Course
Сравнивать несколько групп просто, когда ваши данные имеют нормальное распределение. Проблема в том, что большинство реальных данных ему не подчиняются.
Если по умолчанию вы используете ANOVA, вы можете прийти к неверным выводам, поскольку метод предполагает нормальность распределения. Когда это не так — например, при скошенных данных или малых выборках — нужен другой подход.
Критерий Краскела—Уоллиса — как раз такой подход. Это непараметрическая альтернатива ANOVA, которая работает с рангами вместо исходных значений, поэтому нормальность не требуется.
В этой статье я расскажу о сути метода, математике за ним, о том, как запустить его в Python и R, и как интерпретировать результаты.
Что такое критерий Краскела—Уоллиса?
Критерий Краскела—Уоллиса — непараметрический метод для сравнения трёх и более независимых групп. Он преобразует все наблюдения в ранги и сравнивает эти ранги между группами вместо работы с исходными значениями.
Его можно рассматривать как расширение U-критерия Манна—Уитни, о котором я тоже писал.
U-критерий Манна—Уитни делает то же ранговое сравнение, но только для двух групп. Критерий Краскела—Уоллиса масштабирует его на три и более группы, поэтому, когда у вас несколько групп и нельзя использовать ANOVA, применяйте его.
Поскольку он работает с рангами, а не исходными значениями, он не предполагает никакого конкретного распределения данных. Это и делает его полезным для реальных данных, которые редко идеально следуют какому-то одному типу распределения.
Когда использовать критерий Краскела—Уоллиса
Критерий Краскела—Уоллиса отлично подходит, когда вы имеете дело со следующими ситуациями:
- Три и более независимых группы, которые нужно сравнить
- Порядковые или непрерывные данные, такие как оценки по шкале Лайкерта или результаты измерений
- Ненормальные распределения из‑за скошенности, выбросов, малых выборок или любых условий, с которыми ANOVA не справляется
- Малые объёмы выборок, когда трудно проверить нормальность
Вот простой пример.
Представьте, что вы хотите сравнить экзаменационные баллы в трёх разных классах. Распределения скошены, выборки малы, поэтому ANOVA — не лучший вариант. Критерий Краскела—Уоллиса не требует нормальности, значит, он подходит. Он покажет, различается ли хотя бы один класс от других, не делая неподтверждённых предположений о данных.
Критерий Краскела—Уоллиса vs. ANOVA
Оба метода сравнивают группы, но делают это по‑разному.
ANOVA сравнивает средние групп и предполагает нормальность и примерно равные дисперсии. Когда эти предположения верны, это лучший выбор — он обладает большей статистической мощностью и результаты легче интерпретировать.
Критерий Краскела—Уоллиса сравнивает распределения групп, используя ранги. Ему безразличны нормальность и равенство дисперсий. Это делает его более гибким, но часть статистической мощности теряется.
Краткое сравнение на иллюстрации:

Сравнение ANOVA и критерия Краскела—Уоллиса
Если данные нормальны, используйте ANOVA. Если нет — или вы не можете это проверить — используйте критерий Краскела—Уоллиса.
Формула критерия Краскела—Уоллиса
Критерий Краскела—Уоллиса сводится к одной статистике теста, H. Формула выглядит так:

Формула Краскела—Уоллиса
Разберём компоненты:
-
N— общее число наблюдений по всем группам -
k— число групп -
n_i— число наблюдений в группеi -
R_i— сумма рангов, присвоенных группеi
Формула измеряет, насколько суммы рангов каждой группы отклоняются от ожидаемых, если бы все группы были идентичны. Большое H означает, что группы различаются, а малое H — что они мало отличаются.
Получив H, вы сравниваете его с распределением хи‑квадрат со степенями свободы k - 1, чтобы получить p‑значение.
Как работает критерий Краскела—Уоллиса
Для выполнения критерия Краскела—Уоллиса нужны четыре шага:
- Объедините все группы: возьмите все наблюдения из каждой группы и объедините их в один набор данных
- Присвойте ранги всем наблюдениям: отсортируйте объединённые данные по возрастанию и присвойте ранги. Наименьшее значение получает ранг 1, следующее — ранг 2 и так далее. Если два значения равны, им присваивается среднее из рангов, которые они заняли бы.
- Вычислите суммы рангов: разделите ранги по исходным группам. Сложите ранги в каждой группе. Это и будут ваши суммы рангов —
R_iв формуле - Рассчитайте статистику теста: подставьте суммы рангов в формулу
H. Если группы похожи, их суммы рангов будут близки, иHбудет малой. Если одна группа систематически получает более высокие или низкие ранги,Hвозрастает
И это всё!
Как видно, тест не опирается на сами значения, а учитывает лишь их положение относительно остальных.
Критерий Краскела—Уоллиса в Python
В библиотеке scipy для Python есть встроенная функция для критерия Краскела—Уоллиса, так что реализовывать формулу вручную не нужно. Рассмотрим пример.
Допустим, вы сравниваете экзаменационные баллы трёх классов. Вот как запустить тест:
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}")

