Перейти к содержимому

Байесовский подход к A/B-тестам: когда классика не работает

3 минуты чтения
Содержание

Частотная статистика отвечает на вопрос: «если гипотеза H0H_0 верна, насколько странные данные мы увидели?». Байесовская — на другой: «с какой вероятностью одно лучше другого, учитывая данные и то, что я знал заранее?». Это принципиально разные вопросы.

Теорема Байеса

Всё держится на одном тождестве:

P(θD)=P(Dθ)P(θ)P(D)P(\theta \mid D) = \frac{P(D \mid \theta) \cdot P(\theta)}{P(D)}

Где:

  • P(θ)P(\theta) — prior, что мы думали о параметре до данных,
  • P(Dθ)P(D \mid \theta) — likelihood, вероятность увидеть данные при данном θ\theta,
  • P(θD)P(\theta \mid D) — posterior, обновлённое мнение после данных.

В A/B-тесте θ\theta — конверсия группы. DD — число успехов и провалов.

Beta-Binomial: рабочая модель для конверсий

Если prior на конверсию — Beta(α,β)\text{Beta}(\alpha, \beta), а наблюдение — ss успехов из nn, то posterior имеет аккуратный вид:

θDBeta(α+s,  β+ns)\theta \mid D \sim \text{Beta}(\alpha + s, \; \beta + n - s)

Это сопряжённый prior: форма распределения не меняется, только параметры. Никаких интегралов руками.

Python (SciPy):

import numpy as np
from scipy.stats import beta

# Слабый prior (неинформативный): Beta(1, 1) = равномерное
alpha_prior, beta_prior = 1, 1

# A: 1040 конверсий из 10 000. B: 1120 из 10 000.
a_post = beta(alpha_prior + 1040, beta_prior + 10_000 - 1040)
b_post = beta(alpha_prior + 1120, beta_prior + 10_000 - 1120)

# P(B > A) через Monte Carlo
N = 200_000
samples_a = a_post.rvs(N)
samples_b = b_post.rvs(N)
prob_b_better = np.mean(samples_b > samples_a)
print(f"P(B > A) = {prob_b_better:.3f}")  # ~0.97

97% вероятности, что B лучше A. Это прямой ответ на вопрос продакта, без мысленных оборотов вокруг «отвергаем нулевую гипотезу».

Частотный vs байесовский: честное сравнение

СвойствоЧастотный подходБайесовский подход
Главный вопросP(DH0)P(D \mid H_0)P(θD)P(\theta \mid D)
Требует фиксированного nnДа (иначе peeking)Нет
Использует prior-знаниеНетДа, явно
Интерпретация неэкспертуСложнаяПростая («вероятность, что B лучше»)
Контроль ошибок I родаГарантирован α\alphaНе гарантирован в классическом виде
Вычислительная стоимостьНизкаяВыше (MCMC для сложных моделей)

Когда байес реально выигрывает

  1. Маленькие выборки. Prior стабилизирует оценку, не даёт дикие доверительные интервалы.
  2. Sequential decisions. Можно останавливаться, когда P(B>A)>0.95P(B > A) > 0.95, без штрафа за peeking.
  3. Сложные модели. Иерархические эффекты по сегментам в bayes — тривиальны, в частотной — кошмар.
  4. Решение через risk. Можно считать expected loss, если выберем неверный вариант:
Loss(A)=E[max(0,θBθA)]\text{Loss}(A) = \mathbb{E}[\max(0, \theta_B - \theta_A)]

Пока loss выше порога — продолжаем тест. Это работает ближе к тому, как продукт реально принимает решения.

Где ловушки

  • Plausible prior. Если prior неаккуратный (Beta(100,1)\text{Beta}(100, 1) без оснований), он будет доминировать. Делайте prior слабым, либо откровенно основанным на прошлых тестах.
  • P(B > A) — не вероятность релиза. 95% — это ещё не бинарное решение: учитывайте cost и reversibility.
  • Нет магии. Байес не создаёт информацию из ничего. Шумный эксперимент останется шумным.

Что читать дальше

  • Bayesian Data Analysis, Gelman et al. — справочник на всю жизнь.
  • Блог VWO и статьи Chris Stucchio — про практику в продукте.
  • PyMC или Stan — когда перерастёте Beta-Binomial.

Частотный подход проще в автоматизации и стандартизации, байесовский — честнее отвечает на бизнес-вопросы. В зрелой экспериментальной культуре живут оба.