A/B-тесты · ПродвинутоеПодглядывание и последовательный анализ
Подглядывание в A/B-тесте: симуляция показывает, сколько ложных побед даёт ежедневная проверка, — при 20 взглядах около 25 % вместо 5 %. План промежуточных проверок с границами О’Брайена–Флеминга, Покока или Лана–ДеМетса, коридор, рост выборки и решение «остановить или продолжать» на текущей проверке. Код Python и R.
Цифры остаются в браузере и никуда не отправляются
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 в конце: рано остановиться можно только при очень большом эффекте. Выборка растёт меньше всего.
Одна граница на всех проверках: легче остановиться рано, но последняя проверка заметно строже 1,96 и выборка растёт сильнее.
Функция расходования α типа О’Брайена–Флеминга: проверки можно делать в любые доли выборки — например, когда набралось 30 % и 70 %.
Через запятую, по возрастанию, последняя — 100. Например, 30, 70, 100.
α = 0,05 · мощность 80 % · двусторонняя проверка
Уровень значимости α
Мощность
Выбирайте, только если заранее решили, что B не может быть хуже, и отрицательный результат вас не интересует.
Граница первой проверки
4,562
z, по модулю
Граница последней проверки
2,040
фиксированный тест — 1,96
Выборка вырастет
+2,8 %
к фиксированному тесту при мощности 80 %
Коридор
Выход z за коридор на проверке k — остановка с победой или поражением
ПроверкаДанныхГраница 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 % ложных побед только для одной проверки в конце; при ежедневных взглядах эта гарантия перестаёт действовать, хотя каждое отдельное число выглядит честно.
В A/A-тесте, где эффекта нет, при 20 ежедневных проверках «победа» находится примерно в 25 % тестов вместо 5 %: симуляция на 20 000 прогонов даёт 24,9 %. Пять проверок — около 15 %, две — около 9 %. Симуляция выше пересчитывает это на вашей конверсии и трафике, а «Прогнать заново» меняет зерно.
Порог z для каждой промежуточной проверки, заданный до запуска. В начале он очень строгий, в конце почти обычный: для 5 проверок первая граница — 4,562, последняя — 2,040 вместо 1,96. Остановиться рано можно только при очень большом эффекте, зато общая ошибка остаётся 5 %, а выборка почти не растёт.
Обычно от 2 до 5. Больше проверок — раньше можно остановиться при сильном эффекте, но растут выборка и сложность, а выигрыш после пяти почти не меняется. Проверки удобно привязать к неделям теста. Если доли данных неравные, например 30 и 70 %, подойдут границы Лана–ДеМетса — их можно задать здесь же.
Для О’Брайена–Флеминга на 5 проверках — примерно на 2,8 % к фиксированному тесту при мощности 80 %, на 2 проверках — на 0,8 %. У Покока рост заметнее: на 5 проверках — на 22,8 %. Взамен Покок чаще позволяет остановиться рано. Рост считается от выборки обычного теста с теми же α и мощностью.
Последовательный тест отношения правдоподобия со смесью: его граница растёт с каждым новым наблюдением, поэтому смотреть на результат можно когда угодно и сколько угодно, не завышая ошибку. На нём построены «всегда верные» p-value в последовательных отчётах крупных платформ экспериментов. Цена — немного больше данных, чем у фиксированного теста.