{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Как просто реализовать расчет LTV в Power BI?

Сегодня мы поговорим о такой важной в продуктовой аналитике метрике, как LTV. В момент, когда я в первый раз столкнулся с потребностью ее расчета, у меня разбежались глаза от обильности статей с вариантами расчета этого показателя. Я не знал, какой из вариантов расчета наиболее точный, а самое главное, все они предлагали мне считать его вручную. Меня это категорически не устраивало, и я продолжал искать возможность считать все просто и быстро, не выгружая кучу транзакций клиентов каждый раз, когда мне хотелось узнать, что там происходит с LTV.

Спойлер: способ я нашел, и он вполне меня устраивает.

Перейдем сразу к делу. Мой вариант автоматического расчета показателя LTV базируется на статье из блога GoPractice. В ней хорошо описывается способ расчета, показываются примеры того, какие показатели лучше не использовать при его расчете, а также приводятся аргументы в пользу описанного способа.

Если при прочтении данной статьи у вас возникнут вопросы к методологии, то уверен, что вы найдете все ответы в статье из блога GoPractice.

Структура данных

В нашей модели данных потребуется всего три таблицы. Первая таблица с всеми транзакциями и клиентами, которые их совершали (DBOrder). Вторая с датой регистрации клиентов для создания когорт (DBClient), и третья — для создания сводной таблицы для клиентов (pivot_table). Связь таблиц происходит по столбцу client_id:

DBOrder[client_id]* <> (1)DBClient[client_id] и DBOrder[client_id]* <> *pivot_table[client_id].

Таблица с заказами и транзакциями

Для начала проведем подготовку и создадим несколько столбцов с датами по 30 дней с момента первого заказа. Это делается для удобства представления временных периодов.

В таблице DBOrder создадим столбец с датой первого заказа, чтобы в дальнейшем узнать, сколько дней прошло с момента первого заказа.

first_order = CALCULATE ( MIN ( DBOrder[created_date]), FILTER ( DBOrder, DBOrder[client_id] = EARLIER ( DBOrder[client_id] ) ) )

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

Дней с первой транзакции = DATEDIFF ( DBOrder[first_order], DBOrder[created_date], DAY )

И в заключении, разбиваем промежутки на группы по 30 дней для того чтобы в дальнейшем знать, какой показатель LTV на 30, 60, 90 и т.д. день. Можно разбить и на другие промежутки, например, дни или недели, все зависит от специфики вашего бизнеса.

дней30 с первой транзакции = CEILING ( DBOrder[Дней с первой транзакции], 30 )

С подготовкой таблицы DBOrder мы закончили. В итоге у вас должно получиться нечто подобное.

Сводная таблица клиентов

Можно приступать к созданию сводной таблицы клиентов. По сути, она нужна для удобства отображения и уже будет включать в себя данные об LTV. В моем случае, я создал ее следующим образом.

pivot_table = SUMMARIZE ( DBOrder, DBOrder[client_id], DBOrder[дней30 с первой транзакции], "profit", SUM(DBOrder[profit]) )

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

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

indx = RANKX ( FILTER ( ALL (pivot_table), pivot_table[client_id] = EARLIER (pivot_table[client_id]) ), pivot_table[period_(30_days)], , ASC )

Теперь можно получить накопительный итог дохода.

cumulative_profit = VAR _client = pivot_table[client_id] VAR _index = pivot_table[indx] RETURN SUMX( FILTER( pivot_table, pivot_table[client_id] =_client && pivot_table[indx]<=_index ), pivot_table[profit] )

А чтобы в дальнейшем мы могли использовать показатель LTV в разного рода визуализациях, создадим меру, в которой считается сам показатель.

_ltv = DIVIDE ( SUM ( pivot_table[cumulative_profit] ), COUNTA ( pivot_table[client_id] ) )

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

Предварительно в таблице DBClient необходимо создать меру, которая при добавлении в pivot_table будет давать нам дату регистрации клиента, которая будет выступать в качестве когорты.

_first_client = MIN ( DBClient[created_client] )

Добавляем меру в pivot_table.

cohort = FORMAT ( DBClient[_first_client], "YY-MM" )

В конце концов таблица pivot_table должна принять следующий вид.

Порядок столбцов немного перепутан. При создании таблицы должно получиться client_id, period_(30_days), profit.

Визуализируем

В области представления отчета теперь мы можем добавить различные элементы визуализации, такие как сводные таблицы с показателем LTV как для всей когорты, так и для отдельного клиента.

Для более наглядной визуализации можно построить график.

Вывод: таким образом, использование данного подхода обеспечивает эффективный и гибкий метод расчета LTV, что может быть крайне полезным для более глубокого понимания стоимости клиентов в течение их жизненного цикла. Здесь не требуется постоянное жонглирование выгрузками клиентов и их транзакциями. По нажатию одной кнопки можно узнавать об изменении LTV даже после каждого нового заказа клиента. Этот способ обеспечивает постоянный и бесперебойный доступ к одной из самых важных продуктовых метрик.

0
1 комментарий
Dmitry Supruniuk

круто, спасибо

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда