Pull to refresh

Comments 4

Добрый день, спасибо за статью !

У меня есть вопрос касательно ratio-метрик:

В вашем примере расчета линеаризации есть пользователи с нулевыми значениями числителя и знаменателя, есть ли в этом смысл ? Например в оригинальной статье по линеаризации указано следующее - where X and Y are some user level metrics (we assume that Y is positive) (см. пункты 3.2, 4.2 и 4.3 ), то есть судя по данному определению, знаменатель не может быть меньше или равен нулю. Также это не слишком стыкуется с самим описанием подхода - мы же хотим оценить эффект на non-user уровне, то есть несмотря на то, что мы сплитуем в тесте пользователей, оценка происходит на единицу наблюдения в знаменателе. Резюмируя - если нету наблюдения - то что оценивать ?

Привет, да, в табличке я осознано на это пошел, чтобы указать на общую поюзерную структуру в экспе, где у нас единица рандомизации и единица анализа совпадают. Но когда у нас единица анализа non-user, например, чек, чтобы посчитать его среднее значение, то надо оставлять только тех юзеров, у которых сигналы знаменателя больше 0, так как если пользователь "не сделал" чек, то и не участвует в определении ratio-метрики. Соответственно линеаризация сигналов и статоценка линеаризованных сигналов происходит только по тем, где сигнал знаменателя больше 0.

Вообще, если пойти в рассуждениях дальше, то можно понять, что любая метрика определяется как "оставь только те сигналы, где знаменатель больше нуля". Например, в статье я указываю ARPU, но если захочется ARPPU, то тебе в числителе и знаменателе надо оставить только тех пользователей, кто сконвертился в покупку, т.е. знаменатель по сигналам "совершил ли покупку" больше 0. Это может быть критично для некоторых метрик, числитель которых напрямую не зависит от знаменателя, например, какое-нибудь среднее число кликов по рекламному баннеру по платящим пользователям.

В Python определение любой метрики в таком случае будет следующим:

# num and denom are numpy arrays with user signals
numerator = numerator[denominator>0]
denominator = denominator[denominator>0]

metric = numerator.sum() / denominator.sum()

А если мы хотим оценить подобную метрику, где числитель не зависит от знаменателя, (в качестве пример приведу свою метрику - отношение рекламной выручки к общей выручке, где не для каждого числителя есть знаменатель), то в таком случае лучше использовать бутстрап ?

О, хороший пример, на самом деле имхо тут вопрос интерпретации метрики и всех преобразований которые применяешь к юзерам.
Условно ты можешь попробовать посчитать adv_revenue per adv_gmv (т.е. только по тому gmv >0 и где была рек выручка) и ответить на вопрос, а стала ли реклама "отъедать" больше gmv где она была. Но думая в таком ключе можно продолжить и сказать что и твоя метрика adv_revenue per gmv интерпритируется также, что реклама могла "съесть" весть gmv, т.е. он будет 0.

Это по сути та же ratio-метрика, где ты имеешь у отдельного юзера adv_revenue и gmv . При линеаризации будет два случая когда gmv == 0 и gmv > 0 , тогда для юзера будет соответственно:
1) adv_revenue - CONTROL_RATIO * 0 = adv_revenue
2) adv_revenue - CONTROL_RATIO * gmv = lin_value
И всегда adv_revenue будет больше чем lin_value , т.е. у одного юзера вклад в метрику как бы только за счет рекламной выручки (съеден весь gmv), а у другого получился какой-то вклад в метрику меньше чем его рекламная выручка (он принес какой-то gmv). Так что я бы попробовал на самом деле и с нулями.
Только не стоит забывать, что обычно ratio-метрики еще парадоксу Симпсона подвержены, т.е. надо отдельно смотреть на суммарную рекламную выручку и суммарный gmv, чтобы понимать за счет чего произошло изменение, чтоб подстраховаться.

Знаю, на практике такой пример как у тебя считают бакетным методом на самом деле, но для него желательно иметь оооочень много наблюдений.
Да, когда нет уверенности, бутстрап всегда можно применять и для ratio-метрик в том числе.

Sign up to leave a comment.