QQ plot en R : qqnorm(), qqline() et le test de normalité

Tracez un diagramme quantile-quantile en R de base et lisez-le pour juger si vos données sont normales

Réalisez un diagramme quantile-quantile (Q-Q) en R pour vérifier la normalité. Utilisez qqnorm() et qqline() pour un Q-Q plot normal, qqplot() pour comparer deux échantillons, apprenez à lire les courbes et les formes en S (asymétrie et queues lourdes), et tracez un graphique prêt à publier avec une bande de confiance grâce à ggpubr::ggqqplot().

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Un diagramme quantile-quantile (Q-Q plot) compare les quantiles de vos données aux quantiles d’une distribution normale — la vérification visuelle la plus rapide de la normalité.
  • En R de base, qqnorm() trace le graphique et qqline() ajoute la droite de référence à 45 degrés. Des points proches de la droite ⇒ approximativement normaux.
  • Lisez la forme : les points épousent la droite (normal) ; les extrémités s’incurvent vers le haut aux deux queues (queues lourdes) ; une forme en S ou une seule extrémité courbée (asymétrie).
  • qqplot(x, y) compare deux échantillons entre eux plutôt qu’à la distribution normale.
  • Pour un graphique prêt à publier avec une bande de confiance à 95 %, utilisez ggpubr::ggqqplot() — les points à l’intérieur de la bande sont jugés « assez proches ».

Introduction

« Mes données sont-elles normales ? » Vous pouvez fixer un histogramme, ou lancer un test de Shapiro-Wilk et obtenir une unique p-value — mais un Q-Q plot le montre d’un coup d’œil. Il trace les quantiles de votre échantillon en regard des quantiles attendus d’une distribution normale. Si les deux concordent, les points tombent sur une droite ; là où ils s’écartent de la droite, vous voyez exactement comment les données s’éloignent de la normale — une asymétrie, une queue lourde, une valeur aberrante.

Cette leçon reste en R de base pour la recette de base — qqnorm() et qqline() n’ont besoin d’aucun package — puis montre le moderne ggpubr::ggqqplot() pour une version soignée dotée d’une bande de confiance. Vous tracerez le graphique, apprendrez à le lire, et saurez ce qu’une courbe ou une forme en S vous indique.

Vous travaillez avec la grammaire des graphiques ? Consultez la leçon Q-Q plot ggplot2/ggpubr pour la voie stat_qq().

Un premier Q-Q plot : qqnorm() et qqline()

Deux fonctions font tout le travail. qqnorm() trace les points ; qqline() ajoute la droite de référence à laquelle vous les comparez.

set.seed(123)
normal_sample <- rnorm(100)              # 100 draws from a normal distribution

qqnorm(normal_sample, pch = 1, frame = FALSE)
qqline(normal_sample, col = "#3a86d4", lwd = 2)

A normal Q-Q plot of 100 simulated normal values: the open circles fall closely along a straight steel-blue reference line from bottom-left to top-right.

L’axe des x représente les quantiles théoriques (ce que prédit une distribution normale) ; l’axe des y représente vos quantiles d’échantillon (ce que vous avez réellement). qqline() trace une droite passant par le premier et le troisième quartile. Comme les points tombent près de cette droite, cet échantillon est cohérent avec une distribution normale — exactement ce que nous espérions, puisque nous l’avons tiré de rnorm().

pch = 1 utilise des cercles ouverts ; frame = FALSE supprime le cadre autour du graphique pour un rendu plus net.

Un Q-Q plot de données réelles

Les deux mêmes appels fonctionnent sur n’importe quel vecteur numérique. Voici la colonne len (longueur des dents) du jeu de données intégré ToothGrowth.

qqnorm(ToothGrowth$len, pch = 1, frame = FALSE)
qqline(ToothGrowth$len, col = "#3a86d4", lwd = 2)

A normal Q-Q plot of ToothGrowth tooth length: points fall approximately along the steel-blue reference line with only mild deviation at the ends.

Les points suivent bien la droite au centre, avec seulement un léger flottement aux extrémités. Pour un échantillon de cette taille, c’est une base raisonnable pour supposer la normalité — le verdict habituel avant un t-test ou une ANOVA.

Comment lire un Q-Q plot

Tout l’intérêt d’un Q-Q plot réside dans la forme de l’écart. Trois motifs couvrent presque tout ce que vous verrez. Le graphique ci-dessous place un échantillon normal à côté d’un échantillon asymétrique à droite pour que vous puissiez comparer.

set.seed(42)
normal_sample <- rnorm(200)
skewed_sample <- rexp(200, rate = 1)     # exponential -> right-skewed

op <- par(mfrow = c(1, 2))

