В чем разница между t-тестом и тестом Манна-Уитни?

«В чем разница между t-тестом и тестом Манна-Уитни?» — вопрос из категории Статистика и теория вероятностей, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два основных теста для сравнения двух независимых выборок, но они основаны на разных предположениях о данных.

  • t-тест (Стьюдента)параметрический тест. Он проверяет гипотезу о равенстве средних значений генеральных совокупностей. Его корректное применение требует выполнения ключевых предположений:

    1. Данные в каждой выборке распределены нормально (или объем выборки достаточно велик для применения ЦПТ).
    2. Гомогенность дисперсий (дисперсии в сравниваемых группах примерно равны).
    3. Данные измерены в интервальной или относительной шкале.
  • U-тест Манна-Уитнинепараметрический тест. Он проверяет гипотезу о том, что одна выборка стохастически больше другой (т.е. значения в одной группе систематически превышают значения в другой). Он работает не с исходными значениями, а с их рангами. Его главные преимущества:

    1. Не требует нормальности распределения.
    2. Устойчив к выбросам.
    3. Может работать с порядковыми (ординальными) данными.

Практический пример выбора на Python:

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# Генерируем данные: group1 - нормальное распределение, group2 - сдвинутое
group1 = np.random.normal(loc=50, scale=10, size=30)
group2 = np.random.normal(loc=60, scale=10, size=30)

# 1. Проверяем нормальность (например, тестом Шапиро-Уилка)
_, p1 = stats.shapiro(group1)
_, p2 = stats.shapiro(group2)
print(f"P-value normality test: Group1={p1:.3f}, Group2={p2:.3f}")

# Если p-value > 0.05 для обеих групп, можно использовать t-тест
if p1 > 0.05 and p2 > 0.05:
    t_stat, p_val_t = stats.ttest_ind(group1, group2)
    print(f"t-test: p-value = {p_val_t:.4f}")
else:
    print("Data not normal, defaulting to Mann-Whitney.")

# U-тест Манна-Уитни можно использовать всегда как более robust альтернативу
u_stat, p_val_u = stats.mannwhitneyu(group1, group2)
print(f"Mann-Whitney U-test: p-value = {p_val_u:.4f}")

Итог: Если данные нормальны и выполнены другие условия — t-тест более мощный. Если есть сомнения в нормальности, присутствуют выбросы или шкала измерений порядковая — используйте тест Манна-Уитни.