← Назад к вопросам

Как правильно прерывать A/B тесты?

2.7 Senior🔥 251 комментариев
#A/B-тестирование#Статистические критерии и тесты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как правильно прерывать 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 тесты в крупных компаниях. Дисциплина важнее интуиции.