LTV: вероятность совершения повторной покупки
Я думаю, вы уже пришли к выводу, что в работе с LTV главное рассчитывать вероятность совершения повторной покупки и быстро реагировать на ее снижение.
Существуют разные подходы к ее оценке, но все они так или иначе связаны с поведенческими характеристиками, причем практически всегда характеристика #1 это Recency.
Сегодня я покажу вам 3 подхода к оценке вероятности совершения повторной покупки (от менее точного к более точному):
Взляните как меняется вероятность совершения повторной покупки при изменении inverse_Recency и Frequency:
Для вашего удобства я в таблицу также включил Recency. Напомню, что: R = LT - inv_R
Что мы видим?
Существуют разные подходы к ее оценке, но все они так или иначе связаны с поведенческими характеристиками, причем практически всегда характеристика #1 это Recency.
Сегодня я покажу вам 3 подхода к оценке вероятности совершения повторной покупки (от менее точного к более точному):
- на основе Recency и Latency
- на основе Recency, Lifetime, Frequency
- на основе модели Pareto/NBD
Прелесть каждого из подходов в том, что мы рассчитываем вероятность совершения повторной покупки для каждого клиента индивидуально (не на основе когорты).
Оценка вероятности на основе Recency и Latency
Оценка вероятности на основе Recency и Latency
Начну с того, что бегло напомню вам разницу между Recency и Latency.
Recency - время, которое прошло с момента совершения последней покупки до сейчас.
R = today() - last_order_date
Latency - среднее время между покупками.
L = ( last_order_date - first_order_date ) / ( Frequency - 1 )
ВАЖНО УЧЕСТЬ:
- Для того, чтобы Latency имело смысл клиент должен совершить 2+ покупки;
- Если взглянув на промежутки между покупками вы видите, что у клиентов периодически возникают длинные паузы (21, 17, 20, 90, 18) тогда среднее арифметическое лучше заменить на медиану.
Дано:
odds = R / L = 31/ 14 = 2.21
inv_odds = 1 / odds = 1 / 2.21 = 0.45
p_Alive = inv_odds / ( 1 + inv_odds ) = 0.45 / ( 1 + 0.45 ) = 0.31
Давайте посмотрим как меняется вероятность совершения повторной покупки при изменении Recency:
Что мы видим?
НЕДОСТАТКИ:
Основной недостаток данного подхода состоит в том, что он не учитывает активность клиента до сейчас, т.е. Frequency.
- Среднее время между покупками клиента = 14 дней (Latency);
- Последний раз клиент покупал 31 дней назад (Recency).
odds = R / L = 31/ 14 = 2.21
inv_odds = 1 / odds = 1 / 2.21 = 0.45
p_Alive = inv_odds / ( 1 + inv_odds ) = 0.45 / ( 1 + 0.45 ) = 0.31
Давайте посмотрим как меняется вероятность совершения повторной покупки при изменении Recency:
p_Alive: function( R, L ). |
Что мы видим?
- Вероятность совершения повторной покупки на следующий день очень высока;
- Вероятность быстро снижается за первые 3-4 периода:
- пока R < L: вероятность совершения покупки > 0.5
- после того как R > L: вероятность совершения покупки < 0.5
- Начиная где-то с R > 85 вероятность снижается достаточно медленно, но к этому моменту вероятность сама по себе достаточно низкая.
Чтобы лучше показать зависимость уменьшения вероятности совершения повторной покупки с увеличением Recency я построил кривую удержания:
p_Alive: retention curve. |
НЕДОСТАТКИ:
Основной недостаток данного подхода состоит в том, что он не учитывает активность клиента до сейчас, т.е. Frequency.
В тоже время из предыдущего поста мы знаем, что активные клиенты (с большим Frequency) "стареют" намного быстрее.
Поэтому давайте перейдем к следующему подходу, который учитывает этот момент.
Оценка вероятности на основе Lifetime, Recency и Frequency
Давайте снова введем необходимые нам термины:
Давайте снова введем необходимые нам термины:
Lifetime - время от первой покупки до сегодня.
LT = today() - first_order_date
inverse_Recency - время от первой покупки до последней.
inv_R = last_order_date - first_order_date
Frequency - количество совершенных клиентом покупок.
F = countrows( order_table )
Дано:
p_Alive = ( inv_R / LT ) ^ F = ( 144 / 157 ) ^ 2 = 0.84
LT = today() - first_order_date
inverse_Recency - время от первой покупки до последней.
inv_R = last_order_date - first_order_date
Frequency - количество совершенных клиентом покупок.
F = countrows( order_table )
Дано:
- С момента первой покупки до сегодня прошло 157 дней (Lifetime);
- За это время клиент совершил 2 покупки (Frequency);
- Последнюю покупки клиент совершил на 144-й день (inverse_Recency).
p_Alive = ( inv_R / LT ) ^ F = ( 144 / 157 ) ^ 2 = 0.84
p_Alive = function( LT, inv_R, F ) |
Для вашего удобства я в таблицу также включил Recency. Напомню, что: R = LT - inv_R
Что мы видим?
- Если клиент сделал одну покупку (F = 1), то вероятность совершения следующей покупки хотя и снижается с увеличением Recency, но происходит это постепенно:
- R = 1, p_Alive = 0.99;
- R = 13, p_Alive = 0.92;
- R = 31, p_Alive = 0.80;
- Как только Frequency начинает увеличиваться (например F = 5), вероятность совершения повторной покупки начинает очень быстро снижаться:
- R = 1, p_Alive = 0.97;
- R = 13, p_Alive = 0.65;
- R = 31, p_Alive = 0.33.
Таким образом этот подход одновременно учитывает и Recency и Frequency.
Чтобы лучше показать зависимость уменьшения вероятности совершения повторной покупки с увеличением Frequency я построил 3 кривые удержания:
НЕДОСТАТКИ:
Основный недостаток данного подхода состоит в том, что он не учитывает горизонт в котором мы прогнозируем вероятность совершения повторной покупки.
Поэтому давайте перейдем к следующему подходу, который учитывает и этот момент также.
Оценка вероятности на основе модели Pareto/NBD
p_Alive: function( LT, F, R ). |
НЕДОСТАТКИ:
Основный недостаток данного подхода состоит в том, что он не учитывает горизонт в котором мы прогнозируем вероятность совершения повторной покупки.
Поэтому давайте перейдем к следующему подходу, который учитывает и этот момент также.
Оценка вероятности на основе модели Pareto/NBD
Это самый точный способ оценки вероятности совершения клиентом повторной покупки.
Для того, чтобы рассчитать вероятность повторной покупки нам необходимо:
- params - расчетные параметры модели Pareto/NBD;
- x - количество повторных покупок совершенных клиентом в калибровочном периоде (F - 1);
- t.x - время совершения последней покупки в калибровочном периоде (inv_R);
- T.cal - время окончания калибровочного периода.
Дано:
Имеем лог транзакций.
Расчёт (используя R и пакет `BTYD`):
РЕЗЮМЕ:
Имеем лог транзакций.
Расчёт (используя R и пакет `BTYD`):
- Рассчитываем CBS (смотри пост про модель);
- Рассчитываем параметры модели Pareto/NBD;
- p_Alive = BTYD::pnbd.PAlive() для каждого клиента из CBS.
РЕЗЮМЕ:
Маркетолог должен двигаться быстро и независимо. Для этого ему важно понимать, какие клиенты в какой группе риска находятся и быстро принимать корректирующие действия:
- высокая вероятность повторной покупки - up-sell / cross-sell;
- средняя вероятность повторной покупки - cross-sell, работа с обратной связью;
- невысокая вероятность повторной покупки - promo;
- очень низкая вероятность повторной покупки - забыть.
А как вы оцениваете вероятность совершения повторной покупки?
Добрый день! Очень крутое исследование и статья, спасибо, Павел!
ReplyDeleteВозник вопрос при расчете p_alive во втором случае. Если freq=1, то как при R=13 получается p_alive=0.92?
Вроде как inv_Rate в случае одной покупки всегда равен 0, а значит и по формуле будет получаться 0? Или я что-то упустил в расчетах?
Спасибо!
Inv_recency м.б. равен нулю только в случае если мы хотим сделать оценку вероятности в день совершения 1-й покупки.
Delete