![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Ang isa sa mga mahahalagang kasanayan ng isang mahusay na propesyonal sa data ay ang epektibong pangangasiwa ng malalaking dataset, na tinitiyak ang kalidad at pagiging maaasahan ng data. Ang data ay ang sentro at pangunahing bahagi ng anumang sistema ng data, at anuman ang magagandang kasanayan na mayroon ka sa iba pang aspeto ng aming kalakalan, ito ang hindi mo kayang palampasin.
Sa artikulong ito, tinutuklasan ko ang mga mahusay na diskarte para sa pagsasagawa ng mga pagsusuri sa QA sa malalaking dataset gamit ang Deequ library at mga istatistikal na pamamaraan. Sa pamamagitan ng pagsasama-sama ng mga diskarte na ipinapaliwanag ko sa ibaba, mapapanatili mo ang integridad ng data, mapahusay ang iyong mga kasanayan sa pamamahala ng data, at maiwasan ang mga potensyal na isyu sa mga downstream na application.
Ang pagtiyak sa kalidad ng data sa sukat ay isang nakakatakot na gawain, lalo na kapag nakikitungo sa bilyun-bilyong row na nakaimbak sa mga distributed file system o data warehouse. Ang Deequ library ay isang open-source data profiling at QA framework na binuo sa Spark na isang moderno at maraming nalalaman na tool na idinisenyo upang malutas ang problemang ito. Ang pinagkaiba nito sa mga katulad na tool ay ang kakayahang isama ng walang putol sa Spark, na ginagamit ang distributed processing power para sa mahusay na pangangasiwa ng mga malalaking dataset.
Kapag sinubukan mo ito, makikita mo kung paano nagbibigay-daan sa iyo ang flexibility nito na tukuyin ang mga kumplikadong panuntunan sa pagpapatunay na iniayon sa iyong mga partikular na kinakailangan, na tinitiyak ang komprehensibong saklaw. Bukod pa rito, nagtatampok ang Deequ ng malawak na sukatan at mga kakayahan sa pagtuklas ng anomalya na tutulong sa iyong matukoy at maagap na matugunan ang mga isyu sa kalidad ng data. Para sa mga propesyonal sa data na nagtatrabaho sa malalaki at dynamic na mga dataset, ang Deequ ay isang Swiss-knife solution. Tingnan natin kung paano natin ito magagamit.
Higit pang mga detalye sa Deequ library setup at mga kaso ng paggamit sa paligid ng data profiling ay maa-access dito . Para sa kapakanan ng pagiging simple, sa halimbawang ito, nakabuo lang kami ng ilang tala ng laruan:
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)
Karamihan sa mga application ng data ay may kasamang mga implicit na pagpapalagay tungkol sa mga katangian ng data, tulad ng mga non-NULL na halaga at pagiging natatangi. Sa Deequ, nagiging tahasan ang mga pagpapalagay na ito sa pamamagitan ng mga unit test. Narito ang ilang karaniwang pagsusuri:
Bilang ng Row: Tiyaking naglalaman ang dataset ng partikular na bilang ng mga row.
Pagkakumpleto ng Katangian: Suriin na ang mga katangian tulad ng id at productName ay hindi kailanman NULL.
Pagkakatangi-tangi ng Katangian: Tiyaking natatangi ang ilang partikular na katangian, gaya ng id.
Halaga ng Halaga: Patunayan na ang mga katangian tulad ng priority at numViews ay nasa loob ng inaasahang saklaw.
Pagtutugma ng Pattern: I-verify na ang mga paglalarawan ay naglalaman ng mga URL kapag inaasahan.
Mga Statistical Properties: Tiyaking nakakatugon ang median ng mga numerical na katangian sa mga partikular na pamantayan.
Narito kung paano mo maipapatupad ang mga pagsusuring ito gamit ang 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()
Pagkatapos patakbuhin ang mga pagsusuring ito, isinasalin ni Deequ ang mga ito sa isang serye ng mga trabaho sa Spark, na isinasagawa nito upang makalkula ang mga sukatan sa data. Pagkatapos, hinihikayat nito ang iyong mga pag-andar ng assertion (hal., _ == 5 para sa pagsusuri ng laki) sa mga sukatan na ito upang makita kung ang mga hadlang ay humahawak sa data. Maaari naming suriin ang object na "verificationResult" upang makita kung ang pagsubok ay may nakitang mga error:
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}") } }
Kung patakbuhin natin ang halimbawa, makukuha natin ang sumusunod na output:
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!
Nalaman ng pagsubok na nilabag ang aming mga pagpapalagay! 4 lang sa 5 (80%) ng mga value ng attribute ng productName ang hindi null, at 2 lang sa 5 (ibig sabihin, 40%) na value ng attribute ng paglalarawan ang naglalaman ng URL. Sa kabutihang palad, nagpatakbo kami ng isang pagsubok at natagpuan ang mga pagkakamali; may dapat na agad na ayusin ang data!
Bagama't nag-aalok ang Deequ ng matibay na balangkas para sa pagpapatunay ng data, ang pagsasama ng mga istatistikal na pamamaraan ay maaaring higit pang mapahusay ang iyong mga pagsusuri sa QA, lalo na kung nakikipag-ugnayan ka sa mga pinagsama-samang sukatan ng isang dataset. Tingnan natin kung paano ka makakagamit ng mga istatistikal na pamamaraan upang masubaybayan at matiyak ang kalidad ng data.
Isaalang-alang ang isang senaryo ng negosyo kung saan ang isang proseso ng ETL (Extract, Transform, Load) ay gumagawa ng N record sa isang pang-araw-araw na naka-iskedyul na trabaho. Maaaring naisin ng mga support team na mag-set up ng mga pagsusuri sa QA upang magtaas ng alerto kung mayroong malaking paglihis sa bilang ng record. Halimbawa, kung ang proseso ay karaniwang bumubuo sa pagitan ng 9,500 hanggang 10,500 na tala araw-araw sa loob ng dalawang buwan, anumang makabuluhang pagtaas o pagbaba ay maaaring magpahiwatig ng isang isyu sa pinagbabatayan ng data.
Maaari kaming gumamit ng istatistikal na paraan upang tukuyin ang threshold na ito kung aling proseso ang dapat magtaas ng alerto sa team ng suporta. Nasa ibaba ang isang paglalarawan ng pagsubaybay sa bilang ng rekord sa loob ng dalawang buwan:
Upang pag-aralan ito, maaari naming ibahin ang anyo ng data ng bilang ng rekord upang obserbahan ang mga pang-araw-araw na pagbabago. Ang mga pagbabagong ito ay karaniwang umiikot sa paligid ng zero, tulad ng ipinapakita sa sumusunod na tsart:
Kapag kinakatawan namin ang rate ng pagbabago na ito sa isang normal na distribusyon, ito ay bumubuo ng isang bell curve, na nagpapahiwatig na ang data ay ipinamamahagi nang normal. Ang inaasahang pagbabago ay nasa paligid ng 0%, na may karaniwang paglihis na 2.63%.
Iminumungkahi ng pagsusuri na ito na ang bilang ng record ay karaniwang nasa loob ng -5.26% hanggang +5.25% na hanay na may 90% kumpiyansa. Batay dito, maaari kang magtatag ng isang panuntunan upang itaas ang isang alerto kung ang bilang ng tala ay lumihis sa saklaw na ito, na tinitiyak ang napapanahong interbensyon.
Ang attribute coverag e ay tumutukoy sa ratio ng mga non-NULL value sa kabuuang bilang ng record para sa isang snapshot ng dataset. Halimbawa, kung 8 sa 100 talaan ay may NULL na halaga para sa isang partikular na katangian, ang saklaw para sa katangiang iyon ay 92%.
Suriin natin ang isa pang kaso ng negosyo na may proseso ng ETL na bumubuo ng snapshot ng talahanayan ng produkto araw-araw. Gusto naming subaybayan ang saklaw ng mga katangian ng paglalarawan ng produkto. Kung ang saklaw ay mas mababa sa isang tiyak na limitasyon, dapat na itaas ang isang alerto para sa koponan ng suporta. Nasa ibaba ang isang visual na representasyon ng saklaw ng katangian para sa mga paglalarawan ng produkto sa loob ng dalawang buwan:
Sa pamamagitan ng pagsusuri sa ganap na pang-araw-araw na mga pagkakaiba sa saklaw, napapansin namin na ang mga pagbabago ay umuusad sa paligid ng zero:
Ang kumakatawan sa data na ito bilang isang normal na distribusyon ay nagpapakita na ito ay normal na ipinamamahagi na may inaasahang pagbabago sa paligid ng 0% at isang karaniwang paglihis na 2.45%.
Gaya ng nakikita natin, para sa dataset na ito, ang saklaw ng katangian ng paglalarawan ng produkto ay karaniwang mula -4.9% hanggang +4.9% na may 90% kumpiyansa. Batay sa tagapagpahiwatig na ito, maaari kaming magtakda ng panuntunan upang magtaas ng alerto kung ang saklaw ay lumihis nang lampas sa saklaw na ito.
Kung nagtatrabaho ka sa mga dataset na nagpapakita ng makabuluhang pagkakaiba-iba dahil sa mga salik tulad ng seasonality o trend, maaaring mag-trigger ng mga maling alerto ang mga tradisyunal na paraan ng istatistika. Nag-aalok ang mga algorithm ng time series ng mas pinong diskarte, na nagpapahusay sa katumpakan at pagiging maaasahan ng iyong mga pagsusuri sa QA.
Upang makagawa ng mas makabuluhang mga alerto, maaari mong gamitin ang alinman sa
Gayahin natin ang pang-araw-araw na benta na nagpapakita ng parehong trend at seasonal pattern gamit ang 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)
Gamit ang paraang ito, maaari mong makita ang mga makabuluhang deviation na maaaring magpahiwatig ng mga isyu sa kalidad ng data, na nagbibigay ng mas nuanced na diskarte sa mga pagsusuri sa QA.
Umaasa akong matutulungan ka ng artikulong ito na mahusay na ipatupad ang mga pagsusuri sa QA para sa iyong malalaking dataset. Sa pamamagitan ng paggamit ng Deequ library at pagsasama ng mga istatistikal na pamamaraan at mga time series na algorithm, masisiguro mo ang integridad at pagiging maaasahan ng data, na sa huli ay magpapahusay sa iyong mga kasanayan sa pamamahala ng data.
Ang pagpapatupad ng mga diskarteng inilarawan sa itaas ay makakatulong sa iyong maiwasan ang mga potensyal na isyu sa mga downstream na application at pagbutihin ang pangkalahatang kalidad ng iyong mga workflow ng data.