A/B-тестыЛовушки A/B-тестовMediumБесплатно~10 мин

«Возьмём односторонний — там уже значимо»

// Условие

Тест новой формы регистрации. Планировали как обычно: двусторонний тест, α = 0.05. Выборка собрана полностью, результат на грани. Коллега предлагает: «Мы же ожидали рост, а не падение — давай посчитаем односторонний тест, там p уже меньше 0.1... ну или α возьмём 0.1 — и вообще значимо!»

Что нужно
Посчитай оба p-value — двусторонний и односторонний (в сторону роста). Сохрани в result — dict с ключами p_two_sided, p_one_sided.

// Данные

df: user_id, group (A/B), converted (0/1) — одна строка на юзера
▶ Решить в A/B-тренажёре

// Решение

Подсказка

Двусторонний: 2 * (1 - stats.norm.cdf(abs(z))). Односторонний (H1: B > A): 1 - stats.norm.cdf(z).

При положительном z односторонний p — ровно половина двустороннего. Дёшево и сердито... если выбрать его до теста, а не после.

Сначала попробуй сам → Показать решение
df = load_data()
from scipy import stats

s = df.groupby('group')['converted'].agg(['sum', 'count'])
pa = s.loc['A', 'sum'] / s.loc['A', 'count']
pb = s.loc['B', 'sum'] / s.loc['B', 'count']

p_pool = df['converted'].mean()
se = (p_pool * (1 - p_pool) * (1 / s.loc['A', 'count'] + 1 / s.loc['B', 'count'])) ** 0.5
z = (pb - pa) / se

p_two = 2 * (1 - stats.norm.cdf(abs(z)))   # ≈ 0.145
p_one = 1 - stats.norm.cdf(z)              # ≈ 0.072

result = {'p_two_sided': p_two, 'p_one_sided': p_one}
print(result)
Односторонний тест — легальный инструмент, если выбран до запуска и падение метрики действительно не интересует. Выбор теста или α после просмотра данных — p-hacking: перебирая варианты до «значимо», ты гарантированно найдёшь его даже в чистом шуме.

Коллега ждёт поддержки. Твой вердикт?

  • ✓ По задизайненному тесту (двусторонний, α=0.05) результат незначим: p ≈ 0.145. Менять тип теста или α после просмотра данных — p-hacking; фиксируем «эффект не доказан»
  • Коллега прав: рост мы и ожидали, значит односторонний тест честнее — а он почти значим
  • Возьмём компромисс: односторонний с α=0.05 — p ≈ 0.07, до значимости чуть-чуть, засчитаем
  • Посчитаем ещё несколько разных тестов — какой-нибудь да покажет значимость

Правила игры — тип теста, α, метрику, длительность — фиксируют до запуска. Каждая «поправка» после просмотра данных увеличивает реальную вероятность ложного открытия: двигая α и хвосты, из p = 0.145 можно «выжать» что угодно. Ожидание роста — не аргумент: оно было и до теста, но тест задизайнили двусторонним. Честный итог: эффект не доказан; хочется доказать — новый тест с большей выборкой.

// Похожие задачи

// Разобраться в теме

→ Гайд по A/B-тестам