Bayesian AB testing: альтернатива frequentist подходу
alpha spending?Два подхода к AB-тестированию
Классический (frequentist) и байесовский — два философских подхода к статистике. Оба применимы к AB-тестам, но отвечают на разные вопросы.
Frequentist. «Какова вероятность увидеть такую разницу, ЕСЛИ гипотеза H0 верна?» (p-value).
Bayesian. «Какова вероятность, что B лучше A, УЧИТЫВАЯ данные?» (апостериорная вероятность).
Второй вопрос ближе к тому, что хочет знать бизнес. Но байесовский подход требует более сложной математики и осознанного выбора «приора».
Как работает Bayesian AB testing
Процесс:
- Задаём приор. Начальные убеждения о параметрах (conversion rate) до начала теста.
- Собираем данные. Наблюдения за тестом.
- Обновляем убеждения. Комбинируем приор и данные → апостериорное распределение.
- Принимаем решение. На основе апостериорного распределения.
Вместо точечной оценки получаем распределение. Это богаче информационно.
Prior — что это
Приор — распределение, отражающее знание о параметре до эксперимента.
Типы:
Uninformative prior. Плоское распределение (uniform). Говорит «не знаю ничего про параметр». Апостериорное полностью определяется данными.
Weakly informative. Широкое распределение с небольшим предпочтением. Например, Beta(1, 1) для conversion rate — uniform.
Informative. Строится на исторических данных. Если исторический conversion rate 3-5%, задаём Beta(30, 700) — концентрируется около 4%.
Информативный приор сокращает время теста (меньше данных нужно), но если неправильный — искажает результат.
Beta-Binomial модель
Стандартная модель для conversion rate в AB-тесте.
Приор для conversion rate: Beta(α, β).
Данные: n испытаний, k успехов (Binomial).
Апостериорное: Beta(α + k, β + n - k).
Красота: апостериорное — та же семья, что и приор. Можно легко считать вероятности и обновления.
Пример:
- Приор Beta(1, 1) — uninformative
- Группа A: 100 юзеров, 5 конверсий → апостериорное Beta(6, 96)
- Группа B: 100 юзеров, 8 конверсий → апостериорное Beta(9, 93)
Теперь можем спросить: «какая вероятность, что B > A?» — посчитать через сэмплирование.
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
Два понятия легко спутать.
Confidence Interval (frequentist). «Если повторить эксперимент 100 раз, 95% CI содержат истинное значение». НЕ «95% вероятность, что истинное значение в этом CI».
Credible Interval (bayesian). «95% вероятность, что истинное значение находится в этом интервале, учитывая данные». Прямая интерпретация.
Байесовский ответ — тот, который интуитивно нужен. Frequentist-ответ часто неправильно интерпретируют.
Правила принятия решений
Байесовский подход даёт гибкие правила решений.
Вероятность обогнать базовый вариант. «B лучше A с вероятностью 95%+ → запускаем B».
Ожидаемые потери. Насколько вы рискуете выбрать худший вариант. «Если выбираем A вместо B, теряем в среднем 0.3% conversion rate». Если потери ниже порога — решаем.
Ширина credible interval. Если CI очень широкий (много неопределённости), стоит подождать.
Frequentist традиционно использует только p-value. Байесовский подход предоставляет больше данных для решения.
Преимущества Bayesian-подхода
Интуитивная интерпретация. «Вероятность 94%, что B лучше» — ясно. «p-value 0.06» — требует объяснения.
Нет необходимости в фиксированном размере выборки. Можете отслеживать апостериорное и остановиться, когда уверены. Такое подсматривание (peeking) в frequentist запрещено, в bayesian допустимо (если правильно делать).
Использование априорных знаний. Если есть исторические данные о conversion rate — используйте. Ускоряет тесты.
Multi-arm bandits. Байесовский подход естественен для бандитов (динамическое распределение трафика к лучшим вариантам).
Малые выборки. Бывают ситуации с малыми данными (enterprise-AB с 50 клиентами). Frequentist не работает, байесовский может дать полезный вывод.
Недостатки
Субъективный приор. Два аналитика с разными приорами → разные выводы. Прозрачность приоров важна.
Вычислительная стоимость. Для сложных моделей (иерархических, с непрерывными исходами) нужен MCMC-сэмплинг. Медленно.
Готовность организации. Многие стейкхолдеры обучены думать в frequentist-категориях. Байесовские отчёты требуют обучения команды.
Риск неправильного использования. «Остановим тест когда probability > 90%» — звучит ок, но без правильного decision framework можно накручивать false positives.
Sequential testing
Байесовский подход естественен для последовательного тестирования — проверяете результаты по мере поступления данных и можете остановиться рано.
Frequentist требует корректировок (alpha spending) для подсматривания. Bayesian естественно работает, если приор правильно задан и используется корректное stopping rule (ожидаемые потери, пороги вероятности).
Это огромное практическое преимущество — сокращает время тестов на 30-50%.
Продвинутая статистика для AB-тестов — навык senior-аналитика. В тренажёре Карьерник есть задачи по AB-тестам, байесовским методам и статистике.
Иерархические байесовские модели
Для сложных случаев — иерархические модели. Пример: AB-тест по нескольким сегментам (web, iOS, Android).
Классический подход: считать для каждого сегмента отдельно → мало данных в каждом.
Иерархическая байесовская модель моделирует сегменты совместно, «заимствуя силу» (partial pooling). Сегменты влияют друг на друга через общий приор.
Результат: более точные оценки для каждого сегмента, особенно малых.
Библиотеки: PyMC, Stan (через CmdStanPy), Bambi.
Когда использовать Bayesian
Хорошие кейсы:
- Небольшие выборки (важен приор).
- Ранние решения без полного теста (peek-and-stop).
- Multi-arm bandits или непрерывная оптимизация.
- Есть хорошие исторические данные.
- Бизнес хочет «вероятность, что B лучше» — прямой ответ.
Frequentist остаётся лучше, когда:
- Регуляторные требования (фарма).
- Большой объём данных и стандартные эксперименты.
- Нет хороших априорных знаний.
- Команда уже привыкла к p-value.
Онлайн-инструменты
Сервисы с байесовским AB:
- VWO SmartStats — проприетарный байесовский движок.
- Dynamic Yield, Optimizely — предлагают байесовский режим.
- Bayesian inference calculator — бесплатный онлайн для простых кейсов.
- Statsig — современная экспериментальная платформа с байесовскими методами.
Многие кастомные in-house AB-платформы крупных компаний (Booking, Airbnb) дрейфуют к bayesian.
Типичные ошибки
Выбирать слишком информативные приоры. Приор должен «побеждаться» данными при большой выборке. Если апостериорное мало отличается от приора — приор слишком сильный.
Не указывать приоры. При шеринге результатов — прозрачно указать приор, чтобы другие могли воспроизвести.
Останавливаться только при положительных результатах. «Остановимся когда P(B > A) > 95%, иначе продолжим». Это асимметричное stopping rule → смещённые оценки. Нужно думать о потерях и стоимости обоих решений.
Смешивать p-value и bayesian. Репортить оба «для надёжности» — создаёт путаницу. Выберите один подход и придерживайтесь.
Читайте также
FAQ
Bayesian-тест заменит классический?
В долгосрочной перспективе вероятно да, особенно в tech. В медицине и регулируемых отраслях frequentist остаётся доминирующим.
Какой приор выбрать для conversion rate?
Beta(1, 1) — uninformative. Если есть исторические данные — Beta, соответствующая историческому среднему conversion rate с дисперсией, отражающей неопределённость.
Нужен ли data scientist?
Для простых Beta-Binomial — нет. Для иерархических моделей или кастомных likelihoods — да.
Bayesian-тест считать ещё дольше?
Нет. Часто короче благодаря ранней остановке. Вычисление на одно обновление — быстрее, чем прогон полного frequentist-теста.