Come sostituire i valori mancanti (NA) in R: na.omit e na.rm

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 anziché un valore numerico. I valori mancanti devono essere eliminati o sostituiti per trarre la 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.

Sostituisci i valori mancanti in R

In questo tutorial imparerai

mutare()

Il quarto verbo del 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 alla media e alla 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() della libreria dplyr è un modo semplice per escludere le osservazioni mancanti. Eliminare tutti i NA dai dati è facile, ma non significa che sia la soluzione più elegante. Durante l'analisi, è saggio usare vari metodi per gestire i valori mancanti

Per affrontare il problema delle osservazioni mancanti, utilizzeremo il set di dati Titanic. 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 occuparsi.

Caricheremo il file csv da internet e poi controlleremo quali colonne hanno NA. Per restituire le colonne con dati mancanti, possiamo usare 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 observations
list_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.

Nelle colonne età e tariffa mancano valori.

Possiamo eliminarli con na.omit().

library(dplyr)
# Exclude the missing observations
df_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.

Escludi valori mancanti

Assegnare i dati mancanti alla media e alla mediana

Potremmo anche imputare (popolare) i valori mancanti con la mediana o la media. Una buona pratica è creare due variabili separate per la media e la mediana. Una volta creati, possiamo sostituire i valori mancanti con le variabili appena formate.

Utilizzeremo il metodo apply per calcolare la media della colonna con NA. Vediamo un esempio

Passo 1) In precedenza nel tutorial, abbiamo archiviato il nome delle colonne con i valori mancanti nell'elenco chiamato list_na. Utilizzeremo questo elenco

Passo 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 mean
average_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 (ad esempio "age" e "fare")
  • 2: Calcola la funzione sulle colonne
  • media: 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 le osservazioni mancanti. Questi due valori verranno utilizzati per sostituire le osservazioni mancanti.

Passo 3) Sostituisci i valori NA

Il verbo mutate dalla libreria dplyr è utile per creare una nuova variabile. Non vogliamo necessariamente modificare la colonna originale, quindi possiamo creare una nuova variabile senza NA. mutate è facile da usare, basta scegliere un nome di variabile e definire come creare questa variabile. Ecco il codice completo

# Create a new variable with the mean and median
df_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(tariffa), Average_missing[2],tariffa)

Se la colonna età presenta valori mancanti, sostituiscili 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à.

Passo 4) Possiamo anche sostituire 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:

Assegnare i dati mancanti alla media e alla mediana

Passo 5) Un set di big data potrebbe contenere molti valori mancanti e il metodo sopra descritto potrebbe essere complicato. Possiamo eseguire tutti i passaggi precedenti in una riga di codice utilizzando il metodo sapply(). Anche se non conosceremmo i valori di media e mediana.

sapply non crea un file Frame dati, quindi possiamo racchiudere la funzione sapply() all'interno di data.frame() per creare un oggetto frame di dati.

# Quick code to replace missing values with the mean
df_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:

  • Escludere tutte le osservazioni mancanti
  • Imputare con la media
  • Imputare con la mediana

La tabella seguente riassume come rimuovere tutte le osservazioni mancanti

Biblioteca Obiettivo Code
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 effettuata in due modi

  • Usando applica
  • Utilizzando sapply
Metodo Dettagli Vantaggi Svantaggi
Passo dopo passo con l'applicazione Controlla le colonne mancanti, calcola la media/mediana, memorizza il valore, sostituisci con mutate() Conosci il valore di media/mediana Più tempo di esecuzione. Può essere lento con set di dati di grandi dimensioni
Modo rapido con Sapply Utilizza 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