course
Compararea a multiple grupuri este simplă când datele urmează o distribuție normală. Problema este că, în majoritatea cazurilor reale, datele nu o fac.
Dacă ANOVA este testul implicit, veți ajunge la concluzii greșite, deoarece presupune că datele urmează o distribuție normală. Când nu o fac – gândiți-vă la date asimetrice sau eșantioane mici – aveți nevoie de o altă abordare.
Testul Kruskal–Wallis este acea abordare diferită. Este o alternativă neparametrică la ANOVA și funcționează pe ranguri, nu pe valori brute, astfel încât distribuția normală nu este o cerință.
În acest articol, voi acoperi conceptul, matematica din spatele lui, cum să îl rulați în Python și R și cum să interpretați rezultatele.
Ce este testul Kruskal–Wallis?
Testul Kruskal–Wallis este o metodă neparametrică pentru compararea a trei sau mai multe grupuri independente. Convertește toate observațiile în ranguri și compară acele ranguri între grupuri, în loc să lucreze cu valori brute.
Îl puteți privi ca pe o extensie a testului Mann–Whitney U, despre care am scris, de asemenea.
Mann–Whitney U face aceeași comparație bazată pe rang, dar doar pentru două grupuri. Testul Kruskal–Wallis o extinde la trei sau mai multe, așa că atunci când aveți grupuri multiple și nu puteți folosi ANOVA, acesta este testul potrivit.
Pentru că lucrează cu ranguri, nu cu valori brute, nu presupune că datele urmează o anumită distribuție. Asta îl face util pentru date reale, care rareori respectă perfect un tip de distribuție.
Când să folosiți testul Kruskal–Wallis
Testul Kruskal–Wallis este potrivit când aveți de-a face cu:
- Trei sau mai multe grupuri independente pe care doriți să le comparați
- Date ordinale sau continue precum evaluări pe scala Likert sau date de măsurare
- Distribuții nenormale datorate asimetriei, valorilor extreme, eșantioanelor mici sau oricărui lucru cu care ANOVA nu se poate descurca
- Dimensiuni mici ale eșantionului unde normalitatea este greu de verificat
Iată un exemplu simplu.
Imaginați-vă că doriți să comparați notele la examene pentru trei clase diferite. Notele sunt asimetrice și eșantioanele mici, deci ANOVA nu este o alegere bună. Testul Kruskal–Wallis nu are nevoie de normalitate, deci funcționează aici. Vă va spune dacă cel puțin o clasă a obținut rezultate diferite de celelalte, fără a face presupuneri pe care datele nu le pot susține.
Testul Kruskal–Wallis vs. ANOVA
Ambele teste compară grupuri, dar o fac diferit.
ANOVA compară mediile grupurilor și presupune că datele sunt distribuite normal, cu varianțe aproximativ egale. Când aceste presupuneri sunt adevărate, este alegerea mai bună – are o putere statistică mai mare și rezultatele sunt mai ușor de interpretat.
Testul Kruskal–Wallis compară distribuțiile grupurilor folosind ranguri. Nu îl interesează normalitatea sau varianțele egale. Asta îl face mai flexibil, dar pierdeți ceva din puterea statistică.
Iată un tabel comparativ rapid:

ANOVA comparat cu testul Kruskal–Wallis
Dacă datele sunt distribuite normal, folosiți ANOVA. Dacă nu sunt – sau nu puteți verifica – folosiți Kruskal–Wallis.
Formula testului Kruskal–Wallis
Testul Kruskal–Wallis se reduce la o singură statistică de test, H. Iată formula:

Formula Kruskal–Wallis
Iată explicația componentelor:
-
N- numărul total de observații din toate grupurile -
k- numărul de grupuri -
n_i- numărul de observații în grupuli -
R_i- suma rangurilor atribuite grupuluii
Formula măsoară cât de mult se abat sumele rangurilor fiecărui grup de la ceea ce v-ați aștepta dacă toate grupurile ar fi identice. Un H mare înseamnă că grupurile sunt diferite, iar un H mic înseamnă că nu sunt atât de diferite.
După ce aveți H, îl comparați cu o distribuție chi-pătrat cu k - 1 grade de libertate pentru a obține un p-value.
Cum funcționează testul Kruskal–Wallis
Sunt patru pași necesari pentru a efectua testul Kruskal–Wallis:
- Combinați toate grupurile: Luați toate observațiile din fiecare grup și combinați-le într-un singur set de date
- Ranguiți toate observațiile: Sortați datele combinate de la cel mai mic la cel mai mare și atribuiți ranguri. Cea mai mică valoare primește rangul 1, următoarea rangul 2 și așa mai departe. Dacă două valori sunt egale, împart media rangurilor pe care le-ar fi ocupat.
- Calculați sumele rangurilor: Împărțiți rangurile în grupurile lor inițiale. Adunați rangurile pentru fiecare grup. Acestea sunt sumele de ranguri –
R_idin formulă - Calculați statistica de test: Introduceți sumele rangurilor în formula pentru
H. Dacă grupurile sunt similare, sumele lor de ranguri vor fi apropiate șiHva fi mic. Dacă un grup primește constant ranguri mai mari sau mai mici,Hcrește
Și atât!
Se vede că testul nu ține cont de valorile efective, ci doar de poziția lor relativă față de toate celelalte.
Testul Kruskal–Wallis în Python
Biblioteca scipy din Python are o funcție integrată pentru testul Kruskal–Wallis, ceea ce înseamnă că nu trebuie să implementați manual formula. Să parcurgem un exemplu.
Să spunem că comparați notele la examene pentru trei clase. Iată cum ați rula testul:
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}")

