Questo articolo introduce un concetto per valutare la sporcizia di un set di dati, un argomento che presenta sfide a causa della mancanza di un punteggio tangibile o di una funzione di perdita correlata alla pulizia dei dati. L’obiettivo primario qui è quello di stabilire una metrica in grado di misurare efficacemente il livello di pulizia di un set di dati, traducendo questo concetto in un concreto problema di ottimizzazione.
La pulizia dei dati è definita come un processo in due fasi:
- Primo, rilevamento di errori nei dati come problemi di formattazione, record duplicati e valori anomali;
- Secondo, fissaggio questi errori.
La valutazione di ciascuna fase si basa in genere sul confronto di un set di dati sporco con una versione pulita (verità di base), utilizzando metriche di classificazione come ricordo, precisione e punteggio F1 per il rilevamento degli errori (vedere ad esempio I Foundation Model possono mettere in discussione i tuoi dati?, Rilevamento degli errori nei dati: a che punto siamo e cosa occorre fare?) e metriche basate sull'accuratezza o sulla sovrapposizione per le attività di riparazione dei dati (vedi Riparazione automatica dei dati: siamo pronti per l'implementazione? O HoloClean: riparazioni olistiche dei dati con inferenza probabilistica).
Tuttavia, questi parametri sono specifici dell'attività e non offrono una misura unificata per la pulizia complessiva di un set di dati che include vari tipi di errori.
Questa discussione è incentrata su set di dati tabellari strutturati e ordinati (Vedere Dati ordinati | Giornale del software statistico), distinguere la pulizia dei dati da preoccupazioni più ampie sulla qualità dei dati che includono governance dei dati, derivazione, catalogazione, deriva e altro ancora.
Tutte le ipotesi di seguito costituiscono le basi Punteggio di sporcizia dei dati fa affidamento su. Sono in gran parte ispirati dall'articolo Come quantificare la qualità dei dati?. Naturalmente, tutti potrebbero essere dibattuti e criticati, ma è fondamentale enunciarli chiaramente per favorire la discussione.
Gli errori nei dati sono legati a vincoli violatida cui derivano aspettative sui dati. Ad esempio, se ci si aspetta che la colonna ID non abbia valori mancanti, la presenza di ID mancanti costituirebbe una violazione del vincolo.
Nessuna aspettativa, nessun pianto. L'assenza di aspettative significa nessun impatto sul punteggio. In altre parole, nessun problema relativo ai dati può essere identificato senza aspettative predefinite e, quindi, non può violare vincoli che non esistono.
I problemi relativi ai dati dovrebbero essere individuabili in celle specifiche. Il punteggio si basa sulla capacità di individuare errori in celle particolari nel set di dati.
Punteggi di confidenza per errori di dati. Non tutti gli errori nei dati sono ugualmente certi. A ogni problema identificato dovrebbe essere associato un punteggio di confidenza, che riflette la probabilità o il consenso sulla validità dell'errore, riconoscendo che alcuni problemi potrebbero essere soggetti a interpretazione.
Impatto uniforme delle celle sul punteggio complessivo. Ogni cella in un set di dati ha un impatto potenziale uguale sul punteggio di sporcizia. Affrontare un problema relativo a una determinata cella può risolvere problemi in altre, suggerendo una distribuzione uniforme dei pesi delle celle nel calcolo del punteggio.
Quando si esamina un set di dati, non è raro individuare a colpo d'occhio potenziali problemi di qualità dei dati. Considera il seguente semplice set di dati per l'analisi:
Student#,Last Name,First Name,Favorite Color,Age
1,Johnson,Mia,periwinkle,12
2,Lopez,Liam,blue,green,13
3,Lee,Isabella,,11
4,Fisher,Mason,gray,-1
5,Gupta,Olivia,9,102
6,,Robinson,,Sophia,,blue,,12
Questo esempio dal libro Pulizia dei dati per una scienza dei dati efficace illustra i problemi di qualità dei dati all'interno di un set di dati che rappresenta una classe di 6a elementare. Questo set di dati include più variabili per ogni studente, organizzate in modo tale che ci siano 6 studenti e 5 variabili per studente.
Dopo l'ispezione, alcune voci potrebbero sollevare preoccupazioni a causa di apparenti incongruenze o errori:
- La voce per lo studente con
Student#
2 (Lopez, Liam) sembra avere un valore in più nelFavorite Color
colonna, che sembra che due valori (“blu, verde”) siano stati uniti. In genere, questa colonna deve contenere un solo valore. Data l'incertezza, questo problema viene contrassegnato con un livello di confidenza del 90% per un'ulteriore ispezione. - Alla studentessa successiva, Isabella Lee, manca un
Favorite Color
valore. Dato che questa colonna non dovrebbe avere voci mancanti, questo problema viene identificato con una certezza del 100% per la correzione. - Il record per lo studente numero 4, Mason Fisher, elenca un'età di
-1
un valore non plausibile. Ciò potrebbe rappresentare un valore sentinella che indica dati mancanti, poiché è pratica comune utilizzare tali segnaposto. Tuttavia, le età dovrebbero essere numeri interi positivi, rendendo necessaria una revisione di questa voce. - La riga della studentessa numero 5, Olivia Gupta, pur essendo esente da errori strutturali, presenta un caso insolito poiché sono plausibili diverse spiegazioni. IL
Favorite Color
EFirst Name
i campi potrebbero essere scambiati, considerandoOlivia
può essere sia un nome che un colore. In alternativa, il numero9
potrebbe rappresentare un codice colore, ma questa ipotesi manca di prove corroboranti. Inoltre, un'età di102
per uno studente di 6a elementare è altamente improbabile, suggerendo potenziali errori tipografici (es102
invece di12
). - L'ultima riga contiene virgole superflue, che indicano un possibile problema di inserimento dei dati. Tuttavia, a parte questo problema di formattazione, la voce stessa sembra valida, il che porta ad un elevato livello di confidenza nell'identificazione della natura di questo errore.
Seguendo le nostre linee guida per calcolare il punteggio di sporcizia, possiamo adottare un approccio metodico introducendo a DataIssue
classe in Python, progettata per incapsulare vari aspetti di un problema di dati:
@dataclass
class DataIssue:
type_of_issue: str
expectation: str
constraint_violated: str
confidence_score: float
location: np.ndarray
Per individuare errori specifici, a numpy
matrice di dimensioni (6, 5)
viene utilizzato, dove ogni elemento corrisponde a una cella nel set di dati. Questa matrice è composta da 0 e 1, dove 1 indica un potenziale problema nella cella corrispondente del set di dati.
Tutti i problemi relativi ai dati identificati sono esemplificati di seguito:
# Issue with Student# 2 - Extra value in 'Favorite Color'
issue_1 = DataIssue(
type_of_issue="Extra Value",
expectation="Single value in 'Favorite Color'",
constraint_violated="It looks like two values ('blue,green') have been merged",
confidence_score=0.9,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 1, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0)
),
)
)# Issue with Student# 3 - Missing 'Favorite Color'
issue_2 = DataIssue(
type_of_issue="Missing Value",
expectation="No missing values in 'Favorite Color'",
constraint_violated="Non-null constraint",
confidence_score=1.0,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 1, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0)
),
)
)
# Issue with Student# 4 - Implausible Age
issue_3 = DataIssue(
type_of_issue="Implausible Value",
expectation="Positive integer for 'Age'",
constraint_violated="Positive integer constraint",
confidence_score=1.0,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 1),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0)
),
)
)
# Issues with Student# 5 - Multiple potential issues
issue_4 = DataIssue(
type_of_issue="Structural/Typographical Error",
expectation="Consistent and plausible data entries",
constraint_violated="The `Favorite Color` and `First Name` fields might be swapped, considering `Olivia` can be both a name and a colour",
confidence_score=0.3,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 1, 1, 0),
(0, 0, 0, 0, 0)
),
)
)
issue_5 = DataIssue(
type_of_issue="Typecasting error",
expectation="`Favorite Color` must only contain values from known color strings",
constraint_violated="`9` is not a valid colour name",
confidence_score=0.9,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 1, 0),
(0, 0, 0, 0, 0)
),
)
)
issue_6 = DataIssue(
type_of_issue="Anomaly",
expectation="Realistic age values for 6th-grade students",
constraint_violated="An age of `102` is highly improbable",
confidence_score=0.95,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 1),
(0, 0, 0, 0, 0)
),
)
)
# Issue with last row - Superfluous commas
issue_7 = DataIssue(
type_of_issue="Formatting Error",
expectation="Correct delimiter usage",
constraint_violated="Duplicate commas as separators",
confidence_score=1.0,
location=np.array((
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(1, 1, 1, 1, 1)
),
)
)
La categorizzazione di più errori di dati in specifici DataIssue
le istanze possono essere in qualche modo soggettive, simili alle sfumature coinvolte nella segnalazione di bug nello sviluppo del software. I campi…”type_of_issue
, expectation
E constraint_violated
– servono a chiarire la natura dell'errore, facilitandone la comprensione in sede di indagini o revisioni.
Per calcolare il punteggio di sporcizia, gli elementi critici sono le posizioni degli errori e i punteggi di confidenza associati. In questo esempio, i punteggi di confidenza vengono stimati in base alla certezza percepita della presenza di un errore.
Problemi ripetuti che puntano alle stesse celle aumentano significativamente la probabilità che un problema sia presente lì.
Ora che abbiamo tutte le informazioni di cui abbiamo bisogno, vediamo come calcolare il punteggio di sporcizia per questo piccolo set di dati.
IL Punteggio di sporcizia dei dati rappresenta il frazione prevista di cellule in un set di dati che contengono errori.
La teoria e il calcolo di questo punteggio sono elaborati nel Score Theory
sezione dell'appendice.
Utilizzando i punteggi di confidenza per vari problemi come stime della probabilità indipendente di un errore in ciascuna cella, possiamo applicare i principi fondamentali della probabilità per calcolare la probabilità di un problema per cella e, di conseguenza, il Punteggio di sporcizia dei dati.
Di seguito è riportata una funzione Python per calcolare questa metrica in base a un elenco di problemi relativi ai dati identificati:
def compute_data_dirtiness_score(data_issues: List(DataIssue)) -> float:
"""
Computes the Data Dirtiness Score based on a list of data issues.
Each issue's impact on data quality is represented by a confidence score
and its location within the dataset.
The function aggregates these impacts to estimate the overall 'dirtiness'
of the dataset, with higher scores indicating lower quality.Parameters:
data_issues: A list of DataIssue instances,
each detailing a specific data quality issue.
Returns:
The overall Data Dirtiness Score for the dataset, as a float.
"""
# Stack the probability arrays of a cell being error-free per issue
stacked_error_free_probs = np.stack(
((1 - issue.confidence_score*issue.location) for issue in data_issues),
axis=-1,
)
# Calculate the combined matrix probabilities of an issue for each cell
probs_issue = 1 - np.prod(stacked_error_free_probs, axis=-1)
# Find the average probability across all cells to get the dirtiness score
data_dirtiness_score = np.mean(probs_issue)
return data_dirtiness_score
Calcoliamo il punteggio per il set di dati presentato in precedenza:
compute_data_dirtiness_score(data_issues)
Punteggio di sporcizia dei dati: 33,60%
Per migliorare (ridurre) questo punteggio, un passo naturale è affrontare gli errori più semplici, come correggere le virgole duplicate utilizzate come separatori nell'ultima riga.
Ecco la nuova versione del set di dati:
Student#,Last Name,First Name,Favorite Color,Age
1,Johnson,Mia,periwinkle,12
2,Lopez,Liam,blue,green,13
3,Lee,Isabella,,11
4,Fisher,Mason,gray,-1
5,Gupta,Olivia,9,102
6,Robinson,Sophia,blue,12
Ricalcoliamo ancora una volta il punteggio per vedere il miglioramento.
compute_data_dirtiness_score(data_issues)
Punteggio di sporcizia dei dati: 16,93%
La rivalutazione del punteggio dopo la correzione rivela un miglioramento significativo, dimezzando il punteggio a causa della natura dell'errore che interessa un'intera riga in un set di dati relativamente piccolo.
In conclusione, questa misura fornisce uno strumento quantitativo per monitorare e migliorare la pulizia del nostro set di dati correggendo gli errori di dati identificati in modo iterativo.
Creare aspettative o vincoli per i dati può essere impegnativo e costoso a causa della necessità di etichettatura umana e di conoscenza del dominio. Una soluzione è automatizzare la generazione di vincoli e il rilevamento degli errori nei dati, consentendo agli utenti di rivedere e adattare successivamente questi vincoli automatizzati rimuovendo problemi o modificando i punteggi di confidenza. A questo scopo, i LLM sono ottimi candidati (cfr. Jellyfish: un modello linguistico di grandi dimensioni per la preelaborazione dei dati, I modelli linguistici possono automatizzare la discussione dei dati? O Grandi modelli linguistici come preprocessori di dati).
La probabilità di determinati vincoli e violazioni non è sempre chiara, il che richiede un punteggio di confidenza per tenere conto di questa incertezza. Anche gli esperti potrebbero non essere sempre d’accordo su questioni relative ai dati specifici, quindi quando l’automazione è coinvolta nel rilevamento di questi problemi, avere una probabilità stimata diventa particolarmente utile.
Che dire delle aspettative assenti o degli errori nei dati mancati? L'efficacia del rilevamento degli errori influenza direttamente il punteggio di pulizia e può portare a un valore eccessivamente ottimistico. Tuttavia, c’è una controargomentazione da considerare: gli errori più difficili da rilevare, e quindi più nascosti, potrebbero non essere così critici nel loro impatto sull’usabilità dei dati o sulle applicazioni a valle. Ciò suggerisce che a tali errori dovrebbe essere assegnato un punteggio di confidenza inferiore quando identificati come problemi, riflettendo la loro ridotta significatività. Sebbene questo approccio possa non essere esente da difetti, serve a limitare l’influenza di questi errori trascurati sul punteggio complessivo di sporcizia ponderando di conseguenza la loro importanza.
Un altro aspetto da considerare è la natura dinamica della partitura. Affrontare un problema potrebbe potenzialmente incidere su altri problemi, sollevando dubbi su come aggiornare il punteggio in modo efficiente e senza troppi problemi.
C'è anche la questione se includere indici e nomi di colonne come parte delle celle del set di dati quando si calcola il punteggio di pulizia, poiché la loro accuratezza può anche influenzare il processo di pulizia dei dati (vedi ad esempio Annotazione del tipo di colonna utilizzando ChatGPT).
Gli articoli futuri di questa serie esploreranno vari argomenti correlati, tra cui una tassonomia degli errori nei dati, l'utilizzo degli LLM per il rilevamento automatizzato dei problemi e le strategie per la correzione e la riparazione dei dati. Restate sintonizzati allora!
Fonte: towardsdatascience.com