Tabella dei Contenuti
I dati mancanti sono una sfida onnipresente nei progetti di data science e machine learning. Indipendentemente dal settore o dall’applicazione, ogni dataset può presentare valori assenti o incompleti.
La loro gestione è un passaggio fondamentale nella costruzione di modelli affidabili e accurati: ignorare o trattare in modo superficiale i dati mancanti può portare a interpretazioni distorte e a modelli poco efficaci. Al contrario, una gestione accurata di questo problema consente di ottenere analisi più rappresentative e previsioni più precise.
- identificare i dati mancanti in un dataset
- quali sono le principali tipologie di dati mancanti
- tecniche per gestirli appropriatamente
Perché i dati mancanti sono importanti?
Il problema dei dati mancanti è trasversale: dai sondaggi socio-demografici fino ai sensori IoT, ogni fonte di dati può includere valori assenti per vari motivi, come errori umani, difetti tecnologici o scelte di design.
In ogni caso, questi dati mancanti, se ignorati, possono introdurre bias, diminuire la qualità delle analisi e compromettere la predittività dei modelli.
Definizione di dato mancante
Un dato mancante si riferisce all’assenza di un valore per una determinata osservazione in uno o più campi di un dataset; Si verifica quando, un valore non viene registrato, questo può accadere per vari motivi, in un sondaggio, per esempio, un intervistato potrebbe scegliere di non rispondere a una domanda per questioni di privacy, lasciando un campo vuoto. Nella raccolta di dati ambientali, un sensore potrebbe temporaneamente non funzionare, generando periodi di inattività nel dataset.
La comprensione delle cause della mancanza dei dati è fondamentale perché influisce sulla scelta della tecnica di gestione e, quindi, sull’efficacia dell’analisi successiva.
Esempi comuni di dati mancanti
Gli esempi più comuni di dati mancanti riguardano errori di inserimento dati, domande omesse in sondaggi, dati non registrati a causa di errori tecnici o di limiti nelle tecnologie di acquisizione.
Un caso frequente è quello delle risposte mancanti nei sondaggi, dove un partecipante può decidere di non rispondere a domande specifiche per motivi di privacy o preferenze personali.
Ad esempio, in un’indagine demografica, alcune persone potrebbero non voler rivelare il proprio reddito, lasciando così il campo vuoto. Un altro esempio può essere la mancanza di dati relativi alla salute dei pazienti, dove alcune informazioni potrebbero non essere registrate per motivi di privacy o per protocolli ospedalieri diversi. Ancora, nelle transazioni finanziarie, certi dati sensibili potrebbero non essere raccolti esplicitamente per rispettare norme di riservatezza o regolamenti.
I dati mancanti possono derivare anche da errori tecnici o difetti nelle apparecchiature di rilevazione. Ad esempio, in un dataset ambientale, un sensore potrebbe smettere di registrare informazioni a causa di un guasto temporaneo o di un'interruzione di corrente, creando valori mancanti nel registro di quella variabile. Nella gestione aziendale, una colonna di un database potrebbe non essere aggiornata perché nessuno ha inserito nuovi dati.
Questi esempi illustrano come la presenza di dati mancanti possa variare in base al contesto di raccolta dati e come possa influire sulle analisi successive.
Tipologie di dati mancanti
Le cause dei dati mancanti non sono tutte uguali: possono seguire meccanismi differenti che influenzano il modo in cui questi dati sono trattati. I meccanismi principali sono tre:
- MCAR (Missing Completely at Random)
- MAR (Missing at Random)
- MNAR (Missing Not at Random)
Ciascun meccanismo richiede approcci distinti e ha implicazioni differenti sul modello finale e sull’accuratezza delle previsioni.
Dati MCAR (Missing Completely at Random)
I dati MCAR sono quelli mancanti in modo completamente casuale e senza alcuna relazione con altre variabili presenti nel dataset. In altre parole, l’assenza di un valore non è influenzata né dal valore della variabile stessa né da nessuna altra variabile.
Ad esempio, in un sondaggio, se una domanda rimane non risolta a causa di un problema tecnico e non per scelta del rispondente, il dato mancante è MCAR.
La gestione dei dati MCAR è relativamente semplice poiché l'assenza è del tutto casuale. La loro rimozione o sostituzione non introduce bias significativo. I metodi di imputazione come la sostituzione con la media o la mediana funzionano bene in questo caso, poiché la mancanza non altera le caratteristiche intrinseche del dataset.
Tuttavia, se la percentuale di dati MCAR è molto elevata, anche una rimozione casuale potrebbe ridurre la qualità e la rappresentatività del dataset, portando alla necessità di tecniche di imputazione più sofisticate.
Dati MAR (Missing at Random)
I dati MAR sono quelli mancanti in modo non casuale, ma la loro assenza è legata ad altre variabili osservabili nel dataset.
Ad esempio, immaginando un dataset di dati demografici, potrebbe capitare che alcuni valori di reddito siano mancanti, ma in maniera correlata al livello di istruzione: le persone con un livello di istruzione inferiore potrebbero omettere più spesso questa informazione. In questo caso, la mancanza del dato è legata a una variabile osservabile (il livello di istruzione) e non al reddito stesso.
I dati MAR richiedono metodi di gestione più avanzati rispetto ai dati MCAR, poiché ignorare o eliminare questi valori può portare a un bias significativo.
Una tecnica comune è l’imputazione condizionale, che utilizza le variabili correlate per stimare i valori mancanti. Ad esempio, si può usare la regressione o un algoritmo di machine learning per stimare i valori mancanti in funzione delle altre variabili. Questi metodi possono restituire stime attendibili, mantenendo la coerenza del modello e riducendo il bias derivato dall’assenza dei dati.
Dati MNAR (Missing Not at Random)
I dati MNAR sono quelli mancanti in modo sistematico e dipendono dal valore stesso della variabile mancante. In altre parole, l'assenza dei dati non è legata ad altre variabili osservabili, ma al valore che avrebbero assunto i dati stessi se fossero stati presenti.
Un esempio comune è il reddito non dichiarato da individui con un reddito molto alto o molto basso. In questo caso, la mancanza del dato non è casuale, ma dipende proprio dal valore del reddito.
La gestione dei dati MNAR è la più complessa, in quanto non esistono metodi standard di imputazione in grado di stimare con precisione i valori mancanti senza introdurre bias.
Tipo |
Definizione |
Esempi |
Impatti sul Modello |
MCAR |
Dati mancanti casualmente |
Problemi tecnici; Risposte non date nei sondaggi |
Impatto minimo se eliminati o imputati |
MAR |
Dati mancanti correlati ad altre variabili |
Reddito mancante in base all’istruzione |
Bias se eliminati senza imputazione condizionale |
MNAR |
Dati mancanti dipendenti dal valore della variabile
stessa |
Reddito molto alto o basso omesso |
Difficile da trattare, richiede modelli avanzati |
Come Individuare i dati mancanti
L’individuazione dei dati mancanti è uno dei primi passi essenziali nel preprocessing dei dati, poiché permette di comprendere meglio la qualità e la completezza delle informazioni disponibili. In questa sezione esploreremo metodi semplici e avanzati per rilevare i valori mancanti in un dataset, utilizzando librerie Python comuni come Pandas.
Individuazione di dati mancanti diretti
I dati mancanti diretti sono quelli che presentano celle vuote o valori nulli in un dataset. Il modo più comune per rilevare dati mancanti in un dataset è cercare valori nulli o vuoti che rappresentano direttamente la mancanza di informazioni.
In Python, Pandas offre funzioni utili per individuare questi valori. Le funzioni .isnull()
e .isna()
consentono di identificare i dati mancanti, restituendo una matrice booleana in cui True
indica la presenza di un dato mancante. Utilizzando .sum()
, è possibile calcolare il numero di dati mancanti per ogni colonna, fornendo una panoramica immediata delle variabili più colpite.
Se vuoi leggere di più su come usare Pandas per l'esplorazione di un dataset, leggi questo articolo in basso 👇
Un altro metodo visivo consiste nel creare grafici per rappresentare la distribuzione dei dati mancanti, aiutando a comprendere eventuali schemi o concentrazioni di assenze in determinate colonne o righe. Librerie come missingno
o funzioni di visualizzazione di seaborn
possono essere utilizzate per generare grafici di heatmap, che offrono una visione d’insieme del pattern di dati mancanti nel dataset.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Creiamo un esempio di dataset con valori mancanti
data = pd.DataFrame({
'Nome': ['Anna', 'Marco', 'Luca', None, 'Sara'],
'Età': [23, None, 35, 29, None],
'Città': ['Roma', 'Milano', None, 'Napoli', 'Torino']
})
# Individuazione dei dati mancanti diretti
print("Conteggio dei valori mancanti per colonna:")
print(data.isnull().sum())
# Visualizzazione della distribuzione dei dati mancanti con una heatmap
plt.figure(figsize=(8, 6))
sns.heatmap(data.isnull(), cbar=False, cmap="viridis")
plt.title("Mappa dei Valori Mancanti")
plt.show()
# Percentuale di dati mancanti per colonna
missing_percentage = data.isnull().mean() * 100
print("Percentuale dei valori mancanti per colonna:")
print(missing_percentage)
Questo codice fornisce una visione chiara della posizione dei valori mancanti tramite una heatmap, che è particolarmente utile quando si lavora con dataset di grandi dimensioni. La distribuzione dei valori True evidenzia i punti in cui i dati sono assenti, permettendo una prima analisi visiva.
Individuazione di dati mancanti contestuali (Inferibili)
Oltre ai dati mancanti espliciti, esistono situazioni in cui i dati potrebbero sembrare completi, ma alcune informazioni possono comunque essere assenti in modo implicito. I dati mancanti contestuali sono quei valori che non sono esplicitamente nulli, ma che potrebbero essere calcolati o derivati da altre variabili nel dataset.
Un esempio comune di dati mancanti contestuali è rappresentato dalla variabile età che potrebbe non essere registrata esplicitamente ma deducibile da variabili come la data di nascita. Altri esempi includono variabili come l’indirizzo o la regione di residenza, che possono essere imputati da altre informazioni geografiche presenti nel dataset.
In alcuni casi, i dati mancanti potrebbero non essere esplicitamente vuoti, ma potrebbero essere ricavabili da altre informazioni nel dataset. Questi sono chiamati dati mancanti contestuali o inferibili.
Ad esempio, in un dataset che contiene sia l’età che l’anno di nascita, un dato mancante nell’età può essere calcolato utilizzando l’anno di nascita e l’anno corrente. Altre situazioni includono la presenza di valori di default che non rappresentano realmente l’informazione ma indicano una mancanza di dati, come “999” per il reddito o “N/D” per l’occupazione.
Questa analisi richiede un esame più approfondito della struttura del dataset e del contesto di raccolta dei dati. Algoritmi o regole specifiche possono essere definiti per identificare queste situazioni, come un controllo incrociato con altre variabili o soglie specifiche per considerare un valore come mancante.
import numpy as np
from datetime import datetime
# Aggiungiamo una colonna "Anno_di_Nascita" e creiamo una colonna vuota per "Età"
data['Anno_di_Nascita'] = [1998, 1985, 1987, 1993, np.nan]
data['Età'] = data['Età'].combine_first(datetime.now().year - data['Anno_di_Nascita'])
print("Dataset con Età derivata da Anno di Nascita:")
print(data)
>>>
Dataset con Età derivata da Anno di Nascita:
Nome Età Città Anno_di_Nascita
0 Anna 23.0 Roma 1998.0
1 Marco 39.0 Milano 1985.0
2 Luca 35.0 None 1987.0
3 None 29.0 Napoli 1993.0
4 Sara NaN Torino NaN
In questo esempio, utilizziamo l’anno di nascita per inferire il valore mancante della variabile Età, riempiendo i valori mancanti con il risultato della sottrazione tra l’anno corrente e l’anno di nascita. Questa tecnica di imputazione contestuale è utile per variabili che hanno una dipendenza logica da altre presenti nel dataset.
Come gestire i dati mancanti
La gestione dei dati mancanti è una fase essenziale nel pre-processing dei dati, poiché consente di evitare distorsioni nei modelli di machine learning e di migliorare l’accuratezza delle analisi.
Esistono varie tecniche per trattare i dati mancanti, ciascuna adatta a specifiche situazioni. Di seguito, esploreremo diverse strategie, partendo dalla semplice eliminazione fino all'imputazione avanzata tramite algoritmi di machine learning.
Eliminazione dei dati mancanti
In alcuni casi, eliminare le righe o le colonne contenenti valori mancanti può essere una soluzione valida. Tuttavia, è cruciale valutare attentamente questa opzione, poiché la perdita di dati potrebbe compromettere la qualità e la rappresentatività del dataset.
Quando rimuovere i dati mancanti è un’opzione valida:
- Quando i dati mancanti rappresentano una piccola percentuale del dataset (<5%), l’eliminazione può ridurre il rischio di distorsioni senza perdita significativa d’informazioni
- Se un’intera colonna ha molti valori mancanti (>50%), rimuovere la colonna stessa può essere più vantaggioso, specie se il dato non è cruciale per l’analisi
Implicazioni dell’eliminazione:
- L’eliminazione di dati mancanti può semplificare l’analisi, ma si rischia di ridurre la varietà delle osservazioni.
- Può compromettere l'interpretabilità, specialmente se la presenza di valori mancanti è sistematica e non casuale (ad esempio in dati MNAR).
import pandas as pd
# Creazione di un esempio di dataset
data = {
'A': [1, 2, None, 4],
'B': [None, 2, 3, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# Eliminazione di righe con almeno un valore mancante
df_dropped_rows = df.dropna()
# Eliminazione di colonne con almeno un valore mancante
df_dropped_cols = df.dropna(axis=1)
print("Dataset originale:\n", df)
print("Righe senza valori mancanti:\n", df_dropped_rows)
print("Colonne senza valori mancanti:\n", df_dropped_cols)
>>>
Dataset originale:
A B C
0 1.0 NaN 1.0
1 2.0 2.0 NaN
2 NaN 3.0 NaN
3 4.0 4.0 4.0
Righe senza valori mancanti:
A B C
3 4.0 4.0 4.0
Colonne senza valori mancanti:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
Imputazione semplice
Quando l’eliminazione non è fattibile, l’imputazione semplice è una tecnica efficace. Si tratta di sostituire i valori mancanti con un valore fisso, come la media, la mediana o il valore più frequente della colonna. Altri metodi includono il riempimento dei valori mancanti in base all’ordine dei dati (forward fill e backward fill).
- Valore Fisso:
- Media, Mediana e Moda: Sostituire i valori mancanti con la media, mediana o moda può essere una buona scelta per variabili numeriche.
- Forward e Backward Fill:
- Forward Fill: Utilizza il valore precedente per riempire i valori mancanti, ideale per dati sequenziali.
- Backward Fill: Usa il valore successivo per riempire i valori mancanti, anch’esso utile per serie temporali.
# Imputazione con la media
df['A'].fillna(df['A'].mean(), inplace=True)
# Imputazione con la mediana
df['B'].fillna(df['B'].median(), inplace=True)
# Imputazione con la moda
df['C'].fillna(df['C'].mode()[0], inplace=True)
# Imputazione con forward fill
df_ffill = df.fillna(method='ffill')
# Imputazione con backward fill
df_bfill = df.fillna(method='bfill')
print("Imputazione con media, mediana e moda:\n", df)
print("Forward fill:\n", df_ffill)
print("Backward fill:\n", df_bfill)
>>>
Imputazione con media, mediana e moda:
A B C
0 1.000000 3.0 1.0
1 2.000000 2.0 1.0
2 2.333333 3.0 1.0
3 4.000000 4.0 4.0
Forward fill:
A B C
0 1.000000 3.0 1.0
1 2.000000 2.0 1.0
2 2.333333 3.0 1.0
3 4.000000 4.0 4.0
Backward fill:
A B C
0 1.000000 3.0 1.0
1 2.000000 2.0 1.0
2 2.333333 3.0 1.0
3 4.000000 4.0 4.0
Imputazione avanzata
Le tecniche di imputazione avanzata, come l’imputazione con modelli predittivi e l’imputazione multipla, sono utili quando il dataset contiene molte variabili e la presenza di dati mancanti non può essere ignorata.
Queste tecniche sfruttano algoritmi di machine learning per prevedere i valori mancanti in modo accurato e prendere in considerazione l’incertezza legata all’imputazione.
- Imputazione con Modelli Predittivi:
- Utilizzare algoritmi di machine learning, come la regressione lineare o il K-Nearest Neighbors (KNN), permette di stimare i valori mancanti in base alle correlazioni con le altre variabili.
- Per implementare questa tecnica in Python, si possono usare librerie come Scikit-Learn.
- Imputazione Multipla:
- L’imputazione multipla consiste nella creazione di diverse versioni del dataset imputato, ciascuna con valori stimati differenti per riflettere l’incertezza dei dati mancanti.
- Il modulo
IterativeImputer
di Scikit-Learn offre un’efficace implementazione dell’imputazione multipla.
from sklearn.impute import KNNImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# Creazione di un dataset di esempio
data = {
'X1': [1, 2, None, 4],
'X2': [2, None, 3, 1],
'Y': [None, 2, 3, 4]
}
df = pd.DataFrame(data)
# Imputazione con KNN
knn_imputer = KNNImputer(n_neighbors=2)
df_knn_imputed = pd.DataFrame(knn_imputer.fit_transform(df), columns=df.columns)
# Imputazione Multipla con IterativeImputer
iter_imputer = IterativeImputer()
df_iter_imputed = pd.DataFrame(iter_imputer.fit_transform(df), columns=df.columns)
print("Imputazione con KNN:\n", df_knn_imputed)
print("Imputazione Multipla:\n", df_iter_imputed)
>>>
Imputazione con KNN:
X1 X2 Y
0 1.0 2.0 2.5
1 2.0 2.5 2.0
2 1.5 3.0 3.0
3 4.0 1.0 4.0
Imputazione Multipla:
X1 X2 Y
0 1.000000 2.00000 2.640933
1 2.000000 2.16263 2.000000
2 1.615473 3.00000 3.000000
3 4.000000 1.00000 4.000000
Conclusioni
La gestione dei dati mancanti è una tappa cruciale in ogni progetto di machine learning o data science. Se trascurata, può compromettere seriamente l’affidabilità e l’accuratezza dei modelli, portando a conclusioni errate.
In sintesi, abbiamo visto che esistono tre principali tipologie di dati mancanti: MCAR (Missing Completely at Random), MAR (Missing at Random), e MNAR (Missing Not at Random). La distinzione tra queste categorie è fondamentale, poiché influisce direttamente sulla scelta della strategia di trattamento dei dati.
Tra le tecniche di gestione, abbiamo visto che la rimozione dei dati mancanti può essere utile quando le osservazioni mancanti sono poche e distribuite in modo casuale. Tuttavia, quando la quantità di dati mancanti è significativa, l'eliminazione può portare a una perdita di informazione rilevante.
L’imputazione semplice, come la sostituzione con media, mediana o moda, può essere un buon punto di partenza, ma presenta limitazioni poiché ignora la variabilità del dato mancante. L’imputazione avanzata con modelli predittivi rappresenta un’opzione più robusta, sfruttando algoritmi di machine learning per stimare i valori mancanti basandosi sui dati esistenti. Un'altra strategia avanzata è l’imputazione multipla, che permette di generare più dataset imputati per riflettere l’incertezza intrinseca del dato mancante.
Un ultimo aspetto da considerare è il trattamento dei dati MNAR. Quando il dato è mancante in modo non casuale, è fondamentale capire le cause dell’assenza e adottare modelli specifici, poiché l’imputazione standard potrebbe introdurre bias significativi.
Commenti dalla community