Cours
Comparer plusieurs groupes est simple lorsque vos données suivent une loi normale. Le problème, c’est que la plupart des données réelles n’y obéissent pas.
Si vous utilisez l’ANOVA par défaut, vous risquez de tirer de mauvaises conclusions, car elle suppose que vos données sont normalement distribuées. Lorsque ce n’est pas le cas — données asymétriques ou petits échantillons — il faut changer d’approche.
Le test de Kruskal-Wallis est précisément cette alternative. C’est une méthode non paramétrique à l’ANOVA ; elle s’appuie sur les rangs plutôt que sur les valeurs brutes, et n’exige donc pas de normalité.
Dans cet article, je reviens sur le concept, les bases mathématiques, la mise en œuvre en Python et en R, ainsi que l’interprétation des résultats.
Qu’est-ce que le test de Kruskal-Wallis ?
Le test de Kruskal-Wallis est une méthode non paramétrique pour comparer trois groupes indépendants ou plus. Il convertit toutes les observations en rangs et compare ces rangs entre les groupes plutôt que de travailler sur les valeurs brutes.
Vous pouvez le voir comme une extension du test de Mann-Whitney U, sur lequel j’ai également écrit.
Le test de Mann-Whitney U applique la même logique basée sur les rangs, mais uniquement pour deux groupes. Le test de Kruskal-Wallis passe à trois groupes ou plus. Lorsque vous avez plusieurs groupes et que l’ANOVA n’est pas applicable, c’est l’outil à privilégier.
Comme il travaille sur des rangs et non sur des valeurs, il ne suppose aucune forme particulière de distribution. C’est ce qui le rend utile avec des données réelles, qui ne suivent presque jamais parfaitement une loi donnée.
Quand utiliser le test de Kruskal-Wallis
Le test de Kruskal-Wallis est particulièrement indiqué si vous traitez :
- Trois groupes indépendants ou plus à comparer
- Des données ordinales ou continues (échelles de Likert, mesures, etc.)
- Des distributions non normales (asymétrie, valeurs aberrantes, petits échantillons) que l’ANOVA gère mal
- De petites tailles d’échantillon rendant la normalité difficile à attester
Voici un exemple simple.
Imaginez comparer les notes d’examen de trois classes. Les notes sont asymétriques et les échantillons petits ; l’ANOVA n’est pas adaptée. Le test de Kruskal-Wallis ne requiert pas la normalité : il fonctionne ici. Il vous dira si au moins une classe se distingue des autres, sans imposer d’hypothèses que vos données ne vérifient pas.
Test de Kruskal-Wallis vs ANOVA
Les deux tests comparent des groupes, mais de façons différentes.
L’ANOVA compare les moyennes des groupes et suppose des données normalement distribuées avec des variances à peu près égales. Lorsque ces hypothèses sont vérifiées, c’est le meilleur choix : plus de puissance statistique et des résultats plus simples à interpréter.
Le test de Kruskal-Wallis compare les distributions des groupes via les rangs. Il ne dépend ni de la normalité ni de l’égalité des variances. Il est donc plus flexible, mais au prix d’une moindre puissance statistique.
Voici un tableau récapitulatif :

ANOVA comparée au test de Kruskal-Wallis
Si vos données sont normales, utilisez l’ANOVA. Si elles ne le sont pas — ou si vous ne pouvez pas le vérifier — utilisez Kruskal-Wallis.
Formule du test de Kruskal-Wallis
Le test de Kruskal-Wallis se résume à une statistique, H. Voici la formule :

Formule de Kruskal-Wallis
Voici l’explication des composants :
-
N— nombre total d’observations tous groupes confondus -
k— nombre de groupes -
n_i— nombre d’observations dans le groupei -
R_i— somme des rangs attribués au groupei
La formule mesure à quel point les sommes de rangs de chaque groupe s’écartent de ce que l’on attendrait si tous les groupes étaient identiques. Un grand H indique des groupes différents ; un petit H suggère des groupes proches.
Une fois H calculé, on le compare à une loi du khi-deux avec k - 1 degrés de liberté pour obtenir la p-valeur.
Comment fonctionne le test de Kruskal-Wallis
Quatre étapes suffisent pour réaliser le test de Kruskal-Wallis :
- Combiner tous les groupes : regroupez toutes les observations dans un seul jeu de données
- Ranger toutes les observations : triez les données combinées du plus petit au plus grand et attribuez des rangs. La plus petite valeur reçoit le rang 1, la suivante le rang 2, etc. En cas d’égalité, attribuez la moyenne des rangs correspondants.
- Calculer les sommes de rangs : réaffectez les rangs à leurs groupes d’origine puis additionnez-les pour chaque groupe. Ce sont vos sommes de rangs —
R_idans la formule - Calculer la statistique de test : intégrez les sommes de rangs dans la formule de
H. Si les groupes sont semblables, leurs sommes de rangs seront proches etHsera faible. Si un groupe obtient systématiquement des rangs plus élevés ou plus faibles,Haugmentera.
Et c’est tout !
Le test ne s’intéresse pas aux valeurs en elles-mêmes, mais à leur position relative par rapport à l’ensemble.
Test de Kruskal-Wallis en Python
La bibliothèque scipy de Python propose une fonction dédiée au test de Kruskal-Wallis, ce qui évite d’implémenter la formule à la main. Voyons un exemple.
Supposons que vous compariez les notes d’examen de trois classes. Voici comment lancer le test :
from scipy import stats
# Exam scores
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]
# Run the test
statistic, p_value = stats.kruskal(class_a, class_b, class_c)
print(f"H statistic: {statistic:.4f}")
print(f"P-value: {p_value:.4f}")

