![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Una delle competenze essenziali di un esperto professionista dei dati è la gestione efficace di grandi set di dati, garantendone la qualità e l'affidabilità. I dati sono il pezzo centrale e fondamentale di qualsiasi sistema di dati e, qualunque siano le tue buone competenze in altri aspetti del nostro mestiere, questa è una che non puoi permetterti di trascurare.
In questo articolo, esploro tecniche robuste per eseguire controlli QA su grandi set di dati utilizzando la libreria Deequ e metodi statistici. Combinando gli approcci che spiego di seguito, sarai in grado di mantenere l'integrità dei dati, migliorare le tue pratiche di gestione dei dati e prevenire potenziali problemi nelle applicazioni downstream.
Garantire la qualità dei dati su larga scala è un compito arduo, soprattutto quando si ha a che fare con miliardi di righe archiviate in file system distribuiti o data warehouse. La libreria Deequ è un framework open source di profilazione dei dati e QA basato su Spark, uno strumento moderno e versatile progettato per risolvere questo problema. Ciò che lo distingue da strumenti simili è la sua capacità di integrarsi perfettamente con Spark, sfruttando la potenza di elaborazione distribuita per una gestione efficiente di set di dati su larga scala.
Quando lo provi, scoprirai come la sua flessibilità ti consente di definire regole di convalida complesse su misura per i tuoi requisiti specifici, garantendo una copertura completa. Inoltre, Deequ presenta metriche estese e capacità di rilevamento delle anomalie che ti aiuteranno a identificare e affrontare in modo proattivo i problemi di qualità dei dati. Per i professionisti dei dati che lavorano con set di dati grandi e dinamici, Deequ è una soluzione Swiss-knife. Vediamo come possiamo utilizzarlo.
Maggiori dettagli sulla configurazione della libreria Deequ e sui casi d'uso relativi alla profilazione dei dati sono accessibili qui . Per semplicità, in questo esempio, abbiamo appena generato alcuni record giocattolo:
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)
La maggior parte delle applicazioni dati sono dotate di ipotesi implicite sugli attributi dei dati, come valori non NULL e unicità. Con Deequ, queste ipotesi diventano esplicite tramite test unitari. Ecco alcuni controlli comuni:
Conteggio righe: assicurarsi che il set di dati contenga un numero specifico di righe.
Completezza degli attributi: verificare che attributi come id e productName non siano mai NULL.
Unicità degli attributi: assicurarsi che determinati attributi, come l'ID, siano univoci.
Intervallo di valori: verificare che attributi come priority e numViews rientrino negli intervalli previsti.
Corrispondenza di modelli: verifica che le descrizioni contengano gli URL quando previsto.
Proprietà statistiche: garantire che la mediana degli attributi numerici soddisfi criteri specifici.
Ecco come puoi implementare questi controlli utilizzando 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()
Dopo aver eseguito questi controlli, Deequ li traduce in una serie di lavori Spark, che esegue per calcolare le metriche sui dati. In seguito, richiama le tue funzioni di asserzione (ad esempio, _ == 5 per il controllo delle dimensioni) su queste metriche per vedere se i vincoli sono validi sui dati. Possiamo ispezionare l'oggetto "verificationResult" per vedere se il test ha trovato errori:
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}") } }
Se eseguiamo l'esempio, otteniamo il seguente 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!
Il test ha rilevato che le nostre ipotesi sono state violate! Solo 4 su 5 (80%) dei valori dell'attributo productName sono non nulli e solo 2 su 5 (ovvero, il 40%) valori dell'attributo description contenevano un URL. Fortunatamente, abbiamo eseguito un test e trovato gli errori; qualcuno dovrebbe correggere immediatamente i dati!
Mentre Deequ offre un framework robusto per la convalida dei dati, l'integrazione di metodi statistici può migliorare ulteriormente i controlli QA, soprattutto se si ha a che fare con metriche aggregate di un set di dati. Vediamo come è possibile impiegare metodi statistici per monitorare e garantire la qualità dei dati.
Si consideri uno scenario aziendale in cui un processo ETL (Extract, Transform, Load) produce N record su un job pianificato quotidianamente. I team di supporto potrebbero voler impostare controlli QA per generare un avviso se si verifica una deviazione significativa nel conteggio dei record. Ad esempio, se il processo genera in genere tra 9.500 e 10.500 record al giorno per due mesi, qualsiasi aumento o diminuzione significativa potrebbe indicare un problema con i dati sottostanti.
Possiamo usare un metodo statistico per definire questa soglia su quale processo dovrebbe generare un avviso al team di supporto. Di seguito è riportata un'illustrazione del monitoraggio del conteggio dei record in due mesi:
Per analizzare questo, possiamo trasformare i dati del conteggio dei record per osservare i cambiamenti quotidiani. Questi cambiamenti oscillano generalmente attorno allo zero, come mostrato nel grafico seguente:
Quando rappresentiamo questo tasso di variazione con una distribuzione normale, si forma una curva a campana, indicando che i dati sono distribuiti normalmente. La variazione prevista è di circa 0%, con una deviazione standard del 2,63%.
Questa analisi suggerisce che il conteggio dei record rientra tipicamente nell'intervallo da -5,26% a +5,25% con una confidenza del 90%. Sulla base di ciò, è possibile stabilire una regola per generare un avviso se il conteggio dei record si discosta da questo intervallo, assicurando un intervento tempestivo.
La copertura degli attributi si riferisce al rapporto tra valori non NULL e conteggio totale dei record per uno snapshot del dataset. Ad esempio, se 8 record su 100 hanno un valore NULL per un attributo particolare, la copertura per quell'attributo è del 92%.
Esaminiamo un altro caso aziendale con un processo ETL che genera uno snapshot della tabella dei prodotti ogni giorno. Vogliamo monitorare la copertura degli attributi della descrizione del prodotto. Se la copertura scende al di sotto di una certa soglia, dovrebbe essere emesso un avviso per il team di supporto. Di seguito è riportata una rappresentazione visiva della copertura degli attributi per le descrizioni dei prodotti nell'arco di due mesi:
Analizzando le differenze assolute giornaliere nella copertura, osserviamo che le variazioni oscillano attorno allo zero:
Rappresentando questi dati come una distribuzione normale si nota che sono distribuiti normalmente con una variazione prevista di circa lo 0% e una deviazione standard del 2,45%.
Come possiamo vedere, per questo set di dati, la copertura dell'attributo di descrizione del prodotto varia in genere da -4,9% a +4,9% con una confidenza del 90%. Sulla base di questo indicatore, possiamo impostare una regola per generare un avviso se la copertura devia oltre questo intervallo.
Se lavori con set di dati che mostrano variazioni significative dovute a fattori come stagionalità o tendenze, i metodi statistici tradizionali potrebbero innescare falsi allarmi. Gli algoritmi di serie temporali offrono un approccio più raffinato, migliorando l'accuratezza e l'affidabilità dei tuoi controlli QA.
Per produrre avvisi più sensati, puoi utilizzare
Proviamo a simulare le vendite giornaliere che presentano sia andamenti di tendenza che stagionali utilizzando 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)
Utilizzando questo metodo è possibile rilevare deviazioni significative che potrebbero indicare problemi di qualità dei dati, garantendo un approccio più articolato ai controlli QA.
Spero che questo articolo ti aiuti a implementare in modo efficiente i controlli QA per i tuoi grandi set di dati. Utilizzando la libreria Deequ e integrando metodi statistici e algoritmi di serie temporali, puoi garantire l'integrità e l'affidabilità dei dati, migliorando in definitiva le tue pratiche di gestione dei dati.
L'implementazione delle tecniche descritte sopra ti aiuterà a prevenire potenziali problemi nelle applicazioni downstream e a migliorare la qualità complessiva dei tuoi flussi di lavoro di dati.