Почему нельзя остановить A/B-тест при первом p < 0,05
Через неделю после старта A/B-теста аналитик видит p-value 0,08. Команда ждёт ещё день, получает 0,047 и выключает эксперимент с объявлением победителя. Если бы число выросло, тест продолжили бы. Такое правило остановки выбирает удобный момент из нескольких попыток, хотя каждая отдельная проверка рассчитана как одна финальная.
При нулевом реальном эффекте p-value меняется от случайного состава выборки. Четыре просмотра накопленных данных дают четыре шанса увидеть малое число. Они связаны между собой, поэтому ошибка не равна просто четырём умноженным на 5%, но она выше риска единственной заранее назначенной финальной проверки.
Сравним два правила на одинаковых данных
Ниже 2000 искусственных экспериментов, где варианты A и B генерируются из одного нормального распределения. Значит, истинной разницы нет. Для каждого эксперимента считаем двустороннее p-value после 20, 40, 80 и 160 наблюдений на вариант. Один счётчик отмечает хотя бы одно p-value ниже 0,05, другой смотрит только на 160.
from random import Random
from math import erf, sqrt
rng = Random(21)
checks = (20, 40, 80, 160)
any_early = final_only = 0
for _ in range(2000):
a, b = [], []
seen_small_p = False
for n in range(1, 161):
a.append(rng.gauss(0, 1))
b.append(rng.gauss(0, 1))
if n in checks:
z = (sum(b)/n - sum(a)/n) / sqrt(2/n)
p = 1 - erf(abs(z)/sqrt(2))
seen_small_p |= p < 0.05
if n == 160:
final_only += p < 0.05
any_early += seen_small_p
print('any of four looks:', any_early)
print('only final look:', final_only)
Числа на выходе вычисляются из фиксированного генератора случайных чисел: 276 из 2000 опытов дали хотя бы один промежуточный p-value ниже 0,05, а только 95 имели такой результат на финальном просмотре. Это примерно 13,8% против 4,75%. Часть опытов дала кратковременный «успех», который исчез к финалу. Модель использует известную дисперсию и нормальные данные, чтобы показать механизм; рабочий эксперимент требует теста под выбранную метрику.
Практическое правило для обычного фиксированного теста: заранее выбрать выборку, срок и основную метрику, дождаться закрытия окна, затем сделать финальный вывод. Во время выполнения можно смотреть качество назначения групп, ошибки продукта и безопасность, не объявляя эффект по промежуточному p-value. Если нужна возможность остановиться раньше ради пользы или вреда, планируйте последовательную процедуру с подходящими границами, а не повторяйте обычный порог 0,05.
Дополнительные дни после достижения нужной выборки тоже не всегда безобидны. Если продолжать только когда результат «почти значим», решение о продолжении зависит от данных. Новые наблюдения меняют p-value, но не возвращают автоматически исходный уровень ложной тревоги. Правило конца должно быть одинаковым для удачного и неудобного промежуточного результата.
Важен и порядок действий при реальном вреде пользователям. Эксперимент можно остановить из-за критической ошибки или заранее определённого порога безопасности — это часть управления риском, а не попытка объявить выигрыш по удобному p-value. После такой остановки фиксируйте причину, время и данные; обычный финальный статистический вывод уже не следует механически переносить на неполный тест.
Срок в календаре и требуемая выборка должны сочетаться. Если трафик приходит волнами, тест может собрать нужное число людей за два дня, но не охватить недельный цикл; если поток слабее ожидаемого, к плановой дате выборка будет недостаточной. До запуска запишите оба условия и решите, что делать при отклонении трафика, чтобы решение не зависело от направления эффекта.
Серия промежуточных графиков сама по себе полезна для контроля качества данных: видно, что события оплаты поступают и группы не потерялись. Для вывода о победе используйте заранее выбранный метод анализа. Разделение мониторинга исправности и проверки гипотезы позволяет команде следить за тестом, не повышая незаметно риск ложной находки.
В курсе «A/B тесты и анализ данных на Python» дизайн эксперимента, размер выборки и ошибки вроде peeking связаны с интерпретацией uplift и доверительных интервалов. Вы отработаете расчёты в Python и SQL на продуктовых метриках. Откройте программу, чтобы составить план теста до просмотра результатов.
Сначала также проверьте, что группы набираются в ожидаемой пропорции: разбор SRM показывает, когда проблема уже в распределении участников.
Продолжить на практике
- A/B тесты и анализ данных на Python ↗
Практический курс по A/B-тестированию и продуктовым метрикам: формулируем гипотезы, считаем размер выборки, запускаем эксперименты и анализируем результаты. От первой идеи до внедрения изменений в продукт — без «воды» и лишней теории.
