Что такое 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-й неделе результат был НЕзначимым.