Ошибки I и II рода
Любое статистическое решение может быть ошибочным двумя способами. Понимать оба — значит грамотно выбирать пороги.
Ошибка I рода — отвергнуть верную H₀ («ложная тревога»). Ошибка II рода — не отвергнуть ложную H₀ («пропуск эффекта»).
Четыре исхода решения
Проверяя гипотезу, мы принимаем решение «отвергнуть H₀ или нет», а реальность либо содержит эффект, либо нет. Получается таблица 2×2:
| H₀ верна (эффекта нет) | H₀ ложна (эффект есть) | |
| Отвергли H₀ | Ошибка I рода (α) | Верно ✓ |
| Не отвергли H₀ | Верно ✓ | Ошибка II рода (β) |
- Ошибка I рода (α) — «ложная тревога»: увидели эффект там, где его нет. Например, признали лекарство работающим, хотя оно бесполезно.
- Ошибка II рода (β) — «пропуск»: не заметили реальный эффект. Например, забраковали хорошее лекарство.
Аналогия с медицинским тестом
- Ошибка I рода = ложноположительный результат (тест «болен», а человек здоров).
- Ошибка II рода = ложноотрицательный (тест «здоров», а человек болен).
В суде: осудить невиновного — ошибка I рода; оправдать виновного — ошибка II рода. Какая хуже — зависит от контекста, и именно это определяет выбор порога.
Компромисс между α и β
Уровень значимости α — это и есть вероятность ошибки I рода, которую мы себе позволяем. Заманчиво поставить α поменьше — но тогда мы реже отвергаем H₀ вообще, и растёт β (чаще пропускаем настоящий эффект). Уменьшая один риск, увеличиваем другой.
# Маленькое игрушечное сравнение: смягчаем порог alpha
# и смотрим, как меняется доля "тревог" на данных БЕЗ эффекта.
import random
random.seed(77)
def fraction_rejected(alpha, effect=0.0, trials=20000):
# данные: 30 значений из нормального с заданным сдвигом effect
rejects = 0
for _ in range(trials):
sample = [random.gauss(effect, 1) for _ in range(30)]
m = sum(sample) / len(sample)
# грубый z-тест против H0: среднее = 0
se = 1 / 30 ** 0.5
z = m / se
# двусторонний порог: 1.96 для 0.05, 2.58 для 0.01
crit = 2.58 if alpha == 0.01 else 1.96
if abs(z) > crit:
rejects += 1
return rejects / trials
print("Эффекта НЕТ (тут отвержения = ошибка I рода):")
print(" alpha=0.05 -> доля тревог:", fraction_rejected(0.05, effect=0.0))
print(" alpha=0.01 -> доля тревог:", fraction_rejected(0.01, effect=0.0))
Вывод:
Эффекта НЕТ (тут отвержения = ошибка I рода): alpha=0.05 -> доля тревог: 0.04885 alpha=0.01 -> доля тревог: 0.0098
Когда эффекта нет, доля отвержений совпадает с α: при 0.05 ложно «тревожимся» в 5% случаев, при 0.01 — в 1%. Это и есть ошибка I рода под нашим контролем. Сделав α строже (0.01), мы реже бьём ложную тревогу — но в обмен чаще будем пропускать реальные эффекты (рост β).
Мощность теста
Величину 1 − β называют мощностью теста — вероятность обнаружить эффект, когда он действительно есть. Мощность растёт, если: эффект крупнее, выборка больше, разброс данных меньше. Поэтому перед экспериментом считают, какой размер выборки даст достаточную мощность (часто целятся в 80%).
import random
random.seed(77)
def power(effect, n, trials=20000):
detected = 0
for _ in range(trials):
sample = [random.gauss(effect, 1) for _ in range(n)]
m = sum(sample) / len(sample)
z = m / (1 / n ** 0.5)
if abs(z) > 1.96: # alpha = 0.05
detected += 1
return detected / trials
# Один и тот же эффект, но разный размер выборки
print("Мощность при effect=0.5:")
print(" n=10 :", power(0.5, 10))
print(" n=30 :", power(0.5, 30))
print(" n=100:", power(0.5, 100))
Вывод:
Мощность при effect=0.5: n=10 : 0.3549 n=30 : 0.77505 n=100: 0.9989
Один и тот же реальный эффект (0.5) на выборке из 10 ловится лишь в 35% случаев, а на 100 — почти всегда (99.9%). Вывод для практики: маленькая выборка часто «не видит» настоящий эффект. Если эксперимент не показал значимости, это может быть не «эффекта нет», а «не хватило мощности».
Итог
- Ошибка I рода (α) — ложная тревога: отвергли верную H₀.
- Ошибка II рода (β) — пропуск: не отвергли ложную H₀.
- Уменьшая α, обычно увеличиваешь β — это компромисс.
- Мощность 1−β — шанс заметить реальный эффект; растёт с размером выборки и величиной эффекта.