![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Salah satu keterampilan penting dari seorang profesional data yang ulung adalah penanganan kumpulan data besar secara efektif, yang menjamin kualitas dan keandalan data. Data adalah bagian utama dan mendasar dari setiap sistem data, dan apa pun keterampilan bagus yang Anda miliki dalam aspek lain dari pekerjaan kami, ini adalah salah satu hal yang tidak boleh Anda abaikan.
Dalam artikel ini, saya akan membahas teknik-teknik yang kuat untuk melakukan pemeriksaan QA pada kumpulan data besar menggunakan pustaka Deequ dan metode statistik. Dengan menggabungkan pendekatan-pendekatan yang saya jelaskan di bawah ini, Anda akan dapat menjaga integritas data, meningkatkan praktik-praktik pengelolaan data Anda, dan mencegah potensi masalah dalam aplikasi hilir.
Memastikan kualitas data dalam skala besar merupakan tugas yang berat, terutama saat menangani miliaran baris yang disimpan dalam sistem berkas terdistribusi atau gudang data. Pustaka Deequ adalah kerangka kerja QA dan profil data sumber terbuka yang dibangun di Spark yang merupakan alat modern dan serbaguna yang dirancang untuk memecahkan masalah ini. Yang membedakannya dari alat serupa adalah kemampuannya untuk terintegrasi dengan lancar dengan Spark, memanfaatkan daya pemrosesan terdistribusi untuk penanganan kumpulan data skala besar yang efisien.
Saat Anda mencobanya, Anda akan melihat bagaimana fleksibilitasnya memungkinkan Anda menentukan aturan validasi kompleks yang disesuaikan dengan kebutuhan spesifik Anda, memastikan cakupan yang komprehensif. Selain itu, Deequ memiliki metrik yang luas dan kemampuan deteksi anomali yang akan membantu Anda mengidentifikasi dan secara proaktif mengatasi masalah kualitas data. Bagi para profesional data yang bekerja dengan kumpulan data yang besar dan dinamis, Deequ adalah solusi yang sangat tepat. Mari kita lihat bagaimana kita dapat menggunakannya.
Detail selengkapnya tentang pengaturan pustaka Deequ dan kasus penggunaan seputar pembuatan profil data dapat diakses di sini . Demi kesederhanaan, dalam contoh ini, kami hanya membuat beberapa rekaman 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)
Sebagian besar aplikasi data memiliki asumsi implisit tentang atribut data, seperti nilai non-NULL dan keunikan. Dengan Deequ, asumsi ini menjadi eksplisit melalui pengujian unit. Berikut ini beberapa pemeriksaan umum:
Jumlah Baris: Pastikan kumpulan data berisi jumlah baris tertentu.
Kelengkapan Atribut: Periksa bahwa atribut seperti id dan productName tidak pernah NULL.
Keunikan Atribut: Pastikan atribut tertentu, seperti id, bersifat unik.
Rentang Nilai: Validasi bahwa atribut seperti priority dan numViews berada dalam rentang yang diharapkan.
Pencocokan Pola: Verifikasi bahwa deskripsi berisi URL seperti yang diharapkan.
Properti Statistik: Pastikan median atribut numerik memenuhi kriteria tertentu.
Berikut ini cara Anda dapat menerapkan pemeriksaan 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()
Setelah menjalankan pemeriksaan ini, Deequ menerjemahkannya ke dalam serangkaian pekerjaan Spark, yang dijalankannya untuk menghitung metrik pada data. Setelah itu, Deequ memanggil fungsi pernyataan Anda (misalnya, _ == 5 untuk pemeriksaan ukuran) pada metrik ini untuk melihat apakah batasan berlaku pada data. Kita dapat memeriksa objek "verificationResult” untuk melihat apakah pengujian menemukan kesalahan:
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 tersebut, kita akan mendapatkan output sebagai 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!
Pengujian tersebut menemukan bahwa asumsi kami dilanggar! Hanya 4 dari 5 (80%) nilai atribut productName yang bukan nol, dan hanya 2 dari 5 (yaitu, 40%) nilai atribut description yang berisi URL. Untungnya, kami menjalankan pengujian dan menemukan kesalahan; seseorang harus segera memperbaiki data tersebut!
Meskipun Deequ menawarkan kerangka kerja yang kuat untuk validasi data, mengintegrasikan metode statistik dapat lebih meningkatkan pemeriksaan QA Anda, terutama jika Anda menangani metrik agregat dari suatu kumpulan data. Mari kita lihat bagaimana Anda dapat menggunakan metode statistik untuk memantau dan memastikan kualitas data.
Pertimbangkan skenario bisnis di mana proses ETL (Ekstrak, Transformasi, Muat) menghasilkan N rekaman pada pekerjaan terjadwal harian. Tim dukungan mungkin ingin menyiapkan pemeriksaan QA untuk memberikan peringatan jika ada penyimpangan signifikan dalam jumlah rekaman. Misalnya, jika proses tersebut biasanya menghasilkan antara 9.500 hingga 10.500 rekaman setiap hari selama dua bulan, setiap peningkatan atau penurunan yang signifikan dapat mengindikasikan masalah dengan data yang mendasarinya.
Kita dapat menggunakan metode statistik untuk menentukan ambang batas ini, yang mana proses harus memberikan peringatan kepada tim dukungan. Berikut adalah ilustrasi pelacakan jumlah rekaman selama dua bulan:
Untuk menganalisis hal ini, kita dapat mengubah data jumlah rekaman untuk mengamati perubahan harian. Perubahan ini umumnya berkisar sekitar nol, seperti yang ditunjukkan pada diagram berikut:
Bila laju perubahan ini digambarkan dengan distribusi normal, kurvanya akan berbentuk lonceng, yang menunjukkan bahwa data terdistribusi secara normal. Perubahan yang diharapkan adalah sekitar 0%, dengan deviasi standar 2,63%.
Analisis ini menunjukkan bahwa jumlah rekaman biasanya berada dalam kisaran -5,26% hingga +5,25% dengan keyakinan 90%. Berdasarkan hal ini, Anda dapat menetapkan aturan untuk memberikan peringatan jika jumlah rekaman menyimpang dari kisaran ini, sehingga dapat dilakukan tindakan pencegahan tepat waktu.
Cakupan atribut mengacu pada rasio nilai non-NULL terhadap jumlah total rekaman untuk cuplikan kumpulan data. Misalnya, jika 8 dari 100 rekaman memiliki nilai NULL untuk atribut tertentu, cakupan untuk atribut tersebut adalah 92%.
Mari kita tinjau kasus bisnis lain dengan proses ETL yang menghasilkan cuplikan tabel produk setiap hari. Kita ingin memantau cakupan atribut deskripsi produk. Jika cakupan berada di bawah ambang batas tertentu, peringatan harus diberikan kepada tim dukungan. Berikut adalah representasi visual cakupan atribut untuk deskripsi produk selama dua bulan:
Dengan menganalisis perbedaan absolut dari hari ke hari dalam cakupan, kami mengamati bahwa perubahannya berfluktuasi sekitar nol:
Mewakili data ini sebagai distribusi normal menunjukkan bahwa data tersebut terdistribusi normal dengan perubahan yang diharapkan sekitar 0% dan deviasi standar 2,45%.
Seperti yang kita lihat, untuk kumpulan data ini, cakupan atribut deskripsi produk biasanya berkisar antara -4,9% hingga +4,9% dengan keyakinan 90%. Berdasarkan indikator ini, kita dapat menetapkan aturan untuk memberikan peringatan jika cakupannya menyimpang dari rentang ini.
Jika Anda bekerja dengan kumpulan data yang menunjukkan variasi signifikan karena faktor-faktor seperti musim atau tren, metode statistik tradisional dapat memicu peringatan palsu. Algoritme deret waktu menawarkan pendekatan yang lebih baik, meningkatkan akurasi dan keandalan pemeriksaan QA Anda.
Untuk menghasilkan peringatan yang lebih masuk akal, Anda dapat menggunakan
Mari kita buat model tiruan penjualan harian yang menunjukkan pola tren dan musiman 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)
Dengan menggunakan metode ini, Anda dapat mendeteksi penyimpangan signifikan yang mungkin mengindikasikan masalah kualitas data, memberikan pendekatan yang lebih bernuansa pada pemeriksaan QA.
Saya harap artikel ini akan membantu Anda menerapkan pemeriksaan QA secara efisien untuk kumpulan data besar Anda. Dengan menggunakan pustaka Deequ dan mengintegrasikan metode statistik dan algoritme deret waktu, Anda dapat memastikan integritas dan keandalan data, yang pada akhirnya meningkatkan praktik manajemen data Anda.
Menerapkan teknik yang dijelaskan di atas akan membantu Anda mencegah potensi masalah dalam aplikasi hilir dan meningkatkan kualitas alur kerja data Anda secara keseluruhan.