Résultats Python
La p-valeur est inférieure à 0,05, ce qui signifie qu’au moins une classe se distingue des autres. Gardez simplement à l’esprit que le test ne dit pas laquelle — il faut un test post hoc pour cela, que j’aborde dans la section suivante.
Test de Kruskal-Wallis en R
Comme en Python, R intègre une fonction pour ce test. Reprenons le même scénario de notes d’examen.
# Exam scores
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)
# Combine
scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))
# Run the test
kruskal.test(scores ~ groups)

Résultats R
La sortie correspond à celle obtenue en Python — même statistique H, même p-valeur. Avec p < 0,05, vous rejetez l’hypothèse nulle et concluez qu’au moins un groupe diffère.
Comment interpréter les résultats de Kruskal-Wallis
L’hypothèse nulle du test de Kruskal-Wallis stipule que tous les groupes partagent la même distribution. La p-valeur indique s’il faut la rejeter. Voici comment l’interpréter :
- p < 0,05 : au moins un groupe diffère des autres ; rejetez l’hypothèse nulle
- p ≥ 0,05 : pas de preuve solide d’une différence entre les groupes ; ne rejetez pas l’hypothèse nulle
Le seuil de 0,05 est conventionnel. Selon votre domaine ou les enjeux, vous pouvez retenir un seuil plus strict (0,01) ou plus souple (0,10).
Notez que ce test ne vous dira pas quel groupe est différent. Un résultat significatif indique simplement que les groupes ne sont pas tous identiques. Pour identifier les paires à l’origine de l’écart, il faut un test post hoc.
Tests post hoc après Kruskal-Wallis
Le test indique qu’au moins un groupe diffère, sans préciser lequel. Avec trois groupes et p < 0,05, cela peut être A contre B, A contre C, B contre C, ou une combinaison. Il faut réaliser un test post hoc pour obtenir ces comparaisons par paires.
Le test de Dunn est le plus courant. Il effectue des comparaisons deux à deux entre tous les groupes et ajuste les p-valeurs pour tenir compte des comparaisons multiples — sans cet ajustement, vous augmentez le risque de faux positifs. Plus il y a de comparaisons, plus le risque de trouver un résultat « significatif » par hasard est élevé.
Test de Dunn en Python
Vous aurez besoin de la bibliothèque scikit_posthocs. Si elle n’est pas installée, utilisez pip install scikit-posthocs.
Ensuite, le calcul est direct :
import scikit_posthocs as sp
import pandas as pd
# Same exam scores as before
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]
# Combine
scores = class_a + class_b + class_c
groups = ["A"] * 5 + ["B"] * 5 + ["C"] * 5
df = pd.DataFrame({"score": scores, "group": groups})
# Run the test
result = sp.posthoc_dunn(df, val_col="score", group_col="group", p_adjust="bonferroni")
print(result)

Test de Dunn en Python
Chaque cellule présente la p-valeur ajustée pour la paire considérée. Ici, seule la comparaison B contre C (p = 0,004) franchit le seuil de 0,05 : ces deux groupes diffèrent. A contre B (p = 0,167) et A contre C (p = 0,607) ne sont pas significatifs ; la classe A ne se distingue donc pas statistiquement des deux autres.
Test de Dunn en R
Commencez par installer la bibliothèque si besoin avec la commande install.packages("dunn.test") :
library(dunn.test)
# Same exam scores as before
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)
scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))
# Run the test
dunn.test(scores, groups, method = "bonferroni")