Вывод Python
p‑значение меньше 0,05, что означает: по крайней мере один класс отличается от остальных. Учтите, что тест не указывает какой именно — для этого нужен пост‑хок‑анализ, о котором я расскажу в следующем разделе.
Критерий Краскела—Уоллиса в R
Как и в Python, в R есть встроенная функция для этого теста. Используем тот же пример с экзаменационными баллами.
# 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
Вывод совпадает с тем, что получен в Python, — та же статистика H и то же p‑значение. При p < 0,05 вы отвергаете нулевую гипотезу и заключаете, что хотя бы одна группа отличается.
Как интерпретировать результаты критерия Краскела—Уоллиса
Нулевая гипотеза критерия Краскела—Уоллиса гласит, что все группы имеют одинаковое распределение. p‑значение показывает, следует ли её отвергнуть. Интерпретация такая:
- p < 0,05: как минимум одна группа отличается от остальных, нулевую гипотезу отвергаем
- p ≥ 0,05: нет убедительных доказательств различий между группами, нулевую гипотезу не отвергаем
Порог 0,05 — это условность. В зависимости от области и значимости анализа вы можете использовать более строгий порог, например 0,01, или более мягкий — 0,10.
Помните, этот тест не скажет, какая именно группа отличается. Значимый результат лишь означает, что группы не все одинаковы. Вы знаете, что «что‑то происходит», но не где. Чтобы выяснить, какие пары обусловили различие, нужен пост‑хок‑анализ.
Пост‑хок‑тесты после Краскела—Уоллиса
Тест сообщает, что хотя бы одна группа отличается, но не указывает, какая именно. Если у вас три группы и p < 0,05, это может быть A против B, A против C, B против C или их комбинация. Для попарных сравнений нужен пост‑хок‑тест.
Тест Данна — самый распространённый выбор. Он выполняет попарные сравнения между всеми группами и корректирует p‑значения с учётом множественных сравнений — без такой корректировки возрастает риск ложноположительных результатов. Чем больше сравнений вы проводите, тем выше шанс «значимости» случайно.
Тест Данна в Python
Для этого понадобится библиотека scikit_posthocs. Если её нет, установите с помощью pip install scikit-posthocs.
Дальше всё просто:
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)

Тест Данна в Python
Каждая ячейка показывает скорректированное p‑значение для пары. Здесь только сравнение B с C (p = 0,004) проходит порог 0,05, значит эти две группы различаются. A против B (p = 0,167) и A против C (p = 0,607) — нет, следовательно, класс A статистически не отличается от двух других.
Тест Данна в R
Для начала установите пакет при необходимости командой 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")

