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

Ответ

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

  • 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-тест более мощный. Если есть сомнения в нормальности, присутствуют выбросы или шкала измерений порядковая — используйте тест Манна-Уитни.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь такой, данные свои анализируешь, и тут бац — нужно две группы сравнить. И встаёт вечный вопрос: какой тест взять, чтобы не опозориться? Сейчас разжую.

Смотри, есть два главных героя в этой истории: t-тест Стьюдента и U-тест Манна-Уитни. И они, блядь, как небо и земля, хотя оба про сравнение.

t-тест — это такой занудный перфекционист, ядрёна вошь. Он хочет, чтобы у него всё было по высшему разряду. А именно:

  1. Твои данные должны быть нормально распределены, как будто их бог статистики лично выдохнул. Или выборка должна быть овердохуища большая, тогда ему пофиг.
  2. Дисперсии в группах должны быть примерно одинаковые, не разбегаться как тараканы.
  3. И данные должны быть нормальными числами (интервальными), а не просто "много, мало, средне". Он проверяет, равны ли средние арифметические в двух популяциях. Мощный, но привередливый, сука.

А вот U-тест Манна-Уитни — это крутой, спокойный чувак в кожанке. Ему похуй на нормальность, он работает с рангами (то есть сортирует всё по порядку и смотрит, кто выше). Он проверяет, не являются ли значения из одной группы систематически больше, чем из другой. Его козыри:

  1. Плевать он хотел на нормальное распределение.
  2. Выбросы его не пугают, он их как родных.
  3. Может даже с порядковыми данными работать ("сильно", "средне", "слабо"). Короче, надёжный как швейцарские часы, когда всё поехало куда-то.

А теперь, бля, как на практике выбрать, чтобы не быть распиздяем?

Вот тебе код, который как раз показывает эту логику выбора. Смотри, не тупи:

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-тест, он чуть более чувствительный. Но если у тебя в данных бардак, выбросы, или ты вообще не уверен, что там творится — сразу иди к Манну-Уитни. Он тебя не подведёт, чувак. Лучше перебдеть, чем потом, блядь, переделывать всю работу.