Introduzione end-to-end alla gestione dei valori mancanti

Nodo di origine: 1121996

Questo articolo è stato pubblicato come parte di Blogathon sulla scienza dei dati

Panoramica

I dati ci forniscono il potere di analizzare e prevedere gli eventi del futuro. Ogni giorno, sempre più aziende adottano tecniche di data science come la previsione predittiva, il clustering e così via. Sebbene sia molto interessante continuare a conoscere complessi algoritmi ML e DL, non bisogna dimenticare di padroneggiare l'essenziale preelaborazione dei dati. Una delle parti importanti della pre-elaborazione dei dati è la gestione dei valori mancanti. Questa è una guida completa su come gestire diversi tipi di dati mancanti.

Contenuti

  1. Perché è importante gestire i valori mancanti?
  2. Ragioni alla base dei valori mancanti
  3. Tipi di valori mancanti
  4. Verifica la presenza di valori mancanti nel set di dati
  5. Visualizzazione dei valori mancanti
  6. Eliminazione di righe con valori mancanti
  7. Eliminazione di colonne con valori mancanti
  8. Assegnazione per variabili continue
    1. Imputazione con media
    2. Assegnazione con mediana
  9. Prevedere i valori mancanti con Regression
  10. Valori mancanti nei dati categoriali
  11. Valori mancanti nei dati delle serie temporali
    1. Valori mancanti di riempimento in avanti
    2. Riempi a ritroso i valori mancanti
    3. Interpolazione lineare
  12. Algoritmi robusti ai valori mancanti
  13. Conclusione

Perché è importante gestire i dati mancanti?

I dati nel mondo reale hanno molti dati mancanti nella maggior parte dei casi. Potrebbero esserci diversi motivi per cui manca ogni valore. Potrebbero verificarsi perdite o danneggiamenti dei dati o potrebbero esserci anche ragioni specifiche. I dati mancanti ridurranno il potere predittivo del tuo modello. Se applichi algoritmi con dati mancanti, ci saranno distorsioni nella stima dei parametri. Non puoi essere sicuro dei tuoi risultati se non gestisci i dati mancanti.

Ragioni alla base dei valori mancanti

Ti sei mai chiesto quali sono le ragioni alla base della mancanza di dati nei set di dati?

Alcuni dei possibili motivi alla base della mancanza di dati sono:

  • Le persone non forniscono informazioni su determinate domande in un sondaggio di raccolta dati. Ad esempio, alcuni potrebbero non sentirsi a proprio agio nel condividere informazioni sul proprio stipendio, sul consumo di alcol e sul fumo. Questi vengono lasciati intenzionalmente fuori dalla popolazione
  • In alcuni casi, i dati vengono accumulati da vari record passati disponibili e non direttamente. In questo caso, il danneggiamento dei dati è un grosso problema. A causa della scarsa manutenzione, alcune parti dei dati sono danneggiate dando origine a dati mancanti
  • Anche le imprecisioni durante il processo di raccolta dei dati contribuiscono a dati mancanti. Ad esempio, nell'inserimento manuale dei dati, è difficile evitare completamente gli errori umani
  • Incoerenze delle apparecchiature che portano a misurazioni errate, che a loro volta non possono essere utilizzate.

Tipi di valori mancanti

I dati mancanti possono verificarsi a causa di diversi motivi. Possiamo classificarli in tre gruppi principali: Missing Completely at Random, Missing At Random, Non Missing at Random.

1. Mancante completamente a caso (MCAR)

I dati mancanti non seguono uno schema particolare, sono semplicemente casuali. La mancanza di questi dati non è correlata o indipendente dalle variabili rimanenti. Non è possibile prevedere questi valori con il resto dei dati variabili. Ad esempio, durante la raccolta dei dati, un determinato campione viene perso per disattenzione. Questo è un caso ideale, in cui statisticamente l'analisi non sarà distorta. Ma non dovresti presumere la presenza di MCAR a meno che non sia molto sicuro in quanto è una situazione rara.

