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.
Dans ce tutoriel, vous apprendrez
- subir une mutation()
- Exclure les valeurs manquantes (NA)
- Imputer les valeurs manquantes (NA) avec la moyenne et la médiane
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.
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 :
É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 |