Собесов

Хабр Статистика — что такое p-value и его типичные ошибки толкования

Статистика и теорверГипотезыЛёгкаяMiddle

Условие

Дайте корректное определение p-value. Объясните, почему каждая из следующих формулировок — ошибочна:

  1. «p-value = вероятность того, что H₀ верна».
  2. «p = 0.04 значит, что в 96% случаев эффект настоящий».
  3. «Чем меньше p, тем сильнее эффект».
  4. «Если p > 0.05, эффекта нет».

Решение

Корректное определение

p-value = вероятность получить наблюдаемое или ещё более экстремальное значение статистики при условии, что нулевая гипотеза верна.

p=P(TtobsH0)\text{p} = P(\text{T} \ge t_{\text{obs}} \mid H_0)

(Для двустороннего — P(|T| ≥ |t_obs| | H_0).) Это утверждение о данных при условии H₀, не о H₀ при условии данных.

Разбор ошибок

1. «p-value = P(H₀ | данные)». Нет. Это байесов posterior, который требует prior. P-value — это P(данные | H₀). Перепутать P(A|B) и P(B|A) — base rate fallacy.

2. «p = 0.04 → в 96% эффект настоящий». Та же ошибка. Чтобы оценить P(эффект есть | данные), нужно умножить на prior эффекта и нормировать. Эмпирически: при низком prior (например, «90% запускаемых фич не имеют эффекта») «p<0.05» означает FDR (false discovery rate) > 30%, а не 5%.

3. «Меньше p — сильнее эффект». Не обязательно. P-value зависит от n и эффекта. Огромная выборка с маленьким эффектом даёт крошечный p. Маленькая выборка с большим эффектом — большой p. P-value — про уверенность в наличии, не про размер эффекта.

4. «p > 0.05 → эффекта нет». Нет — «не нашли». Это Absence of evidence ≠ evidence of absence. p = 0.4 может означать «реально эффект есть, но мощности не хватило» (особенно при маленьком n).

Что показать вместо/помимо p-value

  1. Размер эффекта (Cohen's d, разница средних в нормированных единицах).
  2. Доверительный интервал для эффекта — показывает и значимость, и точность.
  3. Power проведённого теста (хотя «post-hoc power» — спорная практика).
  4. Bayes factor / posterior probability для bayesian интерпретации.

Симуляция «p-value под H₀»

import numpy as np
from scipy.stats import ttest_ind
 
ps = []
for _ in range(10000):
    a = np.random.normal(0, 1, 100)
    b = np.random.normal(0, 1, 100)
    _, p = ttest_ind(a, b)
    ps.append(p)
# Распределение p-value под H_0 — равномерное на [0, 1]
import matplotlib.pyplot as plt
plt.hist(ps, bins=30); plt.show()

Под H₀ p-value равномерно распределено на [0, 1]. Это основа смысла «5% ложных тревог при α = 0.05».

Подводные камни

  1. «Сильная значимость» = «маленький p». Используйте «маленький p и большой эффект-сайз с узким CI».
  2. Считать «p = 0.049 значимо, p = 0.051 не значимо» как разные миры. Они почти идентичны — пороги условны.
  3. Multiple testing. 20 тестов при α=0.05 → ~64% шанс хотя бы одной ложной значимости. Корректируйте (Bonferroni, BH).
  4. «Большое n → p всегда маленький → всегда значимо». Это про статистическую значимость, не практическую. Спрашивайте «насколько эффект экономически значим».
  5. p-hacking — менять тесты/выборку/метрики до получения p < 0.05.

Эталонный ответ

p-value = P(данные ≥ наблюдённые | H₀). Это не P(H₀ | данные), не вероятность эффекта и не размер эффекта. Под H₀ p-value равномерно распределено. Маленький p говорит «несовместимо с H₀», но без CI и размера эффекта вывод неполный. Большое n → даже копеечные эффекты пробивают порог.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти