I valori mancanti nella scienza dei dati si verificano quando un'osservazione manca in una colonna di un frame di dati o contiene un valore di carattere invece di un valore numerico. I valori mancanti devono essere eliminati o sostituiti per trarre una conclusione corretta dai dati.
In questo tutorial impareremo come gestire i valori mancanti con la libreria dplyr. La libreria dplyr fa parte di un ecosistema per realizzare un'analisi dei dati.
In questo tutorial imparerai
- mutare ()
- Escludi valori mancanti (NA)
- Assegnare i valori mancanti (NA) con la media e la mediana
mutare ()
Il quarto verbo nella libreria dplyr è utile per creare una nuova variabile o modificare i valori di una variabile esistente.
Procederemo in due parti. Impareremo come:
- escludere i valori mancanti da un frame di dati
- imputare i valori mancanti con la media e la mediana
Il verbo mutate () è molto facile da usare. Possiamo creare una nuova variabile seguendo questa sintassi:
mutate(df, name_variable_1 = condition,… )arguments:-df: Data frame used to create a new variable-name_variable_1: Name and the formula to create the new variable-… : No limit constraint. Possibility to create more than one variable inside mutate()
Escludi valori mancanti (NA)
Il metodo na.omit () dalla libreria dplyr è un modo semplice per escludere osservazioni mancanti. Eliminare tutta la NA dai dati è facile ma non significa che sia la soluzione più elegante. Durante l'analisi, è consigliabile utilizzare una varietà di metodi per gestire i valori mancanti
Per affrontare il problema delle osservazioni mancanti, utilizzeremo il set di dati titanico. In questo set di dati abbiamo accesso alle informazioni dei passeggeri a bordo durante la tragedia. Questo set di dati ha molte NA di cui è necessario occuparsi.
Caricheremo il file csv da Internet e quindi verificheremo quali colonne hanno NA. Per restituire le colonne con dati mancanti, possiamo utilizzare il seguente codice:
Carichiamo i dati e verifichiamo i dati mancanti.
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"df_titanic <- read.csv(PATH, sep = ",")# Return the column names containing missing observationslist_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]list_na
Produzione:
## [1] "age" "fare"
Qui,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Fornisce il nome delle colonne che non contengono dati.
Le colonne età e tariffa hanno valori mancanti.
Possiamo rilasciarli con na.omit ().
library(dplyr)# Exclude the missing observationsdf_titanic_drop <-df_titanic %>%na.omit()dim(df_titanic_drop)
Produzione:
## [1] 1045 13
Il nuovo set di dati contiene 1045 righe rispetto alle 1309 del set di dati originale.
Imputare i dati mancanti con la media e la mediana
Potremmo anche imputare (popolare) i valori mancanti con la mediana o la media. Una buona pratica consiste nel creare due variabili separate per la media e la mediana. Una volta creati, possiamo sostituire i valori mancanti con le variabili appena formate.
Useremo il metodo apply per calcolare la media della colonna con NA. Vediamo un esempio
Passaggio 1) In precedenza nel tutorial, abbiamo memorizzato il nome delle colonne con i valori mancanti nell'elenco chiamato list_na. Useremo questo elenco
Passaggio 2) Ora dobbiamo calcolare la media con l'argomento na.rm = TRUE. Questo argomento è obbligatorio perché le colonne hanno dati mancanti e questo dice a R di ignorarli.
# Create meanaverage_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],2,mean,na.rm = TRUE)average_missing
Spiegazione del codice:
Passiamo 4 argomenti nel metodo apply.
- df: df_titanic [, colnames (df_titanic)% in% list_na]. Questo codice restituirà il nome delle colonne dall'oggetto list_na (cioè "età" e "tariffa")
- 2: Calcola la funzione sulle colonne
- mean: calcola la media
- na.rm = TRUE: ignora i valori mancanti
Produzione:
## age fare## 29.88113 33.29548
Abbiamo creato con successo la media delle colonne contenenti osservazioni mancanti. Questi due valori verranno utilizzati per sostituire le osservazioni mancanti.
Passaggio 3) Sostituire i valori NA
Il verbo mutare dalla libreria dplyr è utile per creare una nuova variabile. Non vogliamo necessariamente modificare la colonna originale in modo da poter creare una nuova variabile senza NA. mutate è facile da usare, scegliamo semplicemente un nome di variabile e definiamo come creare questa variabile. Ecco il codice completo
# Create a new variable with the mean and mediandf_titanic_replace <- df_titanic %>%mutate(replace_mean_age = ifelse(is.na(age), average_missing[1], age),replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))
Spiegazione del codice:
Creiamo due variabili, replace_mean_age e replace_mean_fare come segue:
- replace_mean_age = ifelse (is.na (age), average_missing [1], age)
- replace_mean_fare = ifelse (is.na (fare), average_missing [2], fare)
Se la colonna età ha valori mancanti, quindi sostituisci con il primo elemento di average_missing (media dell'età), altrimenti mantieni i valori originali. Stessa logica per la tariffa
sum(is.na(df_titanic_replace$age))
Produzione:
## [1] 263
Eseguire la sostituzione
sum(is.na(df_titanic_replace$replace_mean_age))
Produzione:
## [1] 0
La colonna età originale ha 263 valori mancanti mentre la variabile appena creata li ha sostituiti con la media della variabile età.
Passaggio 4) Possiamo sostituire anche le osservazioni mancanti con la mediana.
median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],2,median,na.rm = TRUE)df_titanic_replace <- df_titanic %>%mutate(replace_median_age = ifelse(is.na(age), median_missing[1], age),replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))head(df_titanic_replace)
Produzione:
Passaggio 5) Un set di dati di grandi dimensioni potrebbe contenere molti valori mancanti e il metodo sopra potrebbe essere macchinoso. Possiamo eseguire tutti i passaggi precedenti sopra in una riga di codice usando il metodo sapply (). Anche se non conosceremmo i valori di media e mediana.
sapply non crea un data frame, quindi possiamo racchiudere la funzione sapply () all'interno di data.frame () per creare un oggetto data frame.
# Quick code to replace missing values with the meandf_titanic_impute_mean < -data.frame(sapply(df_titanic,function(x) ifelse(is.na(x),mean(x, na.rm = TRUE),x)))
Sommario
Abbiamo tre metodi per gestire i valori mancanti:
- Escludi tutte le osservazioni mancanti
- Imputa con la media
- Imputa con la mediana
La tabella seguente riassume come rimuovere tutte le osservazioni mancanti
Biblioteca | Obbiettivo | Codice |
---|---|---|
base | Elenca le osservazioni mancanti |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Rimuovi tutti i valori mancanti |
na.omit(df) |
L'imputazione con media o mediana può essere eseguita in due modi
- Utilizzando applica
- Usando sapientemente
Metodo | Dettagli | Vantaggi | Svantaggi |
---|---|---|---|
Passo dopo passo con applica | Controlla le colonne mancanti, calcola la media / mediana, memorizza il valore, sostituisci con mutate () | Conosci il valore della media / mediana | Più tempo di esecuzione. Può essere lento con un set di dati di grandi dimensioni |
Modo veloce con sapiente | Usa sapply () e data.frame () per cercare e sostituire automaticamente i valori mancanti con media / mediana | Codice breve e veloce | Non conosco i valori di imputazione |