P-value простыми словами

Что такое p-value

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

Нулевая гипотеза (H0) — утверждение, что никакого эффекта нет. Например: «конверсия в тестовой группе не отличается от контрольной». P-value отвечает на вопрос: насколько удивительны ваши данные, если H0 действительно верна?

Маленькое p-value означает: такие данные маловероятны при отсутствии эффекта. Это повод усомниться в нулевой гипотезе. Большое p-value означает: данные вполне совместимы с H0, оснований отклонять её нет.

Правильная интерпретация

P-value — это вероятность данных при условии гипотезы, а не вероятность гипотезы при условии данных.

Это самое важное, что нужно запомнить. P-value = 0.03 не значит, что вероятность отсутствия эффекта — 3%. Оно значит: если эффекта действительно нет, вероятность увидеть такую же или большую разницу — 3%.

Разница принципиальная. P(данные | H0) и P(H0 | данные) — разные величины. Для вычисления P(H0 | данные) нужна теорема Байеса и априорная вероятность гипотезы, которую p-value не учитывает.

Что p-value говорит:

  • Насколько совместимы наблюдаемые данные с нулевой гипотезой
  • Мера «удивительности» результата при условии H0

Что p-value не говорит:

  • Вероятность того, что H0 верна или ложна
  • Размер эффекта (p = 0.001 не означает большой эффект)
  • Практическую значимость результата
  • Вероятность воспроизводимости результата при повторении эксперимента

Числовой пример: A/B тест с конверсией

Вы запустили A/B тест. Контрольная группа: 5000 пользователей, 500 конверсий (10.0%). Тестовая группа: 5000 пользователей, 560 конверсий (11.2%). Разница — 1.2 процентных пункта. Случайность или реальный эффект?

Нулевая гипотеза (H0): конверсия одинакова в обеих группах (разница = 0).

Расчёт. Объединённая конверсия p_pool = (500 + 560) / 10000 = 0.106. Стандартная ошибка разности:

SE = sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
SE = sqrt(0.106 * 0.894 * (1/5000 + 1/5000))
SE = sqrt(0.106 * 0.894 * 0.0004) = 0.00616

Z-статистика:

z = (0.112 - 0.100) / 0.00616 = 1.95

P-value (двустороннее) = 2 * P(Z > 1.95) = 2 * 0.0256 = 0.051.

Результат: p-value = 0.051. При стандартном пороге alpha = 0.05 результат формально незначим. Разница в 1.2 п.п. может быть случайной — данных недостаточно для уверенного вывода. Но p-value близко к порогу, и при увеличении выборки результат, скорее всего, станет значимым.

Порог значимости alpha

Alpha (уровень значимости) — это порог, ниже которого p-value считается достаточно малым для отклонения H0. Стандартное значение — 0.05, то есть 5%.

Alpha выбирается до эксперимента. Это ваша допустимая вероятность ошибки первого рода — вероятность отклонить H0, когда она на самом деле верна. Устанавливая alpha = 0.05, вы соглашаетесь с тем, что в 5% случаев при отсутствии реального эффекта вы ошибочно «найдёте» его.

Почему именно 0.05? Это конвенция, а не физический закон. В продуктовой аналитике 0.05 — разумный компромисс. В медицине иногда используют 0.01. В физике частиц стандарт — 5 sigma (p < 0.0000003). Порог зависит от цены ошибки.

Связь p-value и доверительного интервала

P-value и доверительный интервал — два способа ответить на один и тот же вопрос. Они математически эквивалентны:

  • Если 95% CI для разности не содержит 0, то p-value < 0.05.
  • Если 95% CI содержит 0, то p-value >= 0.05.

Но доверительный интервал информативнее. P-value даёт бинарный ответ: «значимо / незначимо». CI показывает диапазон правдоподобных значений эффекта — его величину и неопределённость оценки.

В примере выше 95% CI для разности конверсий: [-0.01%; +2.41%]. Интервал содержит 0 — согласуется с p = 0.051. Но верхняя граница +2.41% говорит, что эффект потенциально существенный. Такая информация для принятия продуктовых решений полезнее, чем голое «p > 0.05, незначимо».

Ошибки первого и второго рода

При проверке гипотез возможны два типа ошибок:

Ошибка первого рода (Type I, false positive) — вы отклонили H0, но на самом деле эффекта нет. Вероятность такой ошибки контролируется порогом alpha. При alpha = 0.05 вы допускаете 5% ложных срабатываний.

Ошибка второго рода (Type II, false negative) — вы не отклонили H0, но эффект реально существует. Вероятность обозначается beta. Мощность теста = 1 - beta — это вероятность обнаружить эффект, если он есть. Стандартная мощность — 80% (beta = 0.20).

Между alpha и beta есть компромисс. Снижая alpha (ужесточая порог), вы увеличиваете beta — чаще пропускаете реальные эффекты. Увеличивая выборку, можно снизить оба показателя одновременно.

На собеседованиях часто спрашивают: «Что хуже — ошибка первого или второго рода?» Ответ зависит от контекста. Если вы тестируете новый дизайн кнопки «Купить», ложноположительный результат (раскатили неэффективное изменение) — это недополученная прибыль. Если вы тестируете лекарство, ложноположительный результат — это потенциальный вред пациентам. Цена ошибки определяет выбор alpha.

Проблема множественных сравнений

Если вы проверяете 20 гипотез одновременно при alpha = 0.05, ожидаемое число ложных срабатываний — 1. Это не баг, а математика: 20 * 0.05 = 1.

Типичная ситуация: вы запустили A/B тест и смотрите конверсию, средний чек, количество просмотров, время на сайте, bounce rate и ещё 15 метрик. Одна из них «выстрелит» просто по случайности.

Вероятность хотя бы одного ложного срабатывания при 20 независимых тестах:

P(хотя бы 1 ошибка) = 1 - (1 - 0.05)^20 = 1 - 0.358 = 0.642

64% — вероятность найти «значимый» результат при полном отсутствии эффектов. Это называется проблемой множественных сравнений (multiple comparisons problem).

Поправка Бонферрони — простейший способ коррекции. Делите alpha на количество тестов: alpha_corrected = 0.05 / 20 = 0.0025. Консервативный метод — снижает мощность, но гарантирует контроль ошибки первого рода.

FDR (False Discovery Rate) — метод Бенджамини--Хохберга. Контролирует долю ложных срабатываний среди всех отклонённых гипотез. Менее консервативен, чем Бонферрони, и чаще используется на практике при большом числе метрик.

Python: расчёт p-value

Z-тест для сравнения долей (A/B тест)

import numpy as np
from scipy import stats

# Контроль: 500 из 5000, тест: 560 из 5000
n1, x1 = 5000, 500
n2, x2 = 5000, 560

p1 = x1 / n1  # 0.100
p2 = x2 / n2  # 0.112

# Объединённая доля под H0
p_pool = (x1 + x2) / (n1 + n2)
se = np.sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))

z_stat = (p2 - p1) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z_stat)))

print(f"z = {z_stat:.3f}, p-value = {p_value:.4f}")
# z = 1.948, p-value = 0.0514

T-тест для сравнения средних

from scipy import stats

# Средний чек в двух группах
control = [450, 520, 380, 490, 510, 470, 430, 460, 500, 440,
           480, 420, 530, 460, 490, 410, 470, 500, 450, 480]
test = [510, 540, 470, 530, 560, 490, 520, 550, 480, 510,
        530, 500, 570, 520, 540, 480, 510, 560, 500, 530]

stat, p_value = stats.ttest_ind(test, control)
print(f"t = {stat:.3f}, p-value = {p_value:.4f}")
# t = 3.674, p-value = 0.0008

Поправка Бонферрони

from statsmodels.stats.multitest import multipletests

# p-value для 5 метрик
p_values = [0.03, 0.12, 0.04, 0.001, 0.08]

rejected, corrected, _, _ = multipletests(
    p_values, alpha=0.05, method='bonferroni'
)
print("Исходные p-value: ", p_values)
print("Скорректированные:", [round(p, 4) for p in corrected])
print("Отклонить H0:     ", rejected.tolist())
# Исходные p-value:  [0.03, 0.12, 0.04, 0.001, 0.08]
# Скорректированные: [0.15, 0.6, 0.2, 0.005, 0.4]
# Отклонить H0:      [False, False, False, True, False]

После поправки Бонферрони из пяти «кандидатов» значимым остался только один (p = 0.001, скорректированный p = 0.005). Два результата с исходными p = 0.03 и p = 0.04 — вероятные ложные срабатывания.

Типичные ошибки при работе с p-value

1. Интерпретация p-value как вероятности гипотезы. P-value = 0.02 не значит «2% шанс, что эффекта нет». Это вероятность данных при условии H0, а не наоборот.

2. Приравнивание статистической значимости к практической. P-value = 0.001 при разнице конверсий 0.01% — результат статистически значим, но практически бесполезен. Всегда смотрите на размер эффекта, а не только на p-value.

3. Подглядывание (peeking). Проверка p-value каждый день во время эксперимента и остановка теста, как только p < 0.05, — гарантированный способ получить ложноположительный результат. При каждом «подглядывании» вы увеличиваете эффективный alpha. Для ранней остановки используйте методы sequential testing или group sequential design.

