Допустим, мы запустили АБ‑тест, рандомизировали клиентов, и теперь хотим оценить эффект фичи на средний чек. Средний чек — это пример ratio‑метрики или метрики отношения: считаем отношение суммы покупок к их количеству. Как анализировать эффект на такую метрику?
Казалось бы, средний чек — это среднее, и можно использовать просто t‑test. Но t‑test предполагает независимость наблюдений, а чеки могут быть зависимы — один клиент может совершить несколько покупок. Как следствие, мы завышаем ошибку первого рода и находим эффект там, где его нет.
В этой статье разберём, как с этим работать: корректно считать эффект, дисперсию, p‑value и доверительный интервал. Придём к дельта‑линеаризации, которая позволяет сравнивать исходный средний чек через привычный поюзерный тест. Заодно разберём, как использовать CUPED с дельта‑методом, и покажем связь с OLS с кластерными ошибками.
Содержание:
Единица анализа и единица рандомизации
Представим, что на платёжной странице интернет‑магазина появилась кнопка «Плати частями». Покупатель может разбить оплату на несколько платежей и позволить себе более дорогой товар. Мы ожидаем, что вырастет средний чек и средняя выручка на клиента, и хотим проверить это в A/B‑тесте. Посмотрим на эксперимент со стороны магазина.
Кого рандомизируем?
Прежде чем запустить эксперимент нам нужно понять, кому назначать тестовую или контрольную группу. Такой объект будем называть единицей рандомизации.
Самый логичный и правильный вариант — рандомизировать клиентов. Один клиент будет или всегда иметь возможность оплатить частями, или ни разу не иметь такой возможности.
Теоретически, есть другие варианты. Можно рандомизировать города, но их гораздо меньше, чем клиентов, и они сильно различаются по размеру. Можно рандомизировать экраны оплаты, но тогда сегодня клиенту доступна оплата частями, а завтра — нет. К тому же он может попасть в обе группы: привычного разделения на тестовых и контрольных клиентов уже не будет.
Поэтому зафиксируем, что в нашем примере единица рандомизации — клиент.
Что анализируем?
Под единицей анализа будем понимать объект, значения которого в группах мы хотим сравнить. Рассмотрим на примере двух следующих метрик.
Средняя выручка на пользователя (ARPU). Для каждого клиента складываем стоимости всех его покупок за время эксперимента, затем усредняем по клиентам. Единица анализа — клиент.
Средний чек. Берём стоимости отдельных покупок и усредняем их. Один клиент может принести несколько значений. Единица анализа — чек.
Как анализировать?
Для ARPU, то есть средней выручки на клиента, всё привычно: у каждого клиента одно значение, сравниваем средние обычным t‑test. Единица анализа совпадает с единицей рандомизации.
Со средним чеком сложнее. Покупки одного человека могут быть связаны: клиент, который обычно покупает дорогие товары, скорее всего, и следующую покупку сделает на крупную сумму. Все его чеки попадут в одну группу. Обычный t‑test по чекам не учитывает эту зависимость. Стандартная ошибка может оказаться заниженной, и мы начнём чаще находить эффект там, где его нет. Убедиться в этой проблеме можно например на АА симуляциях: на синтетических данных рандомизировать клиентов, анализировать средний чек через t‑test и увидеть, что эффект находится чаще, чем позволяет заложенный уровень значимости.
Введем определение ratio‑метрики или метрики отношения: это метрика, которая считается по единице анализа, которая не совпадает с единицей анализа. Почти всегда это отношения, что и дает название: средний чек, средняя длительность сессии, конверсия из показа баннера в клик. Важна здесь не сколько дробь, столько несовпадение единицы анализа и единицы рандомизации: можно считать не среднюю длительность сессии, а медианную, и мы будем иметь дело с теми же проблемами. Но в этой статье не будем усложнять задачу и сконцентрируемся именно на отношениях типа среднего чека.
Сформулируем общий принцип (подробнее про него здесь): если единица рандомизации совпадает с единицей анализа, то мы можем работать с этими единица как с независимыми объектами и использовать обычный статистический инструментарий, предполагающий независимость (как t‑test). В противном случае, мы имеем место с ratio‑метрикой и нужны специальные методы, о них и поговорим ниже.
Что делать?
Разберём четыре подхода: линеаризацию Яндекса, прямой дельта‑метод, дельта‑линеаризацию и OLS по событиям с кластерными ошибками. Посмотрим, как каждый из них решает нашу задачу и чем они связаны.
Бутстрап и бакетизацию оставим на неопределённое будущее: эти методы идейно сильно отличаются. Я не люблю слова на букву Б.
Все рассматриваемые методы асимптотические: дальше работаем с достаточно большими выборками. Корректировки на конечные выборки и различия между t‑test, Welch t‑test и нормальной аппроксимацией здесь обсуждать не будем — это сильно усложнит повествование и будет отвлекать от центральной мысли.
Линеаризация Яндекса
Идея: если ratio нельзя анализировать как обычное среднее, давайте построим новую метрику, которую уже будет считаться по клиентам, которых мы рандомизируем, а значит можем считать независимыми, и будем работать как с метриками типа ARPU. Эта новая метрика должна быть сонаправлена с исходной ratio‑метрикой или, можно сказать, эта метрика должна быть прокси‑метрикой к ratio.
Для каждого клиента — и в тесте, и в контроле — построим вот такую линеаризованную метрику:
Здесь — средний чек в контрольной группе,
и
— сумма и количество покупок клиента.
Рассмотрим пример с двумя клиентами. Пусть они составляют контрольную группу, тогда .
Клиент |
|||
Клиент 1 |
2000 |
2 |
400 |
Клиент 2 |
400 |
1 |
−400 |
Среднее по контролю обнулили — это уже не средний чек в 800 рублей, а новая линеаризованная метрика.
После преобразования у каждого клиента появляется одно число . Теперь тест и контроль можно сравнить обычным t‑test на уровне клиентов, ведь
и
одного клиента не зависят от
и
другого клиента, а
— константа, общая для всех клиентов, и вроде бы на это можно закрыть глаза (можно, но не всегда, и ниже обратим на это внимание).
Почему такая замена метрики допустима?
Для контроля среднее значение линеаризованной метрики равно нулю:
Для теста:
Поскольку среднее значение знаменателя положительно, знак
совпадает со знаком
.
Если средний чек в тесте вырос, средняя линеаризованная метрика тоже вырастет. Если средний чек упал, она тоже упадёт. Именно поэтому гипотезу о равенстве ratio‑метрик можно проверить через гипотезу о равенстве средних .
Подробное доказательство и условия корректности метода приведены в оригинальной статье Яндекса.
Преимущества линеаризации. После преобразования мы получаем одну поюзерную метрику и можем работать как с обычной поюзерной метрикой: t‑test, CUPED, привычный пайплайн.
Ограничения:
Размерность результата. Среднее
не равно среднему чеку, а разница средних
выражена в единицах числителя (то есть рублях), а не исходной ratio‑метрики (то есть не в рублях на чек). Поэтому p‑value получается естественно, а для получения эффекта, доверительного интервала и MDE в рублях среднего чека требуются дополнительные преобразования и допущения.
Метод ломается, если знаменатель меняется. То есть если наша фича влияет не только на числитель, но и на знаменатель. Точнее ломается p‑value, сонаправленность эффекта сохраняется, как мы показали выше. Проблема в коэффициенте
, который мы используем в линеаризации: на самом деле это случайная величина, и оказывается, что при изменении знаменателя мы неправильно оцениваем дисперсию.
Дельта‑метод
Есть альтернативная идея. Что вообще нужно, чтобы провести статистический тест? Нужны точечная оценка и дисперсия. Точечную оценку эффекта мы уже умеем считать:
Осталось найти дисперсию этой оценки. Зная дисперсию, мы получим стандартную ошибку, построим доверительный интервал и посчитаем p‑value.
Дисперсию среднего по независимым клиентам мы считать умеем:
где — число клиентов в группе. Дисперсию линейной комбинации — тоже. Но здесь у нас отношение двух средних. Что делать? Приблизим отношение линейной комбинацией с помощью формулы Тейлора.
Для функции одной переменной разложение первого порядка выглядит так:
Здесь — случайная величина,
— её математическое ожидание,
— функция, которую мы приближаем, а
— её производная в точке
. Мы заменяем нелинейную функцию её линейным приближением в окрестности математического ожидания. Для линейного выражения дисперсию уже легко посчитать. Если
— вектор, то производная просто заменяется на градиент, а произведение становится скалярным.
В нашем случае случайные величины — два выборочных средних и
, а функция — их отношение:
Обозначим и
: это средняя сумма покупок и среднее число покупок на клиента в генеральной совокупности. Разложим отношение выборочных средних в окрестности
:
Здесь мы использовали формулу Тейлора для двух переменных.
Получили линейную комбинацию средних. Теперь найдём её дисперсию:
Здесь и
— дисперсии суммы покупок и числа покупок на клиента,
— их ковариация.
На практике вместо неизвестных параметров подставляем выборочные средние, дисперсии и ковариацию. Всё считаем отдельно для теста и контроля.
Внутри формулы три слагаемых, которые описывают соответственно:
неопределённость числителя
;
совместное движение числителя и знаменателя через ковариацию
;
неопределённость знаменателя
.
Для независимых тестовой и контрольной групп дисперсии складываются:
После этого получаем z‑статистику:
Из распределения статистики получаем p‑value и доверительный интервал.
Преимущества дельта‑метода. Метод оценивает непосредственно сформулированную ratio‑метрику, а не заменяет исходную метрику прокси‑метрикой. Как следствие, мы получаем и точечную оценку в исходных единицах, и доверительный интервал, и MDE, а не только p‑value. И дельта‑метод работает даже при изменении знаменателя.
Ограничения. Основной недостаток — инженерный. Мы уже не можем просто передать одну колонку в стандартный t‑test. Нужно отдельно считать средние, дисперсии, ковариации и реализовывать формулу для ratio.Для одной метрики это не выглядит страшно, но при добавлении CUPED, нескольких ковариат или более сложной функции число моментов и ковариаций быстро растёт.
Дельта‑линеаризация
Выше мы обсудили линеаризацию и дельта метод. Получается любопытный выбор:
линеаризация удобна как обычная метрика, но не сохраняет исходный масштаб;
дельта‑метод сохраняет исходный масштаб, но требует отдельной реализации.
Преимущества этих подходов можно объединить в один — в дельта‑линеаризацию.
Пусть:
Для каждого клиента построим:
Кажется, это новая сложная формула, но на самом деле мы её уже видели! Мы взяли то же линейное выражение из формулы Тейлора и вместо выборочных средних подставили данные отдельного клиента. Ниже мы убедимся, что среднее в точности равно среднему чеку, а дисперсия среднего
(которую можно посчитать как дисперсию линейной комбинации) в точности равна дисперсии, которую дает дельта‑метод.
Формулу можно упростить:
Алгоритм дельта‑линеаризации
Для каждой экспериментальной группы отдельно:
агрегируем данные до уровня рандомизации и для каждого клиента получаем
и
;
оцениваем
и
выборочными средними;
-
рассчитываем ratio:
строим дельта‑линеаризованную метрику:
А потом сравниваем такую дельта‑линеаризованную метрику между тестом и контролем обычным t‑test.
Несмотря на непривычную формулу, технически метод очень простой: несколько групповых агрегатов, одна новая колонка и обычный тест для средних.
Вернемся к нашему примеру: , а
.
Клиент |
|
Клиент 1 |
800+400/1,5≈1066,67 |
Клиент 2 |
800-400/1,5≈533,33 |
Среднее — ровно 800 рублей. Вернули исходный средний чек, сохранив одно число на клиента.
Среднее дельта‑линеаризованной метрики в точности равно ratio, рассчитанной на той же выборке:
Поэтому разница средних в точности равна разнице средних чеков:
Теперь посмотрим на дисперсию. Сначала подставим определение :
Прибавление константы не меняет дисперсию, а множитель
выносится за её знак в квадрате. Раскрываем оставшуюся дисперсию:
Для дисперсии среднего делим это выражение на — и получаем формулу прямого дельта‑метода.
Что мы получили
Дельта‑линеаризация объединяет основные преимущества двух предыдущих подходов:
Свойство |
Линеаризация |
Дельта‑метод |
Дельта‑линеаризация |
Одна метрика на клиента |
Да |
Нет |
Да |
Обычный t‑test |
Да |
Нет |
Да |
Эффект в исходных единицах |
Нет |
Да |
Да |
Доверительный интервал в исходных единицах |
Не напрямую |
Да |
Да |
CUPED |
? |
? |
? |
CUPED разберём отдельно. Про дельта‑линеаризацию можно думать как про инженерный «трюк», который делает тот же дельта‑метод, но так, что не приходится переписывать пайплайны А/B‑платформы.
Мы опять изобрели линейную регрессию
В статистике и эконометрике всё в какой‑то момент превращается в линейную регрессию. Есть ли связь между OLS и методами, которые мы только что обсудили?
Да. Для среднего чека:
OLS с кластерными ошибками — это обычная регрессия на уровне чеков, в которой мы считаем ошибки хитрым образом. Её можно реализовать например через statsmodels.formula.api с cov_type="cluster"
Все три способа дают одну и ту же оценку эффекта и одну и ту же оценку дисперсии (может быть разница в том, как именно считается кластерная ошибка и делим мы на или на
, но такие отличия несущественны).
Едва ли OLS окажется удобнее дельта‑линеаризации для расчёта A/B‑тестов. Но эта связь позволяет посмотреть на ratio‑метрики с точки зрения привычной эконометрической терминологии — линейной регрессии и кластерных ошибок. Подробности для интересующихся ниже.
Это необязательный раздел для любителей формул, и его можно пропустить
Что такое OLS с кластерными ошибками
Вернёмся к данным на уровне отдельных чеков. Обозначим стоимость чека клиента
как
и оценим модель:
где для контроля и
для теста, а
— эффект теста.
Сами коэффициенты оцениваются обычным OLS. Но чеки одного клиента могут быть зависимы, поэтому дисперсию нужно считать с кластеризацией по клиенту.
Кластерную оценку ковариационной матрицы коэффициентов считаем так:
Здесь
— оценки коэффициентов, Z — матрица со строками ,
— остаток регрессии для чека. Сначала складываем вклады чеков внутри клиента, затем суммируем по клиентам.
Точечные оценки совпадают
Регрессия с константой и индикатором теста оценивает два средних:
Следовательно,
Это точное равенство на конкретной выборке: коэффициент OLS равен разнице средних чеков.
Дисперсии тоже совпадают
Сначала запишем оценку ковариационной матрицы коэффициентов OLS:
где
— матрица, составленная из строк
, а
Суммирование идёт по клиентам: сначала складываем вклады чеков внутри клиента, затем учитываем вклад каждого клиента в дисперсию.
Рассмотрим одну экспериментальную группу .Пусть — число клиентов, а
— общее число чеков. Тогда средний чек равен:
Кластерная дисперсия OLS для среднего чека имеет вид:
где
Теперь запишем оценку дисперсии из дельта‑метода:
Поскольку , получаем:
Для дельта‑линеаризации:
Поэтому
а дисперсия среднего равна той же величине:
Для независимых тестовой и контрольной групп две групповые дисперсии складываются. Следовательно,
Как применять CUPED
Существует распространённое мнение, что CUPED можно применять к ratio‑метрикам только после линеаризации Яндекса.
Но это не так: CUPED можно использовать со всеми рассмотренными методами. Отличается не принципиальная возможность, а сложность реализации, только с оговоркой, что в OLS есть нюансы.
Метод |
Как добавить CUPED |
Линеаризация Яндекса |
Применить обычный CUPED к линеаризованной |
Дельта-линеаризация |
Применить обычный CUPED к дельта-линеаризованной |
Прямой дельта-метод |
Добавить ковариаты в многомерное разложение Тейлора |
OLS cluster robust |
Не совсем CUPED, но можно добавить ковариаты в регрессию на уровне чека |
Что такое CUPED
Часть различий между клиентами была ещё до эксперимента. CUPED вычитает из метрики ту часть, которую можно предсказать по ковариате, и уменьшает шум при сравнении групп.
Пусть — метрика клиента, а
— ковариата. Для одной ковариаты оцениваем коэффициент:
И строим скорректированную метрику:
Коэффициент можно оценить на контроле и использовать одно значение для обеих групп. Затем сравниваем средние скорректированной метрики.
Чаще всего берут одну ковариату — значение той же метрики на препериоде. Но можно использовать и другие ковариаты, в том числе несколько сразу. Ковариаты не должны зависеть от воздействия и для эффективного снижения шума они должны хорошо предсказывать метрику.
CUPED после линеаризации и дельта‑линеаризации
И линеаризация Яндекса, и дельта‑линеаризация превращают ratio в обычную линейную метрику : в первом случае
, во втором —
.
Дальше применяем обычный CUPED:
и сравниваем средние . Вот и всё. Для дельта‑линеаризации результат при этом остаётся в исходных единицах ratio‑метрики.
CUPED внутри прямого дельта‑метода
CUPED для ratio‑метрик обсуждается уже в оригинальной статье. Идея та же: применяем формулу Тейлора не к двум, а к четырём средним —
Добавили числитель и знаменатель на препериоде.
Коэффициенты и
выбираем совместно, чтобы линейная поправка на исторические ковариаты сильнее всего уменьшала дисперсию:
Здесь — дельта‑линеаризованная метрика Это коэффициенты обычной регрессии
на обе ковариаты с константой. На практике их можно оценить на контроле и затем использовать одни и те же значения для теста и контроля.
Оставим эту прекрасную формулу без доказательства — ей можно только любоваться.
Ковариаты в OLS
В OLS добавим ковариату в регрессию и продолжим кластеризовать ошибки по клиенту:
Здесь — ковариата для чека
клиента
, не зависящая от воздействия. Строго говоря, это linear adjustment, а не классический CUPED.
Но не всё так просто: добавление ковариат может изменить саму оцениваемую величину, а не только дисперсию. Принципиальное отличие в том, что теперь мы работаем на уровне чека, а не клиента. Здесь мы показываем общую идею, не вдаваясь в анализ применимости таких корректировок — это тема для дальнейшего исследования.
Какой метод в итоге использовать
Практический вывод: используйте дельта‑линеаризацию. Она сохраняет эффект в исходных единицах метрики и позволяет использовать привычный поюзерный пайплайн с t‑test и CUPED.
Оговорка: задача была показать основные подходы и связи между ними. Все эти методы асимптотические и на конкретных данных и конечных выборках все работает не так гладко, как в теории - проверяйте на симуляциях.
Основные результаты:
Средний чек действительно является средним, но среднее считается по чекам, а рандомизация идет по клиентам. t‑test не работает. Общий принцип: если единица анализа и рандомизации не совпадают, нужны специальные методы
Линеаризация Яндекса превращает ratio в пользовательскую метрику, сонаправленную с исходной, и позволяет использовать обычный t‑test. Однако мы подменяем метрику другой, получаем трудности с оценкой эффекта, ДИ и MDE в исходных единицах и, более того, имеем некорректное p‑value в случае, когда меняется знаменатель.
Дельта‑метод напрямую оценивает дисперсию ratio и даёт результат в исходных единицах. Однако получаем дополнительные инженерные сложности.
Дельта‑линеаризация объединяет преимущества линеаризации и дельта‑метода. Вычислительно удобно и оценивает изначальную метрику.
OLS с кластерными ошибками — альтернативная форма того же метода.
CUPED можно применять к линеаризации, дельта‑методу и дельта‑линеаризации. Теоретически можно добавить ковариаты в OLS по чекам.
Мы начали с примера с возможностью оплаты частями на сайте. Теперь мы умеем оценивать такую метрику как средний чек. Как интерпретировать эту метрику и является ли она подходящей, а так же как переиспользовать этот инструментарий для квантильных метрик, обсудим в ближайшем будущем.