A/B-тестыОсновыHardБесплатно~20 мин

Финальный разбор: полный чек-лист

// Условие

Финал бесплатного блока — полный цикл разбора, как на работе. Тест нового каталога: дизайн 50/50, две недели, выборка по плану. Перед тобой сырые данные — сделай всё сам: проверь сплит, посчитай эффект, дай вердикт.

Что нужно
1) SRM-чек против 50/50; 2) конверсии групп; 3) p-value эффекта. Сохрани в result — dict с ключами p_value_srm, conv_a, conv_b, p_value.

// Данные

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

// Решение

Подсказка

Порядок тот же, что в чек-листе аналитика: сначала валидность (SRM), потом эффект. stats.chisquare([n_a, n_b], f_exp=[total/2, total/2]).

Дальше — знакомый z-тест двух долей на пулированной SE.

Прежде чем выбирать вывод, собери всё: сплит валиден? эффект значим? какой он в процентных пунктах?

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

# Шаг 1: валидность — SRM-чек
vc = df['group'].value_counts()
n_a, n_b = int(vc['A']), int(vc['B'])
total = n_a + n_b
p_srm = stats.chisquare([n_a, n_b], f_exp=[total / 2, total / 2]).pvalue

# Шаг 2: эффект
s = df.groupby('group')['converted'].agg(['sum', 'count'])
conv_a = s.loc['A', 'sum'] / s.loc['A', 'count']
conv_b = s.loc['B', 'sum'] / s.loc['B', 'count']
p_pool = df['converted'].mean()
se = (p_pool * (1 - p_pool) * (1 / n_a + 1 / n_b)) ** 0.5
z = (conv_b - conv_a) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z)))

result = {'p_value_srm': p_srm, 'conv_a': conv_a, 'conv_b': conv_b, 'p_value': p_value}
print(result)
Чек-лист разбора теста: 1) валидность (SRM, длительность по плану, не было ли подглядываний) → 2) эффект (размер + значимость + CI) → 3) решение (эффект против цены раскатки). Здесь всё чисто: сплит валиден (p ≈ 0.37), эффект +1 п.п. при p ≈ 5·10⁻⁴.

Полный вердикт для команды?

  • ✓ Тест валиден (SRM p ≈ 0.37, длительность по плану), эффект +1 п.п. (11% → 12%) статзначим (p ≈ 0.0005) — рекомендую раскатывать
  • Группы различаются на 200 юзеров — сначала разобраться со сплитом
  • Разница всего 1 п.п. — незначимо, оставляем старый каталог
  • Эффект есть, но p не дотягивает до 10⁻⁶, как в учебниках — продлеваем тест

Это «эталонно чистый» тест: сплит валиден (25 100 vs 24 900 — p ≈ 0.37, обычный шум), выборка собрана по плану, эффект +1 п.п. и p ≈ 5·10⁻⁴ — вероятность получить такое случайно ничтожна. «Незначимо, потому что всего 1 п.п.» путает размер эффекта со значимостью; «нужно p как в учебниках» — несуществующий стандарт: порог был зафиксирован (0.05), и он пройден с запасом. Решение — раскатывать.

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

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

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