Расскажите про Bayesian vs Frequentist подходы в A/B тестировании.
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Bayesian vs Frequentist подходы в A/B тестировании
Это фундаментальное различие в статистической философии, которое напрямую влияет на то, как мы проводим и интерпретируем эксперименты. Выбор подхода определяет, во что мы верим и как принимаем решения.
Основные различия
Frequentist подход (классический)
Философия: P-value это вероятность получить такие или более экстремальные данные, если нулевая гипотеза верна
Код:
from scipy import stats
# Frequentist A/B test
control_conversions = 50
control_users = 1000
test_conversions = 65
test_users = 1000
# Тест пропорций
stat, p_value = stats.chi2_contingency(
[[control_conversions, control_users - control_conversions],
[test_conversions, test_users - test_conversions]]
)
if p_value < 0.05:
print(f"Результат значимый (p={p_value:.3f})")
else:
print(f"Нет статистической значимости (p={p_value:.3f})")
Bayesian подход
Философия: Обновляем наше убеждение о вероятности, что один вариант лучше другого, основываясь на данных
Код:
from scipy.stats import binom
import numpy as np
# Bayesian A/B test
# Начинаем с prior: 50-50 вероятность, что один лучше другого
control_conversions = 50
control_users = 1000
test_conversions = 65
test_users = 1000
# Используем Beta распределение для пропорций
control_posterior = binom(control_users, control_conversions / control_users)
test_posterior = binom(test_users, test_conversions / test_users)
# Вероятность, что тест лучше контроля
simulations = 100000
control_samples = np.random.binomial(1, control_conversions / control_users, simulations)
test_samples = np.random.binomial(1, test_conversions / test_users, simulations)
prob_test_better = (test_samples > control_samples).mean()
print(f"Вероятность, что тест лучше: {prob_test_better:.1%}")
if prob_test_better > 0.95:
print("Уверены на 95% что тест лучше")
Frequentist подход
Определение:
- P-value: вероятность получить данные при условии, что нулевая гипотеза верна
- Не говорит о вероятности гипотезы
- Фиксированный размер выборки
- Контролирует Type I error (ложноположительные результаты)
Процесс:
- Определи нулевую гипотезу: тест = контроль
- Собери данные
- Рассчитай p-value
- Если p < 0.05, отверни нулевую гипотезу
- Вывод: результаты статистически значимы
Пример интерпретации:
P-value = 0.03
НЕПРАВИЛЬНО: Вероятность, что тест лучше = 97% (НЕВЕРНО!)
ПРАВИЛЬНО: Если нулевая гипотеза верна, вероятность получить такие
даные только 3%. Это редко, поэтому отвергаем нулевую гипотезу.
Плюсы:
- Простой и традиционный
- Хорошо известен
- Контролирует Type I error
- Объективен (не требует prior)
Минусы:
- P-value часто неправильно интерпретируется
- Требует фиксированный размер выборки
- Нельзя останавливать тест рано (peeking)
- Не говорит о вероятности, что тест лучше
- Multiple testing проблема
Bayesian подход
Определение:
- Обновляем распределение вероятностей (posterior) на основе данных
- Ответ: вероятность что гипотеза верна (не p-value!)
- Гибкий размер выборки
- Принимает prior информацию
Процесс:
- Определи prior: что ты думаешь до эксперимента
- Собери данные (можешь останавливать рано)
- Обнови posterior на основе данных
- Вывод: вероятность что тест лучше контроля = 95%
Пример интерпретации:
Posterior probability = 0.97
Это значит: есть 97% вероятность, что тест действительно лучше контроля
(дано наши данные и наш prior)
Плюсы:
- Естественная интерпретация вероятностей
- Можешь останавливать тест рано (sequential testing)
- Можешь использовать предыдущие данные (prior)
- Ответ прямой: вероятность что один лучше другого
- Хорош для multiple testing
Минусы:
- Выбор prior может быть субъективным
- Более сложные вычисления
- Требует дополнительного контроля (регуляризация)
- Может быть смещен, если prior неправильный
Сравнение на примере
Сценарий: Тестируем кнопку (контроль) vs новая кнопка (тест)
Данные:
Контроль: 100 из 2000 = 5% конверсия
Тест: 120 из 2000 = 6% конверсия
FREQUENTIST подход:
P-value = 0.08
Вывод: Не значимо (p > 0.05), хотя есть числовой рост
BAYESIAN подход:
Prior: 50-50 (не знаем разницы)
Posterior: 72% вероятность что тест лучше
Вывод: 72% уверены что тест лучше
Какой подход выбрать?
- Frequentist: консервативен, хочешь убедиться что результат не случайность
- Bayesian: более гибкий, хочешь вероятность и можешь раньше закончить
Практический пример: Sequential Testing (только Bayesian)
import numpy as np
from scipy.stats import beta
def bayesian_sequential_test(control_clicks, control_total,
test_clicks, test_total,
threshold=0.95):
"""
Sequential Bayesian A/B test с ранней остановкой
"""
# Prior: Beta(1, 1) = uniform distribution
prior_alpha = 1
prior_beta_val = 1
# Posterior для контроля
control_post_alpha = prior_alpha + control_clicks
control_post_beta = prior_beta_val + control_total - control_clicks
# Posterior для теста
test_post_alpha = prior_alpha + test_clicks
test_post_beta = prior_beta_val + test_total - test_clicks
# Симуляция: какой вариант лучше
samples = 100000
control_samples = np.random.beta(control_post_alpha, control_post_beta, samples)
test_samples = np.random.beta(test_post_alpha, test_post_beta, samples)
prob_test_better = (test_samples > control_samples).mean()
if prob_test_better >= threshold:
return 'STOP: Test wins', prob_test_better
elif prob_test_better <= (1 - threshold):
return 'STOP: Control wins', 1 - prob_test_better
else:
return 'CONTINUE: Need more data', prob_test_better
# Дневной мониторинг
for day in range(1, 8):
control_clicks = 5 * day
control_total = 100 * day
test_clicks = 6 * day
test_total = 100 * day
result, prob = bayesian_sequential_test(control_clicks, control_total,
test_clicks, test_total)
print(f"День {day}: {result} (P(Test>Control) = {prob:.1%})")
Выбор для Product Team
Используй FREQUENTIST если:
- Регуляторные требования (pharma, finance)
- Высокий cost of false positive
- Простота важна
- Известен размер выборки заранее
Используй BAYESIAN если:
- Хочешь раньше закончить тест
- Есть информация из прошлых тестов
- Нужна вероятность, а не p-value
- Гибкость в размере выборки важна
- Много A/B тестов одновременно
Практический пример с реальными данными
-- Bayesian анализ в SQL
WITH ab_data AS (
SELECT
variant,
COUNT(*) as total_users,
SUM(CASE WHEN converted THEN 1 ELSE 0 END) as conversions
FROM users
WHERE test_id = 'payment_test'
GROUP BY variant
)
SELECT
variant,
conversions,
total_users,
ROUND(conversions * 100.0 / total_users, 2) as conversion_rate,
-- Для Bayesian анализа нужно перейти в Python
'See Python script for Bayesian posterior' as note
FROM ab_data;
Потом в Python:
from scipy.stats import beta
data = {
'control': {'conversions': 50, 'total': 1000},
'test': {'conversions': 65, 'total': 1000}
}
# Beta posterior
for variant, d in data.items():
alpha = 1 + d['conversions']
beta_val = 1 + d['total'] - d['conversions']
mean = alpha / (alpha + beta_val)
std = np.sqrt(alpha * beta_val / ((alpha + beta_val)**2 * (alpha + beta_val + 1)))
print(f"{variant}: {mean:.3f} +/- {std:.3f}")
Чек-лист выбора подхода
- Требования к регуляции (Frequentist обычно)
- Стоимость ошибки Type I vs Type II
- Есть ли prior информация
- Нужна ли ранняя остановка
- Предпочтение команды
- Число одновременных тестов
- Требуемый размер выборки
Выбор Frequentist vs Bayesian не война, это выбор инструмента для конкретной задачи.