3.3 Boite à moustaches
Vous souhaitez représenter graphiquement cette fois un résumé d’une variable numérique mesurée sur un nombre (relativement) important d’individus, soit depuis une dizaine jusqu’à plusieurs millions. Vous souhaitez également conserver de l’information sur la distribution des données, et voulez éventuellement comparer plusieurs distributions entre elles : soit différentes variables, soit différents niveaux d’une variable facteur. Nous avons déjà vu au module 2 les diagrammes en violon et en lignes de crêtes pour cet usage. Nous allons étudier ici les boites à moustaches (encore appelées boites de dispersion) comme option alternative intéressante. La boite à moustaches représentera graphiquement cinq descripteurs communément appelés les cinq nombres.
Considérez l’échantillon suivant :
1, 71, 55, 68, 78, 60, 83, 120, 82 ,53, 26
Ordonnons-le de la plus petite à la plus grande valeur :
# Créer du vecteur
x <- c(1, 71, 55, 68, 78, 60, 83, 120, 82, 53, 26)
# Ordonner le vecteur par ordre croissant
sort(x)
# [1] 1 26 53 55 60 68 71 78 82 83 120
Le premier descripteur des cinq nombres est la médiane qui est la valeur se situant à la moitié des observations, donc, avec autant d’observations plus petites et d’observations plus grandes qu’elle. La médiane sépare l’échantillon en deux.
# [1] 68
En effet, nous voyons sur le vecteur ordonné que cinq valeurs sont plus petites que 68 et cinq valeurs sont plus grandes. Les quartiles séparent l’échantillon en quatre. Le premier quartile (Q1) sera la valeur pour laquelle 25% des observations seront plus petites. Elle se situe donc entre la valeur minimale et la médiane. Cette médiane est égale au second quartile (50% des observations plus petites). Le troisième quartile (Q3) est la valeur pour laquelle 75% des observations de l’échantillon sont plus petites13. Enfin, la valeur minimale et la valeur maximale observées dans l’échantillon complètent ces cinq nombres qui décrivent de manière synthétique la position et l’étendue des observations.
Les cinq nombres sont : la valeur minimale, le premier quartile, la médiane (ou deuxième quartile), le troisième quartile et la valeur maximale.
Voici comment on les calcule facilement dans R :
# [1] 1 54 68 80 120
La boite à moustaches est une représentation graphique codifiée de ces cinq nombres. La représentation de x
sous forme de nuage de points n’est ni très esthétique, ni très lisible, surtout si nous avons affaire à des milliers ou des millions d’observations qui se chevauchent sur le graphique14.
La boite à moustaches va remplacer cette représentation peu lisible par un objet géométrique qui représente les cinq nombres.
Vous observez à la Fig. 3.14 que certaines valeurs minimales et maximales ne sont pas reliées à la boite à moustaches, il s’agit de valeurs extrêmes.
Règle pour déterminer s’il y a des valeurs extrêmes avec une boite à moustaches : une valeur est considérée comme extrême si son écart par rapport à la boite est supérieur à une fois et demie la hauteur de la boite (encore appelée espace inter-quartile IQR correspondant à Q3 - Q1). Les tiges (ou “moustaches”) qui prolongent la boite à moustaches s’arrêtent donc aux dernières valeurs les plus petites et plus grandes, mais qui rentrent encore dans une fois et demie l’IQR. Les valeurs extrêmes sont ensuite représentées individuellement par un point au-dessus et en dessous.
La boite à moustaches finale ainsi que sa description sont représentées à la Fig. 3.15 ci-dessous.
Un des gros avantages de la boite à moustaches est de mettre en évidence de manière synthétique la distribution des données sur l’axe. La boite à moustaches parallèle place plusieurs boites à moustaches côte à côte en face d’un même axe. C’est un excellent moyen de comparer la dispersion de données numériques en fonction des niveaux d’une variable factor. Les instructions dans R pour produire un graphique en boites à moustaches parallèles sont :
La formule à employer est YNUM (size) ~ XFACTOR (class)
. Ensuite, pour réaliser une boite à moustaches, vous devez ajouter la fonction geom_boxplot()
.
3.3.1 Taille de l’échantillon
Lors de la réalisation de boites à moustaches, vous devez être vigilant au nombre d’observations qui se cachent sous chacune d’elles. En effet, réaliser une boite à moustaches à partir d’échantillons ne comportant que cinq valeurs ou moins n’a aucun sens !
La boite à moustaches pour le niveau "A"
est calculée à partir de seulement quatre observations. C’est trop peu. Comme les points représentant les observations ne sont habituellement pas superposés à la boite, cela peut passer inaperçu et tromper le lecteur ! Une bonne pratique consiste à ajouter n, le nombre d’observations au-dessus de chaque boite. Cela peut se faire facilement avec les fonctions give_n()
et stat_summary()
ci-dessous15.
give_n <- function(x)
c(y = max(x) * 1.1, label = length(x))
chart(data = copepoda, size ~ class) +
geom_boxplot() +
stat_summary(fun.data = give_n, geom = "text", hjust = 0.5)
La fonction stat_summary()
ajoute des éléments à un graphique sur base d’un calcul. Ici, nous rajoutons du texte geom = "text"
, sur base du calcul effectué avec notre fonction give_n()
définie plus haut. L’argument hjust = 0.5
indique que le texte doit être justifié horizontalement à 0.5 (= centré, car 0 = justification à gauche, et 1 = justification à droite).
3.3.2 En fonction de deux facteurs
La Fig. 3.19 présente un graphique en boites à moustaches parallèles qui combine l’usage de deux variables facteurs différentes. Nous allons utiliser un autre jeu de données qui a besoin d’être retravaillé pour effectuer ce graphique.
# Importation du jeu de données ToothGrowth
(tooth_growth <- read("ToothGrowth", package = "datasets", lang = "fr"))
# len supp dose
# <num> <fctr> <num>
# 1: 4.2 VC 0.5
# 2: 11.5 VC 0.5
# 3: 7.3 VC 0.5
# 4: 5.8 VC 0.5
# 5: 6.4 VC 0.5
# 6: 10.0 VC 0.5
# 7: 11.2 VC 0.5
# 8: 11.2 VC 0.5
# 9: 5.2 VC 0.5
# 10: 7.0 VC 0.5
# 11: 16.5 VC 1.0
# 12: 16.5 VC 1.0
# 13: 15.2 VC 1.0
# 14: 17.3 VC 1.0
# 15: 22.5 VC 1.0
# 16: 17.3 VC 1.0
# 17: 13.6 VC 1.0
# 18: 14.5 VC 1.0
# 19: 18.8 VC 1.0
# 20: 15.5 VC 1.0
# 21: 23.6 VC 2.0
# 22: 18.5 VC 2.0
# 23: 33.9 VC 2.0
# 24: 25.5 VC 2.0
# 25: 26.4 VC 2.0
# 26: 32.5 VC 2.0
# 27: 26.7 VC 2.0
# 28: 21.5 VC 2.0
# 29: 23.3 VC 2.0
# 30: 29.5 VC 2.0
# 31: 15.2 OJ 0.5
# 32: 21.5 OJ 0.5
# 33: 17.6 OJ 0.5
# 34: 9.7 OJ 0.5
# 35: 14.5 OJ 0.5
# 36: 10.0 OJ 0.5
# 37: 8.2 OJ 0.5
# 38: 9.4 OJ 0.5
# 39: 16.5 OJ 0.5
# 40: 9.7 OJ 0.5
# 41: 19.7 OJ 1.0
# 42: 23.3 OJ 1.0
# 43: 23.6 OJ 1.0
# 44: 26.4 OJ 1.0
# 45: 20.0 OJ 1.0
# 46: 25.2 OJ 1.0
# 47: 25.8 OJ 1.0
# 48: 21.2 OJ 1.0
# 49: 14.5 OJ 1.0
# 50: 27.3 OJ 1.0
# 51: 25.5 OJ 2.0
# 52: 26.4 OJ 2.0
# 53: 22.4 OJ 2.0
# 54: 24.5 OJ 2.0
# 55: 24.8 OJ 2.0
# 56: 30.9 OJ 2.0
# 57: 26.4 OJ 2.0
# 58: 27.3 OJ 2.0
# 59: 29.4 OJ 2.0
# 60: 23.0 OJ 2.0
# len supp dose
# Remaniement et labelisation du jeu de données
tooth_growth$dose <- as.ordered(tooth_growth$dose)
tooth_growth <- labelise(tooth_growth, self = FALSE,
label = list(
len = "Longueur des dents",
supp = "Supplémentation",
dose = "Dose"
),
units = list(
len = "mm",
supp = NA,
dose = "mg/J"
)
)
Petits commentaires sur ce code :
La fonction
labelise()
appliquée au tableau tout entier et avec l’argumentself = FALSE
s’applique aux colonnes du tableau, c’est-à-dire aux variables. Ensuite, les argumentslabel =
etunits =
reçoivent unelist()
nommée pour en modifier les attributs (nom = "valeur"
). C’est une manière pratique et efficace de changer tous les labels et unités des variables en une seule étape (il n’est pas indispensable de reprendre toutes les variables, on peut indiquer seulement celles que l’on veut modifier).Nous avons utilisé
as.ordered()
à la place deas.factor()
. Les objets “facteurs ordonnés” dans R (ou ordered) sont identiques aux facteurs à ceci près que l’ordre de niveaux a aussi un sens du plus petit au plus grand. Ainsi, des niveaux desupp
: soit"VC"
pour vitamine C ou"OJ"
pour vitamine C dans du jus d’orange n’ont pas d’ordre précis. Nous utilisons un objet factor. Par contre, les doses de vitamines C0.5 < 1 < 2
exprimées en mg/J ont un ordre. Dans ce cas, nous préférons les objets ordered, qui s’utilisent en pratique comme les objets factor dans R (mais notez bien l’indication de l’ordre des niveaux de la variable à l’aide de<
dansLevels:
, c’est ce qui distingue un objet ordered d’un objet factor).
# [1] 0.5 0.5 0.5 0.5 0.5 0.5
# attr(,"label")
# [1] Dose
# attr(,"units")
# [1] mg/J
# Levels: 0.5 < 1 < 2
# Réalisation du graphique (nous réutilisons give_n() ici!)
chart(data = tooth_growth, len ~ supp %fill=% dose) +
geom_boxplot() +
stat_summary(fun.data = give_n, geom = "text", hjust = 0.5,
position = position_dodge(0.75))
À vous de jouer !
Effectuez maintenant les exercices du tutoriel A03Lb_boxplot (Boites à moustaches).
BioDataScience1::run("A03Lb_boxplot")
Pour en savoir plus
Un tutoriel boites à moustaches à l’aide de
ggplot()
présentant encore bien d’autres variantes possibles, en français.Box plots in
ggplot2
. Autre explication en anglais avec sortie utilisant {plotly}.Explication plus détaillée sur les cinq nombres, en anglais.
Notez que, lorsque la coupure tombe entre deux observations, une valeur intermédiaire est utilisée. Ici par exemple, le premier quartile est entre 53 et 55, donc, il vaut 54. Le troisième quartile se situe entre 78 et 82. Il vaut donc 80.↩︎
Il est possible de modifier la transparence des points en utilisant l’argument
alpha =
et/ou de les déplacer légèrement vers la gauche ou vers la droite de manière aléatoire pour résoudre le problème de leur chevauchement sur un graphique en nuage de points univarié en replaçantgeom_point()
pargeom_jitter()
.↩︎La fonction
give_n()
est une fonction personnalisée que nous avons écrite nous-mêmes. Elle positionne du textey =
10% plus haut que lemax(x)
, et ce texte estlength(x)
, la longueur du vecteur qui correspond au nombre d’observations pourx
(x
étant utilisé en interne par le moteur graphique). Il est possible, et même assez facile, dans R d’écrire ses propres fonctions. Néanmoins cela dépasse du cadre du cours pour l’instant. Pour utilisergive_n()
dans vos documents Quarto ou R Markdown, copiez simplement sa définition dans un chunk avant de l’utiliser comme c’est fait ici. Elle est aussi réutilisable plus loin dans le même Quarto ou R Markdown, une fois qu’elle est définie.↩︎