Как использовать p-value при проверке статистической гипотезы?

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

Ответ

P-value (значение p) — это вероятность получить наблюдаемые выборочные данные (или ещё более крайние) в предположении, что нулевая гипотеза (H₀) верна. Я использую его как инструмент принятия решения в рамках классического частотного подхода.

Стандартный алгоритм применения:

  1. Формулирую гипотезы:
    • H₀ (нулевая): Эффекта нет (например, «средние значения двух групп равны»).
    • H₁ (альтернативная): Эффект есть (например, «средние значения различаются»).
  2. Выбираю уровень значимости (α): Порог вероятности для принятия решения. Обычно α = 0.05 (5%). Это допустимая вероятность совершить ошибку I рода (отклонить верную H₀).
  3. Провожу подходящий статистический тест (t-тест, χ², ANOVA и т.д.) на имеющихся данных и получаю p-value.
  4. Принимаю решение, сравнивая p-value с α:
    • Если p-value ≤ α: Отвергаю нулевую гипотезу. Данные предоставляют статистически значимые свидетельства в пользу H₁.
    • Если p-value > α: Не имею достаточных оснований отвергнуть H₀. Это не доказывает, что H₀ верна, а говорит лишь о том, что данные с ней не противоречат.

Практический пример на Python (двухвыборочный t-тест):

import numpy as np
from scipy import stats

# Предположим, тестируем новый алгоритм против baseline
baseline_scores = [0.85, 0.82, 0.88, 0.79, 0.90]
new_algorithm_scores = [0.89, 0.91, 0.87, 0.93, 0.90]

# H₀: Средние результаты равны (новый алгоритм не лучше).
# H₁: Средние результаты различаются (двусторонний тест).

t_statistic, p_value = stats.ttest_ind(new_algorithm_scores, baseline_scores)
print(f"t-статистика: {t_statistic:.3f}")
print(f"p-value: {p_value:.4f}")

alpha = 0.05
if p_value <= alpha:
    print(f"p-value ({p_value:.4f}) ≤ α ({alpha}). Отвергаем H₀.")
    print("Есть статистически значимые свидетельства различий между алгоритмами.")
else:
    print(f"p-value ({p_value:.4f}) > α ({alpha}). Не отвергаем H₀.")
    print("Статистически значимых различий не обнаружено.")

Критически важные интерпретации, которые я учитываю:

  • P-value — не вероятность истинности гипотезы. Низкий p-value не означает, что H₁ верна с вероятностью 95%.
  • Статистическая значимость ≠ практическая значимость. При огромной выборке даже крошечный эффект даст низкий p-value. Всегда оцениваю размер эффекта (например, Cohen's d).
  • P-value чувствителен к нарушениям предположений теста (нормальность, гомогенность дисперсий). Перед тестом проверяю данные.
  • Я никогда не использую p-value как единственную метрику, а дополняю его доверительными интервалами и визуализацией данных.