Ответ
Формулировка нулевой гипотезы (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₀ как "отсутствие эффекта" — это строгий и консервативный подход, минимизирующий ложные открытия.
Ответ 18+ 🔞
А, ну вот, опять про эти ваши гипотезы. Слушай, давай я тебе на пальцах объясню, а то ты тут с нулевыми гипотезами носишься, как дурень с писаной торбой.
Представь себе, что ты — следователь, а твоя новая рекомендательная система — подозреваемый. Подозреваемый, блядь, красивый, навороченный, менеджеры на него молиться готовы. И все орут: «Он лучше! Он круче! Он нам продажи поднимет!» А ты-то что? Ты консервативный уёбок. Твоя базовая, стартовая позиция — НИЧЕГО НЕ МЕНЯЕТСЯ. Вот это и есть H₀, твоя нулевая гипотеза. «Разницы, сука, нет. Ноль. Ни хуя. Всё как было». Почему так? А потому что иначе ты начнёшь верить всякой хуйне.
Первая причина, ёпта. Наш мир устроен так, что доказать, что что-то работает, — это пиздец как сложно. А вот накопить улик, что что-то — полная хуйня и не работает, — это пожалуйста. Это как в науке: ты не можешь доказать, что единорогов не существует, но ты можешь сто лет ходить по лесам и, не найдя ни одного, всё сильнее в этом убеждаться. Вот H₀ — это и есть наш «единорог». Мы исходим из того, что его нет, и ждём, пока данные так сильно нам в ебальник не дадут, что придётся признать: «Ну ладно, бля, возможно, он таки есть».
Вторая причина, ядрёна вошь. Мы хотим контролировать свою долбоёбность. Мы не хотим кричать «Ура! Эффект есть!» каждый раз, когда ветер подует. Поэтому мы заранее договариваемся: «Слушай, мозг, если мы ошибочно отвергнем нашу спокойную гипотезу H₀ (то есть накричим про эффект, когда его нет), пусть это происходит не чаще, чем в 5% случаев». Это и есть уровень значимости, альфа. Контролировать эту ошибку для чёткой гипотезы «всё одинаково» — легко. А как контролировать её для размытой хуйни вроде «ну там что-то да изменилось, хрен его знает что»? Да никак, пиздец.
Третья причина, хитрая жопа. Это презумпция невиновности, ебать копать! Подсудимый (новая фича) невиновен (не даёт эффекта), пока не доказано обратное. Данные — это прокурор. И прокурор должен быть охуенно убедительным (p-value < 0.05), чтобы судья (ты) сказал: «Да, ок, отвергаем невиновность, сажать!». Если прокурор слабый и несёт какую-то мудя — H₀ так и остаётся в силе. Не «доказана», а «не опровергнута». Разница, блядь, огромная!
Ну и пример, чтобы совсем понятно стало. Делаем мы A/B-тест. Старая система — это как твой дед, который ворчит, но стабилен. Новая — как молодой кричащий менеджер с дипломом из интернета.
- H₀ (наша базовая лень): Новый менеджер работает ровно так же, как дед. Разницы — ноль.
pB - pA = 0 - H₁ (наша надежда): Новый менеджер таки лучше.
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.")
Видишь? Мы изначально — скептики, блядь, законченные. Мы не верим менеджеру на слово. Мы говорим: «Докажи, сука, цифрами!». И только когда p-value падает ниже нашего порога терпения (0.05), мы такие: «Охуеть, ну ладно, возможно, этот выскочка и правда что-то может». А если нет — то нет. Сиди, дед, дальше в своём кресле. Это строгий подход, который спасает нас от того, чтобы бегать с криками «Эврика!» каждый понедельник.