Przejdź do treści głównej

Test Kruskala-Wallisa: porównywanie wielu grup bez założenia normalności

Praktyczny przewodnik po teście Kruskala-Wallisa — czym jest, jak działa, kiedy stosować go zamiast ANOVY oraz jak go uruchomić i interpretować w Pythonie i R.
Zaktualizowano 4 maj 2026  · 9 min Czytać

Porównywanie wielu grup jest proste, gdy dane mają rozkład normalny. Problem w tym, że większość danych z rzeczywistego świata go nie ma.

Jeśli domyślnie stosują Państwo ANOVĘ, łatwo o błędne wnioski, bo test zakłada normalność rozkładu. Gdy tak nie jest — np. przy skośnych danych lub małych próbach — potrzeba innego podejścia.

Test Kruskala-Wallisa jest właśnie takim podejściem. To nieparametryczna alternatywa dla ANOVY; działa na rangach zamiast na surowych wartościach, więc normalność rozkładu nie jest wymagana.

W tym artykule omówię koncepcję, stojącą za nią matematykę, sposób uruchomienia w Pythonie i R oraz interpretację wyników.

Czym jest test Kruskala-Wallisa?

Test Kruskala-Wallisa to nieparametryczna metoda porównywania trzech lub więcej niezależnych grup. Zamienia wszystkie obserwacje na rangi i porównuje te rangi między grupami zamiast operować na surowych wartościach.

Można myśleć o nim jako o rozszerzeniu testu U Manna-Whitneya, o którym również pisałem.

Test U Manna-Whitneya wykonuje to samo porównanie oparte na rangach, ale tylko dla dwóch grup. Test Kruskala-Wallisa skaluje je do trzech lub więcej, więc gdy mają Państwo wiele grup i nie można użyć ANOVY, należy zastosować tę metodę.

Ponieważ działa na rangach, a nie na wartościach surowych, nie zakłada żadnego konkretnego rozkładu danych. To czyni go użytecznym w danych rzeczywistych, które rzadko idealnie wpisują się w jeden typ rozkładu.

Kiedy używać testu Kruskala-Wallisa

Test Kruskala-Wallisa świetnie sprawdza się, gdy mają Państwo do czynienia z:

  • Trzema lub większą liczbą niezależnych grup do porównania
  • Danymi porządkowymi lub ciągłymi, np. ocenami w skali Likerta lub danymi pomiarowymi
  • Nienormalnymi rozkładami wynikającymi ze skośności, obserwacji odstających, małych prób lub czegokolwiek, z czym ANOVA sobie nie radzi
  • Małymi próbami, dla których trudno zweryfikować normalność

Oto prosty przykład.

Załóżmy, że chcą Państwo porównać wyniki egzaminów w trzech różnych klasach. Rozkład wyników jest skośny, a próby małe, więc ANOVA nie jest dobrym wyborem. Test Kruskala-Wallisa nie wymaga normalności, więc sprawdzi się tutaj. Pokaże, czy co najmniej jedna klasa różni się wynikami od pozostałych, bez czynienia założeń, których Państwa dane nie spełniają.

Test Kruskala-Wallisa a ANOVA

Oba testy porównują grupy, ale robią to inaczej.

ANOVA porównuje średnie grup i zakłada normalność rozkładu oraz zbliżone wariancje. Gdy te założenia są spełnione, to lepszy wybór — ma większą moc statystyczną, a wyniki łatwiej interpretować.

Test Kruskala-Wallisa porównuje rozkłady grup, korzystając z rang. Nie interesuje go normalność ani równość wariancji. To czyni go bardziej elastycznym, ale kosztem pewnej utraty mocy statystycznej.

Oto szybka tabela porównawcza:

Porównanie ANOVY i testu Kruskala-Wallisa

Porównanie ANOVY i testu Kruskala-Wallisa

