CUPED One

CUPED One

Я един с силой. Сила течет во мне.

Двенадцать лет назад Алекс Денг, Я Сю, Рон Кохави и Тоби Уолкер сделали дроп, который помог всей индустрии A/B-тестирования немного ускориться. Что такое CUPED знает, наверное, почти любой человек, трогавший эксперименты. Чего, скорее всего, не знает почти любой человек, трогавший эксперименты, – это того,

  • как выглядит корректная формула для CUPED-трансформации
  • как выглядит корректная формула для θ
  • как подружить CUPED с ratio-метриками
  • как добавить в CUPED несколько ковариат
  • что еще использовать в качестве ковариат, кроме предэкспериментальных данных

Ничего страшного – сейчас узнает.

Это первая из серии статей про CUPED. Её содержание примерно совпадает с содержанием моей старой статьи, которую линкдин почему-то решил отформатировать, удалив весь код и картинки. Тут кода не будет, но будут чуть более формальные объяснения. Всё как вы не любите.

Правильная формула для CUPED-метрики

В оригинальной статье Алекс Денг приводит вот такую формулу для трансформированной метрики:

Её математическое ожидание равно математическому ожиданию исходной метрики Y.

Здесь метрика представлена агрегированно – как среднее. Но часто CUPED-трансформацию применяют на уровне пользователя. Мы можем записать формулу в поюзерном виде:

Такую запись любят эконометристы, потому что формула начинает сильно походить на формулу из теоремы Фриш-Во-Лоуэла. Но, помимо возможности разглядеть в CUPED линейную регрессию, поюзерная трансформация дает еще одно преимущество. Мы можем использовать флоу, к которому привыкли: считаем по трансформированной поюзерной метрике выборочное среднее и выборочную дисперсию, делим последнюю на размер выборки и получаем оценку дисперсии cреднего по CUPED-метрике.

Если же мы представляем трансформацию сразу в агрегированном виде, то нам нужно явно выписать формулу для дисперсии среднего :

Оба подхода дадут одинаковый результат. Обратите внимание, что последнее слагаемое, θE[X], при вычислении дисперсии в агрегированном виде исчезло. Это произошло из-за того, что θE[X] – константа, а дисперсия обладает свойством: Var(r.v + const) = Var(r.v.).

Очень важно понимать, что E[X] – это не среднее по выборке и даже не среднее по объединенной выборке "тест + контроль". Это математическое ожидание ковариаты в генеральной совокупности. Мы его не знаем. Хорошая новость заключается в том, что оно нам и не нужно. В A/B-тестах нас интересует разность средних. Так как E[X^t] = E[X^c], при вычислении разности эти слагаемые просто сократятся.

Поэтому всё что нужно сделать при трансформации метрики – это вычесть из нее ковариату, помноженную на θ. В агрегированном виде это выглядит так:

А в поюзерном так:

Средние по приведенным выше метрикам Y_cv^c и Y_cv^t не являются несмещенными оценками E[Y^c] и E[Y^t], так как мы не вычитаем из них соответствующие мат. ожидания E[X^c] и E[X^t]. Однако их разность является несмещенной оценкой E[Y^t] – E[ Y^c].

Иллюзия трансформации

Раз мы не можем прибавить мат. ожидание по ковариате, почему бы не использовать вместо него среднее по выборке? То есть на уровне пользователя проводим вот такую трансформацию:

В этом случае не только разность средних будет несмещенной оценкой E[Y^t] –E[ Y^c], но и сами средние по Y_cv^c и Y_cv^t будут несмещенными оценками E[Y^c] и E[Y^t].

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

То есть, несмотря на то что на уровне каждого пользователя мы получим трансформированное значение, когда мы посчитаем по ним среднее, оно будет в точности равно среднему до трансформации. Мы фактически отменили CUPED. Если мы будем многократно брать выборки, считать средние по нетрансформированной и трансформированной таким способом метрике и накладывать их на график, то получим два одинаковых (широких) распределения.

При этом выборочная дисперсия такой метрики будет совпадать с выборочной дисперсией при корректной трансформации (когда мы не добавляем среднее по ковариате).

А значит она будет меньше, чем дисперсия нетрансформированной метрики. И, как следствие, наша оценка дисперсии среднего, Var() / n, тоже будет меньше, чем реальная дисперсия среднего.

Мы попадаем в ситуацию, когда привычный нам способ оценки дисперсии среднего – Var() / n – дает некорректный результат. Оценка будет заниженной. Из-за этого наши доверительные интервалы будут включать в себя мат. ожидание метрики реже, чем ожидается. В частности, при верной H_0 это приведет к завышению вероятности ошибки первого рода.

Почему так происходит? На уровне выборки X_bar – константа. Когда мы применяем функцию Var() к поюзерным данным, автоматически срабатывает свойство Var(r.v + const) = Var(r.v.). Но проблема в том, что при многократном сэмплировании X_bar уже не является константой. Её значение будет меняться от выборки к выборке. И эту вариабельность при оценке стандартной ошибки мы не учитываем. Если бы на месте X_bar было E[X], которое является константой и на уровне выборки, и при многократном сэмплировании, то неравенство сверху превратилось бы в равенство.

Если подумать где-то одну минуту, то становится ясно, что эти же рассуждения будут верны и для разности средних. Только в этом случае вместо вариабельности одного среднего по ковариате мы не будем учитывать вариабельность разности выборочных средних (X_bar^t - X_bar_c).

Concat-среднее как у Букинга

В 2018 году в блоге букинга вышла статья, в которой предлагалось при трансформации прибавлять среднее по ковариате по объединенной выборке "тест + контроль".

Это буквально на капельку лучше, чем некорректный способ, который мы только что рассмотрели. Если мы посчитаем выборочную дисперсию, например, по тестовой выборке и поделим её на n^t, то все еще недооценим дисперсию трансформированного среднего, так как не учтем вариабельность X_bar^concat

Но, к счастью, при взятии разности средних X_bar^concat в тесте и в контроле сократятся. И при многократном сэмплировании так будет происходить на каждой итерации. А значит вариабельность разности (X_bar^concat – X_bar^concat) равна 0, как, собственно, и сама разность. Это позволяет нам получить корректную оценку дисперсии разности средних, взяв Var() / n^t + Var() / n^c

То есть при трансформации от букинга:

  • разность средних остается несмещенной оценкой E[Y^t] – E[ Y^c]
  • среднее по тесту остается несмещенной оценкой E[Y^t]
  • среднее по контролю остается несмещенной оценкой E[Y^с]
  • можно корректно оценить дисперсию разности средних
  • проблематично оценить дисперсию среднего по контролю и среднего по тесту

Дисперсия процентного прироста CUPED-метрики

Последний пункт в частности стоит держать в голове, когда вы считаете доверительный интервал для процентного прироста с помощью дельта-метода. Там в формуле фигурирует дисперсия среднего по контролю:

Так как для CUPED-метрики от букинга адекватно оценить её может быть немного сложно, лучше подставлять в знаменатель нетрансформированное среднее по контролю:

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

Продолжение будет в моем тгк @abtesticles

Report Page