A/B-тесты · ПродвинутоеПодглядывание и последовательный анализ

Подглядывание в A/B-тесте: симуляция показывает, сколько ложных побед даёт ежедневная проверка, — при 20 взглядах около 25 % вместо 5 %. План промежуточных проверок с границами О’Брайена–Флеминга, Покока или Лана–ДеМетса, коридор, рост выборки и решение «остановить или продолжать» на текущей проверке. Код Python и R.

Цифры остаются в браузере и никуда не отправляются

01Подглядывание02План проверок03Проверка сейчас04Код05Примеры06Вопросы07Похожие
01

Демонстрация подглядывания

A/A-тест: версии одинаковые, эффекта нет. Смотрим на результат каждый день и останавливаемся на первой значимости.

Сколько раз смотрим
Прогонов
зерно 1 · 5 000 A/A-тестов · 20 дней
Подглядывание раздувает ошибку в 4,8 раза.
Эффекта нет, но если смотреть 20 раз и остановиться на первой значимости, «победа» найдётся в 25,6 % тестов вместо 5 %. Каждый взгляд — ещё один шанс на случайный выброс.
Смотрели 20 раз
25,6 %
ложных побед
Одна проверка в конце
5,3 %
ложных побед — как и обещает α
Чем чаще смотрим, тем больше ложных побед
Смотрели 1 раз5,3 %
Смотрели 2 раза8,7 %
Смотрели 5 раз14,8 %
Смотрели 10 раз20,1 %
Смотрели 20 раз25,6 %
02

План промежуточных проверок

Проверок K
Границы

Строгие границы в начале и почти 1,96 в конце: рано остановиться можно только при очень большом эффекте. Выборка растёт меньше всего.

α = 0,05 · мощность 80 % · двусторонняя проверка
Граница первой проверки
4,562
z, по модулю
Граница последней проверки
2,040
фиксированный тест — 1,96
Выборка вырастет
+2,8 %
к фиксированному тесту при мощности 80 %
Коридор
Выход z за коридор на проверке k — остановка с победой или поражением
123451,960
ПроверкаДанныхГраница zПорог pТратим α
120 %4,562< 0,0010,0000
240 %3,2260,00130,0013
360 %2,6340,00840,0089
480 %2,2810,0230,0256
5100 %2,0400,0410,0500
03

Проверка сейчас

Остановить: B лучше.
На проверке 3 из 5 z = 2,652 вышло за границу ±2,634. Прирост +15,0 %.
Современные методы

mSPRT и «всегда верные» p-value позволяют смотреть на результат когда угодно, не завышая ошибку: граница растёт с каждым новым наблюдением. Так работают последовательные отчёты в крупных платформах экспериментов. Цена — немного больше данных, чем у фиксированного теста.

04

Проверить в Python / R

Проверить в Python / R
import numpy as np
from scipy import stats

# A/A-тесты: 5000 прогонов, 20 дней, смотрим каждый день
rng = np.random.default_rng(1)
base, per_day, runs = 0.1, 500, 5000
a = rng.binomial(per_day, base, (runs, 20)).cumsum(1)
b = rng.binomial(per_day, base, (runs, 20)).cumsum(1)
n = per_day * np.arange(1, 21)
pp = (a + b) / (2 * n)
z = (b - a) / n / np.sqrt(pp * (1 - pp) * 2 / n)
print((np.abs(z) > stats.norm.ppf(0.975)).any(1).mean())  # ложных побед при 20 проверках
05

Примеры

06

Частые вопросы

Каждый взгляд на результат — ещё одна попытка поймать случайный выброс. Если остановиться на первой значимости, вы выбираете самый удачный момент шума, а не настоящий эффект. Порог p < 0,05 обещает 5 % ложных побед только для одной проверки в конце; при ежедневных взглядах эта гарантия перестаёт действовать, хотя каждое отдельное число выглядит честно.

Обновлено