Что такое байесовская статистика

Коротко

Два подхода к статистике:

  • Частотный (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 — средний вариант.