Как правильно прерывать A/B тесты?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как правильно прерывать A/B тесты
Преждевременное прерывание A/B тестов — одна из самых распространённых ошибок аналитиков. Это приводит к ложным выводам и потере денег. Разберу правильный подход.
Основные принципы
Правило 1: Нельзя прерывать тест на основе промежуточных результатов
Это называется peeking problem или optional stopping problem. Когда вы подглядываете в результаты и принимаете решение, вы увеличиваете вероятность ошибки первого рода (false positive) с обещанных 5% до 25-30%.
Почему так происходит? Потому что случайные колебания в начале теста могут дать ложный сигнал о разнице. Если вы останавливаете тест, когда видите p-value < 0.05, вы ловите эти случайные колебания, а не реальный эффект.
Как правильно остановить тест
1. Установите размер выборки заранее
Используйте power analysis до теста:
from scipy.stats import norm
def calculate_sample_size(effect_size, alpha=0.05, power=0.8):
z_alpha = norm.ppf(1 - alpha/2)
z_beta = norm.ppf(power)
n = 2 * ((z_alpha + z_beta) / effect_size) ** 2
return int(n)
# Пример: эффект 5%, alpha=0.05, power=0.8
n = calculate_sample_size(effect_size=0.05)
print(f"Нужно {n} наблюдений в каждой группе")
Для типичного случая с конверсией 3-5% и ожидаемым 25% подъёмом нужно 10,000-50,000 пользователей на группу.
2. Зафиксируйте горизонт теста
- Рассчитайте скорость трафика
- Определите дату окончания (обычно неделя или две)
- Придерживайтесь плана даже если результаты уже видны на день 3
3. Используйте Sequential Testing, если хотите гибкость
Если нужна возможность раннего прерывания, применяйте sequential analysis с поправкой на множественные сравнения:
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
def sequential_test(control, treatment, interim_looks=5):
alpha_corrected = 0.05 / interim_looks
count = np.array([control, treatment])
nobs = np.array([10000, 10000])
z_stat, p_value = proportions_ztest(count, nobs)
return p_value < alpha_corrected
Когда можно остановить тест раньше
1. Если есть проблемы с качеством данных
- Обнаружили баг в трекинге
- Изменилась реклама или внешние факторы
- Группы несбалансированы
2. Если эффект очень сильный и неожиданный
- Используйте Sequential Testing (Pocock's boundary, O'Brien-Fleming)
- Для конверсии: если эффект >100%, стоит проверить дважды
3. После достижения необходимого размера выборки
- Не останавливайте на день 2, если нужна неделя
- Даже если p-value уже < 0.05
Частые ошибки
❌ Тестирование много гипотез одновременно без поправок
❌ Удаление выбросов после теста на основе результатов
❌ Изменение метрики, если первая не показала эффект
❌ Запуск теста и остановка при виде результатов
Практический чеклист
- ✅ Рассчитан размер выборки (power analysis)
- ✅ Установлена дата окончания
- ✅ Выбрана первичная метрика
- ✅ Исключены выбросы ДО запуска теста
- ✅ Группы сбалансированы
- ✅ Трафик идёт равномерно
- ✅ Статистический тест определён заранее
- ✅ Не пикали в результаты до конца
Так работают A/B тесты в крупных компаниях. Дисциплина важнее интуиции.