Jeśli Państwa dane mają rozkład normalny, proszę użyć ANOVY. Jeśli nie — lub nie można tego zweryfikować — proszę użyć testu Kruskala-Wallisa.

Wzór testu Kruskala-Wallisa

Test Kruskala-Wallisa sprowadza się do jednej statystyki testowej, H. Oto wzór:

Wzór testu Kruskala-Wallisa

Wzór testu Kruskala-Wallisa

Oto wyjaśnienie składników:

  • N — łączna liczba obserwacji we wszystkich grupach

  • k — liczba grup

  • n_i — liczba obserwacji w grupie i

  • R_i — suma rang przypisanych grupie i

Wzór mierzy, jak bardzo sumy rang poszczególnych grup odbiegają od tego, czego należałoby oczekiwać, gdyby wszystkie grupy były identyczne. Duże H oznacza różnice między grupami, a małe H — że nie różnią się one znacząco.

Gdy mają już Państwo H, porównuje się je z rozkładem chi-kwadrat o liczbie stopni swobody k - 1, aby uzyskać wartość p.

Jak działa test Kruskala-Wallisa

Aby przeprowadzić test Kruskala-Wallisa, potrzeba czterech kroków:

  1. Połącz wszystkie grupy: Weź wszystkie obserwacje ze wszystkich grup i połącz je w jeden zbiór danych
  2. Uszereguj wszystkie obserwacje: Posortuj połączone dane od najmniejszej do największej i przypisz rangi. Najmniejsza wartość dostaje rangę 1, następna 2 itd. Jeśli dwie wartości są równe, otrzymują średnią rang, które by zajęły.
  3. Oblicz sumy rang: Podziel rangi z powrotem na pierwotne grupy. Zsumuj rangi dla każdej grupy. To są Państwa sumy rang — R_i we wzorze
  4. Oblicz statystykę testu: Podstaw sumy rang do wzoru na H. Jeśli grupy są podobne, ich sumy rang będą zbliżone, a H będzie małe. Jeśli jedna grupa konsekwentnie otrzymuje wyższe lub niższe rangi, H rośnie

I to wszystko!

Widać, że test nie zwraca uwagi na faktyczne wartości, lecz na ich pozycję względem pozostałych.

Test Kruskala-Wallisa w Pythonie

Biblioteka Pythona scipy ma wbudowaną funkcję testu Kruskala-Wallisa, więc nie trzeba ręcznie implementować wzoru. Przejdźmy przez przykład.

Załóżmy, że porównują Państwo wyniki egzaminów w trzech klasach. Oto jak uruchomić 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}")

Wynik w Pythonie

Wynik w Pythonie

Wartość p jest poniżej 0,05, co oznacza, że co najmniej jedna klasa różni się wynikami od pozostałych. Proszę pamiętać, że test nie wskazuje, która — do tego potrzebny jest test post hoc, o którym mowa w następnej sekcji.

Test Kruskala-Wallisa w R

Podobnie jak w Pythonie, R ma wbudowaną funkcję do tego testu. Użyjmy tego samego scenariusza z wynikami egzaminów.

# 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)

Wynik w R

Wynik w R

Wynik jest taki sam jak w Pythonie — ta sama statystyka H i ta sama wartość p. Przy p < 0,05 należy odrzucić hipotezę zerową i uznać, że co najmniej jedna grupa się różni.

Jak interpretować wyniki testu Kruskala-Wallisa

Hipoteza zerowa testu Kruskala-Wallisa zakłada, że wszystkie grupy mają ten sam rozkład. Wartość p mówi, czy należy ją odrzucić. Oto interpretacja:

  • p < 0,05: Co najmniej jedna grupa różni się od pozostałych, więc należy odrzucić hipotezę zerową
  • p >= 0,05: Brak mocnych dowodów na różnice między grupami, więc nie należy odrzucać hipotezy zerowej

Próg 0,05 to konwencja. W zależności od dziedziny lub wagi analizy można zastosować bardziej rygorystyczny próg, np. 0,01, lub łagodniejszy, np. 0,10.

