class: center, middle, inverse, title-slide # Fake news à l’épreuve des faits ## 3 - Nettoyer les données ### Sylvain Lapoix & Sarah Mersch ### DW Akademie - 26/09/2020 --- layout: true <div class='my-footer'><span>DW-A - DDJ 3 - 26/09/2020</span> <center><div class=logo><img src='https://github.com/datactivist/slides_datactivist/raw/master/inst/rmarkdown/templates/xaringan/resources/img/fond_noir_monochrome.png' width='100px'></center></span></div> --- background-image: url("https://media.giphy.com/media/l2JdUqdX379mOqoq4/giphy.gif") class: center, top, inverse ## Nettoyer les données --- background-image: url("https://media.giphy.com/media/3o7buh0sx5p7qrnJ5u/giphy.gif") class: center, top, inverse ### Selon vous, qu'est-ce qu'une ### "*donnée sale*" ? --- ### Une donnée "sale" Que ce soit pour des raisons techniques ou organisationnelles, il arrive que les données fournies en format tabulaire ou scrapées soient jugées "sales". Une donnée est jugée sale quand son format gêne son utilisation, que ce soit par un humain ou par une machine. Plusieurs dimensions d'une base de données peuvent contribuer à sa saleté : * une source manquante, défectueuse, imprécise ; * des têtières incompréhensibles, redondantes, incomplètes ; * des données imbriquées, mal formatées, lacunaires, excédentaires ; * des colonnes mal agencées, des lignes incohérentes, une mauvaise architecture... --- ### Une "donnée propre" ? Une "donnée propre" est une donnée qui répond à quelques critères qui assure sa lisibilité et son usage sans déperdition de sens. Pour en rester aux critères principaux : * une donnée est propre quand elle est reconnue par la machine pour ce qu'elle est ; * une donnée est propre quand elle est lisible par l'utilisateur·rice ; * une donnée est propre quand elle permet de faire les calculs nécessaires. -- Autrement dit : **une donnée propre est souvent une donnée transformée par rapport à sa source suivant des besoins précis**. --- ### Pourquoi nettoyer ses données ? .pull-left[Le *"travail de balayeur"* que s'avère être le nettoyage n'est pas une petite tâche : [d'après des entretiens menés par le New York Times en 2014](https://www.nytimes.com/2014/08/18/technology/for-big-data-scientists-hurdle-to-insights-is-janitor-work.html), il engouffre 50 à 80% du temps de travail des data scientists. En tant que datajournaliste, le nettoyage constitue une étape essentielle de fiabilisation des données utilisées. Autrement dit : **nettoyer ses données est une étape clef du travail de vérification dans la démarche datajournalistique**.] .pull-right[ ![](./img/nyt_janitorwork.png) ] --- ### Une méthodologie de nettoyage Je vous propose une méthodologie en quatre étape pour s'assurer que vos données sont propres (c'est-à-dire schématiquement : lisibles et prêtes à être utilisées). A chaque étape, il s'agira de se poser une ou deux questions clefs pour savoir quoi faire : 1. est-ce que la source est accessible ? est-ce que la base de données originales est accessible ? 2. est-ce que je comprends la têtière ? est-ce que je comprends la nature des données que contient ma base ? 3. est-ce que les donneés sont lues correctement ? 4. est-ce que je peux faire les calculs dont j'ai besoin ? -- **Il n'existe pas de méthode miracle ou universelle** : de même que toutes les bases de données ont leurs propres lacunes, chaque besoin nécessitera une mise en forme différente. Pour paraphraser [Hadley Whickam](https://r4ds.had.co.nz/tidy-data.html) paraphrasant [Léon Tolstoï](https://dicocitations.lemonde.fr/citations/citation-116915.php) : > *Toutes les bases de données propres se ressemblent, mais chaque base de données sale l'est à sa manière.* --- background-image: url("https://media.giphy.com/media/3oFyCVxsQn6RBa0r5u/giphy.gif") class: center, top, inverse ## 1. Conserver la source --- ### Nettoyer, un sacré chantier ! Le nettoyage n'est pas une opération anodine : **vous allez modifier en profondeur votre base de données suivant vos critères dans le cadre d'une analyse spécifique**. De telle manière que les producteur·rices de la base, d'autres datajournalistes ou vous-même dans un futur proche ne seriez pas capable de reconnaître le fichier ! Conserver la source a plusieurs avantages : * retrouver les données de base en cas d'erreur ; * citer l'origine de votre analyse sans vous tromper ; * situer votre source dans le temps et par rapport à d'autres données comparables. -- Raison pour laquelle, la première étape de la méthodologie consiste à s'assurer de **conserver les données d'origine dans leur état initial à portée de main à tout moment**. --- ### Sourcer comme un pro .pull-left[ ![](./img/googlesheets_onglet.png) ] .pull-right[Pour répondre à ces besoins, nous allons utiliser la fonctionnalité "onglets" de Google Sheets, qui permet de réunir plusieurs feuilles dans un même document. Nous allons procéder en trois étapes : 1. renommer l'onglet principal **source** ; 2. dupliquer cet onglet pour créer une feuille de travail ; 3. réunir les informations sur la base dans un onglet dédié, **metadata**, avec trois infos : * *nom* de la source ; * *lien* de téléchargement ; * *date* de téléchargement.] --- ### Première application Penchons-nous [sur les données de l'OMS sur la tuberculose](https://www.who.int/tb/data/en/) et appliquons la méthodologie : 1. téléchargez ; 2. importez ; 3. renommez ; 4. dupliquez ; 5. créez un onglet de métadonnées. ![](./img/who_tb.png) --- background-image: url("https://media.giphy.com/media/L0aWDywDu1ziw/giphy.gif") class: center, top, inverse ## 2. Comprendre les données --- ### Vocabulaire descriptif ![](./img/tidydata.png) 1. **la base de donnéees** est la structure qui accueille les données ; 2. **les variables** sont les caractéristiques renseignées (généralement disposées en colonne) ; 3. **les observations** sont les individus sur lesquels des données sont collectées (généralement disposées en lignes) ; 4. **les valeurs** sont les valeurs existants pour chaque variable dans une même base de données. 5. **la donnée** (ou **point de données**) est la *valeur* prise par une *variable* pour une *observation* dans une *base de données*. --- class: center, top, inverse ### Et vous, que comprenez-vous des données ? ![](./img/who_tb.png) Que signifient les variables ? Que signifie le titre ? A quoi correspondent les observations ? --- ### Tout renommer .pull-left[ Les données sont souvent présentées suivant les préférences des personnes qui les ont produites. Dans votre tableau, vous êtes comme chez vous, **il faut donc que les données vous parlent et parlent aux gens avec qui vous travaillez**. Renommer le fichier et les têtières est essentiel pour vous orienter dans vos fichiers et dans votre tableau. Pour savoir à quoi elles correspondent, il vous sera parfois nécessaire de vous pencher sur le *dictionnaire des variables* ou les *métadonnées*. [Comme ici pour l'OMS](https://www.who.int/tb/country/data/download/en/) :] .pull-right[ ![](./img/who_tb_metadata.png) ] --- #### Aparté : les filtres, principe généraux .pull-left[ Quand nous avons trop d'*observations*, il peut être utile ne conserver que celles qui correspondent à certaines *valeurs* d'une ou plusieurs *variables*. En traitement de donneés, c'est ce qu'on appelle : créer un .red[**filtre**]. Pour se faire, il faut sélectionner les donneés à filter et cliquer sur l'icône en forme d'entonnoir à droite de la barre d'outils : ![](./img/filtre_icone.png) Quand on clique sur le bouton .red[**filtre**], des flèches apparaissent à côté du nom des variables. ] .pull-right[ Il suffit de cliquer sur une valeur dans la liste pour cocher ou la décocher ou bien de cliquer sur les autres options pour tout sélectionner ou tout effacer puis valider sa sélection avec *OK* : ![](./img/filtre_menu.png) ] --- .pull-left[ Le dictionnaire des variables des données sur la tuberculose de l'OMS contient beaucoup d'informations qui ne nous intéressent pas : 495 variables alors que notre base de données n'en comporte que 47. Or, la deuxième variable, *dataset*, laisse deviner que chaque nom de ce dictionnaire est rattaché à un jeu de données. Nous pouvons donc filter en ne conservant que la valeur *Estimates* qui correspond à notre jeu de données : ] .pull-right[ **Précisions techniques** 1. le filtre ne créé qu'une *"vue"*, c'est-à-dire une liste des observations conservées suivant les critères fournis. Un filtre ne modifie jamais le contenu d'une base. 2. pour désactiver un filtre, il suffit de recliquer sur l'icône filtre ; 3. vous pouvez enregister un filtre en sélectionnant l'option correspondante en cliquant sur la flèche à côté de l'icône filtre. ] ![](./img/filtre_vu.png) --- ### Lisibilité : se concentrer sur l'essentiel .pull-left[ Rendre une base de données lisibles, c'est aussi retirer ce qui est superflu : **plus une base est dépouillée, plus elle est lisible et facile à manipuler**. Pour les classiques : * **les métadonnées mal placées** peuvent être coupées et collées dans l'onglet *metadata* ; * **les têtières à étage / fusionnée** que l'on peut intégrer au nom des variables ; * **les variables redondantes** : ne gardez que la variable qui renseigne le mieux ; * **les variables inutiles à votre analyse**. ] .pull-right[*Dans notre exemple* (la base de données de l'OMS sur la tuberculose), on peut ainsi remarquer que : * les variables *iso* ne font que reprendre le nom du pays ; * les variables *100k* sont des ratio qui peuvent être recalculés manuellement avec la population et le nombre de cas ; * les données croisées avec d'autres maladies ne servent que si l'on étudie le rapport entre tuberculose et VIH ; * etc. ] --- background-image: url("https://media.giphy.com/media/LwHkZcEhYZYFhDrh8X/giphy.gif") class: center, top, inverse ## 3. Nettoyer les données --- ### Parlons football ! Jetons un oeil au palmarès de la CAN [disponible sur Wikipedia](https://fr.wikipedia.org/wiki/Coupe_d%27Afrique_des_nations_de_football#%C3%89quipes) : ![](./img/can_palmares_wikipedia.png) Pour *l'oeil humain*, le tableau est très propre et lisible. --- ### Dans l'oeil de la machine Mais quand nous récupérons ces données et que nous les importons dans Google Sheets, ce n'est plus la même histoire ([source](https://docs.google.com/spreadsheets/d/1AwemAZJimK3FZSCiPhrqK5dSC0TYbuBTb5Nl5ivtUUk/edit#gid=1893205433)) : ![](./img/can_palmares_scrape.png) -- Quels problèmes remarquez-vous dans le tableau ?* .footnote[\* *Il va falloir se mettre à la place d'un ordinateur pour tout trouver* ...] --- ### Quatre problèmes, quatre solutions Nous allons ici nous concentrer sur quatre problèmes qui vont amener à quatre opérations de nettoyage différentes : .pull-left[ 1. il y a des signes en trop (notamment les étoiles) ; 2. il y a des colonnes en trop (vide, en l'occurrence) ; 3. il y a des plusieurs données dans certaines cellules à séparer (deux scores dans une cellule) ; 4. il y a des données dans certaines cellules que nous aimerions extraire (AP et TAB). ] -- .pull-right[ 1. trouver / remplacer ; 2. supprimer des colonnes ; 3. scinder une colonne suivant un délimitateur ; 4. tester une chaîne de caractère avec un modèle. ] --- ### Nettoyage 1 : trouver / remplacer La plupart de ces erreurs peuvent être corrigées par des manipulations .red[**trouver/remplacer**]. Sous Google Sheets, l'interface est accessible avec un raccourci `Contrôle + H` : .pull-left[![](./img/FindReplace.png)] .pull-right[![](./img/FindReplace2.png)] --- ### Nettoyage 1 : exemple .pull-left[Pour supprimer les étoiles ("\*") qui empêchent la lecture et la comparaison des données, il nous suffit d'utiliser .red[**trouver/remplacer**] en remplaçant l'étoile par ... rien ! ![](./img/search_replace_config.png) ] .pull-right[Avant : ![](./img/search_replace_avant.png) Après : ![](./img/search_replace_apres.png) ] --- ### Nettoyage 2 : supprimer des colonnes .pull-left[Pour supprimer les colonnes, vous pouvez utiliser le menu qui apparaît soit en cliquant sur la flèche à côté du nom de la colonne, soit d'un clic droit au même endroit. L'option .red[**supprimer la colonne / delete column**] permet de supprimer cette colonne et son contenu de la base. Notez que vous pouvez supprimer (ou créer) plusieurs colonnes d'un coup en les sélectionner : cliquez sur la première, maintenez la touche *maj / shift* et cliquez sur la dernière puis accédez au menu comme pour expliqué plus haut.] .pull-right[ ![](./img/supprimer_colonne.png) ] --- ### Nettoyage 3 : scinder une colonne suivant un délimitateur Vous rencontrerez de nombreuses situations où plusieurs données se retrouvent dans une même cellule. Or, pour pouvoir réaliser des opérations, il vous faudra les isoler. Pour cela, vous pourrez vous servir de .red[**schéma**] répétitifs qui permettent de distinguer les différentes données dans la cellule. Si vous réussissez à identifier un tel schéma, vous pourrez alors utiliser une *fonction* de Google Sheets appelée .red[**split**]. Une fonction est un ordre donné à la machine ou à un logiciel dont vous devez fournir les critères (ou *arguments*) afin que l'opération soit réalisée selon vos besoins. Dans notre cas : * la fonction .red[**split**] donne l'ordre de diviser une donnée suivant un délimitateur (d'où son nom, *split* = *couper*) ; * elle prend au minimum deux arguments : la donnée à découper et le délimitateur. --- #### Nettoyage 3 : utiliser la fonction split .pull-left[ Dans notre cas, .red[**split**] pourrait être utile à plusieurs endroits. Nous allons d'abord nous en servir pour supprimer les parenthèses de la colonne *Vainqueur* et leur contenu. Nous allons donc configurer split de la manière suivante : * indiquer d'abord le nom de la cellule où se trouve la donnée ; * indiquer ensuite que nous souhaitons couper quand se présente une parenthèse ouverte. Ce qui se traduit ainsi : ``` * =split(E2 ; "(") ``` ] .pull-right[ **Préalables** 1. vous devrez créer deux colonnes pour faire de la place : une où vous mettrez la fonction et l'autre où se retrouvera la partie après la "coupe" ; 2. pour appliquer la fonction à toute une colonne, vous devrez la *"dérouler"*. Pour cela, il suffit de cliquer et tirer le bouton en bas à droite de la cellule ou, mieux, de double-cliquer dessus pour faire descendre la formule jusqu'en bas ! ![](./img/fonction_derouler.png) 3. ] --- #### Nettoyage 3 : récupérer les données de split .pull-left[ ![](./img/split_deroule.png) ] .pull-right[**ATTENTION** : vous ne pourrez pas utiliser les données tel quel. 1. vous devrez d'abord copier les deux colonnes et effectuer une .red[**collage spécial**] : il vous faudra faire un clic droit puis choisir l'option dans le menu ou bien utiliser le raccourci `Ctrl + Shift + V` ; 2. ensuite seulement vous pourrez supprimer la deuxième colonne et ne garder que la première, où sont les données qui vous intéressent. ] --- #### Nettoyage 3 : méthodologie pour utiliser split L'utilisation de la fonction .red[**split**] peut donc se décompoer en cinq étapes : 1. créer des colonnes pour recevoir les résultats ; 2. paramétrer la fonction en indiquant la cellule où se trouve la donnée à découper et le délimitateur pour le faire ; 3. dérouler la fonction sur toute la colonne ; 4. copier et "coller les valeurs seulement" ; 5. supprimer la ou les colonnes en trop. --- ### Nettoyage 4 : tester une chaîne de caractère avec un modèle Il arrive qu'une donnée ne soit pas formulée de manière à pouvoir être utilisée tel quel mais que nous disposions d'un indice, d'une indication qui permet de la déduire. Dans le cas de cette base de données, la variable *score* contient des indications en plus des scores eux-mêmes : *ap*, *tab*, dont on peut déduire qu'ils indiquent le recours à des prolongations ou des tirs au but. Ces indices nous permettent donc de savoir s'il y a eu ou non prolongations et tir au but. Dans ce cas, nous pouvons procéder à ce que l'on appelle en informatique un .red[**test**], c'est-à-dire vérifier si une condition est remplie ou non. Ce qui revient à poser une question fermée qui, dans ce cas, serait : > La cellule contient-elle "ap" ? Qui permet de répondre à la question fermée : *y a-t-il eu prolongation ?* --- #### Nettoyage 4 : utiliser la fonction regexmatch() Pour répondre à cette question, nous allons utiliser une fonction de test : .red[**regexmatch()**]. Cette fonction appelle deux arguments : 1. le texte à tester ; 2. le modèle (ou *pattern*) à trouver. Si le modèle est présent, le résultat sera **TRUE** ou **VRAI** car la condition est remplie. Sinon, le résultat en sera **FALSE** ou **FAUX**. Dans notre cas, nous traduirons ainsi le test consistant à vérifier si une cellule contient "ap" : ``` * =regexmatch(E2 ; "ap") ``` **ATTENTION** : les coordonnées E2 servent ici d'exemple. Dans votre base de données, vous devrez pointer vers la première ligne de la variable *Score*. --- #### Nettoyage 4 : mise en pratique .pull-left[ En utilisant la fonction .red[**regexmatch()**], nous avons ainsi extrait une information auparavant piégée dans une cellule pour la stocker dans une nouvelle colonne. **Autrement dit, nous avons créé une nouvelle variable dans notre tableau**. Nous pourrons ainsi : * retirer la mention "ap" et finir de nettoyer la variable *score* ; * faire des calculs sur les prolongations ; * filtrer les finales suivant ce critères ; * etc. ] .pull-right[ ![](./img/regexmatch.png) ] --- background-image: url("https://media.giphy.com/media/3oriNZoNvn73MZaFYk/giphy.gif") class: center, top, inverse ## 4. Entraînement --- ### Consigne de l'exercice Avec les outils présentés, je vous demande de nettoyer la base originale pour arriver à ce résultat exactement. Indices : 1. toutes les opérations nécessaires peuvent être réalisées soit dans toute la feuille, soit sur une colonne : vous disposez de tous les outils pour ne pas avoir à modifier les cellules manuellement ; 2. il ne vous manque qu'une seule fonction pour réaliser l'exercice. ![](./img/nettoyage_exercice.png) --- background-image: url("https://media.giphy.com/media/UVMal38eCIhx4dnEng/giphy.gif") class: center, top, inverse #### Exercice bonus Vous créerez une nouvelle variable d'analyse pertinente sur cette base de données en utilisant .red[**regexmatch()**] ou n'importe quelle autre fonction. .footnote[N'hésitez pas à expérimenter !] --- class: inverse, center, middle # Merci ! Contact : [sylvain@datactivist.coop](mailto:sylvain@datactivist.coop)