Nettoyer et valider les données avec R

nettoyez et valider vos données

 

Après l’importation des données, et avant leur analyse à proprement parlé, la phase de nettoyage et de validation des données est indispensable ! Dans cet article, je vous propose de passer en revue, quelques étapes importantes de ce processus.

1. Rappels concernant l’importation des données

Lorsqu’on souhaite importer des données dans R, celles-ci peuvent être sous différents formats de fichiers, par exemple .txt, .csv, .xlsx, .tsv. Néanmoins, le format csv est largement répandu, car il permet de visualiser les données dans un tableur, sans pour autant dépendre d’un logiciel en particulier (Excel, google sheet, open office etc…).

 1.1 Importer un ficher csv

En Europe, les données au format csv utilisent généralement:

  • le point-virgule (semi colon) comme séparateur de colonnes,
  • la virgule (comma) comme séparateur de décimales.

importer données dans R

 

Mais il existe aussi des fichiers au format .csv qui utilisent :

  • la virgule (comma) comme séparateur de colonnes,
  • le point (dot) comme séparateur de décimales.

csv dans R

 

Pour importer correctement un fichier au format .csv dans R, il est nécessaire de connaître les caractères utilisés pour séparer les colonnes et pour séparer les décimales.

Si vous ne savez pas quels sont les caractères utilisés dans votre fichier à importer, ouvrez le fichier dans le bloc note : clique droit sur le fichier –> Ouvrir avec –> Bloc note.

 

Si votre fichier .csv est au format européen ( colonnes séparées par un point-virgule et une virgule pour séparer les décimales ), utilisez la fonction read.csv2() pour l’importer:

Par exemple, pour le jeu de données nommé AirPasengers1.csv, préalablement placé dans un dossier “data” du projet RStudio:

 

Pour construire automatiquement le chemin d’accès, on peut utiliser la fonction here() du package here :

 

Si votre fichier .csv utilise la virgule comme séparateur de colonnes et le point comme séparateur de décimales, utilisez la fonction read.csv() pour l’importer :

 

Voici l’aide sur ces deux fonctions :

csv dans R

import data R

 

1.2 Importer un ficher txt

Les données à importer peuvent également être au format.txt. Dans ce cas, les colonnes sont généralement séparées par une tabulation :

data texte dans R

 

Dans ce cas, en fonction du caractère employé pour séparer les décimales, vous pouvez employer les fonctions read.delim() and read.delim2() :

import txt data R

 

Par exemple :

 

1.3 Importer d’autres formats de fichiers

Selon le format de vos données, vous pouvez également utiliser les fonctions read_*() du package ‘readr’ :

 

readr package

D’après Data Import Cheat sheet

 

Ces fonctions ont l’avantage d’être plus rapides que les fonctions présentées précédemment, qui appartient au package utils .

Et si vos données sont au format. xlsx, vous pouvez utiliser la fonction read.xlsx(“filename.xlsx”, sheet_numb) du package xlsx.

 

2. Vérifier l’importation et la structure de vos données

 

Le code pour générer le jeu de données “people” est fourni à la fin de cet article.

2.1 Vérification de l’importation

Pour vérifier que l’importation des données s’est bien déroulée, j’utilise généralement les fonctions head() et tail() :

 

 

2.2 Contrôle de la structure :

Pour contrôler la structure des données, j’utilise la fonction str ()

 

structure data

Cette fonction est très pratique, car elle permet de connaître :

  • le format des données : ici un data frame
  • les dimensions du jeu de données : ici 10 lignes (observations) et 8 colonnes (variables)
  • le nom des variables : ici Name_FirstName, Sex, Age etc..
  • le format de ces variables : ici Name_FirstName, Sex et Hair sont des variables catégorielles (factor), l’Age est une variable numérique de type entier, Height est une variable numérique continue
    etc…

*Remarque* : Si vous ne voulez pas que les chaines de caractères soient converties en variables catégorielles dans R, vous pouvez utiliser l’argument stringsAsFactor = FALSE dans les fonctions d’importation :

 

3. Le format souhaité : tidy !

Pour pouvoir être manipulées et analysées de façon optimale dans R, les données doivent être au format tidy :

tidy data nettoyer et valider

C’est à dire avec :

  • une ligne par observation,
  • une variable par colonne,
  • et une valeur au croisement d’une ligne et d’une colonne.

 

4.Gérer les problèmes de structure

 4.1 Séparer une variable en deux colonnes:

Si, par exemple, vous souhaitez séparer la variable “Name_FirstName” en une colonne “Name” et une colonne “First Name”, vous pouvez le faire très simplement à l’aide de la fonction str_separate() du package tidyr qui fait parti du super package tidyverse :

La fonction inverse est la fonction unite().

 

4.2 Séparer les valeurs d’une colonne en deux lignes

