Условие
Сравниваем 4 группы юзеров по revenue (распределение скошено). Какой тест?
Решение
Если бы revenue был нормальный
ANOVA (f_oneway):
from scipy.stats import f_oneway
F, p = f_oneway(group1, group2, group3, group4)Если не нормальный — Kruskal-Wallis
Непараметрический аналог one-way ANOVA на рангах.
from scipy.stats import kruskal
H, p = kruskal(group1, group2, group3, group4)Что проверяет
H_0: все группы имеют одинаковое распределение
H_1: хотя бы одно распределение отличается
Не «средние», а stochastic equality.
Алгоритм
- Объединяем все наблюдения, ранжируем.
- Считаем сумму рангов в каждой группе.
- Считаем H-статистику ~ χ²(k-1).
H = (12 / (N(N+1))) × Σ R_i² / n_i - 3(N+1)
Post-hoc
Если K-W значимый — нужно парные сравнения. Mann-Whitney с поправкой Bonferroni:
from itertools import combinations
from scipy.stats import mannwhitneyu
alpha = 0.05
k = 4
n_pairs = k * (k - 1) / 2 # 6
alpha_corr = alpha / n_pairs # 0.0083
for g1, g2 in combinations(['g1', 'g2', 'g3', 'g4'], 2):
u, p = mannwhitneyu(globals()[g1], globals()[g2])
print(f'{g1} vs {g2}: p={p:.4f}, sig at α/6={alpha_corr:.4f}? {p<alpha_corr}')Альтернативы: Holm-Bonferroni (мощнее), Dunn's test (специально для K-W post-hoc).
Effect size для K-W
η² = (H - k + 1) / (N - k)
- 0.01 — small
- 0.06 — medium
- 0.14 — large
Сравнение с ANOVA
ANOVA мощнее Kruskal-Wallis на 5-10% при нормальности. На скошенных данных Kruskal-Wallis может быть мощнее.
Альтернативы
- Log-transform + ANOVA — часто работает на revenue.
- Bootstrap ANOVA — без предположений о распределении.
- Permutation test — точный non-parametric.
Подводные камни
- Many ties (одинаковые значения) ослабляют тест — нужна tie correction.
- K-W не говорит, какие группы отличаются — нужен post-hoc.
- Без поправки на multiple comparisons — inflated Type I error.
- Heterogeneity of variances в группах нарушает Welch-аналог; для серьёзных проектов смотрите Brown-Forsythe / Games-Howell.
- На малых n в группе (< 10) K-W слабомощный — лучше combine или собрать больше данных.
Эталонный ответ
Kruskal-Wallis = ANOVA на рангах, для 3+ групп без нормальности. После значимого H — post-hoc Dunn / Mann-Whitney с Bonferroni. Effect size η². Альтернатива — log-transform + ANOVA, bootstrap, permutation.