Test de Dunn en R
Les résultats concordent avec Python, comme attendu. Seule la paire B contre C est significative, tandis que A contre B et A contre C ne le sont pas. Les classes B et C expliquent la différence détectée par le test de Kruskal-Wallis.
Hypothèses du test de Kruskal-Wallis
Le test de Kruskal-Wallis est plus flexible que l’ANOVA, mais il repose tout de même sur trois hypothèses à vérifier avant exécution :
- Échantillons indépendants : les observations d’un groupe n’influencent pas celles d’un autre. Si vos données sont appariées ou répétées, ce test n’est pas adapté
- Données ordinales ou continues : le test exige des données classables par rang. Des catégories nominales (couleurs, libellés) ne conviennent pas
- Formes de distribution similaires : si vous souhaitez interpréter les résultats en termes de médianes plutôt que de distributions globales, les groupes doivent avoir des formes de distribution globalement comparables. Sinon, vous pouvez comparer les distributions, mais pas conclure sur les médianes
Si vous violez les deux premières hypothèses, les résultats ne seront pas valides. La troisième influe surtout sur l’interprétation, pas sur la possibilité de réaliser le test.
Quand ne pas utiliser le test de Kruskal-Wallis
Trois cas de figure appellent un autre test :
- Vos données sont appariées ou à mesures répétées : si les mêmes sujets apparaissent dans plusieurs groupes, utilisez le test de Friedman, équivalent non paramétrique pour échantillons dépendants. Utiliser Kruskal-Wallis ignorerait la dépendance et pourrait conduire à de mauvaises conclusions
- Vos données respectent les hypothèses de l’ANOVA : si les données sont normales avec des variances proches, l’ANOVA est préférable, plus puissante pour détecter de vraies différences
- Vos échantillons sont volumineux : avec de grands échantillons, les méthodes paramétriques fonctionnent bien même sans parfaite normalité (théorème central limite). L’ANOVA donnera des résultats plus fiables que l’approche par rangs. Avec des centaines ou milliers d’observations par groupe, Kruskal-Wallis n’est pas le bon choix
Conclusion
Le test de Kruskal-Wallis compare trois groupes indépendants ou plus lorsque vos données ne suivent pas la normalité requise par des tests comme l’ANOVA. C’est possible car il travaille sur des rangs plutôt que sur des valeurs brutes.
Pour autant, ce n’est pas un remplaçant de l’ANOVA. Si vos données sont normales, l’ANOVA est préférable, car plus puissante. Si vos données sont appariées, utilisez le test de Friedman. Comme toujours, le bon test dépend de vos données.
Lorsque les conditions s’y prêtent, le test de Kruskal-Wallis est une option fiable et simple. Exécutez-le, examinez la p-valeur, puis enchaînez avec le test de Dunn si vous devez identifier les groupes à l’origine de la différence.
Vos bases en statistiques sont un peu rouillées ? Suivez notre cours Introduction to Statistics et remettez-vous à niveau en une après-midi.
FAQ sur le test de Kruskal-Wallis
À quoi sert le test de Kruskal-Wallis ?
Le test de Kruskal-Wallis sert à comparer trois groupes indépendants ou plus lorsque vous ne pouvez pas supposer que vos données suivent une loi normale. C’est une alternative non paramétrique à l’ANOVA qui s’appuie sur les rangs plutôt que sur les valeurs brutes. Il est utile lorsque les distributions sont asymétriques ou lorsque les données sont ordinales.
Que signifie un résultat significatif au test de Kruskal-Wallis ?
Un résultat significatif — généralement p < 0,05 — signifie qu’au moins un groupe diffère des autres. Le test ne dit pas quelles paires sont différentes, seulement qu’ils ne sont pas tous identiques. Pour identifier les paires à l’origine de la différence, réalisez un test post hoc, comme le test de Dunn.
Quelles sont les hypothèses du test de Kruskal-Wallis ?
Le test requiert des échantillons indépendants — les observations d’un groupe ne doivent pas influencer celles d’un autre. Vos données doivent être ordinales ou continues, donc classables. Si vous souhaitez interpréter les résultats comme une comparaison de médianes, les groupes doivent aussi présenter des formes de distribution similaires.
Quelle est la différence entre le test de Kruskal-Wallis et le test de Mann-Whitney U ?
Le test de Mann-Whitney U compare deux groupes indépendants ; le test de Kruskal-Wallis étend cette approche à trois groupes ou plus. Les deux travaillent sur des rangs et ne supposent pas la normalité. Avec seulement deux groupes, choisissez Mann-Whitney U ; Kruskal-Wallis est son équivalent multi-groupes.
Quand utiliser le test de Dunn après Kruskal-Wallis ?
Lancez le test de Dunn lorsque le résultat de Kruskal-Wallis est significatif et que vous devez savoir quelles paires de groupes diffèrent. Il réalise des comparaisons par paires entre tous les groupes et ajuste les p-valeurs pour limiter les faux positifs. En Python, scikit_posthocs.posthoc_dunn() permet de le faire, et en R, le package dunn.test offre la même fonctionnalité.