qqnorm(normal_sample, main = "Normal data", pch = 1, frame = FALSE)
qqline(normal_sample, col = "#3a86d4", lwd = 2)

qqnorm(skewed_sample, main = "Right-skewed data", pch = 1, frame = FALSE)
qqline(skewed_sample, col = "#3a86d4", lwd = 2)

Two Q-Q plots side by side: a normal sample whose points lie on the line, and a right-skewed sample whose points curve sharply up away from the line at the top-right.

par(op)

Lisez-le ainsi :

  • Les points épousent la droite → les données sont approximativement normales (panneau de gauche).
  • Une extrémité s’écarte (les points se courbent vers le haut en haut à droite, comme sur le panneau de droite) → asymétrie à droite ; une courbure en bas à gauche au lieu de cela → asymétrie à gauche.
  • Les deux extrémités s’éloignent de la droite (une forme en S, ou les deux queues au-dessus de la droite) → queues lourdes (plus de valeurs extrêmes qu’une normale) ; les deux extrémités s’incurvant vers la droite → queues légères.
  • Un ou deux points isolés loin de la droite à une extrémité → valeurs aberrantes à examiner.

Une poignée de points hors de la droite tout aux extrémités relève du bruit d’échantillonnage normal — jugez la tendance globale, pas les points individuels.

Comparer deux échantillons avec qqplot()

qqnorm() compare toujours à la distribution normale. Pour comparer deux échantillons entre eux — partagent-ils la même forme de distribution ? — utilisez qqplot(x, y). Il trace les quantiles de x en regard des quantiles de y ; si les deux distributions ont la même forme, les points tombent sur une droite.

set.seed(7)
sample_a <- rnorm(100, mean = 0)
sample_b <- rnorm(100, mean = 0)

qqplot(sample_a, sample_b,
       xlab = "Quantiles of sample A",
       ylab = "Quantiles of sample B",
       pch = 1, frame = FALSE)
abline(0, 1, col = "grey50", lty = 2)    # 45-degree reference line

A two-sample Q-Q plot comparing two normal samples: points fall close to a dashed grey 45-degree line, showing the samples share the same distribution shape.

Les deux échantillons proviennent de la même distribution normale, donc les points se placent sur la droite à 45 degrés en pointillés. Donnez à qqplot() deux distributions véritablement différentes et les points s’incurveront en s’en éloignant. C’est l’outil pour « ces deux groupes ressemblent-ils au même type de données ? ».

Une remarque sur la bande de confiance

Une simple droite de référence laisse place à un jugement : à quel point un écart à la droite est-il trop grand ? Une bande de confiance y répond — les points à l’intérieur de la bande relèvent de la variation d’échantillonnage normale. R de base n’en trace pas d’office, mais la fonction qqPlot() du package car ajoute une bande, et ggpubr::ggqqplot() (section suivante) la trace par défaut. Lorsque vous disposez d’une bande, la règle est simple : points à l’intérieur de la bande ⇒ assez proches de la normale.

La méthode moderne ggpubr : ggqqplot()

Pour un Q-Q plot prêt à publier avec la bande de confiance intégrée, ggpubr::ggqqplot() le fait en un seul appel. Il trace les points, la droite de référence et une bande de confiance à 95 % ombrée — et renvoie un objet ggplot que vous pouvez thématiser ou facetter.

library(ggpubr)

ggqqplot(ToothGrowth, x = "len",
         color = "#3a86d4",
         title = "Normal Q-Q plot of tooth length")

A ggpubr ggqqplot of ToothGrowth tooth length: points along a reference line inside a grey 95 percent confidence band, with axis labels for theoretical and sample quantiles.

Passez un data frame et le nom de la colonne sous forme de chaîne (x = "len"). Les points qui tombent à l’intérieur de la bande grise sont cohérents avec la normalité. Ajoutez facet.by = "supp" pour tracer un panneau par groupe, ou color = une colonne de groupement pour colorer les points — pratique lorsque vous devez vérifier la normalité au sein de chaque groupe avant un test groupé.

Pour la voie complète stat_qq() / stat_qq_line() et davantage de styles ggplot2, consultez la leçon Q-Q plot ggplot2/ggpubr.

Essayez-le en direct

Modifiez les données ou remplacez ggqqplot() par qqnorm() + qqline() puis appuyez sur Run — cela s’exécute dans votre navigateur via webR, sans installation.

🟢 Avec un agent IA

Demandez à Prova « mon Q-Q plot s’incurve vers le haut en haut à droite — qu’est-ce que cela signifie ? » — elle répond avec du code R que vous pouvez exécuter sur vos propres données, de sorte que le diagnostic est reproductible. The runtime is the judge. Demander à Prova →

Problèmes courants

