Как рассчитать размер выборки для 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 или стратификацию, использовать более чувствительную метрику (например, конверсию в корзину вместо конверсии в покупку), увеличить долю трафика в эксперименте.