Chapitre 2 Le tidyverse

Dans ce document, nous utiliserons l’extension tidyverse par (Wickham 2017b). Ce chapitre permettra d’introduire l’extension tidyverse mais surtout les principes qui la sous-tendent. Ce chapitre est inspiré de (Barnier 2018) et (Wickham and Grolemund 2017).

library(tidyverse)
library(questionr)

2.1 Extensions

Le terme tidyverse est une contraction de tidy (qu’on pourrait traduire par bien rangé) et de universe. En allant visiter le site internet de ces extensions https://www.tidyverse.org/, voici ce que nous pouvons trouver sur la première page du site:

The tidyverse is an opinionated collection of R packages designed for data science. All packages share an underlying design philosophy, grammar, and data structures.

que nous pourrions traduire par:

Le tidyverse est une collection dogmatique d’extensions pour le langage R conçues pour la science des données. Toutes les extensions partagent une philosphie sous-jacente de design, de grammaire et de structures de données.

Ces extensions abordent un très grand nombre d’opérations courantes dans R. L’avantage d’utiliser le tidyverse c’est qu’il permet de simplifier plusieurs opérations fréquentes et il introduit le concept de tidy data. De plus, la grammaire du tidyverse étant cohérente entre toutes ses extensions, en apprenant comment utiliser l’une de ces extensions, vous serez en monde connu lorsque viendra le temps d’apprendre de nouvelles extensions.

Nous utiliserons le tidyverse pour:

  • Le concept de tidy data
  • L’importation et/ou l’exportation de données
  • La manipulation de variables
  • La visualisation

Le tidyverse permet aussi de:

  • Travailler avec des chaînes de caractères (du texte par exemple)
  • Programmer
  • Remettre en forme des données
  • Extraire des données du Web
  • Etc.

Pour en savoir plus, nous invitons le lecteur à se rendre au site du tidyverse https://www.tidyverse.org/. Le tidyverse est en grande partie issu des travaux de Hadley Wickham.

2.2 Installation

Pour installer les extensions du tidyverse, nous effectuons la commande suivante:

install.packages("tidyverse")

Une fois l’extension installée, il n’est pas nécessaire de la réinstaller à chaque fois que vous utilisez R. Par contre, vous devez charger l’extension à chaque fois que vous utilisez R.

Pour charger l’extension et l’utiliser dans R, nous effectuons la commande suivante:

library(tidyverse)

Cette commande va en fait charger plusieurs extensions qui constituent le coeur du tidyverse, à savoir :

  • ggplot2 (visualisation)
  • dplyr (manipulation des données)
  • tidyr (remise en forme des données)
  • purrr (programmation)
  • readr (importation de données)
  • tibble (tableaux de données)
  • forcats (variables qualitatives)
  • stringr (chaînes de caractères)

Il existe d’autres extensions qui font partie du tidyverse mais qui doivent être chargées explicitement, comme par exemple readxl (pour l’importation de données depuis des fichiers Excel).

La liste complète des extensions se trouve sur le site officiel du tidyverse https://www.tidyverse.org/packages/.

2.3 Les tidy data

Le tidyverse est en partie fondé sur le concept de tidy data, développé à l’origine par Hadley Wickham dans un article du Journal of Statistical Software, voir (Wickham 2014). Nous pourrions traduire ce concept par données bien rangées.

Il s’agit d’un modèle d’organisation des données qui vise à faciliter le travail souvent long et fastidieux de nettoyage et de préparation préalable à la mise en oeuvre de méthodes d’analyse. Dans ce livre, nous travaillerons toujours avec des tidy data. En réalité, la plupart des données rencontrées par les chercheurs ne sont pas tidy. Il existe une extension du tidyverse qui permet de faciliter la transformation de données non tidy en données tidy, l’extension tidyr. Nous ne verrons pas comment l’utiliser dans ce livre.

Les principes d’un jeu de données tidy sont les suivants :

  1. chaque variable est une colonne
  2. chaque observation est une ligne
  3. chaque valeur doit être dans une cellule différente

La figure 2.1 montre ces règles de façon visuelle (l’image a été prise de (Wickham and Grolemund 2017)).

Suivre les trois principes rend les données tidy: les variables sont en colonnes, les observations sont sur des lignes, et chaques valeurs sont dans des cellules différentes.

Figure 2.1: Suivre les trois principes rend les données tidy: les variables sont en colonnes, les observations sont sur des lignes, et chaques valeurs sont dans des cellules différentes.

Pourquoi s’assurer que vos données sont tidy? Il y a deux avantages importants:

  1. Un avantage général de choisir une seule façon de conserver vos données. Si vous utilisez une structure de données consitante, il est plus facile d’apprendre à utiliser les outils qui fonctionneront avec ce type de structure, étant donné que celles-ci possède une uniformité sous-jacente.

  2. Un avantage spécifique de placer les variables en colonnes car ceci permet de vectoriser les opérations dans R. Ceci implique que vos fonctions seront plus rapides lorsque viendra le temps de les exécuter.

Voici un exemple de données tidy qui sont accessibles en R de base.

