Geoms avec calculs statistiques (transformations)

Plusieurs objets géométriques (en anglais geoms) disposent de fonctions intégrées de transformations et de calculs statistiques. Dans plusieurs chapitres précédents, nous avons présenté geom_smooth(), qui calcule et visualise la relation entre x et y. La fonction geom_smooth() possède l'argument method, que l'on peut fixer à "loess" pour générer une courbe de régression flexible ou à "lm" pour générer une droite de régression linéaire. Le même principe s'applique à plusieurs autres geoms, ce qui signifie qu'ils effectuent des calculs pour visualiser les données.

Dans ce chapitre, nous utiliserons les données de gapminder pour montrer comment fonctionnent les transformations. Nous commençons par charger le package gapminder et par inspecter les 10 premières lignes. L'inspection des données peut se faire, entre autres, avec la fonction head().

library(gapminder)
head(gapminder, 10)
country <fctr> continent <fctr> year <int> lifeExp <dbl> pop <int> gdpPercap <dbl>
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134
Afghanistan Asia 1982 39.854 12881816 978.0114
Afghanistan Asia 1987 40.822 13867957 852.3959
Afghanistan Asia 1992 41.674 16317921 649.3414
Afghanistan Asia 1997 41.763 22227415 635.3414

Nous construisons ensuite un diagramme en barres qui montre combien d'observations (lignes) il y a pour chaque continent. Cela se fait avec geom_bar(), qui crée un diagramme en barres. Le seul mappage esthétique que nous déclarons est x=continent. La fonction calculera automatiquement l'axe des y (le nombre de lignes pour chaque continent).

ggplot(data=gapminder) +
  geom_bar(aes(x=continent))
Diagramme en barres du nombre d'observations par continent dans gapminder, l'Afrique en comptant le plus et l'Océanie le moins

Une alternative à ce qui précède consiste à calculer soi-même le nombre d'observations sur chaque continent. Cela se fait facilement avec la fonction count() du package dplyr. Vous avez probablement déjà chargé dplyr, puisqu'il fait partie du package tidyverse. Sinon, nous le chargeons maintenant :

library(tidyverse)

La fonction count() compte le nombre de lignes pour une ou plusieurs variables catégorielles, de la manière suivante :

gapminder |>
  count(continent)
continent <fctr> n <int>
Africa 624
Americas 300
Asia 396
Europe 360
Oceania 24

Comme on le voit ci-dessus, le nombre de lignes (n) est calculé pour chaque continent (continent).

Comme on le voit ci-dessus, le nombre de lignes (n) est calculé pour chaque continent (continent). Nous prenons maintenant ces données et créons un diagramme en barres identique au précédent. Comme geom_bar() ne doit plus calculer lui-même l'axe des y, nous indiquons y=n et nous utilisons l'argument stat="identity" pour signaler que les valeurs sont déjà calculées. Notez également que nous relions count() à ggplot() et utilisons ainsi directement le résultat de count() dans ggplot(). Cela est possible parce que le pipe (|>) transmet le résultat d'une opération à la fonction suivante, où ce résultat est utilisé comme premier argument (le premier argument de la fonction ggplot() est data).

gapminder |>
  count(continent) |>
  ggplot(aes(x=continent, y=n)) +
  geom_bar(stat="identity")
Diagramme en barres du nombre de lignes n par continent dans gapminder, identique au précédent mais construit avec stat identity

D'autres transformations (calculs) sont intégrées aux objets géométriques. Vous avez déjà rencontré geom_smooth() dans le chapitre précédent. Voici d'autres exemples de geoms qui effectuent des calculs lorsqu'ils sont utilisés :

  • geom_bar(), geom_histogram(), geom_freqpoly() calculent des sommes et des proportions.
  • geom_boxplot(), geom_violin() calculent des distributions.
  • geom_smooth() crée un modèle de régression qui est visualisé.

Dans l'exemple suivant, nous utilisons gapminder pour faire ce qui suit :

  • Ligne 2 : nous ne conservons que les pays d'Afrique en filtrant avec l'argument continent=="Africa".
  • Ligne 2 : nous ne conservons que les données de l'année 1997 en filtrant avec l'argument year==1997.
  • Ligne 2 : nous relions directement ggplot() aux opérations précédentes avec |>
  • Ligne 4 : nous créons un diagramme en barres où le pays est l'axe des y et l'espérance de vie l'axe des x. Comme ces valeurs sont déjà calculées, l'argument stat="identity" est utilisé :
gapminder |>
  filter(continent=="Africa", year==1997) |>
  ggplot()+
  geom_bar(aes(y=country,
               x=pop),
           stat="identity")
Diagramme en barres horizontales de la population en 1997 des pays africains, par ordre alphabétique

