Привет! В этой статье я хочу рассмотреть практический вопрос, связанный с расчётом MDE линеаризованной метрики. Я кратко напомню суть метода линеаризации, а затем покажу как связано изменение исходной ratio-метрики с изменением её линеаризованного варианта в A/B-тесте – это поможет правильно рассчитать размер выборки в экспериментах с ratio-метриками c использованием линеаризации.

Линеаризация: контекст

Линеаризация – это способ трансформировать ratio-метрику в поюзерную (user-level). Он появился в ответ на потребность использовать методы повышения чувствительности для ratio-метрик в A/B-экспериментах, например, CUPED. Эти методы были изначально разработаны для user-level метрик и применить их к ratio-метрикам напрямую было нельзя. Дело в том, что у ratio-метрик нарушается ключевая предпосылка о независимости наблюдений, так как единица анализа отличается от единицы рандомизации, что сильно ограничивает применимость методов – в этом состоит основная мотивация оригинальной статьи по линеаризации Budylin et al. (2018)Consistent Transformation of Ratio Metrics for Efficient Online Controlled Experiments (WSDM'18).

Если в абзаце выше оказалось много неизвестных понятий, то рекомендую почитать статьи на Хабре про ratio-метрики и формальным подходом к единицам рандомизации и анализа – https://habr.com/ru/companies/kuper/articles/774608/ а также статью про сравнение методов работы с ratio-метриками https://habr.com/ru/companies/kuper/articles/768826/

Процедура линеаризациии

Я напомню про работу метода линеаризации на примере популярной ratio-метрики – среднего чека. Представим, что у нас есть данные, сгруппированные по юзерам – информация о стоимости и количестве всех заказов для каждого пользователя.

Данные по заказам пользователей и расчёт среднего чека по заказам
Данные по заказам пользователей и расчёт среднего чека по заказам

Средний чек рассчитываем как стоимость всех заказов на количество заказов, просуммированных по пользователям:

\displaystyle X = \dfrac{\displaystyle \sum_{i=1}^N amount_i}{\displaystyle \sum_{i=1}^N orders_i}  \;,

где N – число пользователей в наборе данных

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

L_i = amount_i - X \cdot orders_i \;,

где

  • L_i – значение линеаризованной метрики юзера i

Интуитивно, линеаризованная метрика отражает вклад пользователя в глобальное среднее X и этот вклад может быть как положительный, так и отрицательный или равный нулю. Слагаемое X \cdot orders_i можно рассматривать как ожидаемую стоимость всех заказов этого пользователя если бы его индивидуальный средний чек был бы равен глобальной среднему чеку. Эту величину мы вычитаем из реальной стоимости заказов пользователя и получаем линеаризованную метрику.

Такой переход позволяет избавиться от зависимых наблюдений при расчёте среднего, ведь теперь каждому пользователю соответствует только одно значение. Усредняя метрику L_i по пользователям мы получаем среднюю пользовательскую метрику, которая будет прокси к исходной ratio-метрике. Это означает, что если средний чек увеличивается, то и средняя линеаризованная метрика также будет расти.

Постановка проблемы

Представим классический сплит-тест – пользователи делятся на тестовую и контрольную группы. В этом случае процедура линеаризации немного уточняется – глобальное среднее вычисляется по контрольной группе X_с, а линеаризацию метрик и в тесте и контроле проводят с использованием именно этого значения:

L_j^{(t)} = amount_j^{(t)} - X_с \cdot orders_j^{(t)} \;, L_i^{(c)} = amount_i^{(c)} - X_с  \cdot orders_i^{(c)} \;,

Здесь и далее я буду использовать сокращения:

  • индекс t означает тестовую группу пользователей (test или treatment), их индексы обозначаю j при суммировании

  • индекс c относится к контрольной группе (control), а их индексы суммирования обозначаю i

Однако на этапе планирования эксперимента тестовой группы ещё нет. Тем не менее, чтобы управлять ожиданиями стейкхолдеров и соблюдать фреймворк работы с A/B, необходимо заранее оценить размер выборки или длительность эксперимента. Для t-теста это можно сделать по стандартной формуле (полагаем дисперсии в тесте и контроле одинаковыми и равными дисперсии метрики на исторических данных):

\displaystyle n = \dfrac{(z_{\alpha} + z_{1-\beta})^2 \cdot 2\sigma^2 }{MDE^2} \;,

В эту формулу входят дисперсия и MDE исследуемой метрики, в нашем случае линеаризованной. Рассчитать \sigma^2 такой метрики по историческим данным не составляет большого труда – никто не запрещает выгрузить данные пользователей и провести линеаризацию по принципу описанному выше и рассчитать показатель.

Однако с определением MDE может быть сложнее. В продукте чаще всего есть ожидания от фичи или инициативы, выраженные в единицах исходной ratio-метрики, например, ожидаем увеличение среднего чека на 5% или 100 рублей. Эту величину как правило и берут в качестве минимально интересующего нас эффекта и желаемого MDE, которого требуется достичь. А саму линеаризованную метрику используют только для подтверждения эффекта и не интерпретируют её отдельно. То есть продакту не репортят, что средний вклад пользователя в метрику среднего чека в тесте вырос на n рублей – это сложно для понимания и не соответствует изначальной бизнес-задаче.

Здесь же обсудим, что при работе с линеаризацией мы будем используем понятие абсолютного MDE. Дело в том, что относительный MDE (выраженный в % изменения) для линеаризованной метрики теряет смысл. Если усреднить L_i^{(c)}по всем пользователям в контроле, то мы получим ноль, так как среднее всех вкладов пользователей в ratio-метрику равно нулю: какие-то пользователи отклонились, но в целом они все вместе привели к тому, что ratio-метрика равна наблюдаемому значению. Из этого вытекает следующее утверждение:

\Delta_{lin} = L_t - L_c \stackrel{{L_c=0}}{=} L_t \;,

то есть по сути вся разница тестовой и контрольной группы содержится в среднем значении линеаризованной метрики в тесте. Используя формулу линеаризации, может представить \Delta_{lin} равное среднему значению линеариованной метрики в тесте как:

\Delta_{lin} = \frac{1}{N_t} \cdot \left( \sum_j amount_j^{(t)} - X_c \cdot \sum_j orders_j^{(t)}\right).

Распишем по определению среднего чека сумму всех заказов у тестовых пользователей как средний чек умноженный на число заказов:

\sum_j amount_j^{(t)} = X_t \cdot \sum_j orders_j^{(t)} \; ,

тогда

\Delta_{lin} = \frac{1}{N_t} \cdot \left( X_t \cdot \sum_j orders_j^{(t)}  - X_c \cdot \sum_j orders_j^{(t)}\right).

Выносим общий множитель за скобку:

\displaystyle \Delta_{lin} = \frac{\displaystyle  \sum_j^{N_t} orders_j^{(t)}}{\displaystyle N_t} \cdot \overbrace{(X_t - X_c)}^{\Delta_{ratio}} .

Получаем разность исходных ratio-метрик X_t - X_c = \Delta_{ratio} c некоторым коэффициентом – количество всех заказов пользователей в тестовой группе, делённое на число пользователей в тесте или другими словами на среднее число заказов на пользователя в тесте.

А если мы хотим на этапе планирования эксперимента перевести MDE ratio-метрики, в момент, когда тестовой группы еще не существует, то мы можем использовать среднее число заказов на пользователя по историческим данным.

В общем случае ratio-метрики это сумма числителей, делённая на сумму знаменателей:

\displaystyle X = \dfrac{\displaystyle \sum_{i=1}^N num_i}{\displaystyle \sum_{i=1}^N denum_i}  \;,

Тогда MDE линеаризованной метрики масштабируется на среднее значение знаменателя относительно MDE исходной ratio-метрики:

\boxed { MDE_{lin} = \overline{denum} \cdot MDE_{ratio}}

Саммари

Мы показали, как связаны изменения линеаризованной метрики и исходной ratio-метрики в рамках эксперимента, и вывели формулу, позволяющую пересчитать ожидаемый эффект в единицы линеаризованной метрики и корректно оценить размер выборки для t-теста.

Комментарии (0)