← Назад к вопросам

Как работает t-test и когда его использовать?

2.3 Middle🔥 181 комментариев
#Статистика и A/B тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает t-test и когда его использовать?

t-test (критерий Стьюдента) - это статистический тест для сравнения средних значений двух групп. Он использует t-распределение для проверки гипотезы о том, что средние значения групп статистически значимо отличаются друг от друга. Это один из самых часто используемых тестов в анализе данных и A/B тестировании.

Основная идея t-test

Мы проверяем нулевую гипотезу H0: средние двух групп равны (μ1 = μ2). Если p-value < 0.05 (или другой уровень значимости α), отклоняем H0 и делаем вывод, что различие статистически значимо.

t-статистика вычисляется как:

t = (mean1 - mean2) / sqrt(se1^2 + se2^2)

где se - стандартная ошибка (standard error) каждой группы.

Виды t-test

1. One-Sample t-test

Сравнивает среднее одной группы с известным значением (например, с популяционным средним).

from scipy import stats
import numpy as np

# Данные одной группы
data = np.array([23, 25, 21, 28, 22, 26, 24, 27])
mu_0 = 24  # Эталонное значение

# Проводим one-sample t-test
t_stat, p_value = stats.ttest_1samp(data, mu_0)

print(f"t-статистика: {t_stat:.4f}")
print(f"p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Среднее значимо отличается от эталонного")
else:
    print("Нет значимого отличия от эталонного значения")

2. Two-Sample t-test (независимые выборки)

Сравнивает средние две независимые группы (например, контрольная и экспериментальная).

# Две независимые группы
group1 = np.array([18, 22, 21, 19, 23, 20, 22, 21])
group2 = np.array([25, 26, 27, 24, 28, 26, 25, 27])

# Independent samples t-test
t_stat, p_value = stats.ttest_ind(group1, group2)

print(f"t-статистика: {t_stat:.4f}")
print(f"p-value: {p_value:.6f}")
print(f"Mean группы 1: {np.mean(group1):.2f}")
print(f"Mean группы 2: {np.mean(group2):.2f}")

if p_value < 0.05:
    print("Группы значимо отличаются друг от друга")

3. Paired t-test (зависимые выборки)

Сравнивает среднее для одних и тех же объектов до и после воздействия.

# Данные до и после лечения для одних пациентов
before = np.array([120, 125, 130, 122, 128, 126])
after = np.array([110, 118, 125, 115, 120, 121])

# Paired samples t-test
t_stat, p_value = stats.ttest_rel(before, after)

print(f"t-статистика: {t_stat:.4f}")
print(f"p-value: {p_value:.4f}")
print(f"Средняя разница: {np.mean(before - after):.2f}")

if p_value < 0.05:
    print("Лечение имело значимый эффект")

Проверка предпосылок t-test

Для корректного использования t-test необходимо проверить несколько условий:

1. Нормальность распределения

from scipy.stats import shapiro, normaltest

# Тест Шапиро-Вилка (для малых выборок)
stat, p_value = shapiro(group1)
print(f"Shapiro-Wilk test p-value: {p_value:.4f}")

if p_value > 0.05:
    print("Данные распределены нормально")
else:
    print("Данные не распределены нормально")

# Для больших выборок - тест Д'Агостино
stat, p_value = normaltest(group1)
print(f"D'Agostino test p-value: {p_value:.4f}")

2. Равенство дисперсий (для independent t-test)

# Тест Левена для проверки равенства дисперсий
stat, p_value = stats.levene(group1, group2)

if p_value > 0.05:
    print("Дисперсии равны, используем стандартный t-test")
    t_stat, p = stats.ttest_ind(group1, group2)
else:
    print("Дисперсии не равны, используем t-test Уэлча")
    t_stat, p = stats.ttest_ind(group1, group2, equal_var=False)

Альтернативы при нарушении предпосылок

Если данные не распределены нормально или предпосылки нарушены, используйте непараметрические тесты:

# Mann-Whitney U test (для независимых выборок)
from scipy.stats import mannwhitneyu
stat, p_value = mannwhitneyu(group1, group2, alternative="two-sided")
print(f"Mann-Whitney U test p-value: {p_value:.4f}")

# Wilcoxon signed-rank test (для зависимых выборок)
from scipy.stats import wilcoxon
stat, p_value = wilcoxon(before - after)
print(f"Wilcoxon test p-value: {p_value:.4f}")

Практический пример: A/B тестирование

# Результаты A/B теста
control_conversion = [0, 1, 0, 1, 1, 0, 1, 0, 1, 1]  # группа A
test_conversion = [1, 1, 0, 1, 1, 1, 1, 0, 1, 1]    # группа B

control_rate = np.mean(control_conversion)
test_rate = np.mean(test_conversion)

print(f"Контрольная группа CTR: {control_rate:.1%}")
print(f"Тестовая группа CTR: {test_rate:.1%}")

# Используем t-test для проверки значимости разницы
t_stat, p_value = stats.ttest_ind(control_conversion, test_conversion)

print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
    print("Разница статистически значима! (reject H0)")
else:
    print("Разница не значима")

Когда использовать t-test

  • Сравнение средних двух групп
  • A/B тестирование в интернет-компаниях
  • До/после анализ (paired t-test)
  • Малые выборки (n < 30)
  • Нормальное распределение данных (или близкое к нему)

Важные замечания

  • p-value не означает вероятность гипотезы - это вероятность наблюдать такие или более экстремальные данные при условии, что H0 истинна.
  • Effect size важен: даже статистически значимые различия могут быть практически незначительны.
  • Размер выборки влияет: большие выборки могут дать значимый результат для крошечных различий.
  • Множественное тестирование: если проводите много t-тестов одновременно, корректируйте p-value (Bonferroni correction).

У t-test есть четкие условия применения и четкая интерпретация результатов, что делает его одним из самых надежных статистических методов.