Préparer un jeu de données
Article mis en ligne le 15 décembre 2021

par Philippe MICHEL

Les données qu’on vous confie sont TOUJOURS mal ficelées, avec des aberrations dans la présentation, du texte dans les données numériques etc. Voici quelques conseils en vrac (enfin à peu prêt dans l’ordre où vous allez en avoir besoin) pour gagner du temps ensuite. Cela va sans dire mais ça fait toujours du bien de le rappeler : faites des sauvegardes. De tout. Tout le temps. Sur plusieurs supports. Pour les thésards qui remplissent leur tableau Excel : lisez bien la première partie de l’article, ça évitera de me mettre de mauvaise humeur.

Avant tout

Quand on vous envoie un fichier à traiter, le plus souvent un tableur, il faut avoir avec une liste des variables avec :

  • le nom (ex : age, satisfaction) en caractères simples, sans accent. Sinon il est toujours possible de nettoyer les noms avec le package Janitor
  • Ce qu’elle représente (âge du patient, ressenti du patient face à l’accueil dans le service...)
  • le type de variable (numérique, catégorielle...)
  • les valeurs possibles ( 18 à 120, très content, un peu content, pas content, très mécontent)
  • La variable discriminante pour la question principale & éventuellement quelques questions secondaires avec chacune sa variable, celle qui va servir pour les tests, par exemple vivant/mort mais c’est rare.
  • Les variables à étudier en priorité & celles qu’on peut oublier. Tant que vous n’avez pas ces informations, ne faites rien.

Dans un monde idéal, chaque variable doit avoir trois intitulés :

  1. Son code "age"
  2. Son nom vrai, celui qui apparaîtra dans le tableau final "Âge du patient"
  3. La question du formulaire de recueil ’Quel est votre âge (en années) ?"

Dans votre tableur

Les premières vérifications sont à faire dans votre tableur préféré. Tout peut se faire dans R mais c’est plus simple comme ça. De plus vous pouvez toujours renvoyer le fichier corrigé à un correspondant, il pourra le lire. Pour commencer, mettez de coté une copie du fichier original, une erreur est vite arrivée. Colonne par colonne, il faut contrôler les données (pour mémoire les cas sont toujours en ligne, les variables en colonne). La fonction "AutoFiltre" permet d’avoir facilement la liste des valeurs contenues dans la variable. Par exemple la variable "age" (sans accent !) ne doit contenir que des chiffres allant de 0 à 120. S’il traine dedans un "1254" ou "oui"...

Homogénéisez les réponses

Par exemple les mélanges de "Oui", "oui", "OUI" sont très fréquents. sans parler du "oui " avec une espace... Il y a souvent des cases vides dans le tableau (et à mon avis après quelques heures à corriger des erreurs flagrantes, il n’y a pas que le tableau qui a des cases de vide !). Remplacez-les par des NA, plus lisibles (sauf opposition de l’auteur). De plus ça vous permettra de voir facilement les cellules remplies par une espace, cause d’erreur très fréquente. Reste ensuite le problème des questions à réponse ouverte. Si il y a visiblement deux ou trois réponses qui reviennent souvent, auquel cas il me parait légitime de ne garder que celles ci & de regrouper les autres sous un un intitulé "autres". Dans tous les cas il faut voir avec l’investigateur ce qu’il faut faire. Ne prenez pas de décision qui conduisent à transformer les données sans avoir l’accord de votre correspondant. De toute façon, une fois les corrections purement mécaniques effectuées il vous faudra voir l’investigateur pour savoir :

  • Quelle est la variable discriminante (bon courage, il me faut à chaque fois plusieurs jours pour avoir une réponse) etc. (voir plus haut)
  • Que faire des réponses ouvertes.
  • Lui montrer les données qui paraissent aberrantes, s’il y a une correction possible (un poids de naissance de 430 g peut correspondre à un grand prématuré ou à une faute de frappe).
  • Que faire des cas très mal remplis, pleins de données absentes. Il est parfois plus simple de les supprimer,
  • Se faire payer un café.

Quand tout vous semble correct, faire une importation dans R et tester la data.frame via str(nomfichier) ou summary(monfichier). Vous allez alors découvrir encore de nombreuses erreurs donc retour au tableur. et ainsi de suite. Tout est bon : il est temps de simplifier votre tableau. Créez une copie et sur cette dernière enlevez toutes les variables inutiles en particulier le nom etc. Il faut garder ces variables le plus longtemps possible car elle peuvent servir pour corriger une donnée, discuter de tel ou tel cas avec l’investigateur... Mais une fois le tableau correct ça va vous faire du bruit, des données inutiles. Donc on supprime mais il vous reste une version complète du tableau quelque part. Gardez quand même la variable d’index (classiquement nommée ID) tout du long du travail, ça peut toujours être utile. Dés que c’est correct, faite une copie du fichier (en .csv c’est le plus simple) & sauvegardez.

Noms de variables

R est sensible à la casse : Nom est différent de nom ce qui peut être une source d’erreur & surtout de difficulté à la saisie. Sans parler des espaces ou des lettres accentuées, pas complètements interdites mais ça marche mieux sans. Comme dit plus haut, un petit coup de janitor & vous avez des noms de variables (presques) propres (voir Vaudor L (2020). "Janitor : nettoie-moi cette table (et qu’elle brille !)." _R-atique : Analyse de données avec R_. )
 mon_dataframe %>% clean_names()

Types de variables

Il est temps de reprendre toutes les variables & de vérifier leur type. Je m’explique : la variable age doit être numérique, ça semble évident mais certaines données chiffrées doivent être traitées comme des données factorielles ordonnées. C’est la cas par exemple de beaucoup de scores qui vont de 1 à 5 (au hasard) mais pour lesquels une moyenne n’a pas beaucoup de sens. De plus garder ces données en numérique sous entend qu’il y a autant de différence entre 2 et 3 qu’entre 3 et 4 ce qui n’est pas toujours vrai pour un score (Exemple pour les médecins : un Glasgow qui passe de 6 à 7 n’a que peu de sens clinique, de 7 à 8 ça change tout). Par contre dire il y a x cas avec un score de 1 et y cas ont un score de 2 etc. peut avoir plus de sens.
Une transformation rapide s’impose alors par :
 monfichier$score <- as.factor(monfichier$score)

Pour les variables factorielles, vérifier l’ordre des facteurs. Par défaut, R classe les niveaux par ordre alphabétique ce qui n’est pas toujours pertinent. Une variable oui/non sera classé non, oui ce qu’on peut vérifier simplement :
 levels(monfichier$content) [1] "non" "oui"
Or il est souvent plus simple & plus parlant d’avoir les oui en premier dans un graphique par exemple. On va donc corriger l’ordre des variables en transformant une variable factorielle simple en variable ordonnée. Un petit exemple pour la variable content :

  1.  > levels(monfichier$content)
  2. [1] "non" "oui"
  3. > monfichier$content) <- ordered(monfichier$content, c("oui","non"))
  4. > levels(monfichier$content)
  5. [1] "oui" "non"

Télécharger

Quand votre jeu de données est correct, sauvegardez le .csv et allez prendre un café, vous l’avez bien mérité. Plus de la moitié du travail est faite.

Une petite aide : ma fonction debutph qui importe un csv, transforme les variables character en factor & normalise les noms des variables

  1. debutph <- function(fich) {
  2.   df <- read_csv(
  3.     fich,
  4.     col_names = TRUE,
  5.     na = c("", "NA"),
  6.     lazy = FALSE,
  7.     show_col_types = FALSE
  8.   ) %>%
  9.     mutate_if(is.character, as.factor) %>%
  10.     janitor::clean_names()
  11.   names(df) <- str_replace_all(names(df), "_", ".")
  12. }

Télécharger