Тест Данна в R
Результаты совпадают с Python, как и ожидалось. Значимым является только сравнение B и C, тогда как A против B и A против C — нет. Именно классы B и C обусловили различие, выявленное критерием Краскела—Уоллиса.
Предпосылки критерия Краскела—Уоллиса
Критерий Краскела—Уоллиса гибче, чем ANOVA, но у него всё же есть три предпосылки, которые нужно проверить до запуска:
- Независимые выборки: наблюдения в одной группе не влияют на наблюдения в другой. Если данные попарные или с повторными измерениями, этот тест не подходит
- Порядковые или непрерывные данные: тесту нужны данные, которые можно ранжировать. Номинальные категории (например, цвета или ярлыки) ранжировать нельзя, поэтому они не подходят
- Схожие формы распределений: если вы хотите интерпретировать результаты как сравнение медиан, а не просто распределений, группы должны иметь примерно одинаковую форму. Если формы сильно различаются, можно сравнивать распределения, но интерпретация через медианы неприменима
Если нарушены первые две предпосылки, результаты теста будут недействительны. Третья — более мягкая: она влияет на интерпретацию результатов, а не на применимость теста.
Когда не стоит использовать критерий Краскела—Уоллиса
Есть три случая, когда другой тест подойдёт лучше:
- Ваши данные — парные или с повторными измерениями: если одни и те же объекты присутствуют в нескольких группах, используйте критерий Фридмана. Это непараметрический эквивалент для зависимых выборок. Применение Краскела—Уоллиса к парным данным игнорирует взаимосвязь наблюдений и может привести к неверным выводам
- Ваши данные удовлетворяют предпосылкам ANOVA: если данные нормальны и дисперсии примерно равны, ANOVA — лучший выбор. Он обладает большей статистической мощностью, то есть лучше выявляет реальные различия при их наличии
- У вас большие выборки: при больших объёмах выборок параметрические методы обычно хорошо работают даже при неидеальной нормальности. Срабатывает центральная предельная теорема, и ANOVA даст более надёжные результаты, чем ранговый подход. Если у вас сотни или тысячи наблюдений в группе, критерий Краскела—Уоллиса — не ваш вариант
Выводы
Критерий Краскела—Уоллиса сравнивает три и более независимые группы, когда данные не соответствуют нормальному распределению, требуемому такими тестами, как ANOVA. Это возможно, потому что он работает с рангами, а не с исходными значениями.
При этом он не заменяет ANOVA. Если данные нормальны, ANOVA лучше, так как обладает большей статистической мощностью. Если данные парные, используйте критерий Фридмана. Как всегда, правильный тест зависит от данных.
При соблюдении условий критерий Краскела—Уоллиса — надёжный и простой выбор. Запустите его, проверьте p‑значение и при необходимости выполните тест Данна, чтобы понять, какие группы обусловили различие.
Немного подзабыли статистику? Пройдите наш курс Introduction to Statistics и освежите знания всего за один вечер.
Частые вопросы о критерии Краскела—Уоллиса
Для чего используется критерий Краскела—Уоллиса?
Критерий Краскела—Уоллиса используется для сравнения трёх и более независимых групп, когда нельзя предположить нормальность распределения данных. Это непараметрическая альтернатива ANOVA, работающая с рангами вместо исходных значений. Он полезен в ситуациях со скошенными распределениями или порядковыми данными.
Что означает значимый результат критерия Краскела—Уоллиса?
Значимый результат — как правило, p < 0,05 — означает, что как минимум одна группа отличается от других. Он не указывает, какие именно группы различаются, лишь то, что они не все одинаковы. Чтобы выяснить, какие пары стоят за различиями, выполните пост‑хок‑анализ, например тест Данна.
Каковы предпосылки критерия Краскела—Уоллиса?
Тест требует независимых выборок, то есть наблюдения в одной группе не влияют на наблюдения в другой. Данные должны быть порядковыми или непрерывными — их можно ранжировать. Если вы хотите интерпретировать результаты как сравнение медиан, группы также должны иметь схожие формы распределений.
В чём разница между критерием Краскела—Уоллиса и U‑критерием Манна—Уитни?
U‑критерий Манна—Уитни сравнивает две независимые группы, а критерий Краскела—Уоллиса расширяет этот подход на три и более группы. Оба работают с рангами и не предполагают нормальности. Если групп две, выбирайте Манна—Уитни; Краскел—Уоллис — его многогрупповой эквивалент.
Когда следует использовать тест Данна после Краскела—Уоллиса?
Запускайте тест Данна, если результат Краскела—Уоллиса значим и вам нужно понять, какие конкретные пары групп различаются. Он выполняет попарные сравнения между всеми группами и корректирует p‑значения, уменьшая риск ложноположительных результатов. В Python это делает scikit_posthocs.posthoc_dunn(), а в R — пакет dunn.test.