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.00616Z-статистика:
z = (0.112 - 0.100) / 0.00616 = 1.95P-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.64264% — вероятность найти «значимый» результат при полном отсутствии эффектов. Это называется проблемой множественных сравнений (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.0514T-тест для сравнения средних
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.