library(tidyverse)
# Créer un tableau de fréquences
groupe_sanguin <- c(rep("A", 85), rep("B", 35), rep("AB", 15), rep("O", 65))
freq_table <- data.frame(table(groupe_sanguin)) %>%
rename(Groupe = groupe_sanguin, Effectif = Freq) %>%
mutate(
Frequence = round(Effectif / sum(Effectif) * 100, 1),
Freq_cumulee = cumsum(Frequence)
)
print(freq_table)Module 3
Analyse descriptive des données
Visualisation et exploration des données biomédicales
6h Débutant Prérequis : Modules 1-2
Objectifs pédagogiques
- Organiser les données dans des tableaux de fréquences et de contingence
- Choisir et créer les graphiques adaptés au type de données
- Détecter les valeurs aberrantes et les anomalies
- Réaliser une analyse exploratoire complète (EDA)
1 1. Tableaux statistiques
Lorsqu’un chercheur termine la collecte de ses données – qu’il s’agisse d’une enquête nutritionnelle dans un district sanitaire du Cameroun, d’un registre hospitalier au Sénégal ou d’un essai clinique multicentrique – il se retrouve face à un fichier contenant des centaines, voire des milliers de lignes. Ces données brutes, telles quelles, ne racontent rien. Elles sont comme un livre dont les pages auraient été mélangées : l’information y est, mais elle est inaccessible.
La toute première étape de l’analyse consiste donc à organiser et résumer ces données à l’aide de tableaux statistiques. Un tableau bien construit permet de transformer un flot de chiffres en une image compréhensible de la situation. C’est le fondement de toute analyse descriptive, et c’est par là que commence tout article scientifique dans sa section “Résultats”.
1.1 1.1 Tableau de fréquences
Imaginez que vous travaillez dans un centre de transfusion sanguine à Douala et que vous avez collecté le groupe sanguin de 200 donneurs. Votre fichier contient une longue colonne de lettres : A, O, B, A, AB, O, A, B… Comment résumer cette information ? En comptant combien de fois chaque groupe sanguin apparaît, puis en calculant la proportion correspondante. C’est exactement ce que fait un tableau de fréquences.
Le tableau de fréquences est l’outil de base pour décrire une variable qualitative (ou catégorielle). Il répond à une question simple mais fondamentale : comment les individus se répartissent-ils entre les différentes catégories ? Pour chaque catégorie, on calcule trois informations complémentaires. L’effectif (n) donne le nombre brut d’individus dans la catégorie. La fréquence relative (%) exprime cette quantité en proportion du total, ce qui permet les comparaisons entre études de tailles différentes. Enfin, la fréquence cumulée additionne progressivement les fréquences, ce qui est particulièrement utile pour les variables ordinales (par exemple, pour savoir quelle proportion de patients a un stade de maladie inférieur ou égal à un certain seuil).
Voici un exemple concret avec les groupes sanguins de nos 200 donneurs :
| Groupe sanguin | Effectif (n) | Fréquence (%) | Fréquence cumulée (%) |
|---|---|---|---|
| A | 85 | 42.5 | 42.5 |
| B | 35 | 17.5 | 60.0 |
| AB | 15 | 7.5 | 67.5 |
| O | 65 | 32.5 | 100.0 |
| Total | 200 | 100.0 |
Ce tableau nous apprend immédiatement que le groupe A est le plus fréquent (42.5%), suivi du groupe O (32.5%), puis du groupe B (17.5%), et enfin du groupe AB qui est le plus rare (7.5%). Pour un responsable de banque de sang, ces informations sont cruciales pour anticiper les besoins en poches de sang et planifier les campagnes de don ciblées.
En R, la construction d’un tel tableau se fait en quelques lignes grâce au package tidyverse :
FREQUENCIES VARIABLES=groupe_sanguin
/ORDER=ANALYSIS.
1.2 1.2 Tableau croisé (contingence)
Un tableau de fréquences décrit une seule variable à la fois. Mais en recherche biomédicale, on s’intéresse souvent aux relations entre deux variables. Par exemple : le diagnostic de paludisme est-il plus fréquent chez les enfants que chez les adultes ? La prévalence de l’hypertension diffère-t-elle entre hommes et femmes ? Le type de traitement prescrit varie-t-il selon le centre de santé ?
Pour répondre à ces questions, on utilise un tableau croisé (ou tableau de contingence). Ce tableau met en relation deux variables qualitatives en affichant, dans chaque cellule, le nombre d’individus qui possèdent simultanément les deux caractéristiques correspondantes. C’est un outil indispensable avant tout test d’association (comme le test du Chi-deux que nous verrons dans un module ultérieur).
La lecture d’un tableau croisé se fait de plusieurs manières complémentaires. Les proportions en ligne permettent de comparer les distributions d’une variable au sein de chaque catégorie de l’autre variable. Par exemple, si on croise le sexe avec le diagnostic, les proportions en ligne répondent à la question : “Parmi les femmes, quelle proportion a tel diagnostic ? Et parmi les hommes ?” Les proportions en colonne, elles, inversent la perspective : “Parmi les patients ayant tel diagnostic, quelle proportion sont des femmes ?”
Le choix entre proportions en ligne et en colonne dépend de la question de recherche. Si le sexe est considéré comme un facteur explicatif potentiel, on calculera les proportions en ligne (par sexe). Si l’on cherche plutôt à caractériser le profil des patients selon leur diagnostic, on utilisera les proportions en colonne.
# Tableau croisé sexe x diagnostic
tableau <- table(patients$sexe, patients$diagnostic)
addmargins(tableau)
# Proportions en ligne (par sexe)
prop.table(tableau, margin = 1) * 100
# Proportions en colonne (par diagnostic)
prop.table(tableau, margin = 2) * 100CROSSTABS /TABLES=sexe BY diagnostic
/FORMAT=AVALUE TABLES
/CELLS=COUNT ROW COLUMN TOTAL
/COUNT ROUND CELL.
1.3 1.3 Distribution de fréquences pour variables quantitatives
Les tableaux de fréquences ne sont pas réservés aux variables qualitatives. On peut aussi les appliquer aux variables quantitatives, à condition de regrouper d’abord les valeurs en classes (ou intervalles). Cette opération est essentielle lorsqu’une variable prend un grand nombre de valeurs distinctes, ce qui est presque toujours le cas pour les mesures continues comme l’âge, le poids ou la glycémie.
Prenons l’exemple de l’âge dans une cohorte de patients suivis dans un hôpital de district. Si l’on affichait la fréquence de chaque âge exact (23 ans, 24 ans, 25 ans…), le tableau serait trop long et peu informatif. En regroupant les âges en classes (moins de 30 ans, 30-44 ans, 45-59 ans, etc.), on obtient un résumé beaucoup plus lisible qui révèle la structure démographique de la cohorte. Le médecin-chef peut alors constater, par exemple, que la majorité des patients ont entre 45 et 59 ans, ce qui pourrait orienter les politiques de prévention.
Le choix du nombre de classes et de leurs bornes est une décision importante. Trop peu de classes (2 ou 3) et l’on perd de l’information ; trop de classes (15 ou 20) et le tableau n’est plus synthétique. En pratique, on utilise souvent entre 5 et 10 classes, en privilégiant des bornes qui ont un sens clinique ou épidémiologique (tranches d’âge de 15 ans, seuils de glycémie reconnus, etc.).
# Classes d'âge
patients <- patients %>%
mutate(classe_age = cut(age,
breaks = c(0, 30, 45, 60, 75, 100),
labels = c("< 30", "30-44", "45-59", "60-74", "≥ 75"),
right = FALSE
))
table(patients$classe_age)Maintenant que nous savons organiser les données dans des tableaux, nous sommes prêts à passer à l’étape suivante : les représenter visuellement. Les graphiques sont le complément naturel des tableaux. Là où le tableau donne des chiffres précis, le graphique révèle des formes, des tendances et des anomalies que l’oeil humain capte instantanément. Un graphique bien choisi raconte l’histoire des données de manière plus immédiate qu’un tableau, et c’est pourquoi il occupe une place centrale dans tout article scientifique et toute présentation de résultats.
2 2. Graphiques pour variables qualitatives
Le type de graphique à utiliser dépend avant tout de la nature de la variable. Nous commençons par les graphiques adaptés aux variables qualitatives (ou catégorielles), c’est-à-dire celles dont les valeurs sont des catégories : sexe, groupe sanguin, diagnostic, niveau d’activité physique, etc.
2.1 2.1 Diagramme en barres
Le diagramme en barres est le graphique le plus fondamental et le plus universel pour représenter une variable qualitative. Son principe est d’une simplicité élégante : chaque catégorie est représentée par une barre dont la hauteur (ou la longueur) est proportionnelle à l’effectif ou à la fréquence de cette catégorie.
Pourquoi est-il si utile ? Parce que notre cerveau compare les longueurs bien plus facilement que les nombres. Si un tableau vous dit que 120 patients sont des femmes et 80 sont des hommes, vous devez faire un petit calcul mental pour appréhender la différence. Sur un diagramme en barres, cette différence est immédiatement visible : la barre des femmes est nettement plus haute.
Dans le contexte d’une étude épidémiologique, vous pourriez utiliser un diagramme en barres pour montrer la répartition des patients par sexe dans un programme de dépistage du VIH dans un centre de santé intégré. D’un coup d’oeil, les responsables du programme verraient si la participation est équilibrée entre hommes et femmes, ce qui est une information cruciale pour ajuster les stratégies de sensibilisation.
library(ggplot2)
# Diagramme en barres simple
ggplot(patients, aes(x = sexe, fill = sexe)) +
geom_bar() +
labs(title = "Répartition par sexe",
x = "Sexe", y = "Effectif") +
theme_minimal() +
scale_fill_manual(values = c("F" = "#e74c3c", "M" = "#3498db")) +
theme(legend.position = "none")2.2 2.2 Diagramme en barres groupées
Lorsque l’on souhaite explorer la relation entre deux variables qualitatives, le diagramme en barres simple ne suffit plus. Il faut passer au diagramme en barres groupées (ou barres côte à côte), qui permet de comparer visuellement les distributions croisées.
Imaginons une étude dans un centre de diabétologie à Yaoundé. Vous souhaitez savoir si la répartition hommes/femmes est la même pour le diabète de type 1 et le diabète de type 2. Un tableau croisé vous donnerait les chiffres, mais un diagramme en barres groupées vous montrerait instantanément les différences. Si, par exemple, le diabète de type 2 est nettement plus fréquent chez les femmes de votre cohorte, cela sauterait aux yeux sur le graphique, alors qu’il faudrait examiner attentivement les chiffres dans un tableau.
Ce type de graphique est particulièrement précieux dans les présentations orales (réunions d’équipe, conférences, soutenances de thèse) où l’auditoire dispose de peu de temps pour assimiler l’information.
# Barres groupées : sexe par type de diabète
ggplot(patients, aes(x = type_diabete, fill = sexe)) +
geom_bar(position = "dodge") +
labs(title = "Type de diabète selon le sexe",
x = "Type de diabète", y = "Effectif", fill = "Sexe") +
theme_minimal() +
scale_fill_manual(values = c("F" = "#e74c3c", "M" = "#3498db"))2.3 2.3 Diagramme circulaire (camembert)
Le diagramme circulaire (ou “camembert”) est sans doute le graphique le plus connu du grand public. Son principe consiste à diviser un cercle en secteurs dont l’angle est proportionnel à la fréquence de chaque catégorie. Il donne une vision immédiate de la part que représente chaque catégorie dans l’ensemble.
Cependant, il faut l’utiliser avec beaucoup de prudence. Le diagramme circulaire ne fonctionne bien que lorsque le nombre de catégories est faible (idéalement 3 ou 4, jamais plus de 5) et que les proportions sont suffisamment différentes pour être distinguées visuellement. Par exemple, pour montrer la répartition des niveaux d’activité physique (sédentaire, modéré, actif) dans une population de patients diabétiques, un camembert peut convenir. Mais dès que les proportions sont proches (par exemple 28% et 32%), l’oeil humain a beaucoup de mal à distinguer les secteurs, ce qui rend le graphique trompeur.
# À utiliser avec précaution (< 5 catégories)
freq <- data.frame(table(patients$niveau_activite))
ggplot(freq, aes(x = "", y = Freq, fill = Var1)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y") +
labs(title = "Niveau d'activité physique", fill = "Niveau") +
theme_void() +
scale_fill_brewer(palette = "Set2")Le diagramme circulaire est souvent déconseillé en biostatistique car il rend les comparaisons de proportions difficiles. Notre système visuel est bien meilleur pour comparer des longueurs (barres) que des angles (secteurs). C’est pourquoi, dans la grande majorité des situations, vous obtiendrez un graphique plus clair et plus honnête en utilisant un simple diagramme en barres. Réservez le camembert aux situations où vous souhaitez insister sur la notion de “parts d’un tout”, avec un nombre très limité de catégories bien distinctes.
Nous avons vu comment représenter graphiquement des variables qualitatives. Mais qu’en est-il des variables quantitatives, c’est-à-dire celles qui expriment des quantités mesurables comme la glycémie, la tension artérielle, le poids ou l’âge ? Ces variables nécessitent des outils graphiques différents, car ce qui nous intéresse n’est plus la répartition en catégories, mais la distribution des valeurs : où se concentrent-elles ? Sont-elles étalées ou resserrées ? La distribution est-elle symétrique ou déformée ? Y a-t-il des valeurs inhabituelles ?
3 3. Graphiques pour variables quantitatives
3.1 3.1 Histogramme
L’histogramme est le graphique fondamental pour visualiser la distribution d’une variable quantitative continue. Son principe rappelle celui du diagramme en barres, mais avec une différence essentielle : les barres sont collées les unes aux autres (car la variable est continue, sans interruption entre les valeurs) et chaque barre représente un intervalle de valeurs, pas une catégorie distincte.
Concrètement, l’histogramme découpe l’étendue des données en intervalles de largeur égale (appelés “bins” en anglais), puis compte combien d’observations tombent dans chaque intervalle. La hauteur de chaque barre reflète cet effectif. En regardant la forme d’ensemble, on découvre la forme de la distribution : est-elle en cloche (ce qui suggère une distribution normale) ? Est-elle asymétrique, avec une longue queue vers la droite (comme c’est souvent le cas pour les revenus ou les durées d’hospitalisation) ? Présente-t-elle plusieurs pics (ce qui pourrait indiquer la présence de sous-populations distinctes) ?
Prenons un exemple concret. Un endocrinologue dans un hôpital de Libreville souhaite caractériser la distribution de la glycémie à jeun dans sa cohorte de patients. Un simple tableau de moyennes et d’écarts-types lui dirait que la glycémie moyenne est de 1.05 g/L avec un écart-type de 0.25 g/L. Mais un histogramme lui révélerait bien davantage : la distribution est-elle concentrée autour de la moyenne, ou bien étalée ? Y a-t-il un pic secondaire autour de 1.40 g/L qui pourrait correspondre aux patients diabétiques non contrôlés ? La ligne pointillée rouge représentant la moyenne se situe-t-elle au centre de la distribution, ou est-elle décalée par rapport au pic principal ?
ggplot(patients, aes(x = glycemie)) +
geom_histogram(binwidth = 0.1, fill = "steelblue", color = "white") +
labs(title = "Distribution de la glycémie à jeun",
x = "Glycémie (g/L)", y = "Effectif") +
theme_minimal() +
geom_vline(aes(xintercept = mean(glycemie)),
color = "red", linetype = "dashed", linewidth = 1)3.2 3.2 Courbe de densité
La courbe de densité est une version lissée de l’histogramme. Au lieu de barres discrètes, elle trace une courbe continue qui épouse la forme de la distribution. Son avantage principal est de permettre la superposition de plusieurs distributions sur un même graphique, ce qui est très difficile avec des histogrammes (les barres se chevauchent et deviennent illisibles).
Cette superposition est extrêmement utile en pratique. Imaginez que vous souhaitez comparer la distribution de la glycémie entre les hommes et les femmes de votre cohorte. Avec un histogramme, il faudrait placer les deux graphiques côte à côte, ce qui rend la comparaison moins directe. Avec deux courbes de densité semi-transparentes tracées sur le même graphique, les différences et les similitudes apparaissent immédiatement : les deux distributions se chevauchent-elles largement (ce qui suggère peu de différence entre les sexes) ? L’une est-elle décalée vers la droite (valeurs plus élevées) ? L’une est-elle plus étalée que l’autre (plus de variabilité) ?
L’axe vertical d’une courbe de densité n’indique pas un effectif, mais une densité de probabilité. L’aire totale sous la courbe vaut toujours 1 (soit 100%). Ce détail technique n’est pas essentiel pour la lecture du graphique : ce qui compte, c’est la forme de la courbe et la position relative des courbes si l’on en compare plusieurs.
ggplot(patients, aes(x = glycemie, fill = sexe)) +
geom_density(alpha = 0.5) +
labs(title = "Distribution de la glycémie par sexe",
x = "Glycémie (g/L)", y = "Densité") +
theme_minimal() +
scale_fill_manual(values = c("F" = "#e74c3c", "M" = "#3498db"))3.3 3.3 Boxplot (boîte à moustaches)
Le boxplot est l’un des graphiques les plus utiles en biostatistique. C’est un outil compact et puissant qui résume en un seul dessin cinq informations essentielles sur la distribution d’une variable : le minimum, le premier quartile, la médiane, le troisième quartile et le maximum. De plus, il signale automatiquement les observations potentiellement aberrantes, ce qui en fait un allié précieux pour le contrôle qualité des données.
Pour comprendre le boxplot, imaginons une analogie. Pensez à un thermomètre gradué sur lequel vous marquez la position de chaque mesure de glycémie de vos patients. La boîte centrale du boxplot couvre la zone où se trouvent les 50% des observations centrales (entre le premier quartile Q1 et le troisième quartile Q3). La ligne qui traverse la boîte indique la médiane, c’est-à-dire la valeur qui sépare l’échantillon en deux moitiés égales. Les moustaches (les lignes qui s’étendent de part et d’autre de la boîte) montrent jusqu’où s’étendent les données “normales”, définies comme celles situées à moins de 1.5 fois l’écart interquartile (IQR) des bords de la boîte. Enfin, tout point situé au-delà des moustaches est affiché individuellement et signale une valeur potentiellement aberrante.
Mais la véritable puissance du boxplot se révèle dans sa version comparative. Supposons qu’un diabétologue à Bamako souhaite comparer les niveaux d’hémoglobine glyquée (HbA1c) entre ses patients diabétiques de type 1 et ceux de type 2. En plaçant les deux boxplots côte à côte, il verrait instantanément si les niveaux médians diffèrent, si la variabilité est comparable, et si l’un des groupes présente davantage de valeurs extrêmes. Ce type de visualisation remplace avantageusement de longues descriptions textuelles et prépare le terrain pour les tests statistiques de comparaison que nous aborderons dans les modules suivants.
# Boxplot simple
ggplot(patients, aes(y = glycemie)) +
geom_boxplot(fill = "steelblue", width = 0.3) +
labs(title = "Distribution de la glycémie", y = "Glycémie (g/L)") +
theme_minimal()
# Boxplot comparatif
ggplot(patients, aes(x = type_diabete, y = hba1c, fill = type_diabete)) +
geom_boxplot() +
labs(title = "HbA1c selon le type de diabète",
x = "Type de diabète", y = "HbA1c (%)") +
theme_minimal() +
scale_fill_brewer(palette = "Set1") +
theme(legend.position = "none")Lecture d’un boxplot : pour bien lire un boxplot, retenez ces quatre éléments. La boîte représente l’intervalle interquartile (IQR), c’est-à-dire la zone contenant les 50% des observations centrales, comprises entre le premier quartile (Q1, 25e percentile) et le troisième quartile (Q3, 75e percentile). Plus la boîte est large, plus la variabilité est importante dans cette zone centrale des données. La ligne horizontale à l’intérieur de la boîte marque la médiane (Q2, 50e percentile), c’est-à-dire la valeur qui partage l’échantillon en deux moitiés égales. Sa position au sein de la boîte renseigne sur la symétrie de la distribution : si elle est centrée, la distribution est approximativement symétrique ; si elle est décalée vers le haut ou le bas, la distribution est asymétrique. Les moustaches s’étendent depuis les bords de la boîte jusqu’aux valeurs les plus extrêmes qui restent dans la limite de 1.5 fois l’IQR. Concrètement, la moustache inférieure va jusqu’à la plus petite observation supérieure ou égale à Q1 - 1.5 x IQR, et la moustache supérieure jusqu’à la plus grande observation inférieure ou égale à Q3 + 1.5 x IQR. Les points isolés affichés au-delà des moustaches représentent les valeurs potentiellement aberrantes (outliers), c’est-à-dire les observations inhabituellement éloignées du centre de la distribution. Ces points méritent toujours une investigation : s’agit-il d’erreurs de saisie, ou de valeurs cliniquement plausibles mais extrêmes ?
Graphiques > Boîtes à moustaches > Simple > Sélectionner la variable
EXAMINE VARIABLES=glycemie BY type_diabete
/PLOT BOXPLOT.
3.4 3.4 Nuage de points (scatter plot)
Tous les graphiques que nous avons vus jusqu’ici décrivent une seule variable à la fois (ou comparent la distribution d’une variable entre groupes). Mais en recherche biomédicale, on s’intéresse souvent à la relation entre deux variables quantitatives. Le poids influence-t-il la glycémie ? L’âge est-il associé à la pression artérielle ? Le nombre d’heures d’activité physique par semaine est-il corrélé à l’IMC ?
Le nuage de points est l’outil graphique par excellence pour explorer ces relations. Chaque observation est représentée par un point dont la position horizontale correspond à la valeur d’une variable (par exemple le poids) et la position verticale à la valeur de l’autre variable (par exemple la glycémie). En examinant la forme du nuage, on peut détecter visuellement plusieurs types de relations. Si les points forment un nuage allongé qui monte de gauche à droite, il existe une association positive : quand une variable augmente, l’autre tend à augmenter aussi. Si le nuage descend, l’association est négative. Si les points forment un nuage rond et diffus, il n’y a probablement pas de relation linéaire entre les deux variables.
L’ajout d’une droite de tendance (droite de régression) permet de résumer la relation par une ligne et de visualiser si l’association est forte (les points sont proches de la droite) ou faible (les points sont dispersés autour de la droite). En colorant les points selon une troisième variable catégorielle (par exemple le sexe), on peut même explorer si la relation diffère entre sous-groupes.
ggplot(patients, aes(x = poids, y = glycemie, color = sexe)) +
geom_point(alpha = 0.7, size = 2) +
geom_smooth(method = "lm", se = TRUE) +
labs(title = "Relation poids-glycémie",
x = "Poids (kg)", y = "Glycémie (g/L)") +
theme_minimal() +
scale_color_manual(values = c("F" = "#e74c3c", "M" = "#3498db"))3.5 3.5 Matrice de corrélation
Lorsqu’une étude inclut de nombreuses variables quantitatives, il serait fastidieux de tracer un nuage de points pour chaque paire de variables. La matrice de corrélation offre une vue synthétique de toutes les relations bivariées en un seul graphique. Elle affiche le coefficient de corrélation (une valeur entre -1 et +1) pour chaque paire de variables, souvent accompagné d’un code couleur qui permet d’identifier rapidement les associations fortes.
Un coefficient proche de +1 indique une forte association positive (les deux variables augmentent ensemble), un coefficient proche de -1 indique une forte association négative (quand l’une augmente, l’autre diminue), et un coefficient proche de 0 indique l’absence de relation linéaire. Par exemple, dans une cohorte de patients diabétiques, on s’attendrait à observer une corrélation positive entre la glycémie et l’HbA1c (les deux reflètent le contrôle glycémique), mais peut-être une corrélation faible ou nulle entre l’âge et le nombre de consultations.
Cette vue d’ensemble est particulièrement précieuse en phase exploratoire, lorsqu’on cherche à identifier quelles variables sont liées entre elles avant de passer à des analyses plus sophistiquées (régressions, modèles multivariés). Elle permet aussi de détecter des colinéarités (variables tellement corrélées entre elles qu’il serait redondant de les inclure toutes dans un même modèle).
library(corrplot)
# Sélectionner les variables quantitatives
vars_quant <- patients %>%
select(age, poids, taille, glycemie, hba1c, nb_consultations)
cor_matrix <- cor(vars_quant, use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper",
addCoef.col = "black", number.cex = 0.7,
tl.col = "black", tl.srt = 45,
title = "Matrice de corrélation")Les tableaux et les graphiques nous ont permis de visualiser et de résumer nos données. Mais cette exploration met parfois en lumière des observations inhabituelles : un patient dont la glycémie dépasse largement toutes les autres valeurs, un âge négatif manifestement erroné, ou un poids biologiquement improbable. Ces valeurs aberrantes (ou outliers) méritent une attention particulière, car elles peuvent fausser nos analyses si elles ne sont pas correctement identifiées et traitées.
4 4. Détection des valeurs aberrantes
La détection des valeurs aberrantes est une étape cruciale de l’analyse exploratoire, et pourtant elle est souvent négligée par les débutants. Une valeur aberrante est une observation qui s’écarte considérablement du reste des données. Elle peut avoir deux origines très différentes, et il est essentiel de les distinguer.
Première possibilité : il s’agit d’une erreur. Lors de la saisie des données, quelqu’un a tapé 120 au lieu de 12 pour un taux d’hémoglobine, ou 450 au lieu de 45 pour un âge. Dans un registre hospitalier à Kinshasa, une infirmière a accidentellement inscrit une température corporelle de 73.6 au lieu de 37.6 en inversant les chiffres. Ces erreurs doivent être corrigées si possible, ou supprimées si la valeur correcte est irrécupérable.
Deuxième possibilité : il s’agit d’une valeur authentique mais extrême. Un patient en crise de diabète acidocétosique peut effectivement avoir une glycémie de 5.5 g/L, ce qui est considérablement plus élevé que la moyenne mais cliniquement plausible. Supprimer cette observation serait une erreur scientifique, car elle reflète une réalité clinique importante.
Comment, alors, identifier systématiquement ces valeurs inhabituelles ? Deux méthodes classiques sont utilisées : la méthode de l’IQR et la méthode du Z-score.
4.1 4.1 Méthode de l’IQR
La méthode de l’IQR (écart interquartile) est directement liée au boxplot que nous avons étudié plus haut. Elle utilise les mêmes principes pour définir des “bornes” au-delà desquelles une observation est considérée comme potentiellement aberrante.
Le raisonnement est le suivant : on calcule d’abord l’IQR, qui est la différence entre le troisième quartile (Q3) et le premier quartile (Q1). Cet écart représente la “largeur” de la zone contenant les 50% d’observations centrales. Ensuite, on définit comme suspecte toute observation située à plus de 1.5 fois cet écart en dessous de Q1 ou au-dessus de Q3. Autrement dit, une valeur est considérée comme aberrante si elle sort de l’intervalle suivant :
\[[Q_1 - 1.5 \times IQR, \quad Q_3 + 1.5 \times IQR]\]
Cette méthode est robuste, ce qui signifie qu’elle n’est pas elle-même influencée par les valeurs extrêmes (contrairement à la moyenne et l’écart-type). C’est pourquoi elle est souvent préférée en première intention.
detecter_outliers <- function(x) {
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr <- q3 - q1
borne_inf <- q1 - 1.5 * iqr
borne_sup <- q3 + 1.5 * iqr
outliers <- x[x < borne_inf | x > borne_sup]
cat("Bornes : [", round(borne_inf, 2), ",", round(borne_sup, 2), "]\n")
cat("Nombre d'outliers :", length(outliers), "\n")
return(outliers)
}
detecter_outliers(patients$glycemie)4.2 4.2 Méthode du Z-score
La deuxième approche, complémentaire de la première, utilise le Z-score (ou score standardisé). Le Z-score d’une observation mesure à combien d’écarts-types elle se trouve de la moyenne. Une observation avec un Z-score de 0 est exactement à la moyenne ; un Z-score de 2 signifie qu’elle est à deux écarts-types au-dessus de la moyenne, et ainsi de suite.
La convention courante est de considérer comme potentiellement aberrante toute observation dont le Z-score dépasse 3 en valeur absolue, c’est-à-dire toute valeur située à plus de trois écarts-types de la moyenne. Dans une distribution normale, environ 99.7% des observations se trouvent dans cet intervalle, de sorte qu’une observation au-delà est statistiquement très improbable.
Valeur aberrante si \(|Z| > 3\) :
Cette méthode est intuitive et facile à mettre en oeuvre, mais elle présente un inconvénient : la moyenne et l’écart-type sont eux-mêmes sensibles aux valeurs extrêmes. Si une observation est très extrême, elle “tire” la moyenne et gonfle l’écart-type, ce qui peut paradoxalement masquer d’autres valeurs aberrantes. C’est pourquoi il est recommandé d’utiliser les deux méthodes conjointement et de comparer leurs résultats.
patients <- patients %>%
mutate(z_glycemie = (glycemie - mean(glycemie, na.rm = TRUE)) /
sd(glycemie, na.rm = TRUE))
patients %>%
filter(abs(z_glycemie) > 3) %>%
select(id, glycemie, z_glycemie)4.3 4.3 Que faire des valeurs aberrantes ?
Détecter les valeurs aberrantes n’est que la première étape. La question véritablement importante est : que faire ensuite ? La réponse n’est jamais automatique. Il ne faut surtout pas supprimer systématiquement toutes les valeurs identifiées comme aberrantes, car cela pourrait biaiser gravement les résultats. Chaque valeur aberrante mérite une investigation individuelle.
Prenons un exemple concret. Dans une étude sur l’anémie chez les femmes enceintes dans un hôpital de Ouagadougou, une valeur d’hémoglobine de 2.1 g/dL est détectée comme aberrante. Après vérification, il s’avère que l’unité de mesure a été confondue : la valeur réelle est 12.1 g/dL. Il s’agit d’une erreur de saisie, et la correction est simple. Dans la même étude, une valeur de 4.5 g/dL est également détectée. Après investigation, il s’avère que cette patiente souffrait d’une anémie sévère confirmée par d’autres examens. Cette valeur est extrême mais authentique, et la supprimer serait scientifiquement inapproprié.
- Vérifier : est-ce une erreur de saisie ? Retournez au cahier de collecte ou au dossier médical pour vérifier la valeur originale. Corrigez si possible.
- Investiguer : la valeur est-elle cliniquement plausible ? Un patient gravement malade, un cas rare ou une situation d’urgence peuvent produire des valeurs extrêmes tout à fait légitimes. Consultez un clinicien si nécessaire.
- Documenter : quelle que soit votre décision (suppression, correction, conservation), notez-la explicitement dans votre rapport d’analyse. La transparence est essentielle pour la reproductibilité de la recherche.
- Analyser : lorsque c’est possible, présentez les résultats avec et sans les valeurs aberrantes. Si les conclusions changent significativement, cela mérite d’être discuté. Si elles restent stables, c’est un signe rassurant de robustesse.
Après avoir nettoyé nos données et traité les valeurs aberrantes, une question fondamentale se pose avant toute analyse inférentielle : nos variables quantitatives suivent-elles une distribution normale (en forme de cloche) ? Cette question est loin d’être académique : de nombreux tests statistiques classiques (test t de Student, ANOVA, régression linéaire) reposent sur l’hypothèse de normalité des données. Choisir le bon test – paramétrique ou non paramétrique – dépend directement de cette vérification.
5 5. Test de normalité
La distribution normale (ou gaussienne) est la distribution en forme de cloche symétrique, caractérisée par le fait que la plupart des observations se concentrent autour de la moyenne, avec de moins en moins d’observations à mesure que l’on s’éloigne de la moyenne. En biologie et en médecine, de nombreuses variables suivent approximativement cette distribution : la taille des adultes dans une population homogène, la pression artérielle dans un groupe de sujets sains, ou certains paramètres biologiques mesurés dans des conditions standardisées.
Cependant, de nombreuses autres variables biomédicales ne suivent pas une distribution normale. Les durées d’hospitalisation, les revenus, les concentrations de certains biomarqueurs ou les scores sur des échelles psychométriques présentent souvent des distributions asymétriques. Il est donc indispensable de vérifier la normalité avant de choisir une méthode d’analyse. Deux approches complémentaires existent : l’approche graphique et l’approche par test statistique.
5.1 5.1 Approche graphique : QQ-plot
Le QQ-plot (Quantile-Quantile plot) est un graphique qui compare les quantiles observés de vos données aux quantiles théoriques d’une distribution normale parfaite. En termes simples, il répond à la question : “Si mes données étaient parfaitement normales, où devrait se trouver chaque observation ? Et où se trouve-t-elle réellement ?”
Si les données suivent une loi normale, les points du QQ-plot s’alignent le long d’une droite diagonale (représentée en rouge dans le graphique ci-dessous). Tout écart par rapport à cette droite indique un écart par rapport à la normalité. Des points qui s’incurvent vers le haut aux extrémités suggèrent des queues plus lourdes que la normale (davantage de valeurs extrêmes). Des points qui forment un “S” suggèrent une asymétrie. Des points qui se décollent nettement de la droite dans une zone indiquent un excès d’observations dans cette zone.
L’avantage du QQ-plot par rapport aux tests formels est qu’il montre comment les données s’écartent de la normalité, pas seulement si elles s’en écartent. C’est une information précieuse pour décider de la transformation à appliquer (logarithmique, racine carrée, etc.) ou du test non paramétrique à privilégier.
# QQ-plot avec ggplot2
ggplot(patients, aes(sample = glycemie)) +
stat_qq() +
stat_qq_line(color = "red") +
labs(title = "QQ-plot de la glycémie",
x = "Quantiles théoriques", y = "Quantiles observés") +
theme_minimal()5.2 5.2 Test de Shapiro-Wilk
Le test de Shapiro-Wilk est le test statistique de référence pour évaluer formellement la normalité d’un échantillon. Il est considéré comme le test le plus puissant pour des échantillons de petite à moyenne taille (jusqu’à environ 5000 observations), ce qui couvre la grande majorité des études biomédicales.
Le test fonctionne selon la logique habituelle des tests d’hypothèses. L’hypothèse nulle (H0) est que les données suivent une distribution normale. Le test calcule une statistique W et une p-valeur associée. Si la p-valeur est supérieure à 0.05, on ne rejette pas H0 : on considère que les données sont compatibles avec une distribution normale. Si la p-valeur est inférieure à 0.05, on rejette H0 : les données s’écartent significativement de la normalité.
Il faut cependant interpréter ce test avec nuance. Pour de très grands échantillons (plusieurs milliers d’observations), le test de Shapiro-Wilk est extrêmement sensible et rejettera la normalité même pour des écarts minimes, cliniquement négligeables. Dans ce cas, c’est le QQ-plot qui doit guider la décision : si les points sont raisonnablement alignés, un léger écart statistiquement significatif n’a pas forcément de conséquences pratiques sur la validité des analyses. C’est pourquoi il est recommandé de toujours combiner l’approche graphique et l’approche par test.
shapiro.test(patients$glycemie)
# Interprétation :
# p > 0.05 → on ne rejette pas l'hypothèse de normalité
# p < 0.05 → les données ne suivent pas une loi normaleEXAMINE VARIABLES=glycemie
/PLOT NPPLOT
/STATISTICS DESCRIPTIVES.
Vérifier le test de Shapiro-Wilk dans la sortie.
6 6. Synthèse : choisir le bon graphique
Tout au long de ce module, nous avons découvert une palette d’outils graphiques, chacun adapté à une situation particulière. Le choix du bon graphique n’est pas anodin : un graphique mal choisi peut induire en erreur, tandis qu’un graphique bien choisi communique l’essentiel en un coup d’oeil. Le tableau ci-dessous récapitule les recommandations principales selon le type de données que vous souhaitez visualiser. Gardez-le comme référence lors de vos analyses.
| Type de données | Graphique recommandé | Fonction R | SPSS |
|---|---|---|---|
| 1 variable qualitative | Diagramme en barres | geom_bar() |
Graphiques > Barres |
| 2 variables qualitatives | Barres groupées / empilées | geom_bar(position="dodge") |
Tableaux croisés |
| 1 variable quantitative | Histogramme, boxplot | geom_histogram(), geom_boxplot() |
EXAMINE |
| 2 variables quantitatives | Nuage de points | geom_point() |
Graphiques > Nuage |
| 1 quanti + 1 quali | Boxplot comparatif | geom_boxplot(aes(x=quali)) |
EXAMINE BY |
Retenez que l’analyse descriptive n’est pas une simple formalité préliminaire : c’est une véritable étape d’investigation qui conditionne toutes les analyses ultérieures. Un bon tableau de fréquences, un graphique pertinent, une détection rigoureuse des valeurs aberrantes et une vérification de la normalité vous permettront de choisir les bons outils statistiques pour la suite et d’éviter des erreurs d’interprétation coûteuses. Dans le prochain module, nous utiliserons ces fondations pour aborder l’estimation et les intervalles de confiance.
7 Références
- Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer.
- Tukey, J.W. (1977). Exploratory Data Analysis. Addison-Wesley.