Почему мы перешли на байесовское A/B-тестирование
За 2024 год команда прогнала 127 экспериментов. 34 показали раннюю значимость, а потом разворачивались при достижении планового размера выборки. Цена — отложенные запуски, разочарованные стейкхолдеры и creeping-недоверие к данным. Эта заметка — decision-log: почему ушли от частотного p-value к байесовскому выводу.
Проблема peeking
Классический частотный подход предполагает фиксированный размер выборки, заданный до старта эксперимента. Каждый раз, когда вы заглядываете в результаты до достижения этого размера, вы раздуваете ошибку I рода. На практике это значит: «p < 0.05 на половине выборки» — не доказательство, а лотерея.
Мы пробовали sequential testing с границами О’Брайена–Флеминга. Это помогает, но математика непрозрачна для продакт-менеджеров: «почему сейчас p < 0.05, а остановить нельзя?» — объяснить трудно.
Байесовская альтернатива
Байесовский вывод отвечает не «есть ли эффект», а «насколько вероятно, что эффект положительный». Это переформулирование меняет коммуникацию с продактом.
Ключевая метрика — Probability of Direction (PoD): вероятность, что лечение лучше контроля. PoD = 0,97 читается как «с вероятностью 97% вариант B лучше». Продакт понимает это без курса статистики.
Минимальный пример на PyMC — сравнение двух конверсий через бета-приоры:
import pymc as pm
import arviz as az
# Успехи и попытки по группам
ctrl_s, ctrl_n = 320, 5000
trt_s, trt_n = 380, 5000
with pm.Model() as m:
# Бета-приоры — равномерные, без сильных предположений
p_ctrl = pm.Beta("p_ctrl", alpha=1, beta=1)
p_trt = pm.Beta("p_trt", alpha=1, beta=1)
# Правдоподобия — биномиальные
pm.Binomial("y_ctrl", n=ctrl_n, p=p_ctrl, observed=ctrl_s)
pm.Binomial("y_trt", n=trt_n, p=p_trt, observed=trt_s)
# Разница и вероятность, что она положительная
delta = pm.Deterministic("delta", p_trt - p_ctrl)
trace = pm.sample(2000, tune=1000, random_seed=42)
# Probability of Direction
pod = (trace.posterior["delta"] > 0).mean()
print(f"PoD = {float(pod):.3f}")
az.summary(trace) покажет апостериорные средние, HDI и вероятность направления. Главное — апостериор обновляется плавно при добавлении данных, без порогов «значим/не значим».
На практике
В проекте volta-banking — A/B-тест прогресс-бара в KYC — я использовал частотный подход: chi-square test на завершение KYC, MDE +5 пп, α = 0,05, power = 80%, длительность 28 дней, фиксированный размер выборки. Плюс bootstrap 95% CI для разницы конверсий. Результат: +4,82 пп, p < 0,0001, эффект подтверждён на 7 из 11 сегментов.
Почему не Bayesian в том конкретном тесте:
- MDE и размер выборки были заранее согласованы со стейкхолдерами — peeking исключён процедурно, не статистически.
- Один первичный критерий, короткая длительность — частотный тест быстрее и понятнее команде.
- Bootstrap CI дал бизнес-читаемую оценку эффекта без MCMC.
Где Bayesian был бы честнее:
- Длинные эксперименты, где стейкхолдеры заглядывают каждую неделю — peeking неизбежен, PoD устойчив к досмотрным проверкам.
- Несколько связанных метрик — байесовская иерархическая модель учитывает их вместе, без поправок Бонферрони.
- Ранние стопы — когда нужно решить «продолжать ли» до планового конца, posterior даёт вероятность эффекта прямо сейчас.
В обоих случаях главное — не метод, а дисциплина: заранее зафиксируйте гипотезу, первичную метрику, MDE, длительность. Без этого и Bayesian не спасёт.
На собеседовании
❓ Чем Bayesian A/B-тестирование отличается от частотного на уровне вопроса, на который отвечает каждый метод?
Частотный отвечает «какова вероятность увидеть такие или более экстремальные данные при условии, что нулевая гипотеза верна» — это p-value, он не говорит о вероятности гипотезы. Байесовский отвечает «какова вероятность, что эффект положительный, учитывая данные и приоры» — это прямое высказывание о параметре. Разница фундаментальна: p-value про данные при фиксированной гипотезе, posterior про гипотезу при фиксированных данных.
— Nikita Boyarkin
❓ Что такое peeking и почему он раздувает ошибку I рода?
Peeking — многократная проверка p-value до планового размера выборки. При α = 0,05 каждая проверка даёт 5% шанс ложноположительного при верной нулевой гипотезе. При k проверках вероятность хотя бы одного ложного срабатывания растёт как 1 − (1 − α)^k — при 10 проверках это ~40%. Решения: фиксированный размер выборки и решение по факту достижения, sequential testing с поправленными границами (О’Брайен–Флеминг, alpha-spending), или Bayesian posterior, который корректно обновляется при досмотре.
— Nikita Boyarkin
❓ Как выбрать приор для байесовского A/B-теста и что будет при слабых данных?
Слабые данные — мало наблюдений или редкое событие. Приор тогда определяет вывод. Бета(1,1) — равномерный, неинформативный, безопасный старт. Если есть историческая конверсия — берите информативный приор (например, Beta с mean = исторической конверсии). Антипаттерн — очень узкий сильный приор на малых данных: он задавит наблюдения. Правило: при малой выборке явно указывайте приор и делайте sensitivity-анализ (проверьте вывод при двух разных приорах).
— Nikita Boyarkin
❓ В каких случаях Bayesian A/B-тестирование проигрывает частотному?
- Фиксированный размер выборки согласован заранее — если MDE, длительность и критерий остановки утверждены до старта, частотный тест проще и дешевле в расчётах.
- Один первичный критерий, короткий эксперимент — классический z/χ²-тест не требует MCMC-сэмплирования и понятен любому DS без байесовского бэкграунда.
- Регуляторные / аудиторские требования — в некоторых отраслях (фарма, финтех с надзором) частотный подход остаётся стандартом де-факто, и Bayesian posterior может не пройти validation.
- Прозрачность power-анализа — для частотного теста power и MDE считаются аналитически; для байесовского — через симуляции, что сложнее коммуницировать.
Итог: Bayesian — не серебряная пуля, а инструмент для сценариев с peeking, множественными метриками и потребностью в интерпретируемости для non-technical стейкхолдеров.
— Nikita Boyarkin
Заключение
Переход на байесовский вывод не отменяет дисциплину эксперимента, но меняет язык, на котором data science говорит с продуктом. Вместо «p < 0,05 — значимо, p ≥ 0,05 — не значимо» появляется континуум вероятностей, устойчивый к досмотрам и понятный без курса статистики.
| Критерий | Частотный подход | Байесовский подход |
|---|---|---|
| Вопрос | Какова вероятность таких данных при H₀? | Какова вероятность эффекта при данных? |
| Устойчивость к peeking | Низкая (раздувает α) | Высокая (posterior обновляется корректно) |
| Интерпретация для продакта | p-value, доверительные интервалы | PoD, HDI, вероятность эффекта |
| Множественные метрики | Поправки (Бонферрони, FDR) | Иерархические модели без поправок |
| Ранняя остановка | Sequential testing + границы | Posterior на текущих данных |
| Вычислительная сложность | Низкая (аналитические формулы) | Средняя (MCMC / variational inference) |
| Power-анализ | Аналитический | Через симуляции |
Когда что выбирать:
- Bayesian — длинные эксперименты, peeking неизбежен, несколько связанных метрик, нужна бизнес-интерпретация «с вероятностью X%».
- Frequentist — короткий тест с одним критерием, MDE согласован, регуляторные требования, команда без байесовского опыта.
В обоих случаях главное — гипотеза, первичная метрика и размер эффекта, зафиксированные до старта. Без этого ни p-value, ни posterior не спасут.