Bayesian AB testing: альтернатива frequentist подходу
Два подхода к AB-тестированию
Классический (frequentist) и байесовский — два философских подхода к статистике. Оба применимы к AB-тестам, но отвечают на разные вопросы.
Frequentist. «Какова вероятность увидеть такую разницу, ЕСЛИ гипотеза H0 верна?» (p-value).
Bayesian. «Какова вероятность, что B лучше A, УЧИТЫВАЯ данные?» (posterior probability).
Второй вопрос ближе к тому, что хочет знать бизнес. Но bayesian требует более сложной математики и осознанного выбора «prior».
Как работает Bayesian AB testing
Процесс:
- Задаём prior. Начальные верования о параметрах (conversion rate) до начала теста.
- Собираем данные. Наблюдения за тестом.
- Обновляем beliefs. Комбинируем prior и data → posterior distribution.
- Принимаем решение. На основе posterior distribution.
Вместо точечной оценки получаем распределение. Это богаче информационно.
Prior — что это
Prior — distribution, отражающее знание о параметре до эксперимента.
Типы:
Uninformative prior. Flat distribution (uniform). Говорит «не знаю ничего про parameter». Data полностью driven posterior.
Weakly informative. Широкое distribution с небольшим предпочтением. Например, Beta(1, 1) для conversion rate — uniform.
Informative. Строится на исторических данных. Если исторический conversion rate 3-5%, задаём Beta(30, 700) — concentrates around 4%.
Informative prior сокращает время теста (меньше данных нужно), но если неправильный — искажает результат.
Beta-Binomial модель
Стандартная модель для conversion rate AB-теста.
Prior для conversion rate: Beta(α, β).
Данные: n трайалов, k успехов (Binomial).
Posterior: Beta(α + k, β + n - k).
Красота: posterior — та же семья, что prior. Можно легко считать вероятности и updates.
Пример:
- Prior Beta(1, 1) — uninformative
- Group A: 100 юзеров, 5 конверсий → posterior Beta(6, 96)
- Group B: 100 юзеров, 8 конверсий → posterior Beta(9, 93)
Теперь можем спросить: «какая probability, что B > A?» — посчитать через sampling.
SQL и Python для Bayesian AB
В Python:
import numpy as np
from scipy.stats import beta
# Данные
a_trials, a_conversions = 1000, 50
b_trials, b_conversions = 1000, 65
# Uninformative prior Beta(1, 1)
a_posterior = beta(1 + a_conversions, 1 + a_trials - a_conversions)
b_posterior = beta(1 + b_conversions, 1 + b_trials - b_conversions)
# Sampling для оценки P(B > A)
n_samples = 100000
a_samples = a_posterior.rvs(n_samples)
b_samples = b_posterior.rvs(n_samples)
p_b_better = (b_samples > a_samples).mean()
print(f"P(B > A): {p_b_better:.3f}")
# Expected uplift
uplift = (b_samples - a_samples) / a_samples
print(f"Expected uplift: {uplift.mean():.1%}")
print(f"95% credible interval: [{np.percentile(uplift, 2.5):.1%}, {np.percentile(uplift, 97.5):.1%}]")Получаем прямую вероятность и credible interval для uplift.
Credible Interval vs Confidence Interval
Два concepts легко спутать.
Confidence Interval (frequentist). «Если повторить эксперимент 100 раз, 95% CI содержат истинное значение». НЕ «95% вероятность, что истинное значение в этом CI».
Credible Interval (bayesian). «95% вероятность, что истинное значение находится в этом interval, учитывая данные». Прямая интерпретация.
Bayesian ответ — тот, который интуитивно нужен. Frequentist ответ часто неправильно интерпретируют.
Decision framework
Bayesian подход даёт гибкие правила решений.
Probability to beat baseline. «B лучше A с вероятностью 95%+ → запускаем B».
Expected loss. Насколько вы рискуете выбрать hudje option. «Если выбираем A вместо B, теряем в среднем 0.3% conversion rate». Если loss threshold < X → решаем.
Credible interval width. Если CI очень широкий (много uncertainty), может стоить подождать.
Frequentist traditionally использует только p-value. Bayesian предоставляет больше данных для решения.
Преимущества Bayesian подхода
Интуитивная интерпретация. «Вероятность 94%, что B лучше» — ясно. «p-value 0.06» — требует объяснения.
Нет необходимости в предустановленном sample size. Можете monitoring posterior и остановиться когда уверены. Это peeking в frequentist запрещён, в bayesian допустим (если правильно делать).
Inclusion prior knowledge. Если есть исторические данные о conversion rate — используйте. Ускоряет тесты.
Multi-arm bandits. Bayesian natural для bandits (динамическое распределение трафика к лучшим вариантам).
Small sample sizes. Бывают ситуации с малыми данными (enterprise AB с 50 клиентами). Frequentist не работает, bayesian может дать полезный вывод.
Недостатки
Subjective prior. Два analysts с разными priors → разные выводы. Прозрачность priors важна.
Computational cost. Для сложных моделей (hierarchical, continuous outcomes) нужен MCMC sampling. Медленно.
Organisational readiness. Многие stakeholders обучены думать в frequentist категориях. Bayesian reports требуют education.
Risk misuse. «Мы остановим тест когда probability > 90%» — звучит ok, но без proper decision framework можно накручивать false positives.
Sequential testing
Bayesian natural для sequential testing — проверяете результаты по мере поступления данных и можете остановиться рано.
Frequentist требует корректировок (alpha spending) для peeking. Bayesian естественно работает, если prior правильно задан и используется proper stopping rule (expected loss, probability thresholds).
Это огромное practical преимущество — сокращает время тестов в 30-50%.
Продвинутая статистика для AB-тестов — senior-level skill для аналитика. В тренажёре Карьерник есть задачи по AB-тестам, bayesian методам и статистике.
Hierarchical Bayesian models
Для сложных случаев — иерархические модели. Пример: AB-тест по нескольким segments (web, iOS, android).
Классический подход: считать для каждого сегмента отдельно → мало данных в каждом.
Hierarchical bayesian: моделирует sub-populations совместно, «заимствуя силу» (partial pooling). Segments влияют друг на друга через общий prior.
Результат: более точные оценки для каждого сегмента, особенно малых.
Библиотеки: PyMC, Stan (через CmdStanPy), Bambi.
Когда использовать Bayesian
Хорошие кейсы:
- Небольшие sample sizes (важен prior).
- Ранние decisions без полного теста (peek-and-stop).
- Multi-arm bandits или continuous optimization.
- Есть хорошие исторические данные.
- Business хочет «probability B лучше» — прямой ответ.
Frequentist остаётся лучше когда:
- Регуляторные требования (pharmaceuticals).
- Большой объём данных и стандартные experiments.
- Нет хорошего prior knowledge.
- Команда уже attuned к p-values.
Online tools
Сервисы с Bayesian AB:
- VWO SmartStats — proprietary bayesian.
- Dynamic Yield, Optimizely — offer bayesian mode.
- Bayesian inference calculator — free online для простых cases.
- Statsig — modern experimentation platform с bayesian методами.
Многие custom in-house AB-платформы крупных компаний (Booking, Airbnb) дрейфуют к bayesian.
Типичные ошибки
Choosing overly informative priors. Prior должен «побеждаться» данными при large sample. Если посты-posterior отличается от prior — prior слишком strong.
Not reporting priors. При шаринге результатов — транспарентно указать prior, чтобы другие могли воспроизвести.
Stopping for positive results only. «Остановимся когда P(B > A) > 95%, иначе продолжим». Это asymmetric stopping rule → biased. Нужно думать о loss и cost обеих decisions.
Mixing p-values and bayesian. Репортить оба «для надёжности» — создаёт confusion. Выберите один подход и придерживайтесь.
Читайте также
FAQ
Bayesian тест заменит классический?
В долгосрочной перспективе вероятно да, особенно в tech. В medical и regulated industries frequentist остаётся dominant.
Какой prior выбрать для conversion rate?
Beta(1, 1) — uninformative. Если есть исторические — Beta, соответствующая историческому mean conversion rate с variance, отражающим неопределённость.
Нужен ли data scientist?
Для простых Beta-Binomial — нет. Для hierarchical моделей или custom likelihoods — да.
Bayesian тест считать ещё дольше?
Нет. Часто короче благодаря early stopping. Computation per update — быстрее чем running full frequentist test.