Les points se courbent ou forment un S — est-ce mauvais ? Pas nécessairement « mauvais », mais cela vous indique que les données ne sont pas normales. Une courbure à une extrémité signifie une asymétrie (vers le haut en haut à droite = asymétrie à droite) ; les deux extrémités qui s’écartent (un S) signifient des queues lourdes. Un léger flottement tout aux extrémités n’est que du bruit d’échantillonnage — jugez la tendance globale. Si la normalité est réellement violée, passez à un test non paramétrique (Wilcoxon, Kruskal-Wallis) ou transformez les données.

ggqqplot() provoque une erreur ou ne trace rien. ggpubr::ggqqplot() prend soit un simple vecteur numérique (ggqqplot(x)), soit un data frame avec le nom de la colonne sous forme de chaîne (ggqqplot(df, x = "len")) — et non df$len comme premier argument. Mélanger les deux formes est la cause habituelle. Et chargez d’abord le package avec library(ggpubr).

Questions fréquentes

Tracez un Q-Q plot avec qqnorm(x) puis qqline(x) — si les points tombent le long de la droite, les données sont approximativement normales. Pour un test numérique en complément, utilisez shapiro.test(x) (une p-value supérieure à 0.05 signifie aucune preuve contre la normalité). Le Q-Q plot est généralement le plus instructif des deux car il montre comment les données s’écartent.

qqnorm(x) compare un échantillon à la distribution normale (une vérification de normalité). qqplot(x, y) compare deux échantillons entre eux — il demande s’ils partagent la même forme de distribution, pas si l’un ou l’autre est normal.

Les points tombent près d’une droite, du bas à gauche vers le haut à droite, avec seulement un léger flottement aux deux extrémités. Cela signifie que les quantiles d’échantillon correspondent aux quantiles théoriques (normaux), donc les données sont cohérentes avec une distribution normale.

Une courbe à une extrémité signale une asymétrie (courbure vers le haut en haut à droite = asymétrie à droite, vers le bas en bas à gauche = asymétrie à gauche). Une forme en S, ou les deux extrémités qui s’éloignent de la droite, signale des queues lourdes — plus de valeurs extrêmes qu’une distribution normale n’en produirait.

qqnorm() de base n’en trace pas. Utilisez ggpubr::ggqqplot(df, x = "col"), qui ombre une bande de confiance à 95 % par défaut, ou car::qqPlot(x). Les points à l’intérieur de la bande relèvent de la variation d’échantillonnage normale.

Testez votre compréhension

Voici un échantillon tiré d’une distribution exponentielle (qui est asymétrique à droite). Tracez son Q-Q plot normal avec qqnorm() et ajoutez une droite de référence bleu acier avec qqline(). Puis regardez la forme : quelle extrémité s’écarte de la droite ?

Appelez d’abord qqnorm(my_data) pour tracer les points, puis qqline(my_data, col = "#3a86d4", lwd = 2) pour la droite de référence. Regardez l’extrémité en haut à droite du nuage de points.

qqnorm(my_data, pch = 1, frame = FALSE)
qqline(my_data, col = "#3a86d4", lwd = 2)

Les points se courbent vers le haut en s’écartant de la droite en haut à droite — la signature de l’asymétrie à droite. Ces données ne sont pas normales ; une transformation ou un test non paramétrique serait la prochaine étape.

Vérification rapide. Vous voulez comparer si deux échantillons, x et y, partagent la même forme de distribution. Quelle fonction utilisez-vous ?

qqplot(x, y). Utilisez qqnorm() pour comparer un échantillon à la distribution normale ; utilisez qqplot() pour comparer deux échantillons entre eux.

Conclusion

Un Q-Q plot est le moyen le plus rapide de juger la normalité à l’œil. En R de base, qqnorm() plus qqline() est tout ce dont vous avez besoin ; lisez la forme — des points sur la droite signifient normal, une extrémité courbée signifie une asymétrie, un S signifie des queues lourdes. Utilisez qqplot(x, y) pour comparer deux échantillons, et tournez-vous vers ggpubr::ggqqplot() lorsque vous voulez une bande de confiance et une figure prête à publier.

Leçons associées

Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : chaque figure a été produite par le code montré, exécuté au moment de la compilation (s’ils s’affichent, le code fonctionne), et le bac à sable se ré-exécute en direct dans votre navigateur. Modifiez n’importe quel bloc et Run. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {QQ plot en R : qqnorm(), qqline() et le test de normalité},
  date = {2026-06-27},
  url = {https://www.datanovia.com/learn/data-visualization/qq-plots-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“QQ plot en R : qqnorm(), qqline() et le test de normalité.” 2026. June 27. https://www.datanovia.com/learn/data-visualization/qq-plots-in-r.