Chapitre 6 Agréger des données

Dans l’analyse de données, il est souvent nécessaire de regrouper les données selon certaines catégories avant d’effectuer des calculs ou des résumés statistiques. La fonction group_by() du package dplyr permet de créer ces groupes et d’appliquer des opérations spécifiques à chaque groupe. Cela peut être extrêmement utile pour analyser des sous-ensembles de données de manière indépendante.

6.1 Introduction à group_by()

La fonction group_by() regroupe les données en fonction d’une ou plusieurs variables. Une fois les données regroupées, vous pouvez utiliser des fonctions comme summarize(), mutate(), ou filter() pour effectuer des calculs sur chaque groupe.

6.1.1 Exemple de base

Prenons un exemple simple avec le jeu de données mtcars, où nous souhaitons regrouper les voitures par nombre de cylindres et calculer la consommation moyenne (mpg) pour chaque groupe.

# Charger les packages nécessaires
library(dplyr)

# Afficher les premières lignes du dataset mtcars
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Grouper les données par nombre de cylindres et calculer la consommation moyenne (mpg)
mpg_par_cylindre <- mtcars %>%
  group_by(cyl) %>%
  summarize(mpg_moyenne = mean(mpg))

# Afficher les résultats
mpg_par_cylindre
## # A tibble: 3 × 2
##     cyl mpg_moyenne
##   <dbl>       <dbl>
## 1     4        26.7
## 2     6        19.7
## 3     8        15.1

Dans cet exemple :

  • group_by(cyl) regroupe les données en fonction de la colonne cyl, qui représente le nombre de cylindres des voitures.
  • summarize(mpg_moyenne = mean(mpg)) calcule la moyenne de la consommation (mpg) pour chaque groupe de cylindres.

6.1.2 Comparaison avec Excel

Dans Excel, une tâche similaire serait réalisée à l’aide d’un tableau croisé dynamique. Par exemple, vous placeriez cyl (nombre de cylindres) en tant qu’axe de lignes et utiliseriez mpg (consommation) comme valeur à résumer, en sélectionnant la fonction de résumé MOYENNE.

Différences clés :

  • Automatisation : En R, les agrégations peuvent être automatisées via des scripts et appliquées à d’autres jeux de données sans avoir à recréer manuellement les étapes, contrairement à un tableau croisé dynamique dans Excel.
  • Complexité : La syntaxe de dplyr est flexible et facile à modifier, permettant d’ajuster les calculs ou les regroupements sans réarranger des champs comme dans Excel.

6.1.3 Grouper par plusieurs variables

Il est également possible de grouper les données par plusieurs variables. Par exemple, vous pouvez regrouper les voitures à la fois par nombre de cylindres (cyl) et par type de boîte de vitesses (am), puis calculer la consommation moyenne pour chaque combinaison de groupes.

# Grouper les données par nombre de cylindres et type de boîte de vitesses, puis calculer la consommation moyenne
mpg_par_cylindre_et_boite <- mtcars %>%
  group_by(cyl, am) %>%
  summarize(mpg_moyenne = mean(mpg))
## `summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# Afficher les résultats
mpg_par_cylindre_et_boite
## # A tibble: 6 × 3
## # Groups:   cyl [3]
##     cyl    am mpg_moyenne
##   <dbl> <dbl>       <dbl>
## 1     4     0        22.9
## 2     4     1        28.1
## 3     6     0        19.1
## 4     6     1        20.6
## 5     8     0        15.0
## 6     8     1        15.4

Dans cet exemple :

  • group_by(cyl, am) crée des groupes en combinant les valeurs des colonnes cyl (nombre de cylindres) et am (type de boîte de vitesses : automatique ou manuelle).
  • summarize() calcule la moyenne de la consommation (mpg) pour chaque combinaison de ces groupes.

6.1.4 Comparaison avec Excel

Dans Excel, pour obtenir des agrégations basées sur plusieurs variables, vous devrez ajouter un deuxième champ (par exemple, am) aux colonnes ou aux lignes dans un tableau croisé dynamique. Bien que cela soit faisable, la modification ou la mise à jour du tableau croisé dynamique peut devenir fastidieuse, surtout si vos données changent fréquemment.

En R, une seule commande permet d’ajouter des critères supplémentaires de regroupement avec group_by(), ce qui est plus pratique et reproductible dans des analyses complexes.

6.1.5 Autres opérations avec group_by()

Une fois que vos données sont regroupées, vous pouvez appliquer diverses opérations, telles que :

6.1.5.1 Calcul de plusieurs résumés statistiques

Vous pouvez calculer plusieurs résumés statistiques pour chaque groupe. Par exemple, en plus de la consommation moyenne, vous pouvez également calculer la consommation maximale et le nombre d’observations dans chaque groupe.

# Calculer plusieurs résumés statistiques pour chaque groupe
stats_par_cylindre <- mtcars %>%
  group_by(cyl) %>%
  summarize(
    mpg_moyenne = mean(mpg),
    mpg_maximum = max(mpg),
    n = n()
  )