Rezultatul în Python
Valoarea p este sub 0,05, ceea ce înseamnă că cel puțin o clasă a obținut rezultate diferite de celelalte. Rețineți doar că testul nu vă spune care anume – veți avea nevoie de un test post hoc pentru asta, pe care îl voi acoperi în secțiunea următoare.
Testul Kruskal–Wallis în R
La fel ca în Python, R are o funcție integrată pentru acest test. Să folosim același scenariu cu notele la examene.
# 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)

Rezultatul în R
Ieșirea este aceeași ca în Python – aceeași statistică H, același p-value. Cu p < 0,05, ați respinge ipoteza nulă și ați concluziona că cel puțin un grup diferă.
Cum să interpretați rezultatele Kruskal–Wallis
Ipoteza nulă a testului Kruskal–Wallis este că toate grupurile au aceeași distribuție. Valoarea p vă spune dacă să o respingeți. Iată cum să o interpretați:
- p < 0,05: Cel puțin un grup diferă de celelalte, deci respingeți ipoteza nulă
- p >= 0,05: Nu există dovezi solide că grupurile diferă, deci nu respingeți ipoteza nulă
Pragul de 0,05 este o convenție. În funcție de domeniu sau de miza analizei, puteți folosi un prag mai strict, precum 0,01, sau unul mai permisiv, precum 0,10.
Rețineți că acest test nu vă spune care grup este diferit. Un rezultat semnificativ înseamnă doar că grupurile nu sunt toate la fel. Știți că se întâmplă ceva, dar nu și unde. Pentru a afla ce perechi determină diferența, aveți nevoie de un test post hoc.
Teste post hoc după Kruskal–Wallis
Testul vă spune că cel puțin un grup diferă, dar nu și care grup este de fapt diferit. Dacă aveți trei grupuri și p < 0,05, ar putea fi A versus B, A versus C, B versus C sau o combinație. Trebuie să efectuați un test post hoc pentru a obține aceste comparații perechi.
Testul lui Dunn este cea mai comună alegere. Rulează comparații perechi între toate grupurile și ajustează valorile p pentru a ține cont de comparațiile multiple – fără acel ajustaj, ați crește șansa unui fals pozitiv. Cu cât rulați mai multe comparații, cu atât crește riscul de a găsi un rezultat „semnificativ” doar din întâmplare.
Testul lui Dunn în Python
Veți avea nevoie de biblioteca scikit_posthocs. Dacă nu o aveți, instalați-o cu pip install scikit-posthocs.
De acolo, calculul este simplu:
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)

Testul lui Dunn în Python
Fiecare celulă arată valoarea p ajustată pentru acea pereche. Aici, doar B versus C (p = 0,004) trece pragul de 0,05, astfel că acele două grupuri diferă. A versus B (p = 0,167) și A versus C (p = 0,607) nu trec, ceea ce înseamnă că clasa A nu este diferită statistic de niciuna dintre celelalte două.
Testul lui Dunn în R
Pentru început, instalați biblioteca dacă este necesar cu comanda 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")