Nous poursuivons en triant l'axe des y selon l'espérance de vie (lifeExp). Cela peut se faire directement dans aes() avec la fonction reorder(). Dans reorder, on précise ce qui doit être trié (country) et la colonne selon laquelle le tri doit être effectué (pop, c'est-à-dire la population). Voir la ligne 4 ci-dessous.

gapminder |>
  filter(continent=="Africa", year==1997) |>
  ggplot()+
  geom_bar(aes(y=reorder(country, pop),
               x=pop),
           stat="identity")
Diagramme en barres horizontales de la population en 1997 en Afrique, trié avec le Nigeria en haut et Sao Tomé-et-Principe en bas

Un signe moins (-) devant pop dans reorder() produit un tri inversé, comme suit (voir ligne 4) :

gapminder |>
  filter(continent=="Africa", year==1997) |>
  ggplot()+
  geom_bar(aes(y=reorder(country, -pop),
               x=pop),
           stat="identity")
Diagramme en barres horizontales de la population en 1997 en Afrique en tri inversé, avec le Nigeria en bas

Nous devons également visualiser l'espérance de vie (lifeExp) de chaque pays, ce que nous pouvons faire avec l'argument fill(), de la manière suivante (ligne 6) :

gapminder |>
  filter(continent=="Africa", year==1997) |>
  ggplot()+
  geom_bar(aes(y=reorder(country, pop),
               x=pop,
               fill=lifeExp),
           stat="identity")
Diagramme en barres horizontales de la population en 1997 en Afrique, où la nuance de bleu de chaque barre indique l'espérance de vie

Proportions

Avec geom_bar(), on peut calculer des proportions (prop) au lieu d'effectifs (count). Cela se fait au moyen d'un « calcul a posteriori » (after_stat) sur y et en spécifiant group=1, ce qui signifie que la proportion totale sur l'ensemble des continents doit valoir 1 :

ggplot(data = gapminder) +
  geom_bar(mapping = aes(x = continent,
                         y = after_stat(prop),
                         group = 1))
Diagramme en barres de la proportion d'observations par continent dans gapminder, l'Afrique représentant environ 0,37

Stat summary : stat_summary()

Nous pouvons aussi utiliser stat_summary() pour choisir les paramètres à calculer et à visualiser. Avec stat_summary(), nous disposons d'une plus grande flexibilité quant aux calculs. Nous spécifions nous-mêmes les fonctions à utiliser et nous choisissons en outre le type de geom qui illustrera le résultat. Ci-dessous, nous utilisons stat_summary() pour calculer la moyenne, la valeur minimale et la valeur maximale de l'espérance de vie sur chaque continent, et le résultat est visualisé avec le geom « pointrange » (geom_pointrange()) :

## Nous utilisons uniquement les données de 1997
ggplot(data = filter(gapminder, year==1997)) +
  stat_summary(
    aes(x = continent,
        y = lifeExp),
    fun = mean,
    fun.min = min,
    fun.max = max,
    geom = "pointrange"
  )
Diagramme point-intervalle de la moyenne, du minimum et du maximum de l'espérance de vie par continent en 1997

Diagrammes en barres segmentés

Nous revenons aux données mpg pour illustrer d'autres fonctionnalités de geom_bar(). Dans l'exemple suivant, nous utilisons fill pour faire apparaître les parts d'une barre. Nous voulons faire apparaître les parts de la colonne drv (le type de transmission de la voiture) dans chaque barre. Dans le code ci-dessous, nous avons également ajusté le thème du graphique avec la fonction theme() afin d'incliner le texte de l'axe des x de 45° (les thèmes sont abordés dans un chapitre ultérieur).

mpg |>
  ggplot(aes(x=manufacturer,
             fill=drv)) +
  geom_bar() +
  # Incline le texte de l'axe des x de 45°
  theme(axis.text.x = element_text(angle=45))
Diagramme en barres empilées du nombre de voitures par constructeur dans mpg, coloré selon la transmission 4, f et r

Il semble que le constructeur Volkswagen ne fabrique que des voitures à traction avant (f), tandis que Subaru ne fabrique que des voitures à quatre roues motrices. Land Rover ne fabrique que des voitures à propulsion arrière.

Dans l'exemple ci-dessus, nous avons écrit geom_gar() sans aucun argument. Cela signifie que position a pris sa valeur par défaut, qui est « identity ». Il existe aussi les options « dodge » et « fill », qui donnent les graphiques suivants :

mpg |>
  ggplot(aes(x=manufacturer,
             fill=drv)) +
  geom_bar(position="dodge") +
  theme(axis.text.x = element_text(angle=45))
Diagramme en barres du nombre de voitures par constructeur avec les transmissions 4, f et r en barres côte à côte

Comme on le voit ci-dessus, position="dodge" place les segments côte à côte au lieu de les empiler les uns sur les autres. Nous poursuivons avec position="fill" :

mpg |>
  ggplot(aes(x=manufacturer,
             fill=drv)) +
  geom_bar(position="fill") +
  theme(axis.text.x = element_text(angle=45))
Diagramme en barres où la barre de chaque constructeur montre la proportion de voitures avec la transmission 4, f et r, jusqu'à 1

Comme on le voit ci-dessus, position="fill" présente les segments de chaque barre sous forme de parts (proportions) au lieu d'effectifs.