Proszę pamiętać, że test nie wskaże, która grupa się różni. Istotny wynik oznacza jedynie, że grupy nie są wszystkie takie same. Wiadomo, że coś się dzieje, ale nie wiadomo gdzie. Aby ustalić, które pary odpowiadają za różnicę, potrzebny jest test post hoc.

Testy post hoc po teście Kruskala-Wallisa

Test mówi, że co najmniej jedna grupa się różni, ale nie wskazuje, która konkretnie. Jeśli mają Państwo trzy grupy i p < 0,05, to może to być A vs B, A vs C, B vs C lub jakaś kombinacja. Aby uzyskać porównania parami, należy wykonać test post hoc.

Test Dunna jest najczęściej wybierany. Przeprowadza porównania parami między wszystkimi grupami i koryguje wartości p pod kątem wielokrotnych porównań — bez tej korekty wzrosłoby ryzyko fałszywie dodatnich wyników. Im więcej porównań, tym większe ryzyko „istotności” przypadkowej.

Test Dunna w Pythonie

Potrzebna będzie biblioteka scikit_posthocs. Jeśli nie jest zainstalowana, proszę użyć pip install scikit-posthocs.

Dalej obliczenia są proste:

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 Dunna w Pythonie

Test Dunna w Pythonie

Każda komórka pokazuje skorygowaną wartość p dla danej pary. Tutaj tylko porównanie B z C (p = 0,004) przekracza próg 0,05, więc te dwie grupy się różnią. A z B (p = 0,167) i A z C (p = 0,607) — nie, co oznacza, że klasa A nie różni się statystycznie od żadnej z pozostałych.

Test Dunna w R

Na początek, jeśli potrzeba, proszę zainstalować pakiet poleceniem 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 Dunna w R

Test Dunna w R

Wyniki pokrywają się z Pythonem, zgodnie z oczekiwaniami. Istotne jest tylko porównanie B z C, natomiast A z B i A z C — nie. To klasy B i C stoją za różnicą wykrytą przez test Kruskala-Wallisa.

Założenia testu Kruskala-Wallisa

Test Kruskala-Wallisa jest bardziej elastyczny niż ANOVA, ale nadal ma trzy założenia, które należy sprawdzić przed jego uruchomieniem:

  • Niezależne próby: Obserwacje w jednej grupie nie wpływają na obserwacje w innej. Jeśli dane są sparowane lub powtarzane, ten test nie będzie odpowiedni
  • Dane porządkowe lub ciągłe: Test wymaga danych, które można uszeregować. Kategorie nominalne (np. kolory czy etykiety) nie mają porządku, więc się nie nadają
  • Podobne kształty rozkładów: Jeśli chcą Państwo interpretować wyniki jako porównanie median, a nie tylko rozkładów, grupy powinny mieć z grubsza podobny kształt. Gdy kształty bardzo się różnią, można porównywać rozkłady, ale interpretacja median nie będzie poprawna

Jeśli dwa pierwsze założenia są naruszone, wyniki testu nie będą ważne. Trzecie jest nieco łagodniejsze — wpływa na interpretację wyników, a nie na możliwość uruchomienia testu.

Kiedy nie należy używać testu Kruskala-Wallisa

Są trzy przypadki, w których lepszym wyborem będzie inny test:

  • Dane są sparowane lub powtarzane pomiary: Jeśli te same obiekty pojawiają się w wielu grupach, należy użyć testu Friedmana. To nieparametryczny odpowiednik przeznaczony dla prób zależnych. Zastosowanie testu Kruskala-Wallisa do danych sparowanych ignoruje zależność między obserwacjami i może prowadzić do błędnych wniosków
  • Dane spełniają założenia ANOVY: Jeśli dane mają rozkład normalny i zbliżone wariancje, ANOVA będzie lepsza. Ma większą moc statystyczną, a więc lepiej wykrywa rzeczywiste różnice, gdy istnieją
  • Próby są duże: Przy dużych próbach metody parametryczne zwykle działają dobrze, nawet gdy dane nie są idealnie normalne. Działa centralne twierdzenie graniczne i ANOVA da bardziej wiarygodne wyniki niż podejście oparte na rangach. Jeśli pracują Państwo ze setkami lub tysiącami obserwacji na grupę, test Kruskala-Wallisa nie będzie odpowiedni

