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

Слишком красивый рост: проверь сплит

// Условие

Тест нового онбординга: дизайн 50/50, метрика — конверсия в первую покупку. Через неделю в дашборде +0.9 п.п. и «звёздочка значимости». Продакт готов раскатывать. Но опытный аналитик сначала проверяет сам сплит.

Что нужно
Посчитай размеры групп и проверь их хи-квадрат-тестом против дизайна 50/50 (SRM-чек). Сохрани в result — dict с ключами n_a, n_b, p_value_srm.

// Данные

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

// Решение

Подсказка

Размеры групп: df['group'].value_counts().

SRM-чек — хи-квадрат на соответствие наблюдаемых размеров ожидаемым: stats.chisquare([n_a, n_b], f_exp=[total/2, total/2]).

Если p_value_srm крошечный (например, < 0.001) — сплит сломан: трафик делился не 50/50, и любые различия метрик могут быть артефактом.

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

vc = df['group'].value_counts()
n_a, n_b = int(vc['A']), int(vc['B'])
total = n_a + n_b

# SRM: соответствуют ли наблюдаемые размеры дизайну 50/50
srm = stats.chisquare([n_a, n_b], f_exp=[total / 2, total / 2])

result = {'n_a': n_a, 'n_b': n_b, 'p_value_srm': srm.pvalue}
print(result)
SRM (Sample Ratio Mismatch) — первый чек любого теста: если трафик делится не так, как задумано, где-то баг (редиректы, боты, фильтры, кривая рандомизация), и группы несравнимы. Порог обычно p < 0.001, здесь p ≈ 10⁻⁴⁵ — сплит сломан безнадёжно.

Продакт ждёт раскатки. Твой вердикт?

  • Эффект значим — раскатываем, а разницу размеров групп спишем на погрешность
  • Удалим случайные 3 000 юзеров из B, чтобы размеры сравнялись, и пересчитаем
  • ✓ Тест невалиден: SRM (p ≈ 10⁻⁴⁵). Сначала чинить сплит и перезапускать тест — метрикам верить нельзя
  • Продлим тест ещё на неделю — размеры групп со временем выровняются

При дизайне 50/50 отклонение 21 000 vs 24 000 невозможно объяснить случайностью (p ≈ 10⁻⁴⁵). Значит, юзеры попадали в группы не случайно — и группы могут различаться систематически (платформа, гео, боты). «Подрезать» группу B нельзя: неизвестно, какие юзеры лишние, — это маскирует баг вместо починки. Время тоже не выровняет сломанную рандомизацию. Единственный честный ход: найти причину SRM, починить, перезапустить.

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

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

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