Что это и зачем нужно
Размер выборки в A/B-тесте — это сколько пользователей нужно набрать чтобы с большой вероятностью обнаружить эффект, если он реально есть. Эта вероятность называется statistical power (мощность). Стандарт индустрии — 80%.
Главная ошибка джунов и PM-ов: запустить тест «на день-два, что-то покажется». При маленькой выборке тест не имеет мощности — даже если фича работает на +5%, ты её не увидишь. Получишь шум и неверный вывод «не работает».
В Каспи стандарт для consumer-фичи: минимум 1 неделя, обычно 2-4. Для B2B Halyk — иногда месяцы.
Базовый пример
Расчёт через формулу для двусторонней проверки разности конверсий (на каждую группу):
$$n = \frac{(z_{\alpha/2} + z_{\beta})^2 \cdot 2 \cdot p (1-p)}{MDE^2}$$
где:
- p — базовая конверсия (например 0.05 = 5%)
- MDE — minimum detectable effect (минимальная разница которую хотим обнаружить, например 0.005 = 0.5 п.п.)
- z_{α/2} — critical value для уровня значимости α=0.05 → 1.96
- z_{β} — critical value для мощности 1-β = 80% → 0.84
Подставляем константы — (1.96 + 0.84)² × 2 = 15.68, округляем до 16:
$$n \approx \frac{16 \cdot p(1-p)}{MDE^2}$$
Пример расчёта для Каспи Магазин:
- Базовая конверсия checkout: p = 5% = 0.05
- Хотим увидеть прирост +0.5 п.п. (относительный +10%): MDE = 0.005
$$n = \frac{16 \times 0.05 \times 0.95}{0.005^2} = \frac{0.76}{0.000025} = 30,400$$
Нужно 30,400 пользователей на группу. Итого 60,800.
При трафике 50K юзеров в день на чекаут (после фильтра на bot/test traffic): примерно 2 дня.
Но если хотим увидеть +1% (relative +20%) — изменим MDE на 0.01:
$$n = \frac{16 \times 0.05 \times 0.95}{0.0001} = 7,600$$
Всего 15,200 — половина дня. Чем больше эффект — тем меньше выборка.
Если хотим увидеть +0.1% (relative +2%) — изменим MDE на 0.001:
$$n = \frac{0.76}{0.000001} = 760,000$$
Итого 1.5M — 30 дней. Маленькие эффекты требуют огромных выборок.
Тонкости и pitfalls
1. MDE — это до теста, не «искать после»
MDE задаётся перед запуском теста. Если ты после теста говоришь «я могу обнаружить эффект 0.3% потому что у меня 1M юзеров» — это математически верно, но post-hoc. Тест должен быть spec'нут заранее с фиксированным MDE.
2. Power 80% — это компромисс
80% значит: если эффект реально есть, мы его увидим в 80% случаев. В 20% случаев — false negative (упустим). Можно повысить до 90% — но это увеличит выборку в 1.6 раза.
3. Sample size vs traffic — ловушка интерпретации
«Нам нужно 30K пользователей» — это на каждую группу, не суммарно. Юзер в группе A и юзер в группе B — это два разных юзера.
4. Continuous metrics (revenue, time) — другая формула
Для continuous переменных (например ARPU, длительность сессии) формула:
$$n = \frac{16 \cdot \sigma^2}{MDE^2}$$
где σ — стандартное отклонение метрики. Continuous обычно требуют больше выборки из-за высокой дисперсии. Особенно ARPU где 95% юзеров платят 0, а 5% — большие суммы. Дисперсия огромна, MDE с обычной выборкой плохо.
Workaround: CUPED (Controlled experiment Using Pre-Experiment Data) — снижает variance на основе pre-period behavior, сокращает выборку в 1.5-3 раза.
5. Стратификация vs random split
Если случайно делишь 50/50 — групы могут получиться разными по составу (одна получила больше iOS, другая больше Android). Стратификация (stratified random sampling) гарантирует балансное распределение по ключевым признакам.
6. Multiple testing — не запускай 10 вариантов
Если запускаешь A/B/C/D/E test — нужны поправки Bonferroni (α/N) или FDR. Без них — false positive почти гарантирован.
Когда НЕ применять формулу
-
Маленький продукт (<1000 юзеров) — A/B-тесты часто бессмысленны. Используй qualitative research (5-10 user interviews).
-
Сильный эффект очевиден — например полностью новый UI с +50% конверсии не нужно тестировать, понятно что работает.
-
Bandit/Multi-armed bandit — если важнее быстро catit'ы winner чем измерить точно, MAB алгоритмы (Thompson sampling) работают лучше A/B при unbalanced правильно потоке.
-
High-stakes решения — для critical changes (например безопасность платежей) — A/B-тест даже на огромной выборке может не покрыть edge cases. Лучше canary release + monitoring.
Кейс из казахстанского бизнеса
В Halyk Bank PM хотел A/B-тест нового onboarding flow. Базовая активация в первый день — 35%. Хотел обнаружить +2% (relative +5.7%).
Аналитик посчитал:
- p = 0.35, MDE = 0.02
- n = 16 × 0.35 × 0.65 / 0.02² = 9,100 на группу
При 5000 новых регистраций в день — 4 дня минимум. Но weekly seasonality (вс vs пн разница в 3 раза) → накинули до 2 полных недели.
PM возмущался: «зачем 2 недели если за 3 дня уже видна тенденция?». Аналитик показал simulation: при peeking в первые 3 дня с p<0.05 в 30% случаев получишь false positive (хотя эффекта нет). Через 2 недели — реальный сигнал.
Запустили на 2 недели. Получили +1.8% (CI: +0.5% to +3.1%, p=0.02). Решение catит, эффект подтвердился через месяц на everyone.
Если бы остановились через 3 дня с p=0.04 (как часто случается) — это могла бы быть случайность. Catit'ли бы возможно не работающую фичу, и потеряли бы трафик на «новом» worse onboarding.
Главный урок: PM-ам нужно объяснять статистику. Sample size — не «бюрократия», а защита от ложных выводов и потерянного product time. Senior аналитик умеет это объяснить с цифрами на их языке: «За 3 дня вероятность false positive 30%, за 2 недели — 5%. Хочешь сэкономить 11 дней и в 1 из 3 случаев катить плохую фичу?»