Частотный тест отвечает на вопрос «насколько странны такие данные, если эффекта нет». Бизнес обычно хочет услышать другое: «какова вероятность, что B лучше A». Байесовский подход отвечает именно на это, но платит за это априорным распределением и своими ловушками.
Формула Байеса
P(гипотеза | данные) = P(данные | гипотеза) · P(гипотеза) / P(данные)
- Априорное распределение (prior): что мы думали о параметре до данных.
- Правдоподобие (likelihood): насколько вероятны данные при каждом значении параметра.
- Апостериорное (posterior): обновлённое знание после данных.
Классическая задача на собесе: тест на болезнь с чувствительностью 99% и ложноположительными 5%, болезнь у 1% людей. Вероятность болезни при положительном тесте: 0.99·0.01 / (0.99·0.01 + 0.05·0.99) ≈ 0.167. Без учёта редкости болезни кажется, что 99%.
Конверсия: модель Beta-Binomial
Конверсия p неизвестна. Удобный prior: Beta(α, β). После k конверсий из n пользователей posterior тоже Beta:
Beta(α + k, β + n - k)
Это называется сопряжённостью: prior и posterior из одного семейства, считать можно на бумаге.
- Beta(1, 1) равномерный prior: «ничего не знаю».
- Среднее Beta(a, b) равно
a / (a + b), дисперсияa·b / ((a + b)² · (a + b + 1)). - Информативный prior из истории: если обычно конверсия около 5%, можно взять Beta(5, 95), это как «100 прошлых наблюдений».
Пример: prior Beta(1, 1), 30 покупок из 1000. Posterior Beta(31, 971), среднее 31/1002 ≈ 0.031.
Что считают в байесовском A/B
- P(B > A): вероятность, что конверсия B выше. Считают сэмплированием из двух posterior или нормальным приближением.
- Распределение эффекта
p_B - p_Aили относительного uplift и его достоверный интервал (credible interval): «с вероятностью 95% эффект между 0.2 и 1.1 п.п.». Именно такую фразу часто ошибочно говорят про частотный доверительный интервал. - Ожидаемые потери (expected loss): сколько в среднем потеряем, если выберем B, а лучше окажется A. Правило: выкатывать, когда ожидаемые потери ниже порога, который бизнес готов терпеть.
Сэмплирование в Python без библиотек:
import random
def prob_b_better(a1, b1, a2, b2, draws=100_000):
wins = sum(random.betavariate(a2, b2) > random.betavariate(a1, b1)
for _ in range(draws))
return wins / draws
Частотный и байесовский: отличия
| Частотный | Байесовский | |
|---|---|---|
| Параметр | фиксированный, неизвестный | случайная величина |
| Результат | p-value, доверительный интервал | posterior, P(B > A), достоверный интервал |
| Prior | нет | нужен |
| Интерпретация | через повторение эксперимента | прямая вероятность утверждения |
При большой выборке и слабом prior выводы обычно совпадают: posterior почти целиком определяется данными.
Мифы
- «Байесовскому тесту не страшно подглядывание». Апостериорное распределение корректно в любой момент, но если правило «останавливаемся, как только P(B > A) > 95%», то при нулевом эффекте ложных выкаток будет больше, чем при одной проверке. Правило остановки всё равно надо продумывать.
- «Не нужен размер выборки». Нужен: без достаточных данных posterior широкий, и решение будет случайным.
- «P(B > A) = 95% значит p-value 0.05». Это разные величины с разным смыслом.
- Prior можно подобрать как угодно. Prior фиксируют до теста, иначе это подгонка. Сильный prior заметно тянет результат на малых выборках.
Что спросят на собесе
- Чем байесовский подход отличается от частотного?
- Как обновляется Beta-prior после наблюдения конверсий?
- Что такое P(B > A) и expected loss?
- Чем credible interval отличается от confidence interval?
- Правда ли, что в байесовском тесте можно подглядывать?