2. Mancante a caso (MAR)

Qui a differenza di MCAR, i dati mancano tra particolari sottoinsiemi. È possibile prevedere se i dati saranno presenti/assenti con l'ausilio di altre funzionalità. Ma non è possibile prevedere i dati mancanti stessi.

Ad esempio, consideriamo un sondaggio sul tempo trascorso su Internet, che ha una sezione sul tempo trascorso su piattaforme come Netflix, amazon prime. È stato osservato che le persone anziane (oltre i 45 anni) hanno meno probabilità di riempirlo rispetto alle persone più giovani. Questo è un esempio di MAR. Qui, il parametro 'Età' decide se i dati mancheranno o meno. MAR si verifica molto comunemente rispetto a MCAR.

3. Non manca a caso (NMAR)

Questa è una situazione seria e delicata. Diciamo che lo scopo del sondaggio è misurare l'abuso/dipendenza dai social media. Se le persone che usano eccessivamente i social media non compilano intenzionalmente il sondaggio, allora abbiamo un caso di NMAR. Questo molto probabilmente porterà a una distorsione dei risultati. I soliti metodi come l'eliminazione di righe/colonne, l'imputazione non funzioneranno. Per risolvere questo problema sarebbe necessaria una conoscenza approfondita del dominio.

Ora che abbiamo visto i diversi tipi di dati mancanti, passiamo ai vari modi di gestirli.

Controlla i valori mancanti

Quando si dispone di un set di dati, il primo passaggio consiste nel verificare quali colonne hanno dati mancanti e quante. Usiamo il set di dati più famoso tra la scienza dei dati impara, ovviamente, il sopravvissuto del Titanic! Leggi il set di dati utilizzando la funzione read_csv di panda come mostrato di seguito.

train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('Forma dati allenamento: ', train.shape ) print('Test forma dati: ', test.shape) train.head()

Dati sui valori mancanti

Fonte: immagine dal taccuino Kaggle dell'autore

Ora abbiamo i frame di dati di addestramento e test di dati titanici.

Come verificare quali colonne hanno dati mancanti e quante?

La funzione "isnull()" viene utilizzata per questo. Quando chiami la funzione sum insieme a isnull, la somma totale dei dati mancanti in ogni colonna è l'output.

valori_mancanti=train.isnull().sum() print(valori_mancanti)
ID Passeggero 0 Sopravvissuto 0 Classe P 0 Nome 0 Sesso 0 Età 177 SibSp 0 Parch 0 Biglietto 0 Tariffa 0 Cabina 687 Imbarcato 2 dtype: int64

Nota che 3 colonne hanno valori mancanti: Età, Cabina, Imbarcato

Sebbene sappiamo quanti valori mancano in ogni colonna, è essenziale conoscerne la percentuale rispetto ai valori totali. Quindi, calcoliamolo in una singola riga di codice.

mis_value_percent = 100 * train.isnull().sum() / len(train) print(mis_value_percent)
ID Passeggero 0.000000 Sopravvissuto 0.000000 Classe P 0.000000 Nome 0.000000 Sesso 0.000000 Età 19.865320 SibSp 0.000000 Parch 0.000000 Biglietto 0.000000 Tariffa 0.000000 Cabina 77.104377 Imbarcato 0.224467 dtype: float64

È evidente che manca il 77% della Colonna 'Cabina', che è una percentuale molto significativa. L'età ha circa il 19% dei dati mancanti e Embarked ha solo lo 0.2% mancante. Questa è l'analisi quantitativa dei dati mancanti che abbiamo. E qualitativa? Continua a leggere!

Visualizzazione dei valori mancanti con Missingno

Indovina un po? Abbiamo un pacchetto Python appositamente per visualizzare ed esplorare i dati mancanti di un set di dati. Il pacchetto Python "Missingno". Vai avanti e installalo rapidamente

pip install mancante

