![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Jedna od vitalnih vještina iskusnog stručnjaka za podatke je učinkovito rukovanje velikim skupovima podataka, čime se osigurava kvaliteta i pouzdanost podataka. Podaci su središnji i temeljni dio svakog podatkovnog sustava, i kakve god dobre vještine imali u drugim aspektima naše trgovine, ovo je ono što si ne možete priuštiti zanemariti.
U ovom članku istražujem robusne tehnike za izvođenje provjera kvalitete na velikim skupovima podataka pomoću biblioteke Deequ i statističkih metoda. Kombinacijom pristupa koje objašnjavam u nastavku, moći ćete održati integritet podataka, poboljšati svoje prakse upravljanja podacima i spriječiti potencijalne probleme u daljnjim aplikacijama.
Osiguravanje kvalitete podataka na razini je zastrašujući zadatak, osobito kada se radi o milijardama redaka pohranjenih u distribuiranim sustavima datoteka ili skladištima podataka. Knjižnica Deequ je open-source profiliranje podataka i QA okvir izgrađen na Sparku koji je moderan i svestran alat dizajniran za rješavanje ovog problema. Ono što ga izdvaja od sličnih alata je njegova sposobnost besprijekorne integracije sa Sparkom, iskorištavanjem distribuirane procesorske snage za učinkovito rukovanje skupovima podataka velikih razmjera.
Kada ga isprobate, vidjet ćete kako vam njegova fleksibilnost omogućuje definiranje složenih pravila provjere valjanosti prilagođenih vašim specifičnim zahtjevima, osiguravajući sveobuhvatnu pokrivenost. Osim toga, Deequ ima opsežne metrike i mogućnosti otkrivanja anomalija koje će vam pomoći u prepoznavanju i proaktivnom rješavanju problema s kvalitetom podataka. Za podatkovne profesionalce koji rade s velikim i dinamičnim skupovima podataka, Deequ je rješenje za švicarski nož. Pogledajmo kako to možemo iskoristiti.
Više detalja o postavljanju biblioteke Deequ i slučajevima korištenja oko profiliranja podataka dostupno je ovdje . Radi jednostavnosti, u ovom smo primjeru generirali samo nekoliko zapisa igračaka:
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)
Većina podatkovnih aplikacija dolazi s implicitnim pretpostavkama o atributima podataka, kao što su ne-NULL vrijednosti i jedinstvenost. Uz Deequ, ove pretpostavke postaju eksplicitne kroz jedinične testove. Evo nekih uobičajenih provjera:
Broj redaka: Provjerite sadrži li skup podataka određeni broj redaka.
Kompletnost atributa: Provjerite da atributi kao što su id i productName nikad nisu NULL.
Jedinstvenost atributa: Osigurajte da su određeni atributi, kao što je id, jedinstveni.
Raspon vrijednosti: potvrdite da atributi kao što su priority i numViews spadaju unutar očekivanih raspona.
Usklađivanje uzorka: Provjerite sadrže li opisi URL-ove kada se očekuje.
Statistička svojstva: Osigurajte da medijan numeričkih atributa zadovoljava određene kriterije.
Evo kako možete implementirati ove provjere koristeći 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()
Nakon pokretanja ovih provjera, Deequ ih prevodi u niz Spark poslova koje izvršava za izračunavanje metrike podataka. Nakon toga poziva vaše funkcije tvrdnji (npr. _ == 5 za provjeru veličine) na tim metrikama da vidi drže li se ograničenja na podacima. Možemo pregledati objekt "verificationResult" da vidimo je li test pronašao pogreške:
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}") } }
Ako pokrenemo primjer, dobit ćemo sljedeći izlaz:
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!
Test je otkrio da su naše pretpostavke prekršene! Samo 4 od 5 (80%) vrijednosti atributa productName nisu null, a samo 2 od 5 (tj. 40%) vrijednosti atributa description sadrže URL. Srećom, proveli smo test i pronašli pogreške; netko bi trebao odmah popraviti podatke!
Iako Deequ nudi robustan okvir za provjeru valjanosti podataka, integracija statističkih metoda može dodatno poboljšati vaše provjere kvalitete, posebno ako imate posla s agregiranim metričkim podacima skupa podataka. Pogledajmo kako možete upotrijebiti statističke metode za praćenje i osiguranje kvalitete podataka.
Razmotrite poslovni scenarij u kojem ETL (Extract, Transform, Load) proces proizvodi N zapisa na dnevno planiranom poslu. Timovi za podršku možda će htjeti postaviti provjere kvalitete kako bi podigli upozorenje ako postoji značajno odstupanje u broju zapisa. Na primjer, ako proces obično generira između 9 500 do 10 500 zapisa dnevno tijekom dva mjeseca, svako značajno povećanje ili smanjenje može ukazivati na problem s temeljnim podacima.
Možemo upotrijebiti statističku metodu da definiramo ovaj prag na kojem proces treba upozoriti tim za podršku. Ispod je ilustracija praćenja broja zapisa tijekom dva mjeseca:
Da bismo to analizirali, možemo transformirati podatke o broju zapisa kako bismo promatrali dnevne promjene. Ove promjene općenito osciliraju oko nule, kao što je prikazano na sljedećem grafikonu:
Kada ovu stopu promjene predstavimo normalnom distribucijom, ona tvori zvonastu krivulju, što pokazuje da su podaci normalno distribuirani. Očekivana promjena je oko 0%, sa standardnom devijacijom od 2,63%.
Ova analiza sugerira da se broj zapisa obično nalazi u rasponu od -5,26% do +5,25% s pouzdanošću od 90%. Na temelju toga možete uspostaviti pravilo za podizanje upozorenja ako broj zapisa odstupi izvan ovog raspona, osiguravajući pravovremenu intervenciju.
Pokrivenost atributa odnosi se na omjer vrijednosti koje nisu NULL i ukupnog broja zapisa za snimku skupa podataka. Na primjer, ako 8 od 100 zapisa ima NULL vrijednost za određeni atribut, pokrivenost za taj atribut je 92%.
Pogledajmo još jedan poslovni slučaj s ETL procesom koji dnevno generira snimku tablice proizvoda. Želimo pratiti pokrivenost atributa opisa proizvoda. Ako pokrivenost padne ispod određenog praga, potrebno je upozoriti tim za podršku. U nastavku je vizualni prikaz pokrivenosti atributa za opise proizvoda tijekom dva mjeseca:
Analizirajući apsolutne svakodnevne razlike u pokrivenosti, uočavamo da promjene osciliraju oko nule:
Predstavljanje ovih podataka kao normalne distribucije pokazuje da je normalno distribuirano s očekivanom promjenom od oko 0% i standardnom devijacijom od 2,45%.
Kao što vidimo, za ovaj skup podataka pokrivenost atributa opisa proizvoda obično se kreće od -4,9% do +4,9% s pouzdanošću od 90%. Na temelju ovog pokazatelja možemo postaviti pravilo za podizanje upozorenja ako pokrivenost odstupa izvan ovog raspona.
Ako radite sa skupovima podataka koji pokazuju značajne varijacije zbog čimbenika kao što su sezona ili trendovi, tradicionalne statističke metode mogu izazvati lažna upozorenja. Algoritmi vremenskih serija nude rafiniraniji pristup, poboljšavajući točnost i pouzdanost vaših provjera kvalitete.
Da biste proizveli razumnija upozorenja, možete koristiti ili
Ismijmo se modelu dnevne prodaje koja pokazuje i trendove i sezonske uzorke koristeći 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)
Pomoću ove metode možete otkriti značajna odstupanja koja bi mogla ukazivati na probleme s kvalitetom podataka, pružajući nijansiraniji pristup provjerama kvalitete.
Nadam se da će vam ovaj članak pomoći da učinkovito implementirate provjere kvalitete za svoje velike skupove podataka. Korištenjem biblioteke Deequ i integriranjem statističkih metoda i algoritama vremenskih serija, možete osigurati integritet i pouzdanost podataka, u konačnici poboljšavajući svoje prakse upravljanja podacima.
Implementacija gore opisanih tehnika pomoći će vam u sprječavanju mogućih problema u nizvodnim aplikacijama i poboljšati ukupnu kvalitetu vaših tijekova rada s podacima.