Почему мы перешли на байесовское 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-тестирование проигрывает частотному?
  1. Фиксированный размер выборки согласован заранее — если MDE, длительность и критерий остановки утверждены до старта, частотный тест проще и дешевле в расчётах.
  2. Один первичный критерий, короткий эксперимент — классический z/χ²-тест не требует MCMC-сэмплирования и понятен любому DS без байесовского бэкграунда.
  3. Регуляторные / аудиторские требования — в некоторых отраслях (фарма, финтех с надзором) частотный подход остаётся стандартом де-факто, и Bayesian posterior может не пройти validation.
  4. Прозрачность 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 не спасут.

Смотрите также

← К статьям