Sequential testing простыми словами

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Зачем это знать

Классика A/B: «зафиксируй выборку заранее, не подглядывай в середине». Но это медленно и неоптимально: если эффект огромный, зачем ждать ещё неделю?

Sequential testing — семейство методов, позволяющих остановить эксперимент раньше и сохранить валидность. Используется в Netflix, Google, Microsoft.

На собесах middle+ в крупных компаниях часто спрашивают: «как безопасно подглядывать?».

Короткое объяснение

В обычном A/B: проверяем p-value один раз в конце. Если проверять много раз — false positive rate растёт (p-hacking).

Sequential testing корректирует для множественных проверок → можно смотреть и останавливаться раньше.

Проблема «подглядывания»

Стандартный t-test с α = 0.05:

  • 1 проверка: FPR 5%
  • 5 проверок: FPR ~14%
  • 10 проверок: ~19%
  • Каждый день: FPR → 100% со временем

«Если подглядывать и останавливать при p < 0.05» — всегда найдёшь «значимость».

Методы sequential testing

1. Always Valid Inference (AVI)

Специальные p-values, которые всегда валидны, сколько бы раз ни проверяли.

p_AVI(t) = min(p(t), 1)

Где формула учитывает «подглядывания». Реализация сложная, но есть библиотеки.

2. SPRT (Sequential Probability Ratio Test)

Log-likelihood ratio проверяется после каждого наблюдения. Остановка когда выходит за границы.

Wald предложил ещё в 1940-х.

3. Alpha spending

Разделить α на «бюджеты» для каждой проверки. Например, 5 проверок → α = 0.01 каждая (но на самом деле не делится так просто — используются Lan-DeMets).

4. mSPRT (mixture SPRT)

Универсальный байесовский approach. Оптимизирован для practical A/B.

Пример: mSPRT

# Pseudo-code (упрощённо)
from sequential_testing import mSPRT

test = mSPRT(alpha=0.05, beta=0.2)

for each_day:
    new_data = fetch_yesterday()
    test.update(new_data)
    
    if test.reject_null():
        print("Stop — lift detected")
        break
    if test.accept_null():
        print("Stop — no lift")
        break

Trade-offs

Плюсы

  • Быстрее останавливаете очевидно плохие или очевидно хорошие тесты
  • Экономия времени и ресурсов
  • Меньше exposure к плохому варианту

Минусы

  • Сложнее реализовать
  • Требует дисциплины — нельзя «смешивать» stopping rules
  • На малых эффектах всё равно долго

Когда использовать

  • Много экспериментов (нужно быстрее)
  • High-traffic сервис (данные копятся быстро)
  • Ограниченное время на тест

Когда НЕ нужно

  • Мало экспериментов (проще обычный test)
  • Novelty effects (нужно дождаться стабилизации)
  • Сезонные эффекты

Реализация в компаниях

Netflix — Quasi-Experimentation

Использует причинные inference + sequential methods.

Optimizely — Stats Engine

Коммерческое решение на основе AVI.

Open-source

abtest, sprtt, confseq — Python пакеты для sequential A/B.

На собесе

«Что такое sequential testing?» Методы, позволяющие безопасно останавливать A/B рано.

«Почему нельзя подглядывать в обычном тесте?» FPR растёт с каждой проверкой.

«Как корректирует?» Alpha spending, log-likelihood ratio, always-valid p-values.

«Когда использовать?» Высокий трафик + много экспериментов.

Частые ошибки

Смешивать stopping rules

Если запустили как sequential, нельзя в середине «ок, теперь буду ждать полный N».

Игнорировать novelty effect

Ранняя остановка может пропустить эффект новизны.

Мало данных

Для sequential нужно быстрое накопление — на low-traffic сервисах не работает.

Связанные темы

FAQ

Всегда безопаснее?

Только если правильно реализован. Неправильный sequential test хуже обычного.

Лучше Bayesian?

Bayesian A/B — другой подход, тоже позволяет подглядывать. Но требует prior.

Open source?

confseq для Python. peek_ab для R.


Тренируйте A/B — откройте тренажёр с 1500+ вопросами для собесов.