Usando questo, possiamo creare visualizzazioni sotto forma di mappe termiche, grafici a barre e matrici. Analizzando come sono distribuiti, puoi concludere in quale categoria rientrano MCAR, MAR o NMAR. Possiamo anche trovare la correlazione delle colonne che contengono il mancante con la colonna di destinazione

Inizia creando un grafico a barre per valori non nulli utilizzando la funzione 'bar()' della libreria missingno. Hai passato il dataframe dei panda a questa funzione.

import missingno as msno msno.bar(train)

mancante | valori mancantiFonte: immagine dal taccuino Kaggle dell'autore

Successivamente, possiamo tracciare la visualizzazione della matrice. Questo ci aiuta a sapere come i dati mancanti sono distribuiti attraverso i dati, cioè se sono localizzati o distribuiti uniformemente, o se c'è qualche schema e molte di queste domande.

msno.matrix(treno)
barra del modello

Nel grafico a matrice, vedrai righe vuote per ogni dato mancante. Nota che la colonna "Imbarcato" contiene solo due dati casuali mancanti, che non seguono alcuno schema. Probabilmente sono stati persi durante l'acquisizione dei dati. Quindi, questo può essere classificato come Mancante completamente a caso.

Le colonne età e Cabina potrebbero essere MAR. Ma vogliamo assicurarci che non ci siano correlazioni tra loro.

Come farlo?

Fortunatamente per noi, il pacchetto mancante fornisce anche la funzione 'heatmap'. Usando questo possiamo trovare se ci sono correlazioni tra i dati mancanti di colonne diverse.

msno.heatmap (treno)

L'output è mostrato!

mappa termica | valore mancante

La mappa di calore mostra che non esiste una correlazione così forte tra i dati mancanti della colonna Età e Cabina. Quindi, i dati mancanti di queste colonne possono essere classificati come MAR o Missing at Random.

Spero che tu sia chiaro su come analizzare i valori mancanti. Successivamente, passerò alla discussione dei diversi modi di gestire questi dati mancanti.

Eliminazione di righe con valori mancanti

È un metodo semplice, in cui eliminiamo tutte le righe che hanno valori mancanti appartenenti a una particolare colonna. Per quanto facile sia, ha un enorme svantaggio. Potresti finire per perdere una grossa fetta dei tuoi dati. Ciò ridurrà le dimensioni del tuo set di dati e renderà le tue previsioni del modello distorte. Dovresti usarlo solo quando il numero di valori mancanti è molto inferiore.

Ad esempio, la colonna "Imbarcato" ha solo 2 valori mancanti. Quindi, possiamo eliminare le righe in cui manca questa colonna. Segui lo snippet di codice seguente.

print('Dataset prima di :', len(train)) train.dropna(subset=['Embarked'],how='any',inplace=True) print('Dataset dopo :', len(train)) print( 'valori mancanti :',train['Embarked'].isnull().sum())
Dataset prima : 891 Dataset dopo : 889 valori mancanti : 0

Immagina di fare lo stesso per la colonna "Età". Perderesti come il 77% dei tuoi dati!

Eliminazione di colonne

Quando una colonna ha grandi valori mancanti, non ha senso imputare i valori con i meno dati veri disponibili che abbiamo. Quindi, quando una colonna ha più dell'80% di valori mancanti, puoi semplicemente eliminare quella colonna dalla tua analisi. Nel nostro caso, "Cabin" ha il 77% di dati mancanti, quindi puoi scegliere di eliminare questa colonna.

Assicurati che la colonna eliminata non sia cruciale per la tua analisi. In tal caso, dovresti provare a ottenere più dati e quindi imputare i valori mancanti.

Assegnazione per variabile continua

