![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Salah satu kemahiran penting seorang profesional data yang cekap ialah pengendalian set data besar yang berkesan, memastikan kualiti dan kebolehpercayaan data. Data ialah bahagian utama dan asas bagi mana-mana sistem data, dan apa jua kemahiran baik yang anda miliki dalam aspek lain perdagangan kami, ini adalah salah satu yang anda tidak boleh terlepas pandang.
Dalam artikel ini, saya meneroka teknik teguh untuk melaksanakan semakan QA pada set data besar menggunakan perpustakaan Deequ dan kaedah statistik. Dengan menggabungkan pendekatan yang saya terangkan di bawah, anda akan dapat mengekalkan integriti data, mempertingkatkan amalan pengurusan data anda dan mencegah potensi isu dalam aplikasi hiliran.
Memastikan kualiti data pada skala adalah tugas yang sukar, terutamanya apabila berurusan dengan berbilion baris yang disimpan dalam sistem fail atau gudang data yang diedarkan. Pustaka Deequ ialah pemprofilan data sumber terbuka dan rangka kerja QA yang dibina pada Spark yang merupakan alat moden dan serba boleh yang direka untuk menyelesaikan masalah ini. Apa yang membezakannya daripada alat yang serupa ialah keupayaannya untuk menyepadukan dengan lancar dengan Spark, memanfaatkan kuasa pemprosesan teragih untuk pengendalian set data berskala besar yang cekap.
Apabila anda mencubanya, anda akan melihat bagaimana fleksibilitinya membolehkan anda menentukan peraturan pengesahan kompleks yang disesuaikan dengan keperluan khusus anda, memastikan liputan komprehensif. Selain itu, Deequ menampilkan metrik yang luas dan keupayaan pengesanan anomali yang akan membantu anda mengenal pasti dan menangani isu kualiti data secara proaktif. Untuk profesional data yang bekerja dengan set data yang besar dan dinamik, Deequ ialah penyelesaian Swiss-knife. Mari lihat bagaimana kita boleh menggunakannya.
Butiran lanjut tentang persediaan perpustakaan Deequ dan kes penggunaan sekitar pemprofilan data boleh diakses di sini . Demi kesederhanaan, dalam contoh ini, kami hanya menghasilkan beberapa rekod mainan:
val rdd = spark.sparkContext.parallelize(Seq( Item(1, "Thingy A", "awesome thing.", "high", 0), Item(2, "Thingy B", "available at http://thingb.com", null, 0), Item(3, null, null, "low", 5), Item(4, "Thingy D", "checkout https://thingd.ca", "low", 10), Item(5, "Thingy E", null, "high", 12))) val data = spark.createDataFrame(rdd)
Kebanyakan aplikasi data datang dengan andaian tersirat tentang atribut data, seperti nilai bukan NULL dan keunikan. Dengan Deequ, andaian ini menjadi jelas melalui ujian unit. Berikut ialah beberapa pemeriksaan biasa:
Kiraan Baris: Pastikan set data mengandungi bilangan baris tertentu.
Kelengkapan Atribut: Semak bahawa atribut seperti id dan productName tidak pernah NULL.
Keunikan Atribut: Pastikan atribut tertentu, seperti id, adalah unik.
Julat Nilai: Sahkan bahawa atribut seperti keutamaan dan numViews berada dalam julat yang dijangkakan.
Padanan Corak: Sahkan bahawa perihalan mengandungi URL apabila dijangka.
Sifat Statistik: Pastikan median atribut berangka memenuhi kriteria tertentu.
Berikut ialah cara anda boleh melaksanakan semakan ini menggunakan Deequ:
import com.amazon.deequ.VerificationSuite import com.amazon.deequ.checks.{Check, CheckLevel, CheckStatus} val verificationResult = VerificationSuite() .onData(data) .addCheck( Check(CheckLevel.Error, "unit testing my data") .hasSize(_ == 5) // we expect 5 rows .isComplete("id") // should never be NULL .isUnique("id") // should not contain duplicates .isComplete("productName") // should never be NULL // should only contain the values "high" and "low" .isContainedIn("priority", Array("high", "low")) .isNonNegative("numViews") // should not contain negative values // at least half of the descriptions should contain a url .containsURL("description", _ >= 0.5) // half of the items should have less than 10 views .hasApproxQuantile("numViews", 0.5, _ <= 10)) .run()
Selepas menjalankan semakan ini, Deequ menterjemahkannya ke dalam satu siri kerja Spark, yang ia laksanakan untuk mengira metrik pada data. Selepas itu, ia menggunakan fungsi penegasan anda (cth, _ == 5 untuk semakan saiz) pada metrik ini untuk melihat sama ada kekangan itu berlaku pada data. Kami boleh memeriksa objek "verificationResult" untuk melihat sama ada ujian mendapati ralat:
import com.amazon.deequ.constraints.ConstraintStatus if (verificationResult.status == CheckStatus.Success) { println("The data passed the test, everything is fine!") } else { println("We found errors in the data:\n") val resultsForAllConstraints = verificationResult.checkResults .flatMap { case (_, checkResult) => checkResult.constraintResults } resultsForAllConstraints .filter { _.status != ConstraintStatus.Success } .foreach { result => println(s"${result.constraint}: ${result.message.get}") } }
Jika kita menjalankan contoh, kita mendapat output berikut:
We found errors in the data: CompletenessConstraint(Completeness(productName)): Value: 0.8 does not meet the requirement! PatternConstraint(containsURL(description)): Value: 0.4 does not meet the requirement!
Ujian mendapati andaian kami telah dilanggar! Hanya 4 daripada 5 (80%) nilai atribut productName adalah bukan nol dan hanya 2 daripada 5 (iaitu, 40%) nilai atribut perihalan yang mengandungi URL. Nasib baik, kami menjalankan ujian dan menemui ralat; seseorang harus segera membetulkan data!
Walaupun Deequ menawarkan rangka kerja yang teguh untuk pengesahan data, penyepaduan kaedah statistik boleh meningkatkan lagi semakan QA anda, terutamanya jika anda berurusan dengan metrik agregat set data. Mari lihat bagaimana anda boleh menggunakan kaedah statistik untuk memantau dan memastikan kualiti data.
Pertimbangkan senario perniagaan di mana proses ETL (Extract, Transform, Load) menghasilkan N rekod pada kerja berjadual harian. Pasukan sokongan mungkin mahu menyediakan semakan QA untuk meningkatkan amaran jika terdapat sisihan ketara dalam kiraan rekod. Sebagai contoh, jika proses lazimnya menjana antara 9,500 hingga 10,500 rekod setiap hari dalam tempoh dua bulan, sebarang peningkatan atau penurunan yang ketara boleh menunjukkan masalah dengan data asas.
Kami boleh menggunakan kaedah statistik untuk mentakrifkan ambang ini mengenai proses yang harus menimbulkan makluman kepada pasukan sokongan. Di bawah ialah ilustrasi penjejakan kiraan rekod selama dua bulan:
Untuk menganalisis ini, kami boleh mengubah data kiraan rekod untuk memerhatikan perubahan hari ke hari. Perubahan ini biasanya berayun sekitar sifar, seperti yang ditunjukkan dalam carta berikut:
Apabila kita mewakili kadar perubahan ini dengan taburan normal, ia membentuk lengkung loceng, menunjukkan bahawa data diedarkan secara normal. Perubahan yang dijangkakan adalah sekitar 0%, dengan sisihan piawai 2.63%.
Analisis ini menunjukkan bahawa kiraan rekod biasanya berada dalam julat -5.26% hingga +5.25% dengan keyakinan 90%. Berdasarkan ini, anda boleh menetapkan peraturan untuk meningkatkan amaran jika kiraan rekod menyimpang melepasi julat ini, memastikan campur tangan tepat pada masanya.
Liputan atribut merujuk kepada nisbah nilai bukan NULL kepada jumlah kiraan rekod untuk petikan set data. Sebagai contoh, jika 8 daripada 100 rekod mempunyai nilai NULL untuk atribut tertentu, liputan untuk atribut tersebut ialah 92%.
Mari semak satu lagi kes perniagaan dengan proses ETL yang menghasilkan petikan jadual produk setiap hari. Kami mahu memantau liputan atribut penerangan produk. Jika liputan jatuh di bawah ambang tertentu, makluman harus dibangkitkan untuk pasukan sokongan. Di bawah ialah perwakilan visual liputan atribut untuk penerangan produk selama dua bulan:
Dengan menganalisis perbezaan mutlak sehari-hari dalam liputan, kami melihat bahawa perubahan berayun sekitar sifar:
Mewakili data ini sebagai taburan normal menunjukkan bahawa ia adalah taburan normal dengan jangkaan perubahan sekitar 0% dan sisihan piawai 2.45%.
Seperti yang kita lihat, untuk set data ini, liputan atribut penerangan produk biasanya berjulat dari -4.9% hingga +4.9% dengan keyakinan 90%. Berdasarkan penunjuk ini, kami boleh menetapkan peraturan untuk meningkatkan amaran jika liputan menyimpang melepasi julat ini.
Jika anda menggunakan set data yang menunjukkan variasi ketara disebabkan faktor seperti kemusim atau aliran, kaedah statistik tradisional mungkin mencetuskan makluman palsu. Algoritma siri masa menawarkan pendekatan yang lebih halus, meningkatkan ketepatan dan kebolehpercayaan semakan QA anda.
Untuk menghasilkan makluman yang lebih wajar, anda boleh menggunakan sama ada
Mari buat model jualan harian yang mempamerkan kedua-dua corak aliran dan bermusim menggunakan Holt-Winters:
import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # Load and preprocess the dataset data = pd.read_csv('sales_data.csv', index_col='date', parse_dates=True) data = data.asfreq('D').fillna(method='ffill') # Fit the Holt-Winters model model = ExponentialSmoothing(data, trend='add', seasonal='add', seasonal_periods=365) fit = model.fit() # Forecast and detect anomalies forecast = fit.fittedvalues residuals = data - forecast threshold = 3 * residuals.std() anomalies = residuals[abs(residuals) > threshold] print("Anomalies detected:") print(anomalies)
Menggunakan kaedah ini, anda boleh mengesan sisihan ketara yang mungkin menunjukkan isu kualiti data, memberikan pendekatan yang lebih bernuansa kepada semakan QA.
Saya harap artikel ini akan membantu anda melaksanakan semakan QA dengan cekap untuk set data besar anda. Dengan menggunakan perpustakaan Deequ dan menyepadukan kaedah statistik dan algoritma siri masa, anda boleh memastikan integriti dan kebolehpercayaan data, akhirnya meningkatkan amalan pengurusan data anda.
Melaksanakan teknik yang diterangkan di atas akan membantu anda mencegah kemungkinan isu dalam aplikasi hiliran dan meningkatkan kualiti keseluruhan aliran kerja data anda.