Ответ
Формулировка нулевой гипотезы (H₀) как об отсутствии эффекта (например, "разницы между средними нет", "коэффициент равен нулю") — это краеугольный камень частотного (frequentist) статистического вывода. Это связано не с удобством, а с логической и математической структурой проверки гипотез.
Основные причины:
- Принцип фальсифицируемости (по Попперу): Статистика может предоставить доказательства против гипотезы, но не абсолютные доказательства за нее. Поэтому мы формулируем гипотезу, которую в принципе можем отвергнуть (фальсифицировать) данными. Гипотеза "нет разницы" хорошо подходит для этого.
- Контроль ошибки первого рода (False Positive): Мы явно задаем вероятность
α(уровень значимости) — вероятность отвергнуть H₀, когда она на самом деле верна. Мы контролируем риск заявить об эффекте, которого нет. Контролировать ошибку для гипотезы "есть разница" (где "разница" может быть любой) математически сложно. - Аналогия с судебной системой ("презумпция невиновности"): Исходное предположение — эффекта нет ("обвиняемый невиновен"). Данные ("улики") должны предоставить достаточно сильные свидетельства (p-value < α), чтобы отклонить это предположение. Слабость доказательств оставляет H₀ неотвергнутой.
Практический пример A/B-теста, который я проводил: Мы тестировали новую рекомендательную систему (вариант B) против старой (A).
- H₀: Конверсия в группе B равна конверсии в группе A (разницы нет).
pB - pA = 0 - H₁ (альтернативная): Конверсия в группе B отличается (или больше) конверсии в группе A.
pB - pA > 0
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
# Данные: клики и общее количество пользователей в каждой группе
clicks = np.array([450, 520]) # [Группа A, Группа B]
nobs = np.array([10000, 10000])
# Двухвыборочный Z-тест для пропорций
z_stat, p_value = proportions_ztest(count=clicks, nobs=nobs, alternative='smaller')
# Здесь alternative='smaller' проверяет H₁: pA < pB (конверсия B больше)
# Но сама проверка строится ОТНОСИТЕЛЬНО H₀: pA = pB.
print(f"Z-статистика: {z_stat:.3f}, P-значение: {p_value:.4f}")
if p_value < 0.05:
print("Отвергаем H₀. Есть статистически значимые свидетельства, что вариант B лучше.")
else:
print("Не отвергаем H₀. Недостаточно свидетельств, чтобы утверждать, что B лучше A.")
Таким образом, формулировка H₀ как "отсутствие эффекта" — это строгий и консервативный подход, минимизирующий ложные открытия.