Considérons le jeu de données suivant, avec dans la même colonne “Children” le nombre de garçons (B) et de filles (G) :

 

On pourrait vouloir créer une ligne pour le nombre de garçons (B) et une ligne pour le nombre de filles (G). Pour cela, on utilise la fonction separate_rows(), comme ceci :

 

 4.3 Quand le nom des colonnes sont des valeurs

Par exemple, dans le jeu de données people, les colonnes “Blue_Eye” , “Brown_Eye” , “Other_Eye ” sont en réalité des valeurs. Pour être en format tidy, il faudrait créer une variable “Eye_colour” avec les modalités “Blue”, “Brown” et “Other” :

L’astuce consiste à passer les données dans un format long avec la fonction gather(). Pour chaque personne, trois lignes sont alors créées. Une seule contient la valeur 1 dans la variable Count, en fonction de la couleur des yeux.

 

 

Dans un second temps, seules lignes avec un Count =1 sont conservées, puis la variable Count est supprimée.

Au final, le code utilisé est :

 

5. Modifier le nom des variables

Vous pouvez facilement modifier le nom des variables en utilisant la fonction name(). Par exemple pour changer “FirstName” en “Prenom” :

 

6.Les valeurs manquantes (NA) :

6.1 Recherche des valeurs manquantes

Une méthode simple pour explorer les données manquantes est d’utiliser la fonction summary()

missing data nettoyer et valider avec R

 

Une autre fonction très utile est la fonction df_status() du package funModelling qui renvoit, pour chaque variable, le nombre de valeurs égales à zéro, le nombre de valeurs manquantes, et le nombre de valeurs infinies (par exemple 1/0), ainsi que les pourcentages correspondant. Ici, appliquée au jeu de données heart_disease :

 

6.2 Gérer les valeurs manquantes

6.2.1 Supprimer les lignes comportant des NA

Pour ne conserver que les lignes du jeu de données ne comportant aucune donnée manquante, la fonction na.omit() peut être utilisée :

 

Le nouveau jeu de données ne contient plus de NA. Il ne comporte plus que 7 lignes, contre 10 dans le fichier original.

 

6.2.2 Remplacer les NA

Dans certaines situations, par exemple lorsque les données manquantes sont totalement aléatoires, on peut avoir envie de remplacer les NA par une moyenne, ou une médiane. Pour cela, on peut utiliser la fonction replace_na du package tidyr.

Par exemple, pour remplacer la valeur manquante de la variable Height, par la moyenne des valeurs :

 

Il n’y a plus de données manquantes.

Et on peut voir que la donnée manquante a été remplacée par la valeur 1.725556.

 

7. Identifier les valeurs aberrantes

7.1 Les valeurs numériques

7.1.1 Fonction summary()

Les valeurs numériques aberrantes peuvent être identifiées grâce à la fonction summary(), notamment en prêtant attention aux valeurs min et max :

 

Par exemple, on peut voir ici que la variable Age dispose de deux valeurs aberrantes avec un minimum à -1 et un maximum 253 !

 

7.1.2 Tableur de Rstudio

Pour identifier des valeurs numériques aberrantes, il peut aussi être utile, de visualiser la table de données dans le tableur de R Studio. Pour cela, cliquer sur le nom des données dans l’onglet Environnement, puis trier les valeurs :

nettoyer et valider data R

 

Pour ouvrir le tableur, vous pouvez aussi utiliser la fonction View()

 

7.1.3 Visualisations

Pour mettre en évidence des données aberrantes, il peut également être intéressant de réaliser des visualisations. On peut par exemple utiliser le code suivant pour ne sélectionner que les variables numériques et réaliser un dotplot pour chacune d’entre elles :

 

données aberrantes

Les visualisations permettent d’identifier les valeurs extrêmes, ici 253 pour l’âge et une taille de plus de 2 mètres.

7.2 Les variables catégorielles

Pour identifier d’éventuelles fautes de frappe, ou d’orthographe dans les modalités des variables catégorielles, vous pouvez utiliser la fonction levels() :

 

Ici, rien ne semble incorrect, mais si “Blond” avait été écrit “Blonde” dans certains cas, on verrait cette double orthographe.

Pour modifier les niveaux des variables catégorielles, vous pouvez vous consulter cet article.

Je vous recommande également l’utilisation du package stringr qui permet de nombreuses manipulations des chaînes de caractères. Vous trouverez sa cheat sheet ici :

 

8. Détecter les outliers

Un outlier, est une valeur ou une observation qui est « distante » des autres observations effectuées sur le même phénomène, c’est-à-dire qu’elle contraste grandement avec les valeurs  “normalement” mesurées. Un outlier peut être du à la variabilité inhérente au phénomène observé, il peut aussi être la marque d’ une erreur expérimentale, ou d’une erreur lors de l’entrée des données.