Wnioski

Test Kruskala-Wallisa porównuje trzy lub więcej niezależnych grup, gdy dane nie spełniają wymogu normalności, który zakładają testy takie jak ANOVA. Jest to możliwe, ponieważ działa na rangach zamiast na wartościach surowych.

Nie jest to jednak zamiennik ANOVY. Jeśli dane są normalne, ANOVA będzie lepszym testem, bo ma większą moc statystyczną. Z kolei przy danych sparowanych należy użyć testu Friedmana. Jak zawsze, właściwy test zależy od danych.

Gdy warunki są spełnione, test Kruskala-Wallisa to solidny i prosty wybór. Wystarczy go uruchomić, sprawdzić wartość p i — jeśli trzeba wskazać, które grupy stoją za różnicą — wykonać test Dunna.

Statystyka trochę się zatarła? Proszę wziąć udział w kursie Introduction to Statistics i wrócić na właściwe tory w jedno popołudnie.

Najczęstsze pytania o test Kruskala-Wallisa

Do czego służy test Kruskala-Wallisa?

Test Kruskala-Wallisa służy do porównywania trzech lub więcej niezależnych grup, gdy nie można założyć normalności rozkładu danych. To nieparametryczna alternatywa dla ANOVY, działająca na rangach zamiast na surowych wartościach. Jest użyteczny, gdy rozkłady są skośne lub gdy dane mają charakter porządkowy.

Co oznacza istotny wynik testu Kruskala-Wallisa?

Istotny wynik — zazwyczaj p < 0,05 — oznacza, że co najmniej jedna grupa różni się od pozostałych. Test nie mówi jednak, które grupy są różne, a jedynie, że nie wszystkie są takie same. Aby ustalić, które pary stoją za różnicą, należy wykonać test post hoc, np. test Dunna.

Jakie są założenia testu Kruskala-Wallisa?

Test wymaga niezależnych prób, czyli obserwacje w jednej grupie nie wpływają na obserwacje w innej. Dane muszą być porządkowe lub ciągłe — takie, które można uszeregować. Jeśli chcą Państwo interpretować wyniki jako porównanie median, grupy powinny mieć podobne kształty rozkładów.

Jaka jest różnica między testem Kruskala-Wallisa a testem U Manna-Whitneya?

Test U Manna-Whitneya porównuje dwie niezależne grupy, natomiast test Kruskala-Wallisa rozszerza to podejście na trzy lub więcej grup. Oba działają na rangach i nie zakładają normalności. Przy dwóch grupach właściwy jest test U Manna-Whitneya — Kruskal-Wallis to jego wielogrupowy odpowiednik.

Kiedy stosować test Dunna po teście Kruskala-Wallisa?

Proszę uruchomić test Dunna, gdy wynik testu Kruskala-Wallisa jest istotny i trzeba ustalić, które konkretne pary grup się różnią. Wykonuje on porównania parami między wszystkimi grupami i koryguje wartości p, by ograniczyć ryzyko fałszywie dodatnich wyników. W Pythonie służy do tego scikit_posthocs.posthoc_dunn(), a w R — pakiet dunn.test.

Tematy

Ucz się z DataCamp

course

Introduction to Statistics in R

4 godz.
128.6K
Grow your statistical skills and learn how to collect, analyze, and draw accurate conclusions from data.
Zobacz szczegółyRight Arrow
Rozpocznij kurs
Zobacz więcejRight Arrow