Что такое Mann-Whitney test

Что это и когда применять

Mann-Whitney U test — непараметрическая альтернатива t-test для сравнения двух независимых групп. «Непараметрическая» означает, что тест не требует предположений о распределении данных (например, нормальности).

Главная польза — для данных с тяжёлыми хвостами, скошенных распределений, с выбросами. Там, где t-test может дать неправильный результат, Mann-Whitney — робастный.

В продуктовой аналитике это часто бывает с LTV, revenue, session length, чеком. Несколько китов с огромными значениями искажают mean и делают t-test ненадёжным.

Как работает

Mann-Whitney не смотрит на значения напрямую. Он ранжирует все данные из обеих групп вместе, потом считает сумму рангов в каждой группе.

Идея: если группы одинаковые, суммы рангов должны быть похожими (с учётом размеров групп). Если одна группа систематически «выше» другой — её сумма рангов будет больше.

Тест даёт U-статистику и p-value. Интерпретация p-value — как в t-test: p < 0.05 означает значимое различие между группами.

Пример в Python

from scipy.stats import mannwhitneyu

group_a = [100, 150, 200, 250, 10000]  # есть кит
group_b = [120, 170, 210, 220, 260]

# Mann-Whitney не смущают выбросы
u_stat, p_value = mannwhitneyu(group_a, group_b, alternative='two-sided')
print(f'U = {u_stat}, p = {p_value:.4f}')

# Для сравнения — t-test
from scipy.stats import ttest_ind
t_stat, p_t = ttest_ind(group_a, group_b)
print(f't = {t_stat:.3f}, p = {p_t:.4f}')

Результаты могут сильно отличаться, особенно при выбросах.

Когда использовать Mann-Whitney

Первое — когда данные сильно скошены или имеют тяжёлые хвосты. Revenue, LTV, session time — типичные примеры.

Второе — когда выборка маленькая (n < 30) и нет уверенности в нормальности. ЦПТ не гарантирует нормальность средних на маленьких выборках.

Третье — когда есть выбросы, которые нельзя убрать. Mann-Whitney игнорирует их влияние через ранги.

Четвёртое — для ordinal data (порядковые шкалы), где разницы между значениями не линейны. Например, оценки по шкале «плохо / нормально / хорошо / отлично».

Попробовать силы на подобных вопросах проще всего в тренажёре Карьерник — прямо в Telegram, без регистрации через сайт.

Когда лучше t-test

Для нормально распределённых данных t-test мощнее Mann-Whitney. То есть быстрее находит реальные эффекты.

Для больших выборок (n > 1000) разница между тестами минимальна. ЦПТ делает t-test применимым к любым распределениям.

Для данных с нормально распределёнными остатками (log-normal → после log-трансформации) t-test на трансформированных данных часто лучше, чем Mann-Whitney на оригинальных.

Применение в A/B-тестах

В продуктовых A/B-тестах Mann-Whitney часто используют для метрик вроде revenue per user. Эти метрики имеют тяжёлый хвост (киты), и t-test может дать ложные результаты.

Недостаток — Mann-Whitney проверяет, что одна группа систематически выше другой. Это близко к «разница средних», но не идентично. Для бизнеса иногда это важно знать.

Альтернативы для A/B с тяжёлыми хвостами: bootstrap, linearization, CUPED, trimming.

Ограничения

Mann-Whitney не отвечает на вопрос «на сколько отличается среднее». Он показывает, есть ли статистически значимое различие, но не размер эффекта. Для размера эффекта надо считать отдельно.

Тест предполагает, что формы распределений групп примерно одинаковые (просто одна сдвинута относительно другой). Если распределения совсем разные (одно нормальное, другое bimodal), интерпретация сложнее.

Mann-Whitney менее мощный, чем t-test, на нормально распределённых данных. Для задачи обнаружить небольшой effect на нормальных данных — t-test надёжнее.

Связанный тест — Wilcoxon

Wilcoxon signed-rank test — аналог Mann-Whitney для связанных выборок (paired data). Используется, когда одни и те же люди измерены в двух условиях (до / после).

В scipy это wilcoxon:

from scipy.stats import wilcoxon

before = [100, 150, 200, 250, 300]
after = [110, 160, 220, 260, 320]

stat, p = wilcoxon(before, after)

Подходит для задач вроде «эффект тренинга на метрики сотрудников».

Для нескольких групп — Kruskal-Wallis

Если нужно сравнить 3+ независимых группы непараметрически, используют Kruskal-Wallis test. Это аналог ANOVA для непараметрического случая.

from scipy.stats import kruskal

stat, p = kruskal(group_a, group_b, group_c)

После значимого Kruskal-Wallis делают попарные Mann-Whitney с поправкой Бонферрони.

Пройти 30–50 задач по теме за вечер можно в Telegram-тренажёре. Это то, что отличает «знаю» от «уверенно отвечу на собесе».

Практическое руководство

Выбор теста зависит от данных. Простое правило:

  • Нормальные данные, n > 30: t-test.
  • Скошенные данные, выбросы: Mann-Whitney.
  • Маленькая выборка с сомнениями о нормальности: Mann-Whitney (безопаснее).
  • Paired data: paired t-test или Wilcoxon.

Для серьёзных A/B тестов часто считают обе метрики: t-test и Mann-Whitney. Если оба согласуются — уверенность высокая. Если расходятся — разбираемся в причинах.

На собеседовании

Классические вопросы:

  • «Когда использовать Mann-Whitney?» — скошенные данные, выбросы, маленькая выборка.
  • «Отличие от t-test?» — непараметрический, работает на рангах, робастный к выбросам.
  • «Какая мощность у Mann-Whitney?» — для нормальных данных ~95% мощности t-test, но для скошенных может быть даже выше.
  • «Что делать с тяжёлыми хвостами в A/B?» — Mann-Whitney, trimming, bootstrap, CUPED.

Читайте также

FAQ

Mann-Whitney чувствителен к выбросам?

Нет, это главное преимущество. Выбросы влияют на ранги минимально.

Какая минимальная выборка?

Около 5-10 на группу. Меньше — результаты сомнительны из-за маленького количества возможных rank arrangements.

Mann-Whitney или Welch's t-test?

Welch's t-test для нормальных данных с разными дисперсиями. Mann-Whitney — для скошенных или с выбросами.

Можно ли всегда использовать Mann-Whitney?

Можно, но на нормальных данных вы теряете немного мощности. На реальных данных часто выгоднее как default.