4. P-hacking. Перебор метрик, сегментов, периодов до тех пор, пока что-то не «выстрелит». Если вы проверили 20 сегментов и нашли значимый результат в одном — это скорее множественные сравнения, чем открытие. Фиксируйте гипотезу до эксперимента.

5. Отсутствие поправки на множественные сравнения. Проверяете 10 метрик — примените Бонферрони или FDR. Без поправки при 10 метриках и alpha = 0.05 вероятность хотя бы одного ложного срабатывания — 40%.

6. «P > 0.05, значит, эффекта нет». Отсутствие статистической значимости — это не доказательство отсутствия эффекта. Это может означать, что выборки недостаточно для обнаружения эффекта (низкая мощность). «Не доказано» и «доказано отсутствие» — разные утверждения.

7. Сравнение p-value между экспериментами. P-value = 0.04 в одном тесте и p-value = 0.06 в другом не означает, что в первом тесте эффект есть, а во втором нет. Разница между «значимым» и «незначимым» сама по себе может быть незначимой.

Вопросы с собеседований

На собеседованиях по статистике вопросы про p-value задают почти всегда. Вот типичные формулировки и ожидаемые ответы.

1. Что такое p-value? Объясните простыми словами.

P-value — это вероятность получить такие же или более экстремальные данные при условии, что нулевая гипотеза верна. Если p-value маленькое, данные плохо совместимы с H0 — это повод её отклонить. Важно: это вероятность данных при гипотезе, а не вероятность гипотезы при данных.

2. P-value = 0.03. Означает ли это, что вероятность ошибки — 3%?

Нет. P-value = 0.03 означает: если H0 верна, вероятность увидеть такой или более экстремальный результат — 3%. Это не вероятность того, что H0 верна. Вероятность того, что конкретное решение об отклонении H0 ошибочно, зависит от априорной вероятности гипотезы (байесовский подход), которую p-value не учитывает.

3. Тест показал p = 0.001 при разнице конверсий 0.05%. Запускаем фичу?

Не обязательно. Статистическая значимость не равна практической. Разница 0.05% при большом трафике легко даёт p < 0.001, но эффект может быть экономически несущественным. Нужно оценить: покрывает ли ожидаемый прирост затраты на поддержку фичи? Смотрите на доверительный интервал — он покажет диапазон возможного эффекта.

4. Чем отличается ошибка первого и второго рода?

Ошибка первого рода (false positive) — отклонили H0, когда эффекта нет. Контролируется порогом alpha (обычно 0.05). Ошибка второго рода (false negative) — не отклонили H0, когда эффект есть. Контролируется мощностью теста (1 - beta, обычно 0.80). Первая приводит к раскатке неэффективных изменений, вторая — к упущенным возможностям.

5. Вы проверяете 10 метрик в A/B тесте. Одна показала p = 0.04. Что скажете?

При 10 метриках и alpha = 0.05 вероятность хотя бы одного ложного срабатывания — 40%. Один результат с p = 0.04 из десяти — скорее всего, случайность. Нужна поправка на множественные сравнения: Бонферрони (alpha_corrected = 0.05 / 10 = 0.005) или FDR. После поправки p = 0.04 перестаёт быть значимым.

6. В чём связь между p-value и доверительным интервалом?

Они математически эквивалентны для двусторонних тестов: если 95% CI для разности не содержит 0, то p < 0.05, и наоборот. Но CI информативнее — показывает не только наличие эффекта, но и его величину. На практике рекомендуется смотреть оба, но приоритет — CI.


Потренируйтесь решать задачи по статистике в Карьернике — тренажёре для подготовки к собеседованиям аналитиков.

FAQ

Что такое p-value простыми словами?

P-value — это вероятность получить такие же или более экстремальные данные при условии, что эффекта на самом деле нет. Маленькое p-value означает, что данные плохо совместимы с отсутствием эффекта, и это повод отклонить нулевую гипотезу.

P-value = 0.03 — это вероятность ошибки 3%?

Нет. P-value = 0.03 означает: если эффекта нет, вероятность увидеть такой или более экстремальный результат — 3%. Это не вероятность того, что нулевая гипотеза верна. Для оценки вероятности гипотезы нужен байесовский подход с априорными вероятностями.

Чем отличается статистическая значимость от практической значимости?

Статистическая значимость (p < 0.05) говорит лишь о том, что результат вряд ли случаен. Практическая значимость — о том, достаточно ли велик эффект для бизнес-решений. Разница конверсий в 0.01% может быть статистически значимой при большом трафике, но бесполезной на практике.

Почему нельзя проверять p-value каждый день во время A/B-теста?

Многократная проверка (peeking) раздувает вероятность ложного срабатывания. При ежедневной проверке двухнедельного теста реальный alpha может вырасти с 5% до 20-30%. Нужно либо зафиксировать размер выборки до запуска, либо использовать методы sequential testing.