CUPED 2
Продолжаем про CUPED. В первой части разобрались, как не перестараться с трансформацией метрики. В этой – выведем верную формулу для θ, а также разберемся, как подружить CUPED с дельта-методом.
Оптимальная тета
Скорее всего, вы сталкивались вот с таким вариантом расчета оптимального значения θ: Cov(Y, X) / Var(X). Ничего удивительного, ведь это буквально формула из оригинальной статьи:

Да и букинг (опять этот букинг) в своей статье объединяют выборки по тесту и контролю и берут θ = cov(Y^concat, X^concat) / var(X^concat). И вся индустрия в итоге делает так же. А мы так делать не будем. Потому что Cov(Y, X) / Var(X) в оригинальной статье – формула просто для среднего, а не для разности средних.
Давайте трансформируем отдельно метрику по тесту и отдельно метрику по контролю, честно посчитаем дисперсию их разности, возьмем производную по θ и приравняем её к 0. Оттуда выразим θ и получим корректную формулу.
Начнем с трансформаций. Берем их в таком виде (если вам непонятно, почему в таком виде, то мне непонятно, почему вы не читали первую часть статьи):

Выводим формулу для дисперсии:

Теперь вычисляем производную по θ, приравниваем её к 0 и находим интересующую нас формулу:

На самом деле такая тета вряд ли будет сильно отличаться от регрешн стайл теты букинга (вот тут можно посмотреть сравнение CUPED с ANCOVA-1 и -2). И, скорее всего, еще меньшей будет разница в величине, на которую вырастает мощность. Но раз можно сделать правильно, то будем делать правильно.
Отменяем линеаризацию от Яндекса
Иногда аналитики при работе с ratio-метриками предпочитают линеаризацию дельта-методу, аргументируя это тем, что последний не получается подружить с CUPED. Чтобы получилось подружить дельта-метод с CUPED, можно попробовать, например, дочитать оригинальную статью про CUPED до конца. В аппендиксе B буквально дается формула для θ на такой случай:

Вторая строчка – это разложение функции f(Y, N) = Y/N в ряд Тейлора первого порядка в точке E[Y_bar] / E[N_bar] (и аналогично для X/M). То есть фактически применение дельта-метода. Про всю эту шизу я писал в части с математикой в моей великой статье про перевод эффекта на конверсию в деньги. Более подробно про связь дельта-метода и разложения в ряд Тейлора можно почитать вот тут. Сейчас на этом подробно останавливаться не буду. Давайте лучше доведем формулу выше до конца.

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

Получив θ, можем трансформировать наши ratio-метрики:

Остается только найти дисперсию разности средних. Для этого сначала снова разложим уже трансформированные метрики в ряд Тейлора первого порядка:

И возьмем от разложенной метрики дисперсию:

Остается только сложить значения для контрольной и тестовой групп, чтобы получить дисперсию разности средних и построить с её помощью доверительные интервалы.
Вы, вероятно, в этот момент скажете: "Ром, спасибо, конечно, но мы, наверное, всё-таки линеаризацию от Яндекса будем использовать...". Могу вас понять. Я и сам последнюю формулу попросил вывести ChatGPT, так что даже не уверен, что она правильная. Но!
Всё, к чему мы пришли, можно получить более простым способом. Чтобы вывести формулы выше, я и Алекс Денг каждый раз раскладывали метрику Y/N, X/M или Y/N – θ*X/M в ряд Тейлора первого порядка и подставляли получившееся выражение внутрь формул для θ и SE. Почему бы нам сразу не разложить в ряд Тейлора значения ratio-метрики на экспериментальных и предэкспериментальных данных в тестовой и контрольной группе. А дальше работать с разложенной метрикой как с обычной mean-метрикой. То есть у нас будет 4 разложения:

Всё, что с чертой сверху, – это средние по выборке. Всё, что без черты, – значения метрики на уровне пользователя. Давайте на примере:
- Ваша ratio-метрика – средний чек
- Среднее значение выручки на пользователя в тестовой группе за период эксперимента – 1000. Это Y_bar^t.
- Среднее значение количества заказов на пользователя в тестовой группе за период эксперимента – 5. Это N_bar^t.
- Пользователь i сделал за период эксперимента 2 заказа на сумму 500 рублей.
- Линеаризованное (приближенное с помощью ряда Тейлора) значение среднего чека для него будет равно 1000 / 5 + (1 / 5) * (500 – (1000 / 5) * 2)
Аналогично считаем для пользователя i его значение на предэкспериментальном периоде. Получаем таким образом для каждого пользователя поюзерные значения метрики на двух периодах. Далее работаем с ними как со значениями любой другой mean-метрики (не ratio), избавляя себя от необходимости прописывать огромные формулы, что я привел ранее.
Вы могли обратить внимание, что я назвал разложенную в ряд Тейлора метрику – линеаризованной. Я сделал так, потому что в математике этот процесс буквально так и называется. Преимущество этой линеаризации над линеаризацией от Яндекса заключается в том, что вы не меняете гипотезу: среднее по разложенной по Тейлору метрике совпадает с глобальным средним по исходной ratio-метрике.

Сравните это с линеаризацией от Яндекса, при использовании которой за гордым утверждением о теоретически доказанной сонаправленности всегда приходится добавлять что-то такое:
К линеаризованным сигналам можно относиться как к единицам вклада в изменение ratio-метрики от начального значения в контроле до наблюдаемого в тесте.
Что это вообще значит, я хз. В общем, долой линеаризацию, долой Яндекс, третья часть будет в моем тгк @abtesticles