Что такое байесовская статистика
Коротко
Два подхода к статистике:
- Частотный (frequentist) — «какова вероятность данных при верной гипотезе». Это p-value и обычные A/B.
- Байесовский (bayesian) — «какова вероятность гипотезы при данных». Более интуитивно.
Байесовский подход используется реже, но отвечает на более полезные вопросы.
Ключевая формула (без пугания)
Теорема Байеса:
P(гипотеза | данные) = P(данные | гипотеза) × P(гипотеза) / P(данные)Или словами:
Posterior = Likelihood × Prior / EvidenceЧто это значит
- Prior — что мы знали до эксперимента.
- Likelihood — насколько данные согласуются с гипотезой.
- Posterior — что мы знаем после эксперимента (обновлённое prior).
Классический vs байесовский ответ
Вопрос: новая кнопка увеличивает конверсию?
Классический
«p-value = 0.02. Если бы не было эффекта, такое или большее наблюдалось в 2% случаев. Отвергаем H0.»
Не очень интуитивно.
Байесовский
«P(лифт > 0 | данные) = 95%. С вероятностью 95% кнопка повышает конверсию.»
Легче объяснить PM.
Prior — что это
Prior — ваше предварительное мнение о гипотезе.
Uninformative prior
«Знаем, что конверсия между 0% и 100%, без предпочтений». Результат = классический.
Informative prior
«По прошлому опыту знаем, что конверсия обычно 3-8%». Результат учитывает опыт.
Примеры
- Новая категория продукта: uninformative (нет данных).
- Оптимизация страницы: informative (знаем historic conv).
Больше таких примеров с разборами — в Telegram-тренажёре. Короткие сессии, прогресс по темам, объяснения после каждого ответа.
Применения в аналитике
1. Bayesian A/B тест
Вместо p-value — распределение эффекта:
import pymc as pm
with pm.Model() as model:
# Prior: бета-распределение (для пропорций)
p_control = pm.Beta('p_control', alpha=1, beta=1)
p_test = pm.Beta('p_test', alpha=1, beta=1)
# Likelihood: реальные данные
obs_control = pm.Binomial('obs_c', n=1000, p=p_control, observed=50)
obs_test = pm.Binomial('obs_t', n=1000, p=p_test, observed=60)
# Sampling posterior
trace = pm.sample(5000)
# Вероятность, что test лучше control
prob_test_better = (trace.posterior['p_test'] > trace.posterior['p_control']).mean()
print(f'P(test > control) = {prob_test_better:.2%}')
# 89%
2. Expected loss
Сколько мы можем потерять, если ошибёмся?
loss_if_wrong = (trace.p_control - trace.p_test).clip(0).mean()Позволяет решение принимать не через «значимо/не значимо», а через risk.
3. Prior expertise
Если у вас есть industry knowledge — включайте в prior:
# Знаем, что лифты обычно 1-5%
prior_lift = pm.Normal('lift', mu=0.03, sigma=0.02)Экономит данные — не надо начинать «с нуля».
Плюсы байеса
1. Интуитивный ответ
«P(H) = X%» вместо «p-value = Y».
2. Sequential analysis
Можно смотреть результаты во время теста без peeking problem.
3. Prior knowledge
Включать предыдущий опыт.
4. Decision-theoretic
Напрямую считает expected loss / gain.
Минусы
1. Сложнее
Prior, likelihood, posterior — concepts нужно понять.
2. Требует больше compute
MCMC sampling медленнее classical.
3. Не стандарт индустрии
Большинство команд используют classical. Байес — редкость.
4. Субъективность prior
«Какой prior выбрать?» — иногда arbitrary.
5. Tooling меньше развит
Statsmodels, scipy — classical. Для Байеса — PyMC, Stan, сложнее.
Где используется
Продуктовые компании
- Booking — Bayesian A/B для оптимизации.
- Netflix — для рекомендаций.
- Medical / Pharma — clinical trials.
В российских компаниях используется реже. Исключения: Яндекс, Сбер AI.
Conjugate priors
Простая математика для базовых случаев:
| Данные | Prior | Posterior |
|---|---|---|
| Бинарные (conversion) | Beta | Beta |
| Счётчики | Gamma | Gamma |
| Normal | Normal | Normal |
Позволяет считать без MCMC — формулой.
Bayesian A/B на калькуляторе
# Control: 50 converted из 1000
# Test: 60 из 1000
# Beta(1, 1) uniform prior
# Posterior: Beta(1 + convers, 1 + fails)
from scipy.stats import beta
alpha_c, beta_c = 1 + 50, 1 + 950
alpha_t, beta_t = 1 + 60, 1 + 940
# Sample from posterior
import numpy as np
samples_c = beta.rvs(alpha_c, beta_c, size=100000)
samples_t = beta.rvs(alpha_t, beta_t, size=100000)
prob_test_better = (samples_t > samples_c).mean()
print(f'P(test > control) = {prob_test_better:.1%}')Если готовишься к собесу — бот @kariernik_bot закрывает 80% технических вопросов. SQL, Python, A/B, продуктовые метрики — всё в одном месте.
Нужно ли аналитику
Junior
Нет. Classical достаточно.
Middle
Базовое понимание — полезно для собеседования.
Senior / DS-adjacent
Да. Особенно если компания использует Bayesian или Sequential testing.
Продуктовый в Авито/Яндексе
Да. Используют в некоторых командах.
На собеседовании
Вопросы:
- «В чём отличие Bayesian от classical?»
- «Что такое prior?»
- «Зачем Bayesian A/B?»
- «Можно ли останавливать тест досрочно?» (Bayesian — да).
Не ждут глубокого понимания — но узнавать понятие должны.
Читайте также
FAQ
PyMC или Stan?
PyMC (Python-native). Stan — более production. Для аналитика PyMC достаточно.
Bayesian обязательно для A/B?
Нет. Classical — стандарт. Bayesian — продвинуто.
Sequential analysis — это Bayes?
Не обязательно. Есть frequentist sequential methods (always-valid inference).
Как выбрать prior?
Uninformative — если нет знаний. Historic — если есть. Weakly informative — средний вариант.