Un grand coup de balai
Le nettoyage de données est un défi en bioinformatique. Entre les personnes qui veulent réinventer les standards et les personnes qui ne savent pas les suivre, nous nous trouvons souvent en train de nettoyer, de formater et de changer la structure de nos données pour qu'elles soient conformes à une certaine norme ou compréhensibles par nos programmes.
Il existe une grande variété de types de donnés, et l'un des plus couramment utilisés est le format TSV (Tabulation-Separated Value): il permet de structurer assez facilement les données et reste compatible avec la plupart des outils bioinformatiques. Ce format est très répandu car il ressemble un peu à celui d'Excel pour les non bioinformaticiens : un tableau avec des lignes et des colonnes 😉 . Il existe d'ailleurs une fonction permettant d'importer ou d'exporter en TSV via Excel et cela restant assez transparent pour des utilisateurs non avertis.
NB : vous avez peut être rencontré le format CSV (Comma-Separated Value), similaire au TSV mais où on remplace le caractère de séparation '\t' par un ',' (virgule par tabulation).
Un problème aléatoire
Vous travaillez pour une équipe de recherche et une personne du labo a recueilli les données démographiques de vos patients, à savoir leurs noms et nationalités ainsi que quelques autres données les concernant. Elle a regroupé tout cela dans un fichier TSV.
Vous voulez construire une base de données de ces patients pour pouvoir y attacher les données expérimentales de votre équipe. Cela permettra à votre laboratoire d'être plus efficace pour rechercher les résultats de vos expériences et certaines informations rattachées à chaque personne.
Jetons alors un œil au ficher TSV :
1 2 3 4 5 6 7 8 9 10 11 12 |
wget https ://raw.githubusercontent.com/bioinfo-fr/data_samples/master/patients.csv # on télécharge le fichier head patients_sample_1.csv # on regarde le début Patient id Name Lastname gender Nationality Adress Department phone number email 74698 Victor Garnier Women EN 44, rue de Gaudin 64441 Leblanc Lot et Garonne +33 (0)3 10 92 45 51 genevieve.picard@example.fr 47092 Constance Guillaume w EN 947, chemin de Louis 60099 Schmitt-sur-Hernandez Guyane 0308465583 . 8122 Lucie Bruneau F DE rue Lucie Hardy 87449 Dijoux-sur-Mer Alpes-Maritimes 01 96 20 51 87 19407 Chantal Sauvage women German 278, rue de Perrin 73401 Jourdan-sur-Pires Alpes-Martitimes +33 (0)5 80 07 60 37 14426 Lucas Aubry Women Français 6, chemin Albert 12338 Jacquotdan Maine et Loire 0164292815 68129 Noël Poirier female french boulevard Dupre 67125 Marty Alpes-Haute-Provence +33 3 28 43 72 39 . 1954 Marcelle Ferreira Female DE 479, boulevard Frédéric Paul 80 058 Pires Seine-Saint-Denis 02 42 62 83 55 alphonse97@example.com 10238 Simone Riou m Français 893, rue Brigitte Etienne 05 754 David Lot et Garonne 0666539963 47653 Agathe Gallet Male FR 5, avenue Adélaïde Samson 97 590 Dubois-sur-Mer gironde +33 4 24 85 82 02 |
NB : les données sont générées par ce script qui utilise python-faker, un générateur de données aléatoires.
Les données
On peut tout de suite remarquer que les données sont inconstantes. Par exemple, pour la colonne "gender", il y a au moins 6 façons de noter que le patient est une femme : "Women", "women", "w", "female", "Female" et "F".
Je dis au moins, car le fichier est assez important, et nous ne voulons pas passer une après-midi à répertorier toutes les façons dont ont été représentées les "Femmes".
Ce problème ici fictif est assez courant quand les données proviennent de plusieurs localités différentes, bien que cela puisse aussi arriver au sein d'un même groupe : plusieurs personnes travaillent sur le même fichier et ont des façons de noter les mêmes choses différemment, sans compter les fautes de frappes. Cela ne nous pose pas vraiment de problèmes à nous "humains", nous pouvons rapidement distinguer une femme d'un homme avec ce ficher, un seul petit coup d'oeil suffit. Mais pour un ordinateur, F et Female sont aussi différents que F et Male.
La solution du barbu
C'est parti, on utilise la ligne de commande pour analyser notre fichier et repérer les erreurs. Cela peut être long et fastidieux, mais grâce à quelques astuces, on peut vite trouver les différentes valeurs pour la colonne "gender":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cut -f 4 patients.csv | sort | uniq -c 34 F 29 Female 26 M 41 Male 71 Man 41 Men 40 Woman 34 Women 43 f 26 female 1 gender 31 m 27 men 24 w 33 women |
Ok donc 8 façons de dire : "Femme", SU-PER !!! Oui c'est plutôt ironique, et les personnes ayant déjà fait du nettoyage de données savent que c'est assez courant et comment dire, énervant :p
Il faut donc choisir une valeur et remplacer les autres. Au hasard, "f", c'est la valeur la plus utilisée. Pour remplacer "Female", très facile, on vérifie combien d’occurrences de Female se trouvent dans le fichier, car on ne voudrait pas remplacer d'autres champs par erreur, le nombre devrait correspondre à celui que nous avons trouvé au dessus, à savoir 29.
1 2 |
grep "Female" patients.csv | wc -l 29 |
Bien, on va pouvoir remplacer facilement "Female", mais bon après on a aussi "F"
1 2 |
grep "F" patients.csv | wc -l 214 |
Beaucoup moins bien… il faut donc extraire la colonne dans un autre fichier, remplacer tous les "F", "Woman", … et ré-injecter la colonne dans le fichier original… ou faire un programme un peu plus complexe. Pas bien dur en soi, c'est faisable… mais cela risque de prendre pas mal de temps, vu qu'il faut le faire pour toutes les colonnes et moi, ben je suis quelqu'un de paresseux…
La solution du pro
Développé à la base en open source par une entreprise (Metaweb) sous le nom de Freebase Gridworks. Racheté par Google sous le nom de google-refine. A la fin du support annoncé par Google, le code source a été transféré en open source et le projet s'appelle aujourd'hui Open Refine. C'est le produit parfait pour travailler avec ce genre de données et de problèmes.
Une fois l'installation faite (assez facile d'ailleurs, des exécutables sont à votre disposition sur leur site), OR (Open Refine) ouvre une fenêtre de navigation dans votre navigateur web favori et il n'y a plus qu'à importer vos données. A savoir qu'OR supporte de nombreux type de données tels que TSV, JSON, RDF, XLS, XML … mais ne nous égarons pas 😉 Allez hop, on reprend notre problématique :
Une fois nos données importées, on clique sur la colonne "gender" > Facet > text facet.
Dans la colonne de gauche, OR nous désigne les différentes manières de décrire "gender". On clique sur "edit" sur celles qu'on veut changer. Hop 30 secondes plus tard, on a tout édité et il ne nous reste plus que "m" et "f".
Il nous reste à faire la même chose pour les départements, les nationalités et notre fichier sera déjà plus cohérent…
A savoir que toutes les transformations appliquées sont enregistrées, et vous pourrez facilement revenir à une version antérieure. Il sera aussi possible d'appliquer ces transformations à un autre fichier, pratique si on vous fournit le même type de fichier.
Pour aller plus loin
OR offre beaucoup plus. Par exemple vous voulez filtrer vos patients de l'identifiant 10 000 à 15 000 ? Sélectionnez Facet > Numeric facet et vous aurez votre résultat. Vous pouvez aussi appliquer des transformations beaucoup plus complexes.
OR dispose de son propre langage, très proche du JavaScript, il vous permettra de scripter la sélection ou le remplacement des données. En supposant par exemple que vous voulez faire une suite d'études seulement sur les personnes d'origine française ou allemande, vous pouvez facilement ajouter une colonne qui se mettra à "Valid" si la colonne "Nationality" contient FR ou DE seulement. Les possibilités sont multiples et cela vous fera gagner du temps.
Je vous invite à regarder ces 3 tutoriels vidéos qui vous donneront un aperçu plus approfondi des possibilités d'OR.
Merci aux relecteurs : Estel, Nisaea, Nicolas et Hedjour.
Laisser un commentaire