6 шагов которые нужно пройти прежде чем нажать «запустить эксперимент». Пропустишь один — получишь невалидные результаты.
MDE (Minimum Detectable Effect) — минимальный эффект который сможем заметить с заданной мощностью. Sample size зависит от MDE, variance и желаемой мощности.
# Sample size для A/B-теста на пропорции (z-test)
from statsmodels.stats.power import zt_ind_solve_power
# Baseline CR 3%, MDE 0.3pp (relative 10%)
# Alpha 0.05 (two-sided), Power 0.8
p1, p2 = 0.030, 0.033
effect_size = (p2 - p1) / ((p1 * (1-p1) + p2 * (1-p2)) / 2) ** 0.5
n = zt_ind_solve_power(
effect_size=effect_size,
alpha=0.05,
power=0.8,
alternative='two-sided'
)
print(f"Sample size per group: {n:,.0f}")
# Output: ~31,000 на группу = 62,000 total
Эти три темы — must know на Senior в Яндекс/Авито/Tinkoff. Без них собес не пройти.
| Метод | Когда применять | Эффект |
|---|---|---|
| CUPED | Variance reduction для дорогих метрик | -30-50% sample size |
| Sequential (mSPRT) | Хочется прервать раньше | Без peeking penalty |
| Bayesian A/B | Малые выборки, prior знание | Posterior probability |
| Stratified | Mix-shift между группами | Защита от Simpson |
Время эксперимента = sample size / daily volume. Например: 62,000 user / 10,000 daily = 6.2 дня. На практике добавляем 2-3 дня на стабилизацию (избегать day-of-week эффект).
Эти ошибки автоматически снижают grade. На Senior-уровне их вообще нельзя допускать.
Twyman's Law: «Любая фигура которая выглядит интересной или особенной — обычно ошибка». Если результат теста удивил — сначала проверь sanity, потом ищи объяснение.
Bayesian подход полезен когда есть prior знание (предыдущие эксперименты) или малая выборка. Booking использует Bayesian для оценки эффекта на 10% revenue uplift CI.
A/B — фиксированный split (50/50), оценивается на этапе planning. Multi-Armed Bandit — динамический split, оптимизирует cumulative reward. Используется когда нет времени ждать конца теста (новости, реклама).
| Метод | Когда | Цель |
|---|---|---|
| A/B test | Стабильная гипотеза | Validate effect (precision) |
| Multi-Armed Bandit | Динамика, exploit | Max cumulative reward |
| Sequential A/B (mSPRT) | Хочешь early stop | A/B + ранний выход |
| Contextual Bandit | Персонализация | Reward per user-context |
Вероятность увидеть результат как наш или больший, ЕСЛИ нет эффекта (H0 верна). p < 0.05 — отвергаем H0 (значимо). p = 0.05 НЕ означает «5% шанс что H1 верна» — это критическая ошибка интерпретации. На собесе спросят разницу между p-value и posterior probability.
Peeking — подглядывание результата до планируемого окончания и принятие решения на основе текущих данных. Инфлирует FPR (false positive rate) в 3-7×: классический test даёт p<0.05 в 5% случаев когда H0 верна, peeking даёт 15-35%. Решение: sequential testing (mSPRT) либо строго ждать конца.
CUPED снижает variance метрики на 30-50% за счёт регрессии на pre-experiment ковариату (предыдущая активность юзера). Это даёт ту же мощность при 30-50% меньшем sample size. Применяется в Microsoft/Booking/Yandex для дорогих метрик (revenue, retention).
Когда фактическое распределение юзеров по группам не соответствует target (например, ожидаешь 50/50, а получил 48/52). Признак сломанной рандомизации или утечки. Проверка: chi-square test между actual и expected. Если p < 0.001 — НЕ доверяй результатам теста, ищи баг.
t-test (Стьюдент) — параметрический, требует нормальности и равной дисперсии (либо Welch для разной). Mann-Whitney U — непараметрический, работает на любых распределениях, сравнивает медианы (точнее, P(X>Y)). Для skew-распределений (revenue, time) — Mann-Whitney или bootstrap.
Minimum Detectable Effect — минимальный эффект, который сможем заметить с заданной мощностью. Выбирают на этапе planning из бизнес-логики: «эффект < 0.5pp нам не интересен». Жёстче MDE → больше sample size → дольше эксперимент. Пример: для CR 5%, MDE 0.5pp = ~16K на группу.
Классический A/B — нельзя (peeking penalty). Sequential testing (mSPRT, Pocock, OBF) — можно с контролем alpha. Google, Microsoft используют sequential для дорогих экспериментов. На обычном собесе ответ: «нельзя, дождись конца». На senior спросят про sequential.
Когда aggregate-effect противоположен по segments. Пример: Yandex показывает aggregate uplift +2%, но по новым юзерам -5%, по старым +5%. Mix-shift между группами создаёт ложный сигнал. Защита: stratified рандомизация + analysis by segment.
Когда тестируешь 10+ гипотез одновременно — alpha инфлируется. Без коррекции при alpha=0.05 и 10 тестах FPR ≈ 40%. Решения: Bonferroni (alpha / N, консервативно), Benjamini-Hochberg (контроль FDR, мягче). Применяется при множественных metric / segment tests.
A/B — для validation эффекта (научная цель). Bandit — для максимизации cumulative reward (бизнес-цель). Если у тебя 100 вариантов и ты не знаешь который лучший — Bandit. Если 2 варианта и хочешь точно измерить эффект — A/B. Tinkoff/Yandex используют оба.