Selon les causes de cette valeur distante des autres, l’outlier peut être conservé ou supprimé.

Pour détecter les outlier, on utilise fréquemment un boxplot. Les outliers sont alors représentés sur le graph, par un point :

 

outliers

 

Pour rappels, les règles de lecture du boxplot sont les suivantes :

comment lire un boxplot

Pour connaître les valeurs des outliers, on peut utiliser la fonction boxplot.stat():

 

Ici seul 253 apparaît comme un outlier.

Pour connaître l’indice de la ligne comportant cette valeur outlier, on peut utiliser la commande suivante :

 

Ici, l’âge 253 se situe sur la ligne 4. Pour le vérifier :

 

Pour plus de détails sur la détection des outliers, vous pouvez consulter cet article :

 

8. Les jeux de données utilisés dans cet article

 

Conclusion

Et vous, quelles fonctions utilisez vous fréquemment lorsque vous nettoyer vos données ? Indiquez-les-moi en commentaire pour les partager.

En attendant, j’espère que cet article permettra aux débutants d’acquérir les bases, et les bons réflexes, pour nettoyer et  valider plus facilement leurs données.

Et si cet article vous a plus, n’oubliez pas de la partager 😉

 

Crédits photos : blickpixel

Continuez votre lecture 

Partager l'article
  •  
  •  
  •  
  •  
  •  
    25
    Partages
  • 25
  •  
  •  
  •  
  •  

11 commentaires

  1. Daniel OTRON Répondre

    Merci Claire pour cet article qui vient renforcer de façon coriace nos connaissance. Grand merci à toi Claire une de plus.

  2. Tu-Anh PHO Répondre

    Génial cet article où les différentes méthodes d’importation des données sont regroupées.

    Je suis néanmoins resté sur ma faim en ce qui concerne les nettoyages de données comme avec la fonction tsclean.

    Tu-Anh.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,
      tsclean est pour les données temporelles, c’est vrai que je n’ai pas abordé ce sujet. Je pense que je vais faire un article sur le package lubridate et je regarderai comment parler de cette fonction. Dans tous les cas, merci pour le partage.

  3. BANGOURA Répondre

    Bonjour et bonne année 2019. Je voudrais avoir la version pdf de vos cours sur R.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour, je n’ai pas de version pdf de mes articles, mais vous pouvez faire une impression “pdf” à partir de votre navigateur. Bonne continuation.

  4. BANGOURA Répondre

    Bonjour et bonne année 2019. Comment parameter mon logiciel R pour avoir une console de couleur noire?

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour, il suffit d’aller Tools –> Global options –> Appearance et choisir un thème.
      Bonne continuation

  5. Doni Répondre

    Bonjour Claire 🙂

    Merci pour tes articles parce que j’en ai déjà lus plusieurs sans jamais commenté mais je profite du coup de l’occasion pour te remercier d’un seul coup pour tout ce que j’ai déjà lu. Merciiiii !!!

    Une question toutefois, je ne parviens pas à saisir le sens des codes %in%, %>%, %blablabla% alors que je les vois partout. A quoi servent-elles, sont-elles indispensables ? Je n’ai pas trouvé d’articles à se sujet sur ton site et j’ai pas compris les explications sur les autres sites ouverts.

    Bonne journée

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour Doni,
      merci pour votre message.
      Le symbole %>% est appelé “pipe”, on peut le traduire par “et puis”. Dans l’exemple :
      mydata %>%
      mutate(my_new_var = my_var1 * 2)
      C’est un peu comme si on disait à R “prends mydata ET PUIS crée une nouvelle variable en multipliant par 2 les valeurs de la variable my_var1”.

      Le symbole %in% est utilisé par le package dplyr pour dire “dans cette condition” ou “appartenant à cette condition”. Par exemple :
      iris %>%
      filter(Species %in% c(“setosa”, “virginica”))

      On pourrait traduire par “prends le jeu de données iris ET PUIS sélectionne (fonction filter) les lignes dont la variable Species appartient à setosa ou a virginica”.
      C’est un peu expliqué dans cet article : https://wp.me/p93iR1-BV
      J’espère que ça vous aide.
      Bonne continuation

  6. Doni Répondre

    Bonjour Claire.

    Je n’avais pas reçu le mail de la notification pour ta réponse mais je viens d’en prendre connaissance. Merci pour ces informations, je vais porter mon attention sur le lien que tu m’as transmis. Pour ce qui est de ton second exemple, j’avais l’habitude de la coder ainsi :
    Set_Vir<-c(iris[iris$species=="Virginica",],iris[iris$species=="Setosa"])

    Mais je pense que l'utilisation de ces symboles sera plus pratiques.

    Merci bien 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *