Все материалы
Продуктовая аналитикагайдсредний

Результаты A/B-теста: как читать числа и принимать решение

Эффект, доверительный интервал, p-value, MDE и защитные метрики на двух экспериментах DragonKeep. Матрица решений и шаблон отчёта менеджеру.

КейсПрактика28 сентября 2026 г.14 мин

Менеджер приносит таблицу: «В тесте конверсия выросла, p меньше 0,05. Можно раскатывать?» Первое действие аналитика — не нажать зелёную кнопку, а восстановить эксперимент: кто был назначен, сколько успел прожить в окне наблюдения, какую метрику обещали улучшить и что произошло с защитными показателями. На двух учебных тестах DragonKeep один ответ будет осторожно положительным, а другой — отказом от вывода о выгоде.

Короткий ответ: пять строк, без которых результата нет

Результат A/B-теста — это оценка разницы по заранее выбранной метрике и диапазон правдоподобных величин эффекта при конкретной процедуре. Сначала проверяют дизайн и данные, затем величину, доверительный интервал, p-value, мощность относительно запланированного MDE и guardrail. Само по себе p меньше 0,05 не означает, что изменение полезно, а p больше 0,05 не доказывает отсутствия эффекта.

В записке менеджеру нужны пять строк: аудитория и число назначенных; основная метрика по обеим группам; абсолютная разница и 95% интервал; статус диагностики данных и защитных показателей; действие с причиной и условиями наблюдения после релиза. Этот порядок помогает обнаружить красивое число, полученное на неправильном знаменателе.

  • Сверьте назначение и полный горизонт исхода.
  • Назовите эффект в единицах метрики, а не только в процентах.
  • Поставьте интервал рядом с заранее выбранным MDE.
  • Покажите guardrail и честно отметьте, если порог для него не назначали.
  • Опишите действие и условия следующей проверки.

До арифметики: три проверки качества сравнения

В учебной базе вариант каждого эксперимента находится в exposures.variant. Поле users.ab_group существует, но для исторического теста onboarding_v2 расходится с истинным назначением почти у половины игроков. Если им разделить пользователей, аналитик перемешает контроль и тест ещё до подсчёта. В реальном продукте такую же ошибку создаёт присоединение по текущему флагу вместо сохранённой экспозиции.

Второй контроль — достаточная зрелость когорты. D7 нельзя оценивать у игрока, установленного вчера. Для выручки двух групп используйте одинаковое окно от индивидуальной экспозиции, а не общую дату окончания выгрузки. Третий контроль — sample ratio mismatch: резкое отличие фактических размеров от ожидаемого сплита требует расследования. Учебный A/A menu_color даёт 10 929 против 9 350 при обещанных 50/50. Проверка эффекта на этих строках не чинит назначение.

Есть и технический слой: повторный JOIN платежей или сеансов умножает игрока на количество событий. Сначала получите одну строку на единицу рандомизации, потом агрегируйте исход. Если ранние когорты видны дольше поздних, проверка должна обрезать окно одинаково. Дубликаты экспозиций и потери событий считаются отдельно по вариантам; общая красивая сумма не доказывает их отсутствия.

Прежде чем сравнивать доли
ПроверкаНеправильный путьПравильный вопрос
Назначениеusers.ab_group для исторического тестакакой вариант зафиксирован при экспозиции?
Окновсё до конца выгрузкисколько дней после экспозиции у каждого?
Зернострока сеанса или платежасколько уникальных назначенных игроков?
Сплитсмотрим только на итоговую метрикусоответствует ли состав плану?

Эффект: проценты, процентные пункты и денежный масштаб

У онбординга контрольный D7 равен 1 140/8 534 = 13,36%, тестовый — 1 332/8 469 = 15,73%. Абсолютная разница +2,37 процентного пункта. Относительный прирост около 17,7% к контрольному уровню. Слова «на 2,37%» здесь двусмысленны и могут занизить или завысить впечатление; подпишите единицу «п.п.» и обе исходные доли.

Тот же подход важен для выручки. Если 100 покупателей по 100 ₽ дают 10 000 ₽, а новая механика даёт 110 покупателей по 90 ₽, конверсия растёт на 10%, но выручка падает до 9 900 ₽. Метрика, которую выбирали ради бизнеса, определяет смысл решения. Не заменяйте её после получения ответа на ту, что выглядит приятнее.

Практический эффект всегда имеет владельца и цену. Для удержания можно прикинуть, сколько дополнительных D7-пользователей даст эффект при привычном месячном потоке; для денег — умножить разницу выручки на пользователя на число будущих экспозиций с оговоркой о переносимости. Подстановка верхней границы интервала как «ожидаемого результата» создаёт оптимистичный бюджет. Базовый сценарий используют отдельно от риска.

Один и тот же тест в двух шкалах
ПоказательControlTestРазница
D713,36%15,73%+2,37 п.п.
Отношение к control100%117,7%+17,7% относительно

Интервал: какие эффекты совместимы с наблюдением

Для разницы D7 обычный 95% интервал двух независимых долей — примерно от +1,31 до +3,43 п.п. Процедура построения таких интервалов имеет заявленное покрытие при повторении экспериментов; это не вероятность 95%, что фиксированный истинный эффект находится именно в уже посчитанном интервале. Границы зависят от метода и предпосылок, поэтому в рабочем отчёте укажите метод.

Ноль лежит ниже интервала, поэтому данные несовместимы с отсутствием эффекта на выбранном уровне проверки. Но запланированный MDE +1,5 п.п. находится внутри интервала. Возможен эффект чуть ниже делового порога, возможен существенно выше. Честный вывод: есть свидетельство положительного D7, но обещать минимум +1,5 п.п. нельзя. Цена ограниченного релиза и чувствительность решения к нижней границе важнее цвета бейджа «значимо».

Если интервал полностью пересекает ноль, не пишите «эффекта нет». Слишком широкая полоса может одновременно допускать заметную пользу и заметный вред: проблема в недостатке информации или шумной метрике. Если интервал узкий и весь лежит внутри заранее признанной зоны пренебрежимо малых эффектов, можно говорить о практической эквивалентности — только при заранее заданных границах и корректном анализе.

D7 по вариантам

Процент назначенных игроков, вернувшихся на седьмой день; интервал разницы указан в тексте.

D7, %

p-value и мощность отвечают на другие вопросы

Для D7 двусторонний z-тест долей даёт p около 0,000012. Это вероятность получить не менее экстремальную статистику при нулевой гипотезе и выбранной процедуре, а не вероятность того, что нулевая гипотеза верна. При тысячах игроков маленькая разница может дать маленькое p; денежная ценность этой разницы определяется отдельно.

Мощность планируют до опыта против конкретного альтернативного эффекта, например MDE. Она отвечает: как часто процедура заметит заданный эффект при данном размере выборки, если этот эффект существует. Подсчёт «наблюдаемой мощности» из полученного p после теста почти не добавляет информации. По незначимому результату смотрите ширину интервала относительно MDE и возможного вреда, а не объявляйте измерение тщетным по одному p.

Подглядывание в таблицу каждый день с обычным фиксированным тестом повышает риск ложной находки, если решение о завершении зависит от очередного p. Продлить тест после неудачного промежуточного просмотра — тот же выбор по исходу. Если бизнес требует ранней остановки, планируют последовательный дизайн заранее; произвольное «ещё немного трафика» не возвращает прежнюю калибровку.

Матрица решения: сначала MDE, затем риск и данные

Порог MDE фиксируют перед запуском как минимальный эффект, ради которого вообще стоит менять продукт. Он помогает выбрать объём, но не превращает полученный эффект в бинарное «годен/не годен». Если весь интервал выше MDE и проверки качества чистые, аргумент за релиз силён. Если положительный интервал пересекает MDE, действие зависит от цены раскатки, стоимости ошибки и возможностей контролируемого запуска.

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

При исправном дизайне и заранее назначенном MDE
Интервал эффектаЧтениеОбычное действие
Целиком выше MDEпрактически достаточный выигрыш поддержан даннымиконтролируемый релиз с мониторингом
Выше нуля, пересекает MDEплюс есть, гарантии порога нетрешение по цене ошибки; часто постепенный релиз
Пересекает нольпольза и вред совместимы с даннымине объявлять победу; новая проверка или отказ
Целиком ниже нулявероятный вред на основной метрикене раскатывать

Тест 1: онбординг улучшил D7, но релиз всё равно условный

Учебный onboarding_v2 назначил 8 534 игрока control и 8 469 test. D7 считается на седьмой день от установки и включает 186 дополнительных сеансов из отдельного файла датасета. После объединения источников результат +2,37 п.п. и интервал [+1,31; +3,43] п.п. Полученный p около 0,000012 описывает устойчивость статистического сигнала в рамках модели.

В течение одинаковых 14 дней после экспозиции платящих было 393 в control и 431 в test; выручка на назначенного игрока — около 38,92 и 39,21 ₽. Эти наблюдения не выглядят как очевидный сигнал ущерба, но для финансового guardrail заранее не был задан порог и здесь не оценён интервал его разницы. Поэтому фраза «выручка не пострадала» была бы сильнее данных.

Практическое решение — разрешить ограниченную раскатку туториала с контролем D7 и монетизации, отдельно обсудив, достаточно ли эффекта на нижней границе +1,31 п.п. Если внедрение дорогое и нужен гарантированный порог +1,5 п.п., этих данных недостаточно для обещания окупаемости. Если стоимость мала, положительный интервал может оправдать постепенный запуск. В обоих случаях зафиксируйте причину и не превращайте предположение в доказанный guardrail.

Тест 2: первая покупка пакета и выручка расходятся

Для starter_pack_99 назначено 8 690 control и 8 622 test. Мы ограничили каждый платёж 14 днями после индивидуальной экспозиции. Доля первой покупки именно стартового пакета — 117/8 690 = 1,35% в control и 125/8 622 = 1,45% в test: наблюдаемая разница +0,10 п.п., двустороннее p около 0,56 и 95% интервал примерно [−0,25; +0,45] п.п. Утверждение «конверсия выросла» описывает лишь точечную оценку; устойчивого выигрыша этот расчёт не показал.

Если вместо пакета взять любую оплату в те же 14 дней, результат противоположный: 402/8 690 = 4,63% против 383/8 622 = 4,44%. При этом выручка на каждого назначенного игрока — 35,33 ₽ против 32,85 ₽, разница −2,49 ₽. Интервал бутстрепа для разницы средних [−10,60; +5,70] ₽ включает и ущерб, и пользу. Это не свидетельство выгодной акции; решение — не раскатывать на основании этих данных.

Отдельная проблема качества: имя опыта обещает цену 99 ₽, но в строках starter_pack суммы 129, 116,1 и 103,2 ₽, а 99 ₽ нет. Возможны скидки или несовпадение замысла с реализацией, но выгрузка не позволяет определить причину. Пока цена и состав товара не верифицированы, нельзя писать «покупатели отреагировали на снижение до 99 ₽». Этот дефект важнее косметического округления p.

Два вопроса к starter_pack_99, 14 дней после назначения
МетрикаControlTestВывод
Первая покупка starter_pack1,35%1,45%+0,10 п.п.; интервал включает ноль
Любая покупка4,63%4,44%направление меняется
Выручка / назначенный игрок35,33 ₽32,85 ₽−2,49 ₽; интервал включает ноль

SQL: воспроизводимый знаменатель для платежей

Ниже — контрольная выгрузка по одному 14-дневному окну. COUNT(DISTINCT e.user_id) оставляет знаменателем назначенных, даже если человек платил несколько раз. Условие окна стоит в LEFT JOIN, иначе пользователи без платежей исчезнут из выборки. Агрегат суммирует только платежи в этом окне; проверка первой покупки стартового пакета требует отдельного фильтра по is_first_pay и product_type.

Запрос возвращает по starter_pack_99 ровно 8 690 и 8 622 назначенных, 402 и 383 плательщика, общую выручку 307 051,6 и 283 193,5 ₽. Он не доказывает корректность цены, назначения или выбранной метрики: эти условия проверяются до запроса. Сохраните SQL рядом с решением, чтобы другой аналитик мог восстановить то же окно.

Платежи за 14 дней от персональной экспозиции
SELECT e.variant, COUNT(DISTINCT e.user_id) AS assigned,
       COUNT(DISTINCT CASE WHEN p.payment_id IS NOT NULL THEN e.user_id END) AS payers,
       ROUND(SUM(COALESCE(p.amount_rub, 0)), 1) AS revenue_rub
FROM exposures e
LEFT JOIN payments p ON p.user_id = e.user_id
 AND p.payment_date >= e.exposure_date
 AND p.payment_date < e.exposure_date + INTERVAL 14 DAY
WHERE e.exp_id = 'starter_pack_99'
GROUP BY e.variant ORDER BY e.variant

Сегменты, новизна и переносимость после теста

После получения результата легко искать «победу» среди Android, iOS, новых каналов и регионов. Если разрезы не были основными до запуска, они разведочные: каждый дополнительный взгляд повышает вероятность случайной находки. Проверьте не только p внутри сегмента, но и различие эффектов между сегментами, размеры ячеек и целостность назначения. Задачу о новом сегменте лучше оформить как гипотезу для следующего опыта.

Первая неделя может содержать эффект новизны: пользователи исследуют необычный экран, но позднее возвращаются к прежнему поведению. Может быть и обучение: сначала изменение мешает, затем помогает. Нужна временная кривая по когортам, рассчитанная на одинаковом горизонте, а не сравнение первых и последних пользователей с разным временем жизни. Особо важно это для денег и retention, где исход созревает позже показов.

Даже хороший эффект в учебном тесте относится к игрокам, устройствам и датам, которые были включены. Раскатка на старую аудиторию, иной канал или пиковый сезон — новое допущение. Во время постепенного релиза контролируйте те же метрики и сегменты, записывайте технические изменения и сохраняйте возможность остановить релиз при заранее оговорённом ущербе.

Готовая записка менеджеру: решение и ограничения

Формулировка для онбординга: «В новых установках DragonKeep test дал D7 15,73% против 13,36% в control, +2,37 п.п., 95% интервал [+1,31; +3,43] п.п. и p≈0,000012. Данные назначения и полный D7 проверены. Нижняя граница ниже MDE +1,5 п.п.; финансовый guardrail за 14 дней описан, но порог для него не был назначен. Предлагаем ограниченный релиз с мониторингом D7 и платежей, решение о полном выпуске — после наблюдения». Такая записка сообщает и сильную сторону, и предел вывода.

Для стартового пакета записка иная: «Покупка пакета 1,35% → 1,45%, но разница неубедительна; выручка на назначенного игрока 35,33 → 32,85 ₽, интервал разницы включает ноль. Цена 99 ₽ в выгрузке отсутствует. Не раскатываем как доказанную финансовую победу. Сначала сверяем фактические цены и целевую метрику, затем повторно проектируем опыт». Менеджеру проще принять отказ, когда видны конкретный дефект и следующий проверяемый шаг.

Храните вместе с запиской дату отсечения, фильтры включения, знаменатель, окно, метод интервала, статус SRM и ссылки на расчёт. В устном обсуждении полезно начинать с решения, затем показывать эффект и ограничение. Таблица на двадцать метрик без заранее выделенного главного вопроса не заменяет этой структуры.

Приложите одну строку о том, какие данные не вошли: у онбординга D7 собирался из основного и дополнительного файла сеансов; у цены стартового пакета фактическое значение 99 ₽ в платежах не подтвердилось. Это не техническое приложение для архива, а защита решения от повторного анализа по иному набору файлов. Если новый аналитик получит иной эффект, первым делом он сравнит источники, окно и единицу назначения.

Пять ошибок при чтении результата

Первая — назвать p вероятностью того, что B лучше A. Так менеджер принимает статистический сигнал за шанс успеха раскатки. Вторая — сравнить p с 0,05, но не заметить, что интервал эффекта почти целиком меньше стоимости внедрения. Тогда релиз может быть статистически убедительным и экономически пустым.

Третья — включить платежи после 14-го дня у ранних участников и обрезать их у поздних. Разные окна создают механическое преимущество. Четвёртая — делить по users.ab_group вместо сохранённого назначения. Это смешивает варианты и ломает причинный вопрос. Пятая — объявить guardrail «безопасным», потому что его собственное p больше 0,05; незначимость не исключает ущерб, важен интервал относительно допустимого порога.

Шестая — выбрать победивший сегмент после десятков просмотров и написать о нём как о заранее ожидаемом. Седьмая — не заметить SRM, потому что итоговый эффект выглядит здраво. В обоих случаях следующий шаг — расследовать путь данных и явно пометить анализ как разведочный; иначе красивый отчёт переносит дефект в решение.

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

Что значит p = 0,04 в A/B-тесте? Если нулевая модель и правила анализа верны, столь же или более экстремальная статистика возникала бы примерно в 4% повторений. Это не вероятность успеха B и не величина эффекта.

Можно ли раскатить тест, если интервал положителен, но ниже MDE? Можно принять бизнес-решение при низкой цене внедрения, однако нельзя обещать заранее требовавшийся минимум. Сохраните причину изменения порога и не выдавайте её за статистический вывод.

Что делать с незначимым результатом? Сравните интервал с диапазоном полезных и вредных эффектов, проверьте качество назначения и зрелость исхода. Широкий интервал — неопределённость; узкий около нуля — содержательное ограничение на возможный эффект.

Почему конверсия и выручка дали разные сигналы? Одна покупка не равна другой по сумме; кроме того, «первая покупка пакета» и «любая оплата» имеют разные числители. Назначенная основная метрика определяет решение, а расхождение требует объяснения.

Чем закончить анализ? Одним действием с условием: раскатить, ограничить раскатку, повторить тест или отказаться. Для быстрой независимой проверки долей пригодится калькулятор, но его поля должны брать знаменатели из проверенной выгрузки.

Продолжить чтение
Вся библиотека