treno['Età'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 Nome: Età, dtype: float64
train['Age']=train['Age'].replace(np.NaN,train['Age'].mean()) train['Age'][:10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7 2.000000 8 27.000000 9 14.000000 Nome: Età, dtype: float64

Puoi vedere che 'NaN' è stato sostituito con 29.699 (la media calcolata).

L'imputazione media presenta alcuni svantaggi. Se i dati hanno una distribuzione molto irregolare, con molti valori anomali, la media non rifletterà l'effettiva distribuzione dei dati. La media è fortemente influenzata da valori estremi o valori anomali. Quindi, se i dati non hanno molti valori anomali e seguono una distribuzione quasi normale, usa l'imputazione media

Assegnazione con mediana

I valori mancanti di un elemento continuo possono essere riempiti con la mediana dei restanti valori non nulli. Il vantaggio della mediana è che non è influenzato dagli outlier, a differenza della media. Implementiamolo qui.

train['Age']=train['Age'].replace(np.NaN,train['Age'].median()) train['Age'][:10]

imputazione con media

È possibile osservare che il valore mediano (28.0) è stato riempito al posto dei valori NaN.

Allo stesso modo, è possibile eseguire anche l'imputazione della modalità. Generalmente, l'imputazione con la modalità è popolare per i valori mancanti categoriali. Ne parlerò approfonditamente in una sezione successiva

Prevedere i valori mancanti con Regression

Invece di riempire un singolo valore medio o mediano in tutti i posti, e se potessimo prevederli con l'aiuto di altre variabili che abbiamo?

Sì! Possiamo utilizzare le funzionalità con valori non nulli per prevedere i valori mancanti. È possibile costruire un modello di regressione o di classificazione per la previsione dei valori mancanti. Implementiamolo per la colonna "Età" del nostro set di dati titanico.

Possiamo elaborare i dati per costruire il modello. La funzione "Età" sarà la variabile target.

x_treno: Le righe del set di dati che presentano il valore "Età" vengono filtrate. L'"età" è l'obiettivo x_prova: È la colonna "Età" con valori non nulli

I y_treno avrà i dati che hanno valori di età mancanti, che devono essere previsti (y_pred)

import panda as pd data=pd.read_csv('../input/titanic/train.csv') data = data[["Sopravvissuto", "Pclass", "Sex", "SibSp", "Parch", "Fare ", "Età"]] data["Sex"] = [1 if x=="maschio" else 0 for x in data["Sex"]] test_data = data[data["Age"].isnull()] data.dropna(inplace=True) x_train = data.drop("Age", axis=1) x_test = test_data.drop("Age", axis=1) y_train = data["Age"]

Adattiamo un modello di regressione lineare a questi dati. Userò la libreria sklearn qui.

from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)

Ora abbiamo i valori null della colonna Age previsti in y_pred.

Stamperò alcuni esempi dell'input del test e dell'output previsto per una migliore comprensione.

stampa(x_test[:10])
Sesso Pclass sopravvissuto SibSp Parch Fare 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958

Questo è il modo in cui gli input vengono passati al modello di regressione. Diamo un'occhiata ai valori di età previsti.

stampa(y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701 22.15615704 29.07922599]

Evviva! Abbiamo i valori.

Valori mancanti nei dati categoriali

Finora abbiamo visto come trattare i dati numerici mancanti. Cosa succede se mancano dati nel caso di una caratteristica categorica? Ad esempio, la funzione "Cabina" del set di dati Titanic è categorica. Qui, non possiamo calcolare media e mediana. Quindi, possiamo riempire i valori mancanti con la modalità o la classe/categoria più frequente.

train['Cabin']=train['Cabin'].fillna(train['Cabin'].value_counts().index[0])

Quando la percentuale di valori mancanti è inferiore, questo metodo è preferito. Non provoca un'enorme perdita di dati ed è statisticamente rilevante.

Ma se hai molti valori mancanti, non ha senso imputare con la classe più frequente. Invece, creiamo una categoria separata per i valori mancanti come "Sconosciuto" o "Non disponibile". Il numero delle classi sarà aumentato di uno.

Quando i valori mancanti provengono da colonne categoriali (stringhe o numeriche), i valori mancanti possono essere sostituiti con la categoria più frequente. Se il numero di valori mancanti è molto grande, può essere sostituito con una nuova categoria.

train['Cabin']=train['Cabin'].fillna('Unknown') train['Cabin'][:10]

FILA DELLA CABINA | riempire na

Funziona bene con un piccolo set di dati. Inoltre, nega la perdita di dati aggiungendo una categoria univoca.

Come gestire i valori mancanti nei dati delle serie temporali?

I set di dati in cui le informazioni vengono raccolte insieme ai timestamp in modo ordinato sono indicati come dati di serie temporali. Se hai valori mancanti nei dati delle serie temporali, puoi ovviamente provare uno dei metodi sopra discussi. Ma ci sono anche alcuni metodi specifici che possono essere usati qui.

Per avere un'idea, creerò un semplice set di dati fittizio.

time= pd.date_range("1/01/2021", period=10, freq="W") df = pd.DataFrame(index=time); df["Unità vendute"] = [5.0,4.0,np.nan,np.nan,1.0,np.nan,3.0,6.0,np.nan,2.0]; stampa (df)

unità vendute

Passiamo ai metodi

Valori mancanti di riempimento in avanti

Il valore della riga successiva verrà utilizzato per riempire il valore mancante.'fill' sta per 'forward fill'. È molto facile da implementare. Devi solo passare il parametro "method" come "ffill" nella funzione fillna().

avanti_riempito=df.fillna(metodo='riempi') print(avanti_riempito)

riempito in avanti

Riempi a ritroso i valori mancanti

Qui, usiamo il valore della riga precedente per riempire il valore mancante. 'bfill' sta per riempimento all'indietro. Qui, devi passare 'bfill' come parametro del metodo.

indietro_riempito=df.fillna(metodo='riempimento') print(indietro_riempito)

backeded riempito

Spero che tu sia in grado di individuare la differenza in entrambi i casi con le immagini sopra.

Interpolazione lineare

I dati delle serie temporali hanno molte variazioni. I metodi di imputazione di cui sopra utilizzando il riempimento e il riempimento in avanti non sono la migliore soluzione possibile. Interpolazione lineare in soccorso!

Qui i valori vengono riempiti con valori crescenti o decrescenti. È una sorta di tecnica di imputazione, che cerca di tracciare una relazione lineare tra i punti dati. Utilizza i valori non nulli disponibili per calcolare i punti mancanti.

interpolated=df.interpolate(limit_direction="both") print(interpolated)

Interpolazione lineare dei valori mancanti

Confronta questi valori con il riempimento avanti e indietro e controlla tu stesso che è buono!

Questi sono alcuni modi di base per gestire i valori mancanti nei dati delle serie temporali

Algoritmi robusti ai valori mancanti

Ci sono alcuni casi in cui nessuno dei precedenti funziona bene. Tuttavia, devi fare un'analisi. Quindi, dovresti optare per algoritmi che supportano i valori mancanti. KNN (K vicini più vicini) è uno di questi algoritmi. Considererà i valori mancanti prendendo la maggior parte dei K valori più vicini. La foresta casuale è anche affidabile per i dati categoriali con valori mancanti. Molti algoritmi basati su alberi decisionali come XGBoost, Catboost supportano i dati con valori mancanti.

Conclusione

Per riassumere, il primo passo è esplorare i dati e scoprire quali variabili hanno dati mancanti, qual è la percentuale e a quale categoria appartiene. Dopo questo, avrai un'idea strategica di quali metodi potresti provare. Un consiglio utile è provare l'Imputazione con l'algoritmo K del vicino più prossimo a parte un modello di regressione lineare. Ci sono alcuni metodi più recenti che potresti cercare come l'utilizzo di Datawig o metodi di imputazione Hot-Deck se i metodi di cui sopra non funzionano.

Spero che la lettura ti sia piaciuta.

Puoi connetterti con me su: [email protected]

Linkedin: pre-elaborazione dei dati

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e vengono utilizzati a discrezione dell'autore.

Fonte: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

Timestamp:

Di più da Analisi Vidhya