3.1 Histogramme
Vous souhaitez visualiser l’étalement de vos données sur un axe (on parle de distribution6 en statistique) pour l’une des variables étudiées. L’histogramme est l’un des outils pouvant vous apporter cette information. Ce graphique va représenter sous forme de barres un découpage en plusieurs classes7 d’une variable numérique.
Outre l’histogramme lui-même, représenté par des barres de hauteur équivalentes au nombre de fois que les observations ont été réalisées dans les différentes classes, les éléments suivants sont également indispensables à la compréhension du graphique (ici mis en évidence en couleur)
- Les axes avec les graduations (en rouge). Su l’axe des abscisses, les classes de tailles, et sur l’axe des ordonnées, le nombre d’occurrence
- les labels des axes et l’unité (pour l’axe des abscisses uniquement ici) (en bleu)
Les instructions dans R afin de produire un histogramme à l’aide de la fonction chart()
sont :
# Importation du jeu de données
(zooplankton <- read("zooplankton", package = "data.io", lang = "FR"))
# # A tibble: 1,262 x 20
# ecd area perimeter feret major minor mean mode min max
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 0.770 0.465 4.45 1.32 1.16 0.509 0.363 0.0360 0.00400 0.908
# 2 0.700 0.385 2.32 0.728 0.713 0.688 0.361 0.492 0.0240 0.676
# 3 0.815 0.521 4.15 1.33 1.11 0.598 0.308 0.0320 0.00800 0.696
# 4 0.785 0.484 4.44 1.78 1.56 0.394 0.332 0.0360 0.00400 0.728
# 5 0.361 0.103 1.71 0.739 0.694 0.188 0.153 0.0160 0.00800 0.452
# 6 0.832 0.544 5.27 1.66 1.36 0.511 0.371 0.0200 0.00400 0.844
# 7 1.23 1.20 15.7 3.92 1.37 1.11 0.217 0.0120 0.00400 0.784
# 8 0.620 0.302 3.98 1.19 1.04 0.370 0.316 0.0120 0.00400 0.756
# 9 1.19 1.12 15.3 3.85 1.34 1.06 0.176 0.0120 0.00400 0.728
# 10 1.04 0.856 7.60 1.89 1.66 0.656 0.404 0.0440 0.00400 0.880
# # ... with 1,252 more rows, and 10 more variables: std_dev <dbl>,
# # range <dbl>, size <dbl>, aspect <dbl>, elongation <dbl>,
# # compactness <dbl>, transparency <dbl>, circularity <dbl>,
# # density <dbl>, class <fct>
# Réalisation du graphique
chart(data = zooplankton, ~ size) +
geom_histogram(bins = 50) +
ylab("Effectifs")
# bins permet de préciser le nombre de classes souhaitées
La fonction chart()
requiert comme argument le jeu de donnée (zooplankton
), ainsi que la formule à employer dans laquelle vous avez indiqué le nom de la variable que vous voulez sur l’axe des abscisses à droite de la formule, après le tilde ~
. Vous voyez que le jeu de données contient beaucoup de variables (les titres des colonnes du tableau en sortie). Parmi toutes ces variables, nous avons choisi ici de représenter size
, Jusqu’ici, nous avons spécifié ce que nous voulons représenter, mais pas encore comment (sous quelle apparence), nous voulons matérialiser cela sur le graphique. Pour un histogramme, nous devons ajouter la fonction geom_histogram()
. L’argument bins
dans cette fonction permet de préciser le nombre de classes souhaitées. Le découpage en classe se fait automatiquement dans R à partir de la variable size
d’origine.
Vous pouvez décrypter votre histogramme sur base des modes8 et de la symétrie9 de ces derniers. Un histogramme peut être unimodal (un seul mode), bimodal (deux modes) ou multimodal (plus de deux modes). En général, s’il y a plus d’un mode, nous pouvons suspecter que des sous-populations existent au sein de notre échantillon.
3.1.1 Nombre de classes
Vous devez être particulièrement vigilant lors de la réalisation d’un histogramme aux classes définies pour ce dernier.
# Réalisation du graphique précédent
a <- chart(data = zooplankton, ~ size) +
geom_histogram(bins = 50) +
ylab("Effectifs")
# Modification du nombre de classes
b <- chart(data = zooplankton, ~ size) +
geom_histogram(bins = 20) +
ylab("Effectifs")
c <- chart(data = zooplankton, ~ size) +
geom_histogram(bins = 10) +
ylab("Effectifs")
d <- chart(data = zooplankton, ~ size) +
geom_histogram(bins = 5) +
ylab("Effectifs")
# Assemblage des graphiques
combine_charts(list(a, b, c, d))
Comme vous pouvez le voir à la Fig. 3.3, le changement du nombre de classes peut modifier complètement la perception des données via l’histogramme. Le choix idéal est un compromis entre plus de classes (donc plus de détails), et un d“coupage raisonnable en fonction de la quantité de données disponibles. Si l’intervalle des classes est trop petit, l’histogramme sera illisible. Si l’intervalle des classes est trop grand, il sera impossible de visualiser correctement les différents modes. Dans la figure en exemple, les variantes A et B sont acceptables, mais les C et D manquent de détails.
Pièges et astuces
La SciViews Box propose un snippet RStudio pour réaliser un histogramme. Il s’appelle .cuhist
(pour chart -> univariate -> histogram). Entrez ce code dans une zone d’édition R et appuyez ensuite sur la tabulation, et vous verrez le code remplacé par ceci :
chart(data = DF, ~VARNUM) +
geom_histogram(binwidth = 30)
L’argument binwidth =
permet de préciser la largeur des classes. C’est une autre façon de spécifier le découpage en classes, mais vous pouvez naturellement le remplacer par l’argument bins =
si vous préférez.
Vous avez à votre disposition un ensemble de snippets que vous pouvez retrouver dans l’aide-mémoire sur SciViews. N’oubliez pas que vous avez également à votre disposition l’aide-mémoire sur la visualisation des données (Data Visualization Cheat Sheet), via la fonction ggplot()
.
3.1.2 Histogramme par facteur
Lors de l’analyse de jeux de données, vous serez amené à réaliser un histogramme par facteur (c’est-à-dire, en fonction de différents niveaux d’une variable qualitative qui divise le jeu de données en sous-groupes). Par exemple, dans un jeu de données sur des fleurs d’iris, la variable species
10 représente l’espèce d’iris étudiée (trois espèces différentes : I. setosa, I. versicolor et I. virginica).
# Importation du jeu de données
(iris <- read("iris", package = "datasets", lang = "fr"))
# # A tibble: 150 x 5
# sepal_length sepal_width petal_length petal_width species
# <dbl> <dbl> <dbl> <dbl> <fct>
# 1 5.10 3.50 1.40 0.200 setosa
# 2 4.90 3.00 1.40 0.200 setosa
# 3 4.70 3.20 1.30 0.200 setosa
# 4 4.60 3.10 1.50 0.200 setosa
# 5 5.00 3.60 1.40 0.200 setosa
# 6 5.40 3.90 1.70 0.400 setosa
# 7 4.60 3.40 1.40 0.300 setosa
# 8 5.00 3.40 1.50 0.200 setosa
# 9 4.40 2.90 1.40 0.200 setosa
# 10 4.90 3.10 1.50 0.100 setosa
# # ... with 140 more rows
# Réalisation de l'histogramme par facteur
chart(data = iris, ~ sepal_length %fill=% species) +
geom_histogram(bins = 25) +
ylab("Effectifs") +
scale_fill_viridis_d() # palette de couleur harmonieuse
Ici, nous avons tracé un histogramme unique, mais en prenant soin de colorier les barres en fonction de l’espèce. la formule fait toujours intervenir la variable numérique à découper en classes à la droite du tilde ~
, ici sepal_length
, mais nous y avons ajouté une directive supplémentaire pour indiquer que le remplissage des barres (%fill=%
) doit se faire en fonction du contenu de la variable species
.
Nous avons ici un bon exemple d’histogramme multimodal lié à la présence de trois sous-groupes (les trois espèces différentes) au sein d’un jeu de données unique. Le rendu du graphique n’est pas optimal. Voici deux astuces pour l’améliorer. La premières consiste à représenter trois histogrammes séparés, mais rassemblés dans une même figure. Pour cela, nous utilisons des facettes (facets
) au lieu de l’argument %fill=%
. Dans chart()
, les facettes peuvent être spécifiées an utilisant l’opérateur |
dans la formule.
chart(data = iris, ~ sepal_length | species) +
geom_histogram(bins = 25) +
ylab("Effectifs")
L’histogramme est maintenant séparé en trois en fonction des niveaux de la variable facteur species
. Cela rend la lecture plus aisée. Une seconde solution combine les facettes avec |
et l’argument %fill=%
11. Il faut ensuite ajouter par derrière un histogramme grisé de l’ensemble des données.
nbins <- 25
chart(data = iris, ~ sepal_length %fill=% species | species) +
# histogramme d'arrière plan en gris ne tenant pas compte de la variable species
geom_histogram(data = select(iris, -species), fill = "grey", bins = nbins) +
geom_histogram(show.legend = FALSE, bins = nbins) +
ylab("Effectifs") +
scale_fill_viridis_d()
Vous découvrez sans doute que les graphiques réalisables avec R sont modulables à souhait en ajoutant une série d’instructions successives qui créent autant de couches superposées dans le graphique. Cette approche permet de réaliser quasiment une infinité de graphiques différents en combinant seulement quelques dizaines d’instructions. Pour s’y retrouver, les fonctions qui ajoutent des couches commencent toutes par geom_
, et celles qui manipulent les couleurs par scale_
, par exemple. Vous découvrirez encore d’autres fonctions graphiques plus loin.
La distribution des données en statistique se réfère à la fréquence avec laquelle les différentes valeurs d’une variable s’observent.↩
Une variable numérique est découpée en classes en spécifiant différents intervalles, et ensuite en dénombrant le nombre de fois que les observations rentrent dans ces classes.↩
Les modes d’un histogramme correspondent à des classes plus abondantes localement, c’est-à-dire que les classes à gauche et à droite du mode comptent moins d’occurrences que lui.↩
Un histogramme est dit symétrique lorsque son profil à gauche est identique ou très similaire à son profil à droite autour d’un mode.↩
Attention : le jeu de donnée
iris
est un grand classique dans R, mais lorsqu’il est chargé à l’aide de la fonctionread()
du package data.io, le nom de ses variables est modifié pour suivre la convention “snake-case” qui veut que seules des lettres minuscules soient utilisées et que les mots soient séparés par un trait souligné_
. Ainsi, dans le jeu de données d’origine, les variables sont nomméesPetal_Length
ouSpecies
. Ici, ces même variables se nommentpetal_length
etspecies
.↩