Что такое peeking
Постоянная проверка результатов A/B и решение об остановке "когда p<0.05".
Проблема: если делаешь 10 проверок с alpha=0.05, real FPR около 30%.
Симуляция
import numpy as np
import scipy.stats as stats
n_simulations = 1000
peeking_fp = 0
for _ in range(n_simulations):
a = np.random.binomial(1, 0.05, 10000)
b = np.random.binomial(1, 0.05, 10000) # ИДЕНТИЧНЫ
for n in range(1000, 10001, 1000):
# check significance at this point
...
if p < 0.05:
peeking_fp += 1
break
print(f"FPR: {peeking_fp / n_simulations}")
# 28% вместо 5%
Решения
1. Fixed sample size
Заранее посчитай sample size, не смотри пока не наберётся.
2. Sequential testing
- mSPRT (Optimizely)
- Group Sequential Tests
3. Always-valid p-values
"Anytime-valid" подход.
4. Bayesian
Считай P(B лучше A | данные).
from scipy.stats import beta
posterior_a = beta(1 + conv_a, 1 + (n_a - conv_a))
posterior_b = beta(1 + conv_b, 1 + (n_b - conv_b))
samples_a = posterior_a.rvs(100000)
samples_b = posterior_b.rvs(100000)
prob_b_better = (samples_b > samples_a).mean()
Bonferroni для нескольких проверок
Если мониторишь 5 раз → alpha_adj = 0.05/5 = 0.01.
Кейс из Яндекс.Такси
Команда запускала A/B на новой ценовой формуле. Запланировали 3 недели. Через 5 дней p<0.05 в пользу B. Менеджер настоял на быстром выкате. Откатили через неделю — реальная метрика упала.
Анализ: peeking. На 5-й день была случайная флуктуация. К 3-й неделе результат был НЕзначимым.