# Afficher les résultats
stats_par_cylindre
## # A tibble: 3 × 4
##     cyl mpg_moyenne mpg_maximum     n
##   <dbl>       <dbl>       <dbl> <int>
## 1     4        26.7        33.9    11
## 2     6        19.7        21.4     7
## 3     8        15.1        19.2    14

Comparaison avec Excel :

Dans Excel, pour calculer plusieurs résumés statistiques dans un tableau croisé dynamique, vous devrez ajouter plusieurs champs de valeurs, chacun configuré avec une fonction de résumé différente (par exemple, moyenne, maximum, comptage). Cette approche peut rapidement devenir encombrante à gérer lorsque vous avez besoin de plusieurs résumés pour chaque groupe.

En R, summarize() permet d’effectuer plusieurs agrégations en une seule ligne de code, ce qui est plus clair et facile à ajuster.

6.1.5.2 Filtrer les données après un groupement

Vous pouvez également filtrer les données en fonction des statistiques de chaque groupe. Par exemple, vous pouvez filtrer les groupes où la consommation moyenne dépasse un certain seuil.

# Filtrer les groupes où la consommation moyenne est supérieure à 20 mpg
groupes_filtrés <- mtcars %>%
  group_by(cyl) %>%
  summarize(mpg_moyenne = mean(mpg)) %>%
  filter(mpg_moyenne > 20)

# Afficher les résultats
groupes_filtrés
## # A tibble: 1 × 2
##     cyl mpg_moyenne
##   <dbl>       <dbl>
## 1     4        26.7

Comparaison avec Excel : Dans Excel, il n’est pas possible de filtrer directement les valeurs calculées dans un tableau croisé dynamique. Vous devrez copier les résultats ailleurs et appliquer manuellement des filtres, ce qui augmente le risque d’erreurs.

En R, filter() peut être appliqué directement après l’agrégation, ce qui permet de filtrer les groupes de manière dynamique et sans étapes manuelles supplémentaires.

6.1.5.3 Utiliser mutate() sur des groupes

La fonction mutate() peut être utilisée pour créer de nouvelles colonnes basées sur des calculs effectués sur chaque groupe. Par exemple, vous pouvez créer une colonne indiquant la différence entre la consommation de chaque voiture et la consommation moyenne de son groupe.

# Créer une nouvelle colonne indiquant la différence entre la consommation et la moyenne du groupe
mtcars_avec_diff <- mtcars %>%
  group_by(cyl) %>%
  mutate(diff_mpg = mpg - mean(mpg))

# Afficher les premières lignes des résultats
head(mtcars_avec_diff)
## # A tibble: 6 × 12
## # Groups:   cyl [3]
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb diff_mpg
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4     1.26
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4     1.26
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1    -3.86
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1     1.66
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2     3.6 
## 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1    -1.64

Comparaison avec Excel :

Dans Excel, pour créer une nouvelle colonne basée sur des calculs regroupés (par exemple, la différence par rapport à une moyenne de groupe), vous devrez souvent utiliser des formules comme MOYENNE.SI() et appliquer manuellement la logique de regroupement pour chaque ligne. Cela peut devenir complexe et sujet à erreurs, surtout avec des données volumineuses.

En R, mutate() permet d’ajouter de nouvelles colonnes basées sur des calculs de groupe de manière beaucoup plus simple et plus directe.

6.2 Récapitulatif

La fonction group_by() est un outil puissant pour analyser des sous-groupes de données dans R. Elle permet de :

  • Créer des groupes basés sur une ou plusieurs colonnes.
  • Appliquer des résumés statistiques avec summarize().
  • Effectuer des opérations personnalisées avec mutate().
  • Filtrer les groupes avec filter().

En combinant group_by() avec d’autres fonctions de dplyr, vous pouvez effectuer des analyses complexes tout en gardant une syntaxe claire et expressive.

6.2.1 Comparaison générale avec Excel

  • Automatisation : Les opérations d’agrégation en R peuvent être automatisées et reproduites facilement, contrairement aux tableaux croisés dynamiques d’Excel qui nécessitent souvent des ajustements manuels.
  • Flexibilité : R offre une plus grande flexibilité pour combiner plusieurs opérations d’agrégation, filtrer les groupes, et ajouter des colonnes calculées sans étapes intermédiaires complexes. Efficacité : R permet de traiter des ensembles de données plus volumineux de manière plus performante qu’Excel, où les tableaux croisés dynamiques peuvent devenir lents et encombrants.

6.3 Exercice

À partir de la base statistique départementale de la délinquance enregistrée par la police et la gendarmerie nationales, donnez le nombre de faits par région et par classe.

Calculer le taux pour 1000 habitants par région et par classe.

Challenge : Essayez de réaliser ces agrégations à la fois en R et en Excel