Comment remplacer les valeurs manquantes (NA) dans R : na.omit et na.rm

Les valeurs manquantes en science des données surviennent lorsqu'une observation est manquante dans une colonne d'un bloc de données ou contient une valeur de caractère au lieu d'une valeur numérique. Les valeurs manquantes doivent être supprimées ou remplacées afin de tirer des conclusions correctes à partir des données.

Dans ce tutoriel, nous apprendrons comment gérer les valeurs manquantes avec la bibliothèque dplyr. La bibliothèque dplyr fait partie d'un écosystème pour réaliser une analyse de données.

Remplacer les valeurs manquantes dans R

Dans ce tutoriel, vous apprendrez

subir une mutation()

Le quatrième verbe du bibliothèque dplyr est utile pour créer une nouvelle variable ou modifier les valeurs d'une variable existante.

Nous procéderons en deux parties. Nous apprendrons comment :

  • exclure les valeurs manquantes d'un bloc de données
  • imputer les valeurs manquantes avec la moyenne et la médiane

Le verbe mutate() est très simple à utiliser. Nous pouvons créer une nouvelle variable en suivant cette syntaxe :

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()

Exclure les valeurs manquantes (NA)

La méthode na.omit() de la bibliothèque dplyr est un moyen simple d'exclure les observations manquantes. Supprimer tous les NA des données est facile, mais cela ne signifie pas que c'est la solution la plus élégante. Lors de l'analyse, il est sage d'utiliser diverses méthodes pour traiter les valeurs manquantes.

Pour résoudre le problème des observations manquantes, nous utiliserons l’ensemble de données titanesque. Dans cet ensemble de données, nous avons accès aux informations des passagers à bord lors du drame. Cet ensemble de données contient de nombreuses NA qui doivent être prises en compte.

Nous allons télécharger le fichier csv depuis Internet, puis vérifier quelles colonnes contiennent NA. Pour renvoyer les colonnes avec des données manquantes, nous pouvons utiliser le code suivant :

Téléchargeons les données et vérifions les données manquantes.

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

Sortie :

## [1] "age"  "fare"

Ici,

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Donne le nom des colonnes qui ne contiennent pas de données.

Les colonnes âge et tarif comportent des valeurs manquantes.

Nous pouvons les supprimer avec na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Sortie :

## [1] 1045   13

Le nouvel ensemble de données contient 1045 1309 lignes, contre   pour l’ensemble de données d’origine.

Exclure les valeurs manquantes

Imputer les données manquantes avec la moyenne et la médiane

Nous pourrions également imputer (remplir) les valeurs manquantes avec la médiane ou la moyenne. Une bonne pratique consiste à créer deux variables distinctes pour la moyenne et la médiane. Une fois créées, nous pouvons remplacer les valeurs manquantes par les variables nouvellement formées.

Nous utiliserons la méthode apply pour calculer la moyenne de la colonne avec NA. Voyons un exemple

Étape 1) Plus tôt dans le didacticiel, nous avons stocké le nom des colonnes avec les valeurs manquantes dans la liste appelée list_na. Nous utiliserons cette liste

Étape 2) Nous devons maintenant calculer la moyenne avec l'argument na.rm = TRUE. Cet argument est obligatoire car les colonnes contiennent des données manquantes, ce qui indique à R de les ignorer.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Explication du code :

Nous passons 4 arguments dans la méthode apply.

  • df : df_titanic[,colnames(df_titanic) %in% list_na]. Ce code renverra le nom des colonnes de l'objet list_na (c'est-à-dire « âge » et « tarif »)
  • 2 : Calculer la fonction sur les colonnes
  • moyenne : Calculer la moyenne
  • na.rm = TRUE : ignorer les valeurs manquantes

Sortie :

##      age     fare 
## 29.88113 33.29548

Nous avons réussi à créer la moyenne des colonnes contenant les observations manquantes. Ces deux valeurs serviront à remplacer les observations manquantes.

Étape 3) Remplacer les valeurs NA

Le verbe muter de la bibliothèque dplyr est utile pour créer une nouvelle variable. Nous ne voulons pas nécessairement changer la colonne d'origine pour pouvoir créer une nouvelle variable sans le NA. mutate est facile à utiliser, il suffit de choisir un nom de variable et de définir comment créer cette variable. Voici le code complet

# 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))

Explication du code :

Nous créons deux variables, replace_mean_age et replace_mean_fare comme suit :

  • replace_mean_age = ifelse(is.na(age), Average_missing[1], age)
  • replace_mean_fare = ifelse(is.na(tarif), Average_missing[2],tarif)

Si la colonne age a des valeurs manquantes, remplacez-la par le premier élément de Average_missing (moyenne de l'âge), sinon conservez les valeurs d'origine. Même logique pour le tarif

sum(is.na(df_titanic_replace$age))

Sortie :

## [1] 263

Effectuer le remplacement

sum(is.na(df_titanic_replace$replace_mean_age))

Sortie :

## [1] 0

La colonne age d'origine comporte 263 valeurs manquantes tandis que la variable nouvellement créée les a remplacées par la moyenne de la variable age.

Étape 4) Nous pouvons également remplacer les observations manquantes par la médiane.

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)

Sortie :

Imputer les données manquantes avec la moyenne et la médiane

Étape 5) Un ensemble de données volumineuses peut contenir de nombreuses valeurs manquantes et la méthode ci-dessus peut s'avérer fastidieuse. Nous pouvons exécuter toutes les étapes ci-dessus dans une seule ligne de code en utilisant la méthode sapply(). Bien que nous ne connaissions pas les valeurs moyennes et médianes.

sapply ne crée pas de trame de données, nous pouvons donc envelopper la fonction sapply() dans data.frame() pour créer un objet de bloc de données.

# 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)))

Résumé

Nous disposons de trois méthodes pour gérer les valeurs manquantes :

  • Exclure toutes les observations manquantes
  • Imputer avec la moyenne
  • Imputer avec la médiane

Le tableau suivant résume comment supprimer toutes les observations manquantes

Bibliothèque Objectif Code
base Liste des observations manquantes
colnames(df)[apply(df, 2, anyNA)]
déplyr Supprimer toutes les valeurs manquantes
na.omit(df)

L'imputation avec moyenne ou médiane peut être effectuée de deux manières

  • Utiliser Appliquer
  • Utiliser sapply
Method Plus de détails Avantages Désavantages
Étape par étape avec postuler Vérifiez les colonnes manquantes, calculez la moyenne/médiane, stockez la valeur, remplacez par mutate() Vous connaissez la valeur de la moyenne/médiane Plus de temps d'exécution. Peut être lent avec un grand ensemble de données
Méthode rapide avec sapply Utilisez sapply() et data.frame() pour rechercher et remplacer automatiquement les valeurs manquantes par la moyenne/médiane Code court et rapide Je ne connais pas les valeurs d'imputation