Organiser des données avec tidyr
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
Tidyr est un paquet de R faisant partie de l'écosystème Tidyverse qui permet d'organiser des données afin de faciliter la manipulation, la visualisation, ou la modélisation. Dans cet article, le terme organisation des données est une traduction limitative du correspondant tidy en anglais. Par organisation il faut en effet entendre plus en général les différentes actions qui permettent de préparer un ou plusieurs jeu de données : nettoyer les données, structurer les variables/colonnes, exclure les données manquantes, etc.
Cette page intègre des éléments techniques du fonctionnement du paquet tidyr avec des éléments théoriques et pratiques sur les principes du tidy data (Wickham, 2014) selon une perspective liée au parcours pensée computationnelle avec R.
Note sur la version
Cette page se réfère à la version 1.1.x
de Tidyr (voir versionnage sémantique). Les informations contenus abordent cependant des principes fondamentaux du tidy data et devraient par conséquent rester valides pour des versions successives.
Prérequis
L'article nécessite de connaissances de base de R, notamment au niveau des structures de données de type data.frame
ou tibble
(i.e. organisées en lignes et colonnes). La lecture préalable de l'article Introduction à Tidyverse est également recommandée.
Installation et chargement
tidyr est l'un des paquets qui composent l'écosystème Tidyverse. Il peut donc être installé deux deux manières :
- Paquet individuel
- Paquet global Tidyverse
Paquet tidyr individuel
Pour installer seulement le paquet tidyr, la commande est la suivante :
# Installation individuelle
install.packages("tidyr")
Pour utiliser le paquet il faudra à ce moment le charger :
library(tidyr)
Paquet global Tidyverse
Si vous installez le paquet global Tidyverse, tidyrest installé automatiquement.
# Installation de Tidyverse
install.packages("tidyverse")
L'installation de l'écosystème Tidyverse est conseillée, car tidyr peut s'intégrer facilement avec d'autres paquets de l'écosystème Tidyverse comme dplyr pour manipuer des données ou ggplot2 pour les visualiser.
Pour utiliser le paquet vous pouvez à ce moment choisir si :
- Charger seulement tidyr
library(tidyr)
- Charger tous les paquets de Tidyverse
library(tidyverse)
Voir Introduction à Tidyverse pour plus de détails.
Structures des données et Tidy data
Dans l'introduction à Tidyverse, les principes à la base du concept de tidy data (Wickham, 2014) ont déjà été abordés de manière conceptuelle. Dans cette section, les données tidy sont abordées, de manière plus pragmatique, en fonction de différentes structures de données possibles et aux avantages de pouvoir passer entre structures.
Organisation de données tidy
De manière très concrète, un jeu de données tidy est basé sur trois principes :
- Chaque colonne représente une variable. En général, une variable est l'opérationalisation d'un concept, c'est-à-dire une représentation quantifiable ou qualifiable d'un concept théorique.
- Chaque ligne représente une observation. En général, une observation se compose de plusieurs variables qui partagent un élément commun, par exemple le même participant.
- Chaque cellule - résultant du croisement entre colonnes et lignes - représente une et une seule valeur, c'est-à-dire la quantité ou qualité de la variable/colonne pour l'observation/ligne données.
Selon Wickham (ibid), toute autre organisation de données corresponde à messy data, c'est-à-dire le contraire du tidy. Plusieurs exemples de jeu de données qui ne sont pas tidy, mais qui sont assez fréquents en data science, sont disponibles dans la page Tidy data de la documentation officielle du paquet.
Situations qui nécessitent l'organisation des données
Les principes du tidy data sont assez simple à la base, mais il arrive souvent que des jeux de données ne les respectent pas pour différentes raisons, par exemple :
- Le jeu de données est mis à disposition par d'autres entités qui ont un système de gestion de données non-tidy
- Les données sont extraites depuis un outil (e.g. Qualtrics ou Limesurvey) qui aplatit toutes les données indépendamment de la structure sémantique
- Les données sont extraite de manière automatisée ou semi-automatisée et peuvent donc avoir une structure qui n'est pas très bien définie au départ (e.g. avec du web scraping, notamment du web scraping avec R)
- Les donnés sont distribuées dans plusieurs outils ou modalités de récolte différentes, avec des structures de données différentes
- On se rend compte à posteriori qu'une meilleure manière de structurer les données (e.g. pour les partager avec d'autres chercheurs) est possible et utile
- Certaines fonctions de R nécessitent d'un format de données spécifique (voir format large et format long plus bas dans la page)
Depuis ces exemples, on peut extrapoler deux typologies de situations qui nécessitent d'une (ré)organisation des données :
- Sémantique : les données sont pensées ou récoltées d'une manière qui n'est pas optimale
- Pragmatique : dans des phases successives à l'importation et l'organisation, par exemple dans la visualisation, la modélisation, ou la communication des résultats, des mécanismes internes à R nécessitent d'un format spécifique des données
Avantages d'utiliser tidyr pour organiser les données
Utiliser un langage de programmation pour le traitement des données permet déjà à la base de :
- Maintenir les données originales et agir sur des références symboliques aux données, sans donc modifier les données originales ;
- Garder trace de toutes les manipulations effectuées afin de pouvoir créer ou récréer le même flux au besoin ;
- Stocker les mêmes données dans des formats alternatifs, sans dupliquer la source primaire des données (e.g. le fichier avec les données) ;
tidyr met à disposition des mécanismes flexibles qui permettent d'organiser ou ré-organiser des jeux des données à travers des manipulations sémantiques adaptées à la philosophie tidy data.
Différents formats de données
Même en respectant les principes tidy, il existe plusieurs manière pour organiser le même jeu de données. Cette section propose une catégorisation basée sur deux types de formats qui peuvent se combiner :
- Format à plat ou emboîté
- Format large ou long
tidyr propose des fonctions qui permettent une grande flexibilité pour passer entre les différents formats et le reste de l'article sera organisé avec des exemples qui se réfèrent, entre autre, aux passages entre ces formats que nous présentons donc d'abord de manière conceptuelle et succincte.
Format à plat ou emboîté
Un format à plat correspond au format rectangulaire classique des jeux de données qu'on peut notamment trouver dans les applications de type spreadsheet (Excel et équivalent). Structurellement, ces jeux de données ne sont pas forcément dans le format tidy, mais sont en général plus simple à visualiser et à manipuler, car ils maintiennent les deux dimensions classiques des colonnes et lignes, qu'on peut donc transformer respectivement en variables et observations.
Un format emboîté, ou nested en anglais, au contraire, organise les données sur plusieurs niveaux, comme par exemple dans les structures de type liste en r, dans le format JSON, ou encore dans une base de données NoSQL. Ce format est, d'une part, plus difficile à visualiser et manipuler ; mais de l'autre, permet parfois plus de flexibilité et de puissance. Cependant, la plupart des fonctions disponibles en R fonctionnemnt avec des structures rectangulaires, donc à plat, et il arrive donc assez souvent de devoir aplatir une structure emboîtée afin de pouvoir la visualiser, modéliser, ou afficher dans un document. Le processus inverse est également possible, ce qui permet notamment l'automatisation de certains processus sur des larges données, mais en général il s'agit de passages plus complexes qui dépassent le niveau introductif de cet article.
Format large ou long
La distinction entre format large et format long est métaphoriquement simple à saisir, mais conceptuellement plus compliquée. Il s'agit en effet de deux manières différents de penser aux données. La distinction s'applique également aux données à plat ou emboîtées, mais la distinction est souvent plus importante dans les données rectangulaires (à plat).
Dans l'introduction à Tidyverse, cette distinction à été montrée avec un jeu de données complet que ce soit en format large ou en format long. Ici nous montrons un cas différent, qui est assez fréquent avec les données, c'est-à-dire dans lequel il n'y a pas des données pour toutes les combinaisons entre variables/colonnes et observations/lignes. Le jeu de données suivant affiche les notes obtenus par 10 étudiant-es à trois cours différents (mathématique, histoire et français), où chaque étudiant-e n'a suivi qu'un seul cours (e.g. un cours à option entre les trois).
Dans le format large, ou chaque cours représente une variable/colonne, donc, il existe plusieurs données manquantes (représentée par NA en R) :
etu | math | fran | hist |
---|---|---|---|
Etu1 | 4.75 | NA | NA |
Etu2 | NA | 5.75 | NA |
Etu3 | 4.00 | NA | NA |
Etu4 | 5.25 | NA | NA |
Etu5 | NA | 3.25 | NA |
Etu6 | NA | NA | 3.25 |
Etu7 | NA | 5.00 | NA |
Etu8 | 5.75 | NA | NA |
Etu9 | NA | 3.25 | NA |
Etu10 | 4.25 | NA | NA |
Avec les mêmes données en format long, les trois observations/colonnes de chaque matière sont condensées dans une variable cours, et par conséquent chaque observation affiche l'étudiant-e, le cours spécifique, et la note obtenue :
etu | cours | note |
---|---|---|
Etu1 | math | 4.75 |
Etu2 | fran | 5.75 |
Etu3 | math | 4.00 |
Etu4 | math | 5.25 |
Etu5 | fran | 3.25 |
Etu6 | hist | 3.25 |
Etu7 | fran | 5.00 |
Etu8 | math | 5.75 |
Etu9 | fran | 3.25 |
Etu10 | math | 4.25 |
Les deux formats ont avantages et désavantages, surtout dans des contextes plus complexes par rapport au simple exemple illustrés ici. Indépendamment de la qualité intrinsèque de la structure, de plus, au niveau pragmatique il y a des fonctions de R qui requièrent, ou sont plus adaptées, avec l'un ou l'autre format. Donc la possibilité de passer de l'un à l'autre peut se révéler une nécessite et pas seulement une question de structuration optimale.