« Importer et exporter des données avec Tidyverse » : différence entre les versions

De EduTech Wiki
Aller à la navigation Aller à la recherche
Ligne 249 : Ligne 249 :
La partie la plus intéressante du code concerne la ligne 5 qui utilise la fonction <code>here::here(...)</code> pour accéder au fichier avec les données. Cette instruction s'explique de la manière suivante :
La partie la plus intéressante du code concerne la ligne 5 qui utilise la fonction <code>here::here(...)</code> pour accéder au fichier avec les données. Cette instruction s'explique de la manière suivante :


# <code>here::here()</code> fait référence à la fonction <code>here()</code> qui se trouve dans le paquet '''here'''. On utilise le '''namespace''' <code>here::</code> devant la fonction pour éviter des éventuels conflits avec d'autres paquets qui peuvent utiliser une fonction ''here()'', mais différente de celle qui nous sert pour les chemins relatifs.  
* <code>here::here()</code> fait référence à la fonction <code>here()</code> qui se trouve dans le paquet '''here'''. On utilise le '''namespace''' <code>here::</code> devant la fonction pour éviter des éventuels conflits avec d'autres paquets qui peuvent utiliser une fonction ''here()'', mais différente de celle qui nous sert pour les chemins relatifs.  
# À l'intérieur de la fonction <code>here::here(arguments)</code> on passe les éléments qui composent le chemin du fichier par rapport à la ''working directory'' de [[R]]. En utilisant un projet [[RStudio]], la ''working directory'' est facile à repérer car elle contient le fichier avec extension '''.Rproj'''. Si vous utilisez l'arborescence <code>''working-directory''/data/raw/nom-du-fichier.csv</code>, alors les arguments à passer à la fonction sont trois :
* À l'intérieur de la fonction <code>here::here(arguments)</code> on passe les éléments qui composent le chemin du fichier par rapport à la ''working directory'' de [[R]]. En utilisant un projet [[RStudio]], la ''working directory'' est facile à repérer car elle contient le fichier avec extension '''.Rproj'''. Si vous utilisez l'arborescence <code>''working-directory''/data/raw/nom-du-fichier.csv</code>, alors les arguments à passer à la fonction sont trois :
## <code>data</code> pour le dossier au niveau de la ''working directory''
*# <code>data</code> pour le dossier au niveau de la ''working directory''
## <code>raw</code> pour le sous-dossier qui contient les données brutes (voir les bonnes pratiques plus haut)
*# <code>raw</code> pour le sous-dossier qui contient les données brutes (voir les bonnes pratiques plus haut)
## <code>nom-du-fichier.csv</code> le nom spécifique du fichier, avec l'extension adéquate (ici .csv par exemple), qui contient les données à importer
*# <code>nom-du-fichier.csv</code> le nom spécifique du fichier, avec l'extension adéquate (ici .csv par exemple), qui contient les données à importer


Dans le code d'exemple nous avons utilisé deux références symboliques : une pour le chemin et ensuite une pour les données. Il est tout à fait possible de condenser les deux dans une seule instruction :
Dans le code d'exemple nous avons utilisé deux références symboliques : une pour le chemin et ensuite une pour les données. Il est tout à fait possible de condenser les deux dans une seule instruction :

Version du 18 octobre 2021 à 19:08

Cet article est en construction: un auteur est en train de le modifier.

En principe, le ou les auteurs en question devraient bientôt présenter une meilleure version.



Introduction

L'ecosystème Tidyverse met à disposition plusieurs fonctions pour importer et exporter des données qui représentent des alternatives aux modalités mises à disposition de base par R. Cet article propose un aperçu technique des ces fonctions, ainsi que quelques éléments de réflexion et des bonnes pratiques pour l'organisation et la structuration des fichiers qui contiennent des données.

L'article représente cependant une introduction souple et pragmatique à l'importation et exportation des données, tandis que des contraintes plus strictes et déontologiques sont de plus en plus fréquentes et même demandées dans certaines situations (e.g. Data Management Plan, projet pour des fonds, etc.). Vous pouvez considérer cet article comme un premier pas dans des directions plus articulées.

Pour des informations plus approfondies sur les données de recherche, voir :

Avantages des fonctions Tidyverse

Les avantages d'utiliser les fonctions de Tidyverse concernent principalement :

  • Possibilité d'importer depuis différentes sources (fichiers de text, spreadsheet, autres logiciels d'analyse statistique, ...) ;
  • Homogénéité des formats des données une fois importées, indépendamment du type de source originale ;
  • Les données sont déjà prêtes pour le traitement successif, comme par exemple l'organisation, la manipulation, la visualisation, la modélisation, ou la communication des résultats.
  • Possibilité de créer un flux d'importation automatisé qui maintient les données originales, c'est-à-dire les données brutes récoltés
  • Exportation des données dans des formats propices à l'archivage et au partage (formats textuels plutôt que formats propriétaires ou nécessitant de logiciels particuliers)

Objectifs de l'article

L'article vise à un double objectif :

  • Technique
    Fournir des exemples d'importations et exportations de données qui peuvent être utiles dans des situations fréquentes en sciences sociales ;
  • Pratique
    Sensibiliser à l'importance de bien organiser les données, en appliquant des bonnes pratiques sur l'organisation des fichiers et l'organisation des données à l'intérieur des fichiers.

Pour atteindre ces objectifs, l'article utilise certains fonctions des paquets tidyr et dplyr qui sont traités de manière plus approfondies dans les articles :

Prérequis

L'article s'adresse à un public débutant dans l'importation et l'exportation des données avec un langage de programmation et ne requière donc pas de conniassances préalables particulières. Les articles suivantes peuvent néanmoins fournir des informations utiles avant de suivre les contenus présentés dans cette page :

De plus, il est conseillé de disposer du logiciel RStudio qui facilite certaines opérations à travers une interface graphique, bien qu'au final, l'importation se fait directement avec du code.

Bonnes pratiques générales

Nous proposons ici une liste de bonnes pratiques générales au sujet des données dans des projets de recherche. Il s'agit de quelques recommandations de base, qui peuvent être par la suite complexifiées et adaptées selon les besoins des projets. À ce propos, des ressources plus spécifiques, depuis lesquelles la plupart de ces recommandations sont tirées d'ailleurs, sont proposées à la fin de cet article.

Nommer et organiser les dossiers qui contiennent les fichiers avec données

Une première bonne pratique consiste à garder tous les fichiers qui contiennent des données dans le même répertoire d'un projet, par exemple dans un dossier qui s'appelle data. Il est bien que ce dossier soit placé à la racine du dossier qui contient votre projet (e.g. le dossier de travail dans un projet RStudio. Ensuite, ce dossier peut contenir deux autres sous-dossiers :

  • Un dossier pour les données brutes, au du moins les plus brutes possibles.
  • Un dossier pour les données transformées pour des finalités de partage ou d'archivage

Une arborescence possible du dossier contenant les données serait donc :

|- data
  |- raw
     |- fichier-avec-donnes-brutes.extension
     |- autre-fichier-avec-donnes-brutes.extension
  |- transformed
     |- fichier-final.extension
     |- autre-fichier-final.extension

Nous proposons ici les noms des dossiers raw et transformed, mais d'autres solutions sont envisageables. Si possible, le dossier avec les données brutes devrait apparaître avant le dossier avec les données finalisées.

Des ultérieurs sous-dossiers pour mieux organiser les données sont envisageables, mais conseillées seulement avec un grand nombre de fichiers et des relations sémantiques qui suggèrent une sous-division (e.g. plusieurs études/expériences dans un projet, dont chaque avec beaucoup de fichiers différents). Autrement, il est plus simple d'insérer les fichiers directement dans les dossiers, avec des bonnes stratégies de nommage (voir sous-section suivante).

Dossier avec les données brutes

Dans ce dossier, insérez les fichiers avec des données avec le moins de manipulations préalables possible au niveau de leur contenu. Vous pouvez par contre modifier le nom du fichier (voir plus bas).

L'un des intérêts d'utiliser un langage de programmation pour analyser des données consiste à pouvoir tracer, documenter et automatiser les transformations effectuées sur des données. Pour cette raison, le moins de manipulations sont faites en dehors de R (e.g. renommer une colonne, effacer des données, corriger des fautes, ...), le plus votre processus de transformation des données sera transparent.

Si vous comptez partager à la fois les données brutes et finalisées de votre projet, pensez néanmoins à enlever toutes les informations sensibles même dans les fichiers du dossier raw ou équivalent. Vous pouvez par exemple ajouter un troisième dossier private qu'il faudra par la suite éviter de partager, par exemple en l'ignorant dans un système de gestion de versions.

|- data
  |- private
    |- ...
  |- raw
    |- ...
  |- transformed
    |-

De cette manière, vous pouvez créer deux flux de transformations séquentiels :

private --> [scripts privées] --> raw --> [scripts publics] --> transformed

Lors du partage de votre projet, vous pouvez ainsi partager seulement le dossier raw, les scripts de transformations pour passer de raw à transformed, et enfin le dossier transformed.

Au contraire, le dossier private et les scripts de transformations pour passer de private à raw (e.g. anonymisation automatisée des données), ne seront pas partagé avec le reste du projet.

Dossier avec les données finalisées

Le dossier avec les données finalisées contient les différentes sources de données utilisées pour les analyses de votre projet. Ces fichiers sont générée automatiquement à travers des scripts de R et donc exportées à chaque fois que vous lancez les scripts de transformations. De cette manière, vous êtes certain-es de disposer toujours de la dernière version des fichiers finalisées, avec les données utilisées vraiment dans vos analyses.

Le dossier avec les données finalisées peut contenir plus des fichiers par rapport au dossier avec les données brutes. Cela s'explique par le fait que, parfois, on utilise deux versions de la même source, par exemple avec des filtres différents, selon le type d'analyse à faire.

Imaginez une situation dans laquelle les participant-es à une étude doivent effectuer une tâche de type performance et ensuite passer un questionnaire en ligne. Vous pouvez décider de mener une analyse sur tous les questionnaires, mais une deuxième analyse seulement sur les questionnaires des participants en fonction de leur résultats à la tâche performance.

Dans le script de R, vous pouvez lancer ces deux analyses sans avoir à dupliquer les données, car il suffit d'assigner tous les questionnaires à une référence symbolique, et utiliser une autre référence symbolique pour les questionnaires filtrés. En revanche, si d'autres chercheurs veulent contrôler ou répéter votre analyse avec des outils différents de R, il peut-être utile de leur mettre à disposition deux fichiers différents :

  1. Un avec toutes les réponses au questionnaire
  2. L'autre avec seulement les questionnaires filtrés par rapport au résultat de la tâche

Nommer les fichiers qui contiennent les données

Un fichier dispose d'un nom et d'une extension, dans le format nom-du-fichier.extension. Cette partie s'intéresse au nom du fichier, tandis que l'extension, qui détermine le format du fichier, est traitée dans une section plus loin.

Jenny Bryan propose trois critères pour trouver des bons noms de fichiers qui contiennent des données :

  1. Nom qui soit lisible par des machines (machine-readable)
  2. Nom qui soit lisible par des êtres humains (human-readable)
  3. Nom qui s'intègre bien avec les mécanismes de triage des différents systèmes d'exploitations

Nom du fichier lisible par des machines

Les ordinateurs sont des machines qui excellent dans ce qu'on appelle la reconnaissance des patterns, c'est-à-dire l'extraction de régularités depuis une information donnée. Dans l'importation des données avec du code, le nom du fichier, ainsi que le chemin dans lequel se trouve le fichier, sont des informations importantes qui sont utilisées directement dans le code source. Par conséquent, on peut adopter des conventions qui facilitent la reconnaissance des patterns des machines. Ces conventions permettent :

  • De minimiser les erreurs dues au pointage incorrecte à des fichiers
    Ce type d'erreur peut-être réduit en premier lieu avec l'utilisation d'un projet en RStudio pour consolider les chemins indépendamment de la position des fichiers dans l'ordinateur ou du système d'exploitation. Deuxièmement, pour les machines tout est codé dans une série de chiffre. Donc pour un ordinateur les lettres a minuscule et A majuscule n'ont pas de relation particulière, il s'agit au final de deux chiffres différentes. Pour éviter des erreurs, il est donc conseillé de :
    • Utiliser seulement des lettres minuscules, à moins de conventions établies dans le domaine (e.g. abréviation du nom d'un pays tout en majuscules) ;
    • Évitez les espaces dans les noms des fichiers
    • Évitez les accents ou tout caractère spéciaal à l'exception de - et _
  • De passer dans le nom du fichier des informations exploitables dans la programmation
    Imaginez par exemple d'extraire depuis un outil de mesure plusieurs données pour un même participant, mais sans pouvoir insérer dans l'outil à chaque fois l'identifiant du participant concerné. Vous vous retrouvez donc avec plusieurs fichiers qui ont la même structure, mais qui ne peuvent pas être associés à un participant ou à un autre. À ce moment, si vous utilisez un système de nommage bien articulé, vous pouvez laisser la structure originale de chaque fichier, et insérer le nom du participant dans le nom du fichier. Par exemple :
    • p01_physiological-data_2020-11-21.csv
    • p02_physiological-data_2020-11-22.csv
    Grâce à la segmentation régulière du fichier, on peut créer un script qui :
    • Importe chaque fichier individuellement
    • Extrait depuis chaque fichier le nom du participant et l'ajoute aux données du fichier en question
    • Combine toutes les données dans une seule jeu de données pour le traitement successif.

Nom du fichier lisible par des être humains

Les noms de fichier ne servent cependant pas seulement pour pointer le langage de programmation vers les données d'intérêt : ils sont utilisés également par les êtres humains afin de s'orienter et attribuer du sens aux contenus des projets. Par conséquent, il est important que le nom d'un fichier propose les caractéristiques suivantes :

  • Facile à lire
    Même si les êtres humains ne sont pas aussi performant que les ordinateurs dans la reconnaissance de pattern, le système visuel peut bénéficier d'indices pour guider l'attention et segmenter l'information. Les deux noms de fichiers suivants ne sont pas lus avec la même facilité :
    • ceciestunnomdefichiertreslongquinefacilitepaslesystemevisuel.csv
    • un-nom-de-fichier-aussi-long-mais-avec-une-segmentation-utile.csv
  • En rapport sémantique avec le contenu
    Le nom d'un fichier peut être un indice utile pour informer l'utilisateur (soi-même ou une autre personne) du contenu du fichier, c'est-à-dire ce qu'on peut s'attendre en ouvrant/utilisant le fichier. Pour créer des noms de fichiers sémantiques il est bien de se positionner à travers un troisième personne, ce qui évite notamment d'utiliser toutes des variantes possessives du type my-data.csv ou impersonnelles data1.csv

Prédisposition pour un ordre de triage

Enfin, il est utile de prédisposer les noms des fichiers pour qu'ils s'affichent dans un ordre spécifique dans le gestionnaire des fichiers, indépendamment du système d'exploitation utilisé. En effet, les systèmes d'exploitation peuvent avoir différentes manières de déterminer la précédence entre deux noms de fichiers.

Une stratégie utile à cet effet est celle de prévoir un système codifié au début du nom de fichier qui adopte un empan toujours de la même longueur. Cela peut être par exemple :

  • Une série progressive de chiffres
    À cet effet, il est bien d'utiliser des zéros au début pour créer un empan d'un nombre de chiffres proportionnels au nombre de fichiers qu'on peut s'attendre. Par exemple, si vous pensez avoir moins de 100 fichiers, alors la codification 01-..., 02-..., etc. est suffisante. Si non, il faut prévoir trois ou plus chiffres. Même si pensez avoir moins de 10 fichiers, il est plus sûr d'utiliser quand même un empan d'au moins deux chiffres.
  • Une date en format ISO 8601
    Si la date peut jouer un rôle important dans l'organisation de vos fichiers (e.g. données cumulatives, suivi longitudinal, ...), alors il est utile d'entamer les noms de vos fichiers avec une date au format ISO 8601, donc selon le pattern yyyy-mm-dd pour la date simple, par exemple 2021-01-17_....

Utiliser des formats de fichier ouverts

Un format de fichier correspond à une modalité spécifique d'enregistrer de l'information : c'est l'équivalent de la langue parlée par le fichier. Le format du fichier, reconnaissable à travers l'extension, détermine notamment avec quel(s) logiciel(s) il est possible d'encoder et décoder l'information stockée dans le fichier.

Les bonnes pratiques en termes de formats de fichiers suggèrent d'utiliser des formats :

  • Non-propriétaires, c'est-à-dire que le format appartient à une société ou institution spécifique qui en détient les droits intellectuelles
  • Non encryptés, c'est-à-dire qui ne nécessite pas d'un clé stockée en dehors du fichier pour décoder l'information
  • Non comprimés (à moins de nécessités particulières)
  • Adoptant des standards ouverts et documentés
  • Compatibles avec plusieurs systèmes d'exploitation
  • Compatibles avec différents logiciels sans perte d'information ou fonctionnalités
  • Fréquemment utilisés par la communauté scientifique de référence
Pour la plupart des utilisations fréquentes en sciences sociales, le format .csv est adéquat pour les données tabulaire ou rectangulaire (i.e., en colonnes et lignes). En alternative les formats .txt et .html peuvent aussi être utilisés. Pour des structures emboîtés, les formats .json et .xml sont stables, ouverts et bien documentés.

Ces suggestions s'appliquent surtout pour des données de types quantitatives, pour des analyses compréhensives se référer plutôt à la page Introduction à l'analyse de texte avec R.

Ajouter un fichier README pour expliquer les données

Une bonne pratique au niveau des données consiste à créer un fichier README qui contient des informations utiles pour comprendre l'arborescence et la structuration des données disponibles.

Ce fichier, dont le nom est exceptionnellement accepté en lettre majuscules pour le faire ressortir dans une recherche visuelle, est souvent disponible dans les formats suivants :

  • README.txt : il s'agit du format le plus sûr, car il n'a pas de formatage et peut être lu facilement par différents logiciels ;
  • README.md : format appelé Markdown est utilisé souvent en data science pour appliquer des formatages simples à un texte. Utile si vous avez besoin d'un peu de mise en page (e.g. titres, listes, ...). À noter que ce format n'est cependant pas encore adopté de manière universelle en sciences sociales et certains chercheurs peuvent ne pas le connaître et ne disposer donc pas d'un logiciel pour afficher correctement le texte formaté. Le fichier .md peut néanmoins s'ouvrir avec n'importe quel éditeur de texte, mais il s'affichera avec les notations de formatage.
  • README.pdf : à utiliser uniquement si votre document nécessite vraiment d'une structuration particulière

Il est enfin conseillé de produire un fichier README pour chaque ensemble de jeux de données qui sont liés sémantiquement.

Au niveau du contenu, il existe plusieurs lignes guides qui sont plus ou moins détaillées. Par exemple, le site sur les données de recherche de l'Université de Genève suggère qu'un fichier README devrait contenir au moins les informations suivantes :

  • Les noms de l'investigateur/trice principal-e et des co-investigateurs/trices de l’étude
  • Une description de la méthodologie et des outils utilisés pour la collecte des données
  • Les dates de collecte des données
  • Une description de la hiérarchie du répertoire, du type de données qu'il contient et de la convention de dénomination des fichiers
  • Une liste complète de tous les titres/codes/abréviations et conventions utilisées dans les fichiers.
  • Les conditions de partage et d'accès (licence) pendant et après la fin du projet.

Importer des données

Cette section propose des exemples d'importation de données depuis différentes sources à travers des paquets qui font partie de l'écosystème Tidyverse. La plupart de ces paquets sont déjà installés si vous avez installé Tidyverse de manière globale. La section donc propose des instructions sur l'installation seulement si le paquet n'est pas directement inclut avec le paquet tidyverse global.

Aide à l'importation avec RStudio

Cet article se focalise sur le code nécessaire à importer des données pour montrer les différentes possibilités mises à disposition. Si vous utilisez RStudio, vous pouvez faciliter la création du code pour importer des données à travers une interface graphique. À travers cette interface, il est possibile de déterminer quelques options de base et, surtout, avoir un aperçu de l'importation pour vérifier que les données sont importées dans un format propice à la suite de l'analyse. Le flux de travail conseillé dans l'utilisation de l'aide à l'importation des données est donc le suivant :

  1. Utiliser l'interface d'importation de RStudio pour préparer l'importation
  2. Adaptez au besoin les options d'importation (e.g. type de données, séparateur, lignes/observations à exclure, ...)
  3. Au lieu d'entamer l'importation à travers le bouton Import de l'interface, copiez le code proposé sans la dernière ligne avec la fonction View(...)
  4. Collez le code dans un fichier Rscript et adaptez-le en fonction des informations disponibles dans cette section

L'image suivante propose un aperçu de l'interface d'importation qui décrit une partie du processus.

Exemple d'aide à l'importation avec une interface graphique dans RStudio

Pour plus d'informations sur l'aide à l'importation, consultez directement l'article sur le logiciel :

Utiliser un projet de RStudio et le paquet here

Un système utile pour importer des données depuis un fichier consiste à utiliser une combinaison entre :

  • Les projets RStudio, qui permettent d'organiser les fichiers qui composent un projet dans un dossier de travail (working directory) et bénéficier des fonctionnalités du logiciel pour les projets (voir la page RStudio pour plus d'infos)
  • Le paquet here, qui permet de créer des chemins relatifs à la working directory qui sont compatibles dans les différents systèmes d'exploitation (Mac, Linux et Windows). En effet, les systèmes d'exploitation traitent souvent les chemins de manière différente

La combinaison entre projet RStudio et paquet here permet de rendre votre projet flexible au niveau de l'emplacement dans votre système d'exploitation, ainsi que plus simple à partager : avec les autres, ou avec vous-même si vous utilisez souvent plusieurs ordinateurs/postes de travail.

Pour utiliser le paquet here à l'intérieur d'un projet RStudio, il faut d'abord installer le paquet :

install.packages("here")

Ensuite, il faut le charger dans tous les scripts qui peuvent nécessiter de chemins relatifs à d'autres fichiers. Le paquet here marche en effet avec les fichiers avec données, mais également avec tout autre type de fichier (scripts, images, ...).

Voici un exemple de code qui importe les fichiers depuis une arborescence des dossiers comme celle décrite dans les bonnes pratiques plus haut :

1 # Exemple d'importation de données. Ce type d'importation est valable n'importe la position du fichier dans un projet RStudio
2 library(here)
3 
4 # Créer une référence au fichier avec les données
5 fichier_avec_donnees <- here::here("data", "raw", "nom-du-fichier.csv")
6 
7 # Importer les données (fonction à adapter selon les besoins, voir plus bas)
8 donnes_importees <- read_csv(fichier_avec_donnes)

La partie la plus intéressante du code concerne la ligne 5 qui utilise la fonction here::here(...) pour accéder au fichier avec les données. Cette instruction s'explique de la manière suivante :

  • here::here() fait référence à la fonction here() qui se trouve dans le paquet here. On utilise le namespace here:: devant la fonction pour éviter des éventuels conflits avec d'autres paquets qui peuvent utiliser une fonction here(), mais différente de celle qui nous sert pour les chemins relatifs.
  • À l'intérieur de la fonction here::here(arguments) on passe les éléments qui composent le chemin du fichier par rapport à la working directory de R. En utilisant un projet RStudio, la working directory est facile à repérer car elle contient le fichier avec extension .Rproj. Si vous utilisez l'arborescence working-directory/data/raw/nom-du-fichier.csv, alors les arguments à passer à la fonction sont trois :
    1. data pour le dossier au niveau de la working directory
    2. raw pour le sous-dossier qui contient les données brutes (voir les bonnes pratiques plus haut)
    3. nom-du-fichier.csv le nom spécifique du fichier, avec l'extension adéquate (ici .csv par exemple), qui contient les données à importer

Dans le code d'exemple nous avons utilisé deux références symboliques : une pour le chemin et ensuite une pour les données. Il est tout à fait possible de condenser les deux dans une seule instruction :

# Version du code abrégée
donnees_importees <- read_csv(here::here("data", "raw", "nom-du-fichier.csv"))

Selon la complexité du chemin et les éventuelles options de la fonction d'importation, cependant, le code peut résulter moins lisible. À noter, d'ailluers, que dans une utilisation réel il faudrait utiliser une référence symbolique plus saillante de donnees_importees.

Exporter des données

Ressources