Testul lui Dunn în R
Rezultatele corespund celor din Python, cum era de așteptat. Doar B versus C este semnificativ, în timp ce A versus B și A versus C nu sunt. Clasele B și C sunt cele din spatele diferenței detectate de testul Kruskal–Wallis.
Presupozițiile testului Kruskal–Wallis
Testul Kruskal–Wallis este mai flexibil decât ANOVA, dar are totuși trei presupoziții pe care trebuie să le verificați înainte de a-l rula:
- Eșantioane independente: Observațiile dintr-un grup nu influențează observațiile din altul. Dacă datele sunt perechi sau măsurători repetate, acest test nu este potrivit
- Date ordinale sau continue: Testul are nevoie de date care pot fi ordonate. Categoriile nominale (precum culorile sau etichetele) nu pot fi ordonate, deci nu funcționează aici
- Forme similare ale distribuțiilor: Dacă doriți să interpretați rezultatele ca o comparație a medianelor, nu doar a distribuțiilor, grupurile trebuie să aibă aproximativ aceeași formă. Dacă formele diferă mult, puteți compara în continuare distribuțiile, dar interpretarea pe mediană nu se mai susține
Dacă încălcați primele două presupoziții, rezultatele testului nu vor fi valide. A treia este ceva mai flexibilă, deoarece afectează modul în care interpretați rezultatele, nu dacă puteți rula testul.
Când nu ar trebui să folosiți testul Kruskal–Wallis
Există trei cazuri în care un alt test ar fi mai potrivit:
- Datele sunt perechi sau măsurători repetate: Dacă aceiași subiecți apar în mai multe grupuri, folosiți testul Friedman. Este echivalentul neparametric pentru eșantioane dependente. Folosirea Kruskal–Wallis pe date perechi ignoră relația dintre observații și poate duce la concluzii greșite
- Datele respectă presupozițiile ANOVA: Dacă datele sunt distribuite normal, cu varianțe aproximativ egale, ANOVA este alegerea mai bună. Are o putere statistică mai mare, adică detectează mai bine diferențele reale atunci când există
- Eșantioanele sunt mari: Cu eșantioane mari, metodele parametrice tind să funcționeze bine chiar dacă datele nu sunt perfect normale. Teorema limită centrală își face efectul, iar ANOVA vă va oferi rezultate mai fiabile decât abordarea bazată pe ranguri. Dacă lucrați cu sute sau mii de observații per grup, Kruskal–Wallis nu este testul pentru dumneavoastră
Concluzie
Testul Kruskal–Wallis compară trei sau mai multe grupuri independente atunci când datele nu urmează distribuția normală cerută de teste precum ANOVA. Acest lucru este posibil deoarece lucrează pe ranguri, nu pe valori brute.
Asta nu înseamnă că înlocuiește ANOVA. Dacă datele sunt normale, ANOVA este testul mai bun deoarece are o semnificație statistică mai mare. Pe de altă parte, dacă datele sunt perechi, folosiți testul Friedman. Ca întotdeauna, testul potrivit depinde de date.
Când condițiile sunt potrivite, testul Kruskal–Wallis este o alegere fiabilă și directă. Îl rulați, verificați valoarea p și continuați cu testul lui Dunn dacă trebuie să știți ce grupuri stau la baza diferenței.
Cunoștințele dumneavoastră de statistică sunt puțin ruginite? Urmați cursul nostru Introducere în Statistică și reveniți pe drumul cel bun într-o singură după-amiază.
Întrebări frecvente despre testul Kruskal–Wallis
La ce se folosește testul Kruskal–Wallis?
Testul Kruskal–Wallis este utilizat pentru a compara trei sau mai multe grupuri independente atunci când nu puteți presupune că datele urmează o distribuție normală. Este o alternativă neparametrică la ANOVA care funcționează pe ranguri, nu pe valori brute. Îl veți găsi util în situații în care distribuțiile sunt asimetrice sau datele sunt ordinale.
Ce înseamnă un rezultat Kruskal–Wallis semnificativ?
Un rezultat semnificativ – de obicei p < 0,05 – înseamnă că cel puțin un grup diferă de celelalte. Nu vă spune care grupuri sunt diferite, doar că nu sunt toate la fel. Pentru a afla ce perechi stau la baza diferenței, trebuie să continuați cu un test post hoc, precum testul lui Dunn.
Care sunt presupozițiile testului Kruskal–Wallis?
Testul necesită eșantioane independente, adică observațiile dintr-un grup nu influențează observațiile din altul. Datele trebuie să fie ordinale sau continue – ceva ce poate fi ordonat. Dacă doriți să interpretați rezultatele ca o comparație a medianelor, grupurile ar trebui, de asemenea, să aibă forme similare ale distribuțiilor.
Care este diferența dintre testul Kruskal–Wallis și testul Mann–Whitney U?
Testul Mann–Whitney U compară două grupuri independente, în timp ce testul Kruskal–Wallis extinde abordarea la trei sau mai multe grupuri. Ambele lucrează pe ranguri și nu presupun normalitate. Dacă aveți doar două grupuri, Mann–Whitney U este alegerea corectă – Kruskal–Wallis este echivalentul pentru mai multe grupuri.
Când ar trebui să folosiți testul lui Dunn după Kruskal–Wallis?
Rulați testul lui Dunn atunci când rezultatul Kruskal–Wallis este semnificativ și aveți nevoie să știți care perechi specifice de grupuri diferă. El efectuează comparații perechi între toate grupurile și ajustează valorile p pentru a reduce șansa de false pozitive. În Python, scikit_posthocs.posthoc_dunn() face acest lucru, iar în R, pachetul dunn.test oferă aceeași funcționalitate.