Команда интернет-магазина хочет убрать лишнее поле из формы заказа. Изменение кажется разумным: покупателю придётся вводить меньше данных. Но станет ли больше оплаченных заказов? Мнения команды здесь мало помогают — нужен способ проверить предположение на пользователях.
Для этого и проводят A/B-тест: часть пользователей видит прежнюю форму, остальные — новую. Затем сравнивают долю покупателей в каждой группе. Важно не только получить два процента, но и понять, насколько можно доверять разнице.
Разберём весь путь на одном примере: подготовим эксперимент, рассчитаем конверсию и её изменение, выясним смысл p-value и доверительного интервала. В конце посмотрим, как перейти от чисел к решению о выпуске новой формы.
Что такое A/B-тестирование
В A/B-тесте пользователей случайно распределяют между вариантами и сравнивают заранее выбранный показатель. Обычно A — работающая версия продукта, B — версия с изменением, которое хотят проверить.
Представим двух покупателей, пришедших в магазин в один день. Одному система назначила форму A, другому — B. При следующем визите каждый снова увидит свой вариант. Когда наблюдение закончится, мы узнаем, какая доля пользователей каждой группы оплатила заказ.
Случайное распределение помогает сделать группы сопоставимыми. Оно не гарантирует, что в них окажутся совершенно одинаковые люди, зато при правильном проведении эксперимента позволяет оценивать влияние изменения, а не сравнивать разные периоды продаж.
Здесь важно сразу договориться, что считать покупкой. Нажатие кнопки, создание заказа и подтверждённая оплата — разные события. Для обеих групп мы будем считать только пользователей с подтверждённой оплатой. Ошибки в сборе событий или повторный подсчёт одного человека рандомизация не исправит.
Как подготовить A/B-тест
Гипотеза. Новая форма заказа должна увеличить долю пользователей, которые оплатят покупку. Такую гипотезу можно проверить: есть два варианта и один понятный показатель.
Основная метрика. Выберем конверсию в подтверждённую оплату — число пользователей с хотя бы одной успешной оплатой, делённое на число пользователей, включённых в эксперимент. Дополнительно проследим за ошибками платежей, отменами и возвратами. Эти защитные метрики нужны, чтобы улучшение конверсии не скрывало других проблем.
Группы. До показа варианта определим, кто участвует в эксперименте, и случайно назначим каждому подходящему пользователю A или B. Назначение сохраняется при повторных визитах. В примере единица анализа — пользователь, поэтому один пользователь учитывается в знаменателе конверсии только один раз. Если назначать вариант человеку, а затем считать независимыми каждую его сессию и каждый заказ, статистический расчёт будет опираться на неверное число независимых наблюдений.
Окно наблюдения. Допустим, мы учитываем покупки в течение семи дней после первого показа формы. Тогда пользователи, пришедшие в последний день набора, должны получить свои семь дней. Иначе у них окажется меньше времени на покупку, чем у первых участников.
До запуска зафиксируйте правила включения и исключения пользователей, метрики и способ распределения. Основную гипотезу и условия остановки также нельзя выбирать задним числом, когда одна из групп уже выглядит лучше.
Сколько пользователей нужно для A/B-теста
Предположим, обычная конверсия формы составляет 12%. Какую прибавку мы вообще хотим обнаружить? Если ради дополнительных 0,2 процентного пункта переделывать продукт невыгодно, такая точность нам не нужна. А улучшение на 2 процентных пункта, допустим, уже оправдывает работу. Этот порог определяют до теста.
Размер выборки следует оценить до запуска по базовой конверсии, минимальному полезному эффекту, уровню значимости и мощности.
Минимально полезный эффект (MDE) — наименьшее изменение, ради которого вы готовы внедрять вариант B. В приведённом рассуждении условный MDE равен 2 процентным пунктам. Это ориентир для решения, а не обещание, что эксперимент обнаружит именно такой рост.
Остаются ещё два параметра:
- Уровень значимости
α— вероятность отклонить верную нулевую гипотезу при многократном повторении процедуры в её предпосылках. - Статистическая мощность
1 − β— вероятность отклонить нулевую гипотезу, когда заданный при планировании эффект действительно существует.
Часто для планирования выбирают α = 0,05 и мощность 80% или 90%. Чем меньший эффект нужно обнаружить, тем больше обычно требуется пользователей. На расчёт влияют также исходная конверсия и доля трафика в каждой группе. Эти параметры описаны в документации statsmodels.
После расчёта объёма оцените продолжительность по доступному трафику. Учтите будни и выходные, а главное — дождитесь завершения окна покупки. Ниже для удобства взято по 1000 пользователей: это учебное число, а не рассчитанный размер выборки для настоящего магазина.
Пример A/B-теста: две формы заказа
Пусть эксперимент закончился, и у каждого включённого пользователя было достаточно времени для покупки. Варианты назначались по одному разу, а исход определён просто: хотя бы одна подтверждённая оплата за время наблюдения.
| Вариант формы | Пользователей | Оплатили заказ | Конверсия |
|---|---|---|---|
| A — прежняя | 1000 | 120 | 12% |
| B — новая | 1000 | 160 | 16% |
Это синтетические данные: по ним мы учимся считать, а не сообщаем о результатах настоящего магазина. Для рабочего эксперимента перед расчётом пришлось бы отдельно убедиться, что ни один пользователь не потерялся из учёта, не попал в обе группы и получил полное окно наблюдения.
Как посчитать изменение конверсии
В группе A оплатили 120 человек из 1000: 120 / 1000 = 12%. В группе B — 160 из 1000: 160 / 1000 = 16%. На первый взгляд новая форма лучше. Но насколько именно?
Разница между 12% и 16% составляет 4 процентных пункта, а относительное изменение — около 33,3%.
Процентные пункты показывают, на сколько изменилась сама доля: 16 − 12 = 4 п.п. Относительный прирост отвечает на другой вопрос — насколько новая конверсия больше старой: (16 − 12) / 12 × 100% ≈ 33,3%.
Поэтому фраза «конверсия выросла на 4%» здесь неточна. Рост составляет 4 процентных пункта, или примерно 33,3% относительно варианта A.
Мы пока сравнили только наблюдаемые показатели. В других случайных группах даже при тех же двух формах числа могли бы получиться немного другими. Следующий вопрос: насколько необычна разница в четыре процентных пункта, если обе формы имеют одинаковую конверсию?
Что такое p-value и как его рассчитать
Начнём с предположения, что новая форма не влияет на вероятность покупки. Тогда конверсия у A и B одинакова, а разница в нашей таблице возникла из-за того, какие пользователи случайно попали в группы.
Это и есть нулевая гипотеза: H₀: p_A = p_B. Нам нужно проверить, насколько полученные данные с ней согласуются. Поскольку новая форма теоретически может как улучшить, так и ухудшить результат, проверяем различие в обе стороны.
p-value — вероятность при верной нулевой гипотезе получить результат не менее экстремальный, чем наблюдаемый, в рамках выбранной статистической модели.
Для нашего примера p-value около 0,009946, то есть примерно 0,995%. Смысл такой: если формы действительно одинаковы по конверсии, то разница не меньше наблюдаемой по абсолютной величине встречалась бы примерно в одном случае из ста при повторении такого случайного сравнения в рамках модели. Это не вероятность того, что гипотеза верна. p-value не показывает вероятность того, что вариант B лучше варианта A. Такое ограничение подчёркивают NIST и Американская статистическая ассоциация.
Откуда берётся число
Для двух независимых групп пользователей с ответом «оплатил / не оплатил» применим двусторонний z-тест двух долей. При нулевой гипотезе обе группы имеют общую вероятность покупки, поэтому сначала объединяем их результаты:
p_pool = (x_A + x_B) / (n_A + n_B)
SE_H0 = sqrt(p_pool × (1 - p_pool) × (1 / n_A + 1 / n_B))
z = (p_B - p_A) / SE_H0
p-value = 2 × P(Z ≥ |z|), где Z имеет стандартное нормальное распределение
Здесь x — число оплативших пользователей, n — число пользователей в группе, p — конверсия, а SE_H0 — стандартная ошибка при предположении об одинаковой конверсии. Для таблицы выше общая доля p_pool = 0,14, показатель z ≈ 2,577696. Формулы для больших независимых выборок приводит NIST.
Заранее выбранный уровень значимости, например α = 0,05, позволяет сформулировать правило: если p-value не превышает 0,05, мы отклоняем нулевую гипотезу в рамках данного теста. При этом вывод зависит от независимости наблюдений, правильных числителей и знаменателей и заранее определённого анализа. Малое p-value ещё не означает, что новую форму выгодно выпускать.
Повторяем расчёт на Python
Для этих чисел достаточно стандартной библиотеки Python. Код отдельно вычисляет показатель теста и интервал для разницы конверсий, который разберём следующим шагом:
from math import erfc, sqrt
from statistics import NormalDist
n_a, x_a = 1000, 120
n_b, x_b = 1000, 160
p_a, p_b = x_a / n_a, x_b / n_b
difference = p_b - p_a
pooled = (x_a + x_b) / (n_a + n_b)
test_se = sqrt(pooled * (1 - pooled) * (1 / n_a + 1 / n_b))
z = difference / test_se
p_value = erfc(abs(z) / sqrt(2))
interval_se = sqrt(p_a * (1 - p_a) / n_a + p_b * (1 - p_b) / n_b)
margin = NormalDist().inv_cdf(0.975) * interval_se
ci_low, ci_high = difference - margin, difference + margin
print(f"A: {p_a:.2%}; B: {p_b:.2%}")
print(f"absolute: {difference * 100:.2f} pp")
print(f"relative: {difference / p_a:.2%}")
print(f"z: {z:.6f}; p-value: {p_value:.6f}")
print(f"95% CI: [{ci_low * 100:.2f}, {ci_high * 100:.2f}] pp")
Результат:
A: 12.00%; B: 16.00%
absolute: 4.00 pp
relative: 33.33%
z: 2.577696; p-value: 0.009946
95% CI: [0.96, 7.04] pp
Двусторонний z-тест даёт p-value около 0,009946, а 95% интервал Вальда для разницы — от 0,96 до 7,04 п.п.
Более полная реализация расчёта и проверки граничных случаев доступны в примере XNova на GitHub.
Зачем нужен доверительный интервал
p-value помог проверить гипотезу об одинаковой конверсии. Но команда хочет знать ещё кое-что: насколько большим может быть улучшение? Наблюдаемые +4 процентных пункта — всего одна оценка по двум случайным группам.
Для нашей таблицы 95% доверительный интервал разницы составляет примерно от +0,96 до +7,04 процентного пункта. Этот диапазон показывает неопределённость оценки при выбранном статистическом методе. Если истинный эффект меньше двух пунктов, вложения в новую форму, возможно, не окупятся; если он ближе к семи, выгода может быть существенной. Величину полезного эффекта нужно установить до просмотра итоговых данных.
Как получили интервал
Здесь используем интервал Вальда для разницы двух независимых долей. В отличие от теста равенства долей, он считает разброс каждой группы отдельно:
SE_CI = sqrt(p_A × (1 - p_A) / n_A + p_B × (1 - p_B) / n_B)
CI_95 = (p_B - p_A) ± 1,96 × SE_CI
Стандартная ошибка здесь отличается от SE_H0: тест оценивает общую вероятность при условии равенства долей, а интервал оценивает неопределённость наблюдаемой разницы без этого ограничения.
Как понимать эти 95%? Процедура построения таких интервалов при многократном повторении покрывала бы истинную разницу в 95% случаев при выполнении предпосылок. Это не означает, что у уже полученного интервала есть 95-процентная вероятность содержать фиксированный истинный эффект. Такую частотную интерпретацию объясняет NIST.
Интервал Вальда — приближённый метод. Для наших чисел оплативших и неоплативших пользователей достаточно много, чтобы использовать обычную нормальную аппроксимацию, но при малых выборках или редких событиях результат может быть ненадёжным. Документация statsmodels описывает и другие методы построения интервалов.
Статистическая значимость не равна практической выгоде изменения. Чтобы принять решение, важно сопоставить полученный интервал с заранее выбранным MDE и проверить, не ухудшились ли другие показатели.
Что может испортить даже убедительный результат
Представьте, что эксперимент должен делить пользователей пополам, но в отчёте оказалось 650 человек в A и 350 в B. Сначала нужно разобраться, куда пропали или откуда появились участники. Причиной может быть ошибка назначения, регистрации события или отбора данных.
Такую проверку называют SRM (sample ratio mismatch) — статистически заметным отклонением размеров групп от запланированного соотношения. Microsoft Research рекомендует проверять распределение отдельным статистическим критерием: небольшая разница в числе участников допустима, а значительное отклонение требует расследования.
У SRM нулевая гипотеза состоит в том, что количество назначенных пользователей соответствует запланированной доле, например 50/50. Это другой вопрос, чем проверка конверсии: даже идеальное распределение 1000/1000 не доказывает, что измерения оплат верны.
Ещё три частые проблемы стоит проверить до вывода:
- Один человек посчитан несколько раз. Если анализируем пользователей, повторные визиты и оплаты не должны превращаться в новые независимые наблюдения.
- Тест остановили при первом «удачном» p-value. Когда проверяют результат каждый день и заканчивают эксперимент при первом значении меньше 0,05, обычное правило для единственной запланированной проверки уже не сохраняет исходный риск ошибочного вывода. Нужен заранее выбранный последовательный метод.
- Выбрали наиболее выгодную из многих метрик. Чем больше сравнений вариантов и сегментов, тем выше вероятность случайной находки. Заранее выбранная основная проверка и дополнительные поисковые выводы должны быть разделены.
Поэтому перед расчётом эффекта проверьте назначение вариантов, полноту событий и одинаковое время наблюдения. Если качество данных вызывает сомнения, результат таблицы не спасает эксперимент.
Как решить, выпускать ли вариант B
Вернёмся к форме заказа. В синтетической таблице конверсия выросла с 12% до 16%, p-value оказался меньше 0,05, а доверительный интервал лежит выше нуля. Для выбранного метода это свидетельствует о различии конверсий, но ещё не отвечает на вопрос об экономической выгоде.
Допустим, до эксперимента мы решили, что изменение имеет смысл только при приросте не менее двух процентных пунктов. Наш интервал от +0,96 до +7,04 пункта включает и меньшие, и большие значения. Поэтому мы пока не можем уверенно утверждать, что улучшение достигает нужных двух пунктов. При другом заранее выбранном пороге решение могло бы быть иным.
Кроме того, повысить долю оплат недостаточно, если вместе с этим выросли отмены, ошибки платежей или затраты. Эти показатели следует проверять по тем правилам, которые были заданы до старта.
Порядок решения простой: сначала убедиться, что группы и события корректны; затем оценить разницу и её неопределённость; после этого сопоставить эффект с MDE, рисками и стоимостью внедрения. Если качество данных не подтверждено, вывод о выигрыше преждевременен. Если p-value велик, это тоже не доказательство равенства форм: возможно, данных недостаточно, чтобы заметить полезное изменение.
Итог
A/B-тест даёт больше, чем сравнение двух процентов. Он помогает оценить влияние изменения, если вы заранее определили участников, метрику, способ распределения и правила завершения эксперимента.
В нашем примере новая форма получила 16% конверсии против 12% у прежней. Разница в четыре процентных пункта выглядит обнадёживающе, но ответ для продукта зависит и от её неопределённости, и от того, какой прирост действительно окупает изменение.
Для своего первого A/B-теста начните с одной проверяемой гипотезы и одной основной метрики. Убедитесь, что данные собираются правильно, а затем оцените не только p-value, но и величину эффекта вместе с доверительным интервалом.
Источники
- Двусторонний z-тест двух долей и объединённая оценка вероятности
- Методы доверительного интервала для разницы двух независимых долей, включая Wald
- Связь размера выборки двух долей с эффектом, мощностью, alpha и распределением групп
- Определения уровня значимости, мощности и практической значимости
- Условное определение p-value и заранее выбранный порог
- Частотная интерпретация доверительного интервала через повторение процедуры
- Заявление ASA об интерпретации p-value, порогах и практической значимости
- Sample ratio mismatch и проверка качества распределения
- Единица назначения варианта и согласование аналитических данных
- Независимый библиотечный ориентир для сверки z-теста
- Полный типизированный пример, pytest-сценарии и кроссплатформенный CI на закреплённом коммите