Как рассчитать размер выборки для A/B-теста
Почему размер выборки нужно считать заранее
Запустить A/B тест без расчёта выборки — всё равно что выйти в море без карты. Если выборка слишком маленькая, тест не обнаружит реальный эффект: вы потратите две недели трафика и получите незначимый результат. Если слишком большая — вы потратите трафик впустую, хотя могли бы закончить раньше и запустить следующий эксперимент.
Недостаточная мощность — самая частая ошибка в экспериментах. Тест с мощностью 30% обнаружит реальный эффект только в трёх случаях из десяти. Остальные семь раз вы решите, что фича не работает, хотя она работала. Это прямые потери для продукта.
Расчёт выборки до запуска теста фиксирует правила игры: вы заранее определяете, какой минимальный эффект хотите обнаружить, с какой вероятностью готовы ошибиться, и сколько наблюдений для этого нужно. Это дисциплинирует и защищает от подглядывания в результаты (peeking).
Четыре параметра расчёта
Размер выборки определяется четырьмя величинами. Измените любую из них — и необходимое n изменится.
Уровень значимости (alpha)
Вероятность ложного срабатывания — отвергнуть нулевую гипотезу, когда эффекта нет. Стандартное значение — 0.05 (5%). Это ваша терпимость к ошибке первого рода.
При двустороннем тесте (а на практике почти всегда используют двусторонний) критическое значение z-статистики при alpha = 0.05 равно 1.96.
Мощность (1 - beta)
Вероятность обнаружить эффект, если он реально существует. Стандартное значение — 0.80 (80%). Это значит, что вы допускаете 20% шанс пропустить реальный эффект (ошибка второго рода, beta = 0.20).
Для более ответственных решений берут мощность 0.90 — но это заметно увеличивает необходимую выборку.
Минимальный детектируемый эффект (MDE)
Самый важный и самый сложный параметр. MDE — это наименьший размер эффекта, который вы хотите гарантированно обнаружить. Не ожидаемый эффект, а минимальный, при котором вам ещё имеет смысл менять продукт.
Для конверсии MDE обычно задают в абсолютных процентных пунктах (например, рост с 10% до 11% — это MDE = 1 п.п.) или в относительных процентах (рост на 10% от базовой конверсии). Для метрик-средних (revenue, время сессии) — в единицах метрики.
Чем меньше MDE, тем больше выборка. Уменьшение MDE вдвое увеличивает необходимую выборку в четыре раза.
Базовая дисперсия (variance)
Для конверсии дисперсия определяется базовым уровнем: p * (1 - p). Конверсия 50% даёт максимальную дисперсию и требует больше всего данных. Конверсия 2% — дисперсию 0.0196, выборка меньше.
Для метрик-средних нужно знать стандартное отклонение метрики (sigma), которое обычно оценивают по историческим данным.
Формула для пропорций (конверсия)
При сравнении конверсий двух групп одинакового размера формула размера одной группы:
n = (z_alpha/2 + z_beta)^2 * (p1*(1-p1) + p2*(1-p2)) / (p2 - p1)^2где:
z_alpha/2— квантиль стандартного нормального распределения для уровня значимости (при alpha = 0.05, двусторонний тест: z = 1.96)z_beta— квантиль для мощности (при power = 0.80: z = 0.842)p1— базовая конверсия (контроль)p2— ожидаемая конверсия (тест) = p1 + MDE
Упрощённый вариант (когда p1 и p2 близки, что почти всегда верно):
n ≈ (z_alpha/2 + z_beta)^2 * 2 * p * (1 - p) / delta^2где p = (p1 + p2) / 2, а delta = p2 - p1.
Формула для средних
При сравнении средних значений метрики (revenue, время сессии, количество действий) между двумя группами одинакового размера:
n = (z_alpha/2 + z_beta)^2 * 2 * sigma^2 / delta^2где:
sigma— стандартное отклонение метрики (оценивается по историческим данным)delta— MDE в единицах метрики
Здесь n — размер одной группы. Общий размер эксперимента — 2n.
Пошаговый пример: конверсия
Базовая конверсия в покупку — 5%. Вы хотите обнаружить абсолютный прирост в 0.5 п.п. (то есть рост до 5.5%). Параметры: alpha = 0.05, power = 0.80.
Шаг 1. Квантили: z_alpha/2 = 1.96, z_beta = 0.842.
Шаг 2. Средняя конверсия: p = (0.05 + 0.055) / 2 = 0.0525.
Шаг 3. Дисперсия: p * (1 - p) = 0.0525 * 0.9475 = 0.04974.
Шаг 4. Подставляем в формулу:
n = (1.96 + 0.842)^2 * 2 * 0.04974 / (0.005)^2
= (2.802)^2 * 0.09949 / 0.000025
= 7.851 * 0.09949 / 0.000025
= 0.7811 / 0.000025
= 31 244Нужно примерно 31 244 пользователя на группу, или 62 488 всего. При 1 000 новых пользователей в день тест займёт около 63 дней.
Если MDE увеличить вдвое (до 1 п.п., то есть рост с 5% до 6%), n падает до ~7 800 на группу — в четыре раза меньше. Это прямое следствие квадратичной зависимости от MDE.
Python-калькулятор (statsmodels)
Считать вручную не нужно — statsmodels делает это за вас.
Для конверсии (пропорции)
from statsmodels.stats.power import NormalIndPower
analysis = NormalIndPower()
# Параметры
p1 = 0.05 # базовая конверсия
p2 = 0.055 # ожидаемая конверсия (MDE = 0.5 п.п.)
alpha = 0.05
power = 0.80
# effect_size для пропорций — разница, делённая на «объединённое» ст. отклонение
# statsmodels использует формулу Коэна: effect_size = |p2 - p1| / sqrt(p*(1-p))
# где p — средняя пропорция
import numpy as np
p_avg = (p1 + p2) / 2
effect_size = abs(p2 - p1) / np.sqrt(p_avg * (1 - p_avg))
n_per_group = analysis.solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
alternative='two-sided'
)
print(f"Effect size (Cohen's h): {effect_size:.4f}")
print(f"Размер одной группы: {np.ceil(n_per_group):.0f}")
print(f"Всего: {2 * np.ceil(n_per_group):.0f}")Вывод:
Effect size (Cohen's h): 0.0224
Размер одной группы: 31234
Всего: 62468Для средних
from statsmodels.stats.power import TTestIndPower
analysis = TTestIndPower()
# Параметры
sigma = 120 # стандартное отклонение метрики (например, revenue)
delta = 5 # MDE — разница средних, которую хотим обнаружить
alpha = 0.05
power = 0.80
effect_size = delta / sigma # Cohen's d
n_per_group = analysis.solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
alternative='two-sided'
)
print(f"Effect size (Cohen's d): {effect_size:.4f}")
print(f"Размер одной группы: {np.ceil(n_per_group):.0f}")
print(f"Всего: {2 * np.ceil(n_per_group):.0f}")Вывод:
Effect size (Cohen's d): 0.0417
Размер одной группы: 9046
Всего: 18092Что влияет на размер выборки
| Изменение параметра | Как меняется n | Почему |
|---|---|---|
| alpha уменьшается (0.05 -> 0.01) | n растёт (~+30%) | Строже порог — нужно больше данных, чтобы его преодолеть |
| Мощность растёт (0.80 -> 0.90) | n растёт (~+30%) | Хотим реже пропускать реальный эффект |
| MDE уменьшается в 2 раза | n растёт в ~4 раза | Квадратичная зависимость: n ~ 1/delta^2 |
| Дисперсия растёт в 2 раза | n растёт в ~2 раза | Линейная зависимость: n ~ sigma^2 |
| Базовая конверсия ближе к 50% | n растёт | Максимальная дисперсия p*(1-p) при p = 0.5 |
| Односторонний тест вместо двустороннего | n падает (~-20%) | Менее строгий порог, но теряете возможность обнаружить ухудшение |
Главный рычаг — MDE. Если нужно уменьшить выборку, первым делом обсудите с продактом: правда ли вам нужно ловить эффект в 0.5 п.п., или 1 п.п. достаточно? Увеличение MDE вдвое сокращает выборку вчетверо.
Второй рычаг — снижение дисперсии. Методы вроде CUPED снижают эффективную дисперсию на 20–50%, что сокращает необходимую выборку на ту же долю.
Практические советы по оценке длительности теста
1. Считайте в днях, а не в людях. Формула даёт количество наблюдений. Разделите на дневной трафик — получите длительность. Если нужно 60 000, а дневной трафик 2 000, тест займёт 30 дней.
2. Учитывайте сезонность. Трафик в будни и выходные отличается. Длительность теста должна быть кратна неделям, чтобы захватить полный цикл. Тест на 10 дней — плохая идея, на 14 — хорошая.
3. Не останавливайте тест раньше. Если через 5 дней p-value уже < 0.05, это не значит, что можно остановиться. Ранняя остановка без поправки на множественное сравнение завышает false positive rate. Если хотите останавливать раньше — используйте sequential testing.
4. Закладывайте запас. На практике 5–10% трафика теряется: боты, технические ошибки, пользователи из нецелевых сегментов. Увеличьте расчётную выборку на 10%.
5. Несколько вариантов — больше трафика. При тесте с тремя вариантами (A/B/C) нужна поправка на множественные сравнения. Выборка на каждый вариант вырастет примерно на 25% по сравнению с простым A/B.
Вопросы с собеседований
«Как рассчитать размер выборки для A/B-теста?»
Нужно зафиксировать четыре параметра: уровень значимости (обычно 0.05), мощность (обычно 0.80), базовое значение метрики и минимальный детектируемый эффект. Для конверсий используется формула на основе нормального приближения, для средних — формула с дисперсией метрики. На практике считают в statsmodels или аналогичных калькуляторах.
«Что такое MDE и как его выбрать?»
MDE — минимальный размер эффекта, который тест гарантированно обнаружит при заданной мощности. Выбирается из бизнес-логики: какой прирост метрики оправдает затраты на внедрение фичи? Если разработка фичи стоила две недели работы команды, а прирост конверсии в 0.1 п.п. принесёт 1 000 рублей в месяц — нет смысла ставить MDE = 0.1 п.п. и ждать тест полгода. Ставьте MDE на уровне, при котором эффект реально окупится.
«Почему уменьшение MDE вдвое увеличивает выборку вчетверо?»
Потому что в формуле MDE стоит в знаменателе в квадрате: n ~ 1 / delta^2. Это следствие того, что стандартная ошибка убывает как 1 / sqrt(n). Чтобы обнаружить вдвое меньший эффект с той же точностью, стандартная ошибка должна быть вдвое меньше, а для этого n должно вырасти в четыре раза.
«Что делать, если трафика не хватает на тест с нужным MDE?»
Несколько вариантов: (1) увеличить MDE — договориться с бизнесом, что мелкие эффекты не ловим; (2) снизить дисперсию методами вроде CUPED или стратификации; (3) использовать более чувствительную метрику (например, вместо конверсии в покупку — конверсию в добавление в корзину); (4) увеличить долю трафика в эксперименте; (5) объединить результаты нескольких похожих экспериментов (meta-analysis).
«Мощность 80% — это мало? Почему не 95%?»
80% — устоявшийся стандарт, баланс между надёжностью и практичностью. Переход с 80% до 90% увеличивает выборку на ~30%, до 95% — почти вдвое. В большинстве продуктовых экспериментов 20% шанс пропустить реальный эффект — приемлемый компромисс. Но для критичных решений (редизайн checkout, изменение ценовой модели) стоит брать 90%.
«Почему нельзя просто запустить тест и остановить, когда p-value станет значимым?»
Потому что при многократной проверке (peeking) вероятность ложного срабатывания растёт. Если проверять p-value каждый день в течение двух недель, реальный уровень alpha достигнет 20–30% вместо заявленных 5%. Фиксированный размер выборки — защита от этой проблемы. Альтернатива — sequential testing с границами O'Brien-Fleming или always-valid p-values, но это отдельная тема.
Потренируйтесь решать задачи по A/B-тестам и статистике в Карьернике — тренажёре для подготовки к собеседованиям аналитиков.
FAQ
Как рассчитать размер выборки для A/B-теста?
Нужно зафиксировать четыре параметра: уровень значимости (обычно 0.05), мощность (обычно 0.80), базовое значение метрики и минимальный детектируемый эффект (MDE). Подставьте их в формулу или используйте калькулятор в Python (statsmodels). Размер выборки зависит квадратично от MDE.
Что такое MDE и как его выбрать?
MDE (Minimum Detectable Effect) — наименьший размер эффекта, который тест гарантированно обнаружит. Выбирается из бизнес-логики: какой прирост метрики оправдает затраты на внедрение фичи. Чем меньше MDE, тем больше нужна выборка — уменьшение MDE вдвое увеличивает выборку вчетверо.
Почему уменьшение MDE вдвое требует вчетверо большей выборки?
Потому что в формуле MDE стоит в знаменателе в квадрате: n ~ 1/delta^2. Стандартная ошибка убывает как 1/sqrt(n), поэтому для обнаружения вдвое меньшего эффекта стандартная ошибка должна быть вдвое меньше, а для этого n должно вырасти в четыре раза.
Что делать, если трафика не хватает для A/B-теста с нужным MDE?
Несколько вариантов: увеличить MDE (договориться с бизнесом), снизить дисперсию через CUPED или стратификацию, использовать более чувствительную метрику (например, конверсию в корзину вместо конверсии в покупку), увеличить долю трафика в эксперименте.