as_tibble(rownames_to_column(mtcars))
#> # A tibble: 32 x 12
#>   rowname        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear
#>   <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Mazda RX4     21.0    6.  160.  110.  3.90  2.62  16.5    0.    1.    4.
#> 2 Mazda RX4 W…  21.0    6.  160.  110.  3.90  2.88  17.0    0.    1.    4.
#> 3 Datsun 710    22.8    4.  108.   93.  3.85  2.32  18.6    1.    1.    4.
#> 4 Hornet 4 Dr…  21.4    6.  258.  110.  3.08  3.22  19.4    1.    0.    3.
#> 5 Hornet Spor…  18.7    8.  360.  175.  3.15  3.44  17.0    0.    0.    3.
#> 6 Valiant       18.1    6.  225.  105.  2.76  3.46  20.2    1.    0.    3.
#> # ... with 26 more rows, and 1 more variable: carb <dbl>

2.4 Les tibbles

Une autre particularité du tidyverse est que ces extensions travaillent avec des tableaux de données au format tibble, qui est une évolution plus moderne du classique data frame du R de base. Ce format est fourni est géré par l’extension du même nom (tibble), qui fait partie du coeur du tidyverse. La plupart des fonctions des extensions du tidyverse acceptent des data frames en entrée, mais retournent un objet de classe tibble.

Pour être en mesure d’effectuer des calculs statistiques, il nous faut une structure qui soit en mesure de garder en mémoire une base de données. Ces structures se nomment des “tibbles” dans R.

2.4.1 Prérequis

Pour être en mesure d’utiliser le paquetage tibble, nous devons charger l’extension tibble. Pour ce faire, il suffit d’utiliser la commande suivante:

library(tibble)

2.4.2 Un exemple de tibble

Pour comprendre ce qu’est un tibble, nous allons utiliser deux librairies: nycflights13 et diamonds. Si ce n’est pas déjà fait, vous devez les installer et ensuite les charger.

library(nycflights13)
library(ggplot2)

Nous allons étudier le paquetage nycflights13qui contient 5 bases de données contenant des informations concernant les vols intérieurs en partance de New York en 2013, à partir des aéroports de Newark Liberty International (EWR), John F. Kennedy International (JFK) ou LaGuardia (LGA). Les 5 bases de données sont les suivantes:

  • flights: information sur les 336,776 vols
  • airlines: lien entre les codes IATA de deux lettres et les noms de compagnies d’aviation (16 au total)
  • planes: information de construction sur les 3 322 avions utilisés
  • weather: données météo à chaque heure (environ 8 710 observations) pour chacun des trois aéroports.
  • airports: noms des aéroports et localisations

2.4.3 La base de données flights

Pour visualiser facilement une base de données sous forme tibble, il suffit de taper son nom dans la console. Nous allons utiliser la base de données flights. Par exemple:

flights
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>
#> 1  2013     1     1      517            515        2.      830
#> 2  2013     1     1      533            529        4.      850
#> 3  2013     1     1      542            540        2.      923
#> 4  2013     1     1      544            545       -1.     1004
#> 5  2013     1     1      554            600       -6.      812
#> 6  2013     1     1      554            558       -4.      740
#> # ... with 3.368e+05 more rows, and 12 more variables:
#> #   sched_arr_time <int>, arr_delay <dbl>, carrier <chr>, flight <int>,
#> #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#> #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Nous allons décortiquer la sortie console:

  • A tibble: 336,776 x 19: un tibble est une façon de représenter une base de données en R. Cette base de données possède:
    • 336 776 lignes
    • 19 colonnes correspondant aux 19 variables décrivant chacune des observations
  • year month day dep_time sched_dep_time dep_delay arr_time sont différentes colonnes, en d’autres mots des variables, de cette base de données.
  • Nous avons ensuite 10 lignes d’obervations correspondant à 10 vols
  • ... with 336,766 more rows, and 12 more variables: nous indique que 336 766 lignes et 12 autres variables ne pouvaient pas être affichées à l’écran.

Malheureusement cette sortie écran ne nous permet pas d’explorer les données correctement. Nous verrons à la section 2.4.5 comment explorer des tibbles.

2.4.4 La base de données diamonds

La base de données diamonds est composée des variables suivantes:

  • price : prix en dollars US
  • carat : poids du diamant en grammes
  • cut : qualité de la coupe (Fair, Good, Very Good, Premium, Ideal)
  • color : couleur du diamant (J (pire) jusqu’à D (meilleur))
  • clarity : une mesure de la clarté du diamant (I1 (pire), SI2, SI1, VS2, VS1, VVS2, VVS1, IF (meilleur))
  • x : longueur en mm
  • y : largeur en mm
  • z : hauteur en mm
  • depth : z / mean(x, y) = 2 * z / (x + y)
  • table : largeur du dessus du diamant par rapport à son point le plus large
diamonds
#> # A tibble: 53,940 x 10
#>   carat cut       color clarity depth table price     x     y     z
#>   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.230 Ideal     E     SI2      61.5   55.   326  3.95  3.98  2.43
#> 2 0.210 Premium   E     SI1      59.8   61.   326  3.89  3.84  2.31
#> 3 0.230 Good      E     VS1      56.9   65.   327  4.05  4.07  2.31
#> 4 0.290 Premium   I     VS2      62.4   58.   334  4.20  4.23  2.63
#> 5 0.310 Good      J     SI2      63.3   58.   335  4.34  4.35  2.75
#> 6 0.240 Very Good J     VVS2     62.8   57.   336  3.94  3.96  2.48
#> # ... with 5.393e+04 more rows

2.4.5 Comment explorer des “tibbles”

Voici les façons les plus communes de comprendre les données se trouvant à l’intérieur d’un “tibble”:

1. En utilisant la fonction `View()` de RStudio.C'est la commande que nous utiliserons le plus fr?quemment.
2. En utilisant la fonction `glimpse()` du paquetage knitr
3. En utilisant la fonction `kable()`
4. En utilisant l'opérateur `$` pour étudier une seule variable d'une base de données
  1. View():

Éxécutez View(flights) dans la console de RStudio et explorez la base de données obtenue.

Nous remarquons que chaque colonnes représentent une variable différente et que ces variables peuvent être de différents types. Certaines de ces variables, comme distance, day et arr_delay sont des variables dites quantitatives. Ces variables sont numériques par nature. D’autres variables sont dites qualitatives.

Si vous regardez la colonne à l’extrème-gauche de la sortie de View(flights), vous verrez une colonne de nombres. Ces nombres représentent les numéros de ligne de la base de données. Si vous vous promenez sur une ligne de même nombre, par exemple la ligne 5, vous étudiez une unité statistique.

  1. glimpse:

La seconde façon d’explorer une base de données est d’utiliser la fonction glimpse(). Cette fonction nous donne la majorité de l’information précédente et encore plus.

glimpse(flights)
#> Observations: 336,776
#> Variables: 19
#> $ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,...
#> $ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
#> $ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
#> $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 55...
#> $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 60...
#> $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2...
#> $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 7...
#> $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 7...
#> $ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -...
#> $ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV",...
#> $ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79...
#> $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN...
#> $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR"...
#> $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL"...
#> $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138...
#> $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 94...
#> $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,...
#> $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, ...
#> $ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013...
  1. kable():

La dernière façon d’étudier l’entièreté de la base de données est d’utiliser la fonction kable() de la librairie knitr. Nous allons explorer les codes des différentes compagnies d’aviation de deux façons.

library(knitr)
airlines
#> # A tibble: 16 x 2
#>   carrier name                    
#>   <chr>   <chr>                   
#> 1 9E      Endeavor Air Inc.       
#> 2 AA      American Airlines Inc.  
#> 3 AS      Alaska Airlines Inc.    
#> 4 B6      JetBlue Airways         
#> 5 DL      Delta Air Lines Inc.    
#> 6 EV      ExpressJet Airlines Inc.
#> # ... with 10 more rows
kable(airlines)
carrier name
9E Endeavor Air Inc.
AA American Airlines Inc.
AS Alaska Airlines Inc.
B6 JetBlue Airways
DL Delta Air Lines Inc.
EV ExpressJet Airlines Inc.
F9 Frontier Airlines Inc.
FL AirTran Airways Corporation
HA Hawaiian Airlines Inc.
MQ Envoy Air
OO SkyWest Airlines Inc.
UA United Air Lines Inc.
US US Airways Inc.
VX Virgin America
WN Southwest Airlines Co.
YV Mesa Airlines Inc.

À première vue, les deux sorties sont semblables sauf que la seconde est beaucoup plus agréable visuellement dans un document R Markdown.

  1. L’opérateur $:

Finalement, l’opérateur $ nous permet d’explorer une seule variable à l’intérieur d’une base de données. Par exemple, si nous désirons étudier la variable name de la base de données airlines, nous obtenons:

airlines$name
#>  [1] "Endeavor Air Inc."           "American Airlines Inc."     
#>  [3] "Alaska Airlines Inc."        "JetBlue Airways"            
#>  [5] "Delta Air Lines Inc."        "ExpressJet Airlines Inc."   
#>  [7] "Frontier Airlines Inc."      "AirTran Airways Corporation"
#>  [9] "Hawaiian Airlines Inc."      "Envoy Air"                  
#> [11] "SkyWest Airlines Inc."       "United Air Lines Inc."      
#> [13] "US Airways Inc."             "Virgin America"             
#> [15] "Southwest Airlines Co."      "Mesa Airlines Inc."

Bibliographie

Wickham, Hadley. 2017b. Tidyverse: Easily Install and Load the ’Tidyverse’. https://CRAN.R-project.org/package=tidyverse.

Barnier, Julien. 2018. Introduction à R et Au Tidyverse. https://juba.github.io/tidyverse/.

Wickham, Hadley, and Garrett Grolemund. 2017. R for Data Science. 1st ed. O’Reilly Media Inc. http://r4ds.had.co.nz/.

Wickham, Hadley. 2014. “Tidy Data.” Journal of Statistical Software, Articles 59 (10):1–23. https://doi.org/10.18637/jss.v059.i10.