← Назад к вопросам

Расскажите про Bayesian vs Frequentist подходы в A/B тестировании.

2.3 Middle🔥 121 комментариев
#A/B тестирование#Статистика и математика

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 (ложноположительные результаты)

Процесс:

  1. Определи нулевую гипотезу: тест = контроль
  2. Собери данные
  3. Рассчитай p-value
  4. Если p < 0.05, отверни нулевую гипотезу
  5. Вывод: результаты статистически значимы

Пример интерпретации:

P-value = 0.03

НЕПРАВИЛЬНО: Вероятность, что тест лучше = 97% (НЕВЕРНО!)
ПРАВИЛЬНО: Если нулевая гипотеза верна, вероятность получить такие
даные только 3%. Это редко, поэтому отвергаем нулевую гипотезу.

Плюсы:

  • Простой и традиционный
  • Хорошо известен
  • Контролирует Type I error
  • Объективен (не требует prior)

Минусы:

  • P-value часто неправильно интерпретируется
  • Требует фиксированный размер выборки
  • Нельзя останавливать тест рано (peeking)
  • Не говорит о вероятности, что тест лучше
  • Multiple testing проблема

Bayesian подход

Определение:

  • Обновляем распределение вероятностей (posterior) на основе данных
  • Ответ: вероятность что гипотеза верна (не p-value!)
  • Гибкий размер выборки
  • Принимает prior информацию

Процесс:

  1. Определи prior: что ты думаешь до эксперимента
  2. Собери данные (можешь останавливать рано)
  3. Обнови posterior на основе данных
  4. Вывод: вероятность что тест лучше контроля = 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 не война, это выбор инструмента для конкретной задачи.