Как устроен тест в статистике?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Структура статистического теста
Статистический тест — это формализованная процедура для проверки гипотезы на основе данных. Каждый тест имеет четкую структуру и логику работы.
1. Формулировка гипотез
Каждый тест начинается с двух взаимоисключающих гипотез:
- H0 (нулевая гипотеза) — утверждение об отсутствии эффекта. Мы предполагаем её верной до доказательства обратного
- H1 (альтернативная гипотеза) — утверждение о наличии эффекта
Примеры:
H0: средние значения в двух группах равны (μ1 = μ2)
H1: средние значения различаются (μ1 ≠ μ2)
H0: признаки независимы (корреляция = 0)
H1: признаки зависимы (корреляция ≠ 0)
2. Выбор уровня значимости (alpha)
Определяю вероятность ошибки первого рода (отклонить H0, когда она верна):
alpha = 0.05 # стандартное значение в 95% случаев
# или
alpha = 0.01 # более строгое, 99% уверенность
Это критическое значение, которое сравниваю с p-value.
3. Расчет тестовой статистики
На основе данных вычисляю статистику, которая показывает, насколько данные отклоняются от H0:
import scipy.stats as stats
from scipy import stats
# T-тест: сравнение средних двух групп
from scipy.stats import ttest_ind
group1 = [2.3, 2.5, 2.8, 3.0, 3.2]
group2 = [1.8, 2.0, 2.2, 2.4, 2.6]
t_statistic, p_value = ttest_ind(group1, group2)
print(f"t-статистика: {t_statistic}")
print(f"p-value: {p_value}")
Таких статистик много:
- t-статистика для сравнения средних
- chi-square для категориальных данных
- z-статистика для больших выборок
- F-статистика для ANOVA
4. Вычисление p-value
p-value — это вероятность получить такую же или более экстремальную статистику при условии, что H0 верна:
# Односторонний тест (H1: μ1 > μ2)
p_value_one_sided = p_value / 2
# Двусторонний тест (H1: μ1 ≠ μ2) — используется по умолчанию
p_value_two_sided = p_value
Не путайте p-value с вероятностью того, что H0 верна! p-value — это вероятность данных при условии H0.
5. Принятие решения
Сравниваю p-value с alpha:
if p_value < alpha:
print("Отвергаем H0, принимаем H1")
print("Результат статистически значим")
else:
print("Не отвергаем H0")
print("Недостаточно доказательств")
Пример полного теста
import numpy as np
from scipy.stats import ttest_ind
# Данные: контрольная и тестовая группы
control = np.array([10.2, 10.5, 10.8, 11.0, 11.2])
treatment = np.array([12.1, 12.5, 12.8, 13.0, 13.2])
# H0: средние равны
# H1: средние различаются
alpha = 0.05
t_stat, p_val = ttest_ind(control, treatment)
print(f"t-статистика: {t_stat:.4f}")
print(f"p-value: {p_val:.4f}")
print(f"Альфа: {alpha}")
if p_val < alpha:
print(f"Результат значим (p < {alpha})")
print("Лечение имеет эффект")
else:
print(f"Результат не значим (p >= {alpha})")
print("Нет доказательств эффекта")
Типы ошибок
| Реальность | Отвергаем H0 | Принимаем H0 |
|---|---|---|
| H0 верна | Ошибка I рода (α) | Верное решение |
| H0 неверна | Верное решение | Ошибка II рода (β) |
- Ошибка I рода (Type I, False Positive): отвергли верную H0. Вероятность = alpha
- Ошибка II рода (Type II, False Negative): принял неверную H0. Вероятность = beta
- Мощность теста = 1 - beta (вероятность отвергнуть H0, когда она неверна)
Предположения статистических тестов
Каждый тест имеет предположения, которые нужно проверять:
# T-тест требует нормальное распределение
from scipy.stats import shapiro
stat, p = shapiro(group1)
if p > 0.05:
print("Данные нормально распределены")
else:
print("Данные не нормальны, используй Mann-Whitney")
# Проверка гомогенности дисперсий
from scipy.stats import levene
stat, p = levene(group1, group2)
Важные принципы
- Статистическая значимость ≠ практическая значимость: маленький эффект может быть значим на большой выборке
- Размер выборки важен: большая выборка увеличивает мощность теста
- Множественное тестирование: если делаешь много тестов, нужна коррекция (Bonferroni, FDR)
- Доверительные интервалы: дополняют p-value информацией об эффекте