Собесов

Karpov ДЗ: A/B-тест редизайна страницы оплаты

A/B-тестыA/B designСредняяMiddle

Условие

Продукт хочет проверить редизайн страницы оплаты. Текущая конверсия из «корзины» в «успешная оплата» — 12%. Менеджер хочет уловить относительный прирост ≥ 5% (т.е. с 12% до 12.6%).

  1. Сколько пользователей нужно на ветку при α = 0.05, β = 0.20?
  2. Через 2 недели в эксперименте 60К в контроле, 58К в тесте — нормально ли это?
  3. По итогам: контроль 12.0% (60К), тест 12.5% (58К). Что значимо? Что вы бы сказали продукту?

Решение

1) Размер выборки

Для разности пропорций (two-sample):

n_per_arm = (z_α/2 + z_β)² · (p1·(1−p1) + p2·(1−p2)) / (p1 − p2)²

При двустороннем тесте α=0.05: z_α/2 ≈ 1.96; β=0.20: z_β ≈ 0.84.

p1 = 0.120, p2 = 0.126, Δ = 0.006.

(1.96 + 0.84)² = 7.84
p1·q1 = 0.120·0.880 = 0.1056
p2·q2 = 0.126·0.874 = 0.11012
сумма = 0.2157
n = 7.84 · 0.2157 / 0.006² ≈ 1.691 / 0.000036 ≈ 46 968

47К на ветку → ~94К всего.

import statsmodels.stats.proportion as sp
n = sp.samplesize_proportions_2indep_onetail(
        diff=0.006, prop2=0.120, power=0.8, ratio=1, alpha=0.05, alternative='two-sided')
# ≈ 47000

2) Балансировка трафика

В контроле 60К, в тесте 58К — отношение 60/58 ≈ 1.034. Проверим SRM (sample ratio mismatch) χ²-тестом:

expected = (60000 + 58000) / 2 = 59000
χ² = (60000 − 59000)² / 59000 + (58000 − 59000)² / 59000 = 16.95 + 16.95 = 33.9
df = 1, p < 0.001

SRM есть — это критический сигнал. Возможные причины:

  • баг сплитования (cookies/bot-фильтр срабатывает асимметрично);
  • разные тайминги активации эксперимента;
  • разный exclusion (например, тест выгружает страницу медленнее → отвалились bot/slow).

Не интерпретировать результаты до выяснения. Часто исправляют, перезапускают.

3) Анализ результата

Допустим, SRM-проблему решили и финальные данные те же:

  • контроль: 12.0% × 60К = 7200 покупок.
  • тест: 12.5% × 58К = 7250 покупок.

Двусторонний z-тест разности пропорций:

from statsmodels.stats.proportion import proportions_ztest
counts  = [7200, 7250]
nobs    = [60000, 58000]
z, p = proportions_ztest(counts, nobs)
print(z, p)
# z ≈ 2.77, p ≈ 0.0056

p < 0.05 — значимо. Относительный uplift: (0.125 − 0.120) / 0.120 ≈ +4.17%.

Однако:

  • Достигли ли запрошенного эффекта ≥ 5%? Нет (4.17% < 5%). Но эффект статистически значим.
  • 95% CI на uplift: примерно (+1.2%; +7.2%) (CI шире целевой).
  • Бизнес-решение: эффект мал, но реален. Стоит ли катить — зависит от cost-of-rollback и рисков на 58К пользователей. Можно raise — но это пограничный случай.

Декомпозиция результата

SELECT
    variant,
    segment,                                -- mobile/desktop, новые/старые
    SUM(CASE WHEN paid THEN 1 ELSE 0 END) * 1.0 / COUNT(*) AS cr
FROM ab_data
GROUP BY 1, 2;

Проверить: эффект однородный или сидит в одном сегменте. Часто «общий» uplift — на самом деле артефакт mobile или new-users.

Подводные камни

  1. SRM игнорировать — главная ошибка. Любое расхождение > 1% при N>50K — расследовать.
  2. «Доверяй p-value, но проверяй»: p = 0.045 на пятый день перерыва ≠ «можно катить». Считать только на запланированном horizon, не peeking.
  3. MDE vs наблюдаемый эффект: если запланировано MDE=5%, а получили 4%, тест с power 80% не должен был обнаружить → результат «случайно значим».
  4. Двусторонний vs односторонний: бизнес часто хочет «улучшение или ничего». Одностороннее даёт +25% к power, но строже подход. Согласовать заранее.
  5. CR — пропорция: использовать z-test или χ², а не t-test (хотя при больших N разница мала).
  6. Сезонность: 2 недели слишком короткий горизонт — захватили бы только будни или только спецаль.
  7. Множественные сегменты: на 10 сегментах один окажется значим случайно (p = 0.005 × 10 → familywise > 0.04).

Эталонный ответ

  1. n ≈ 47К/ветка: формула (zα/2+zβ)² · Σpq / Δ² при α=0.05, power=0.8.
  2. 60К/58К — SRM: χ² ≈ 33.9, p < 0.001. Расследовать причины до интерпретации.
  3. CR 12.0% vs 12.5%: p ≈ 0.006 — значимо. Uplift 4.2%, ниже запрошенного 5%. CI шире целевого. Решение «катить» — пограничное; нужно убедиться в стабильности (без SRM) и однородности по сегментам.

Главное при коммуникации: «значимо ≠ значимо для бизнеса». p-value меньше α — лишь то, что эффект не нулевой. Релевантность — отдельная оценка.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти