Сравнивает ли Манна-Уитни медианы?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Mann-Whitney U Test: что он на самом деле сравнивает?
Короткий ответ: НЕ совсем медианы
Это частая ошибка даже опытных аналитиков. Часто говорят: "Mann-Whitney сравнивает медианы", но это неправильно (или точнее, неполно).
Что на самом деле сравнивает Mann-Whitney U
Нулевая гипотеза: Две выборки имеют одинаковое распределение.
Более точно: Тест проверяет, является ли вероятность того, что случайное значение из первой выборки больше, чем из второй, равна 50%.
Это называется "stochastic dominance" или "probabilistic ordering".
Математическая формулировка
H0: P(X > Y) = 0.5
H1: P(X > Y) ≠ 0.5
где X — случайное значение из первой выборки
Y — случайное значение из второй выборки
Когда Mann-Whitney сравнивает медианы?
Только в одном случае: когда две выборки имеют одинаковую форму распределения.
Если форма распределения одинакова, но сдвинута, тогда:
- Различие в медианах ↔ различие в распределениях
Пример: две нормальные кривые, сдвинутые вправо/влево
Выборка 1: N(mean=50, std=10)
Выборка 2: N(mean=60, std=10)
↓
Медиана 1 = 50, Медиана 2 = 60
↓
Mann-Whitney скажет: "Выборки отличаются"
И это действительно медианы отличаются
Но часто форма НЕ одинакова
Пример 1: Разные формы распределений
Выборка 1: [1, 2, 3, 4, 5] (равномерное)
Выборка 2: [1, 1, 1, 1, 100] (асимметричное)
Медиана 1 = 3
Медиана 2 = 1
Mann-Whitney U вывод: выборки отличаются
Причина отличия: разные распределения, не обязательно медианы
Пример 2: Почти одинаковые медианы, но Mann-Whitney найдет разницу
Выборка 1: [5, 6, 7, 8] медиана = 6.5
Выборка 2: [5, 6, 7, 15] медиана = 6.5
Медианы одинаковые!
Но Mann-Whitney скажет: "Выборки отличаются"
Причина: хвосты распределений разные (outlier в выборке 2)
Python: демонстрация
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# Пример 1: одинаковые медианы, но разные формы
group1 = np.array([5, 6, 7, 8])
group2 = np.array([5, 6, 7, 15]) # outlier
print("Медиана группы 1:", np.median(group1)) # 6.5
print("Медиана группы 2:", np.median(group2)) # 6.5
print("Медианы равны!")
# Mann-Whitney тест
u_stat, p_value = stats.mannwhitneyu(group1, group2)
print(f"\nMann-Whitney U: {u_stat}")
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
print("Результат: выборки отличаются!")
print("\nВывод: несмотря на равные медианы, выборки статистически разные")
else:
print("Результат: выборки не отличаются")
# Визуализируем
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.hist([group1, group2], label=['Group 1', 'Group 2'], alpha=0.6)
plt.axvline(np.median(group1), color='blue', linestyle='--', label='Median 1')
plt.axvline(np.median(group2), color='orange', linestyle='--', label='Median 2')
plt.legend()
plt.title('Распределения (медианы совпадают)')
plt.subplot(1, 2, 2)
plt.boxplot([group1, group2], labels=['Group 1', 'Group 2'])
plt.title('Box plot (видно различие в разбросе)')
plt.tight_layout()
plt.show()
Что именно тестирует Mann-Whitney математически?
Тест основан на ranks (рангах):
- Объединяем обе выборки
- Присваиваем ранги от меньшего к большему
- Суммируем ранги для каждой группы
- Если одна группа имеет значительно большие ранги, выборки отличаются
# Пример расчета рангов
group1 = [10, 20, 30]
group2 = [15, 25, 35]
combined = [10, 15, 20, 25, 30, 35] # объединенные и отсортированные
ranks = [1, 2, 3, 4, 5, 6] # присвоенные ранги
# Ранги для группы 1: 1, 3, 5 → сумма = 9
# Ранги для группы 2: 2, 4, 6 → сумма = 12
U_stat = len(group2) * len(group1) + (len(group1) * (len(group1) + 1)) / 2 - 9
# U_stat = 3*3 + (3*4)/2 - 9 = 9 + 6 - 9 = 6
Важное уточнение для интерпретации
Если p-value < 0.05:
❌ НЕ говори: "Медианы отличаются" ✅ Говори: "Выборки имеют статистически значимо различные распределения"
Или более скромно: "Нет оснований полагать, что выборки из одного распределения"
Когда использовать Mann-Whitney?
Используй Mann-Whitney когда:
- Данные не нормально распределены
- Есть outliers
- Размер выборки маленький (< 30)
- Данные ранжированные или порядковые
Не используй Mann-Whitney если:
- Хочешь сравнить конкретно медианы (используй другой тест)
- Нужна информация о величине эффекта (тест только говорит значим ли он)
- Данные совершенно не сопоставимы
Альтернатива: медианный тест (Mood's Median Test)
Если ты действительно хочешь сравнить медианы (не выборки в целом):
from scipy.stats import median_test
stat, p_value, med, table = median_test(group1, group2)
print(f"Общая медиана: {med}")
print(f"p-value: {p_value}")
# Этот тест более специфичен для медиан
Практический пример из реальной жизни
Ситуация: Сравниваешь время ответа поддержки в две разные недели
import numpy as np
from scipy import stats
week1_response_time = [5, 6, 7, 8, 9, 10, 11] # минуты
week2_response_time = [5, 6, 7, 8, 9, 10, 200] # outlier (отчет за выходной)
print(f"Week 1 median: {np.median(week1_response_time)}")
print(f"Week 2 median: {np.median(week2_response_time)}")
# Медианы похожи (7 и 8)
u_stat, p_val = stats.mannwhitneyu(week1_response_time, week2_response_time)
if p_val < 0.05:
print(f"\nМанн-Уитни: выборки отличаются (p={p_val:.3f})")
print("Причина: наличие экстремального значения (200)")
print("\nВывод: неправильно говорить 'медианы отличаются'")
print("Правильно: 'распределения отличаются из-за outlier'")
Итоговое резюме
| Аспект | Описание |
|---|---|
| Полное имя | Mann-Whitney U test (Wilcoxon rank-sum test) |
| Что сравнивает | Распределения (stochastic dominance) |
| Сравнивает ли медианы? | Только если распределения имеют одинаковую форму |
| Параметрический? | Нет (непараметрический) |
| Требования | Только независимость наблюдений |
| Чувствителен к | Различиям в центре и хвостах распределения |
| Альтернатива | Median Test (Mood's test) для специфичного сравнения медиан |
Ключевой момент: Это одна из самых частых ошибок в интерпретации статистических тестов. Даже в научных работах часто видишь неправильное утверждение: "Mann-Whitney тест показал, что медианы отличаются". На самом деле он показывает, что выборки из разных распределений.