Фрея · риск-менеджер необанка «Монетка»
Перед продлением контракта хочу посмотреть, как вы читаете чужие тесты. Возьмите все отчёты, что пришли вам за неделю, мой тоже. По каждому одно слово, «верим» или «не верим», и одна цифра, на которой это держится.
За неделю в агентство пришло семь отчётов об A/B-тестах от всех клиентов. Каждый выглядит убедительно: проценты, p-value, слово «значимо». Открываем по одному, как дверцы адвент-календаря. В шести из семи сидит подвох, и каждый мы уже разбирали в блоке продвинутых A/B. Один отчёт честный, и его тоже надо узнать.
Данные к отчётам сгенерированы для проекта программой с фиксированным сидом: это не выгрузки баз курса, а маленькие CSV, устроенные как настоящие тесты. Так каждый подвох виден в чистом виде. Все числа ниже посчитаны на этих файлах.
Фазы как у боссов. Разведка: можно ли верить устройству теста, ещё до всякой статистики. Бой: пересчитать то, что команда посчитала неправильно. Трофей: вердикты для Фреи и честный тест для сравнения.
Фаза 1. Разведка
День 1. Бран: новая витрина
Новая витрина магазина, тест 14 дней, сплит 50 на 50. Конверсия в покупку 5,16% против 4,24%, плюс 22%, p = 0,002. Раскатываем?
Первым делом смотрим не на конверсию, а на размеры групп. В тесте 9978 игроков, в контроле 11 049. Доля теста 47,5% вместо 50%. На глаз мелочь, но при 21 тысяче игроков случайное отклонение от половины редко больше 0,7 пункта. Критерий хи-квадрат даёт p = 1,5 · 10⁻¹³:
from scipy import stats
stats.chisquare([9978, 11049]) # statistic=54.55, pvalue=1.5e-13
Это SRM, несовпадение размеров групп с планом, которое мы разбирали в уроке про ловушки A/B. По дням видно, когда оно началось: первые четыре дня группы ровные, 3002 и 3003, а с пятого тест начинает недобирать. Значит, с пятого дня часть игроков теста терялась до записи в лог. Кто именно терялся, мы не знаем. Если это были те, кому новая витрина не открылась, в тесте остались самые настойчивые, и конверсия выросла бы и без витрины.
Вердикт: не верим. При SRM конверсию не пересчитывают и не «поправляют», а ищут поломку и перезапускают тест. Цифра: p = 1,5 · 10⁻¹³ у проверки сплита.
День 2. Мира: бесплатная доставка
Тест бесплатной доставки от 3000 ₽. Средний чек 4247 ₽ против 4067 ₽, плюс 4,4%. t-тест по 6523 заказам, p = 0,007.
Клиентов делили на группы по customer_id, по 1000 в каждой. А t-тест посчитан по заказам, как будто 6523 заказа независимы. Это не так: у каждого клиента свой привычный чек, и пять заказов одного любителя дорогих коробок похожи друг на друга. Единица рандомизации клиент, значит и разброс надо мерить по клиентам.
Средний чек это метрика-отношение: сумма заказов на число заказов. Дисперсию такой метрики считают дельта-методом по клиентам, как в уроке про ratio-метрики. Для каждого клиента x это сумма его заказов, k их число:
var(R) = (var(x) − 2 · R · cov(x, k) + R² · var(k)) / (N · mean(k)²)
С правильной ошибкой z = 0,74 и p = 0,457. Разница в 180 ₽ на чек укладывается в обычный шум между двумя тысячами клиентов.
Вердикт: не верим. Цифра: p = 0,46 по клиентам вместо 0,007 по заказам.
День 3. Команда «Монетки»: экран копилки
Метрика: пополнения копилки за 4 недели. Без CUPED +256 ₽, p = 0,076, шумно. Применили CUPED с самой сильной ковариатой, корреляция 0,82: эффект −4 ₽, p = 0,96. Экран не работает.
Идея правильная: CUPED из урока про снижение дисперсии убирает шум, который объясняется прошлым поведением клиента. Ошибка в выборе ковариаты. Самой сильной оказались пополнения первой недели теста. Но первая неделя уже внутри теста: если экран работает с первого дня, он поднял и её. В тесте пополнения первой недели выше на 100 ₽, и CUPED с theta = 2,59 вычел этот рост, умножив его почти втрое. Вместе с шумом пропал и эффект.
Правильная ковариата одна: пополнения за 4 недели до старта, pre_rub. Её экран изменить не мог.
ковариата корреляция theta эффект p-value
week1_rub 0,82 2,59 −4 ₽ 0,96
pre_rub 0,75 0,74 +310 ₽ 0,0012
Дисперсия метрики после CUPED с pre_rub падает на 56%, и эффект +310 ₽ за 4 недели становится значимым. Заодно он вырос с 256 ₽: до старта тест пополнял копилку на 73 ₽ меньше контроля, и CUPED это учёл.
Вердикт: не верим. Экран работает. Цифра: +310 ₽, p = 0,0012 с ковариатой до старта.
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.