Почему в статистических тестах нулевая гипотеза часто формулируется как отсутствие различий?

«Почему в статистических тестах нулевая гипотеза часто формулируется как отсутствие различий?» — вопрос из категории Статистика и теория вероятностей, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Формулировка нулевой гипотезы (H₀) как об отсутствии эффекта (например, "разницы между средними нет", "коэффициент равен нулю") — это краеугольный камень частотного (frequentist) статистического вывода. Это связано не с удобством, а с логической и математической структурой проверки гипотез.

Основные причины:

  1. Принцип фальсифицируемости (по Попперу): Статистика может предоставить доказательства против гипотезы, но не абсолютные доказательства за нее. Поэтому мы формулируем гипотезу, которую в принципе можем отвергнуть (фальсифицировать) данными. Гипотеза "нет разницы" хорошо подходит для этого.
  2. Контроль ошибки первого рода (False Positive): Мы явно задаем вероятность α (уровень значимости) — вероятность отвергнуть H₀, когда она на самом деле верна. Мы контролируем риск заявить об эффекте, которого нет. Контролировать ошибку для гипотезы "есть разница" (где "разница" может быть любой) математически сложно.
  3. Аналогия с судебной системой ("презумпция невиновности"): Исходное предположение — эффекта нет ("обвиняемый невиновен"). Данные ("улики") должны предоставить достаточно сильные свидетельства (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₀ как "отсутствие эффекта" — это строгий и консервативный подход, минимизирующий ложные открытия.