Как работает t-test и когда его использовать?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает 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 есть четкие условия применения и четкая интерпретация результатов, что делает его одним из самых надежных статистических методов.