Sur un billet précédent, j’ai évoqué le nettoyage de données sous TextMate ; en réalité, n’importe quel éditeur de texte brut permettant d’effectuer des substitutions de texte par expressions régulières fera l’affaire.
J’explique ma méthode ici car, comme le disait à juste titre un enseignant, en pratique, le data mining et le data cleaning sont tout aussi importants que ce que l’on enseigne en data analysis et data visualization. En revanche, le contenu de ce billet est un peu obscur si l’on ne connaît rien aux expressions régulières. Je tente d’expliquer mes manipulations ci-dessous, mais cela reste assez difficile à déchiffrer, et la seule manière d’apprendre consiste à reproduire l’exercice. La syntaxe utilisée pour les expressions régulières est la syntaxe Oniguruma, et j’ai réuni les commandes dans un fichier texte commenté.
Voici mon protocole :
-
Copier-coller du fichier de base dans un document texte brut. Je ne mets ni la source, ni mon fichier, à disposition, pour ne pas gêner les personnes nommément citées dans le document.
Dans ce qui suit, les lignes
F:
renvoient aux expressions de recherche (Find) et les lignesR:
aux expressions de remplacement (Replace). -
Retrait des en-têtes (“Concours commun…”), des pieds-de-page (“Page X sur 41”) et des en-têtes de tableaux (“Candidat, Nom, Prénom, Rang, Affectation”) :
F:(.*)\nCONCOURS (.*)\n(.*)Affectation
R:{ø} (laisser vide)Comme ceci. On vient de retirer tout ce qui ne concerne pas directement les candidats. Les sigles ésotériques correspondent aux sélecteurs standard en expressions régulières pour “tout caractère en toute quantité” –
(.*)
– et retour à la ligne (\n
). Les parenthèses sont superflues, je les garde pour la lisibilité. Les parenthèses servent à mémoriser le texte sélectionné par l’expression, on s’en sert plus bas. -
Retrait manuel du premier en-tête et du dernier pied-de-page dans le fichier, qui ont “résisté” au nettoyage précédent.
-
Soyons malins : chaque candidat possède un numéro d’identification à cinq chiffres, et les rangs de classement s’arrêtent à 1025, donc à quatre chiffres… Donc si je passe une commande “insérer un retour à la ligne avant chaque nombre à cinq chiffres”, tout ira bien, je me retrouverai avec un(e) candidat(e) par ligne de fichier.
F:([0-9]{5})
R:\n$1Comme cela.
[0-9]{5}
capture le numéro du candidat,$1
le restitue après avoir inséré un saut de ligne (et je supprime un espace situé avant le numéro d’identification au passage, pour avoir des données vraiment propres). -
En regardant le résultat, j’aperçois de légères erreurs causées par le copier-coller sauvage depuis un document PDF : des espaces persistent là où j’ai besoin d’avoir des tabulations, comme ici… Je rectifie avec une commande qui transforme les espaces en tabulations entre le numéro d’affectation et le nom de famille du candidat.
F:([0-9]{5}) (la ligne se finit par un espace)
R:$1\tVous l’avez deviné,
\t
insère une tabulation. -
Soyons précis… Je remarque qu’il reste des espaces là où l’on devrait avoir une tabulation, entre le rang du candidat et le choix d’établissement. Je remarque cela grâce aux caractères invisibles, affichés dans cet exemple. Un petit défaut à supprimer, donc.
F:
([0-9])
(la ligne se finit par un espace)
R:$1\tC’est la même manipulation qu’au-dessus… et j’obtiens une soixantaine de remplacements. Heureusement que je l’ai vu, cela aurait gravement affecté mon import Excel.
-
Restons méfiants… En regardant les espaces, j’aperçois le même problème de l’autre côté du rang, entre le prénom et le rang. Même manipulation, donc, mais “à l’envers”.
F: ([0-9]) (avec un espace avant le rang)
R:\t$1La tabulation est rajoutée avant le rang. CQFD. L’éditeur me prévient qu’il a effectué quelques remplacements de plus.
-
Je pense avoir terminé : je sauvegarde en
.txt
et importe sous Excel au format tab-delimited.Je trouve visuellement deux erreurs sur 1025 lignes de données, que je corrige à la main ; nettoyage réussi et terminé, l’analyse peut commencer ! Temps total de la manipulation : environ cinq minutes. La même opération effectuée “manuellement”, ligne par ligne, sous Excel, aurait pris très longtemps…
J’ai déjà nettoyé de très gros volumes de données par expressions régulières : ce système est extrêmement flexible, et l’on peut monter dans des gammes de complexité assez inouïes (ce qui est présenté ici correspond vraiment à une pratique très basique). Je ne suis naturellement pas payé par Macromates pour vanter les louanges de leur logiciel ; encore une fois, tout logiciel avec caractères invisibles et expressions régulières fera l’affaire (et c’est encore mieux si le logiciel propose aussi la colorisation de syntaxe ainsi que des raccourcis clavier efficaces).
À défaut d’un éditeur séparé, on peut utiliser les expressions régulières directement sous R ou sous Stata.
(Question-bonus : pourquoi se donner tant de mal et ne pas se contenter de remplacer les espaces par des tabulations ? Parce que les noms de famille incluent aussi des espaces…)
OpenEdition vous propose de citer ce billet de la manière suivante :
François (15 août 2010). Nettoyage de données. Polit’bistro. Consulté le 4 décembre 2024 à l’adresse https://doi.org/10.58079/symd
C’est vrai que les expressions régulières sont difficiles d’accès au départ… Le Site du Zéro propose une initiation en français plutôt bien faite (appliquée à du PHP, mais la syntaxe reste la même) : partie 1 et partie 2