Как стать автором
Обновить

Коэффициенты для экстраполяции прогнозов компонент CLTV на 5 лет

Время на прочтение8 мин
Количество просмотров5.2K

Как из прогнозов ряда ML-моделей получить ценность клиента с горизонтом в 5 лет. 

Эта статья описывает, как из прогнозов ряда ML-моделей получить ценность клиента с горизонтом в 5 лет. Напомним, что показатель CLTV представляет из себя композицию прогнозов ее компонент (подробнее в статье). В нашей реализации максимальный период прогнозирования моделей — 24 месяца. Важно отметить, что чем выше горизонт прогнозирования, тем менее точный прогноз способна сделать модель. А показатель CLTV интересен бизнесу на более длинном горизонте, в нашем случае - пять лет. Как же из прогнозов на два года получить прогноз на пять лет? Ответ прост: экстраполировать прогнозы.

Основная идея продления (экстраполяции) прогнозов - это разбиение пользователей на несколько групп, а в каждой группе единообразно продлить ряд прогноза. 

Далее мы обсудим:

  • подходы к экстраполяции ряда, их достоинства и проблемы

  • как выбирать группы и подготовить данные для экстраполяции

  • достоинства выбранного подхода к продлению прогнозов на 5 лет, трудности и пути их решения.

1. Подходы к экстраполяции

Итак, давайте разберемся, что же нам нужно экстраполировать и как это можно сделать. Нам доступны помесячные прогнозы каждой из компонент CLTV на 24 месяца. Конечная цель - вывести некоторые коэффициенты, при помощи которых мы, имея прогноз на 24 месяца, можем получить прогноз на 25, 26, 27, … 60 месяц. Для этого необходимо экстраполировать или продлить ряд прогнозов.

Для построения коэффициентов нам доступны исторические и прогнозные данные.

На наш взгляд, расчет коэффициентов на исторических данных (факте) имеет много недостатков, поскольку на их изменение влияет множество внешних факторов (изменение стоимости тарифных планов, кризисы, действия конкурентов), влияние которых мы хотим избежать и изучать отдельно в рамках экспериментов и тестов.  Кроме того, для 5-ти летних коэффициентов экстраполяции пришлось бы использовать очень старые исторические данные, что привело бы к неактуальным значениям коэффициентов. Например, поведение абонентов (в частности, выживаемость) в последний год отличается от их поведения 3 года назад. По этой же причине ML модели не предсказывают выручку и затраты на 5-ти летнем горизонте. К достоинствам этого подхода можно отнести доступность информации о фактических колебаниях сервисной маржи на длинных горизонтах. В результате применения такого подхода, если база с каждым годом улучшается, мы получим заниженные оценки коэффициентов. Исторические данные нами использовались только для валидации.

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

Пример: есть ряд наблюдений за 2 года для базы пользователей, активных в декабре 2021 года (зафиксировали группу пользователей). Наблюдение = сумма выручки, которые мы спрогнозировали на 1, 2, 3 ... 24 месяцев вперед. Описанный ряд изобразим чёрной линией, на графике, где ось абсцисс - месяц прогноза, ось ординат - выручка. Видим, что чёрная линия поначалу убывает, а потом колеблется вокруг нуля. Малиновым изображен ряд, посчитанный накопительным итогом - в нем видна явная логарифмическия зависимость между накопленным прогнозом выручки и месяцем прогноза.

2. Подготовка данных

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

В билайн для определения сегментов использовались комбинации:

  1. стаж клиента в компании (lifetime). У себя мы выделяем 0-3 месяцев, 4-12 месяцев, 13+ месяцев

  2. соц-дем характеристики клиента 

  3. географическая принадлежность клиента

  4. активность клиента за последние год/полгода/месяц и прочее

Обозначим каждую группу характеристик номером как в списке. Пусть признак 1 принимает k_{1}=5 значений, признак 2 принимает k_{2}=6 , и 3 - k_{3}=8. В итоге получается k_{1}*k_{2}*k_{3}=5*6*8=240сегментов. Пример такого сегмента - абоненты с lifetime от года из северных регионов и активные на конец периода.

Далее возникает вопрос, за какой период брать выборку для расчета коэффициентов. Мы пробовали 2 подхода: 10% сэмпл базы за несколько лет и всю базу за последние полгода. Победил 2 вариант, так как сокращение периода сбора предсказаний позволяет уловить актуальное поведение абонентов. 

Итак, мы сформировали некоторую выборку клиентов за последние 6 месяцев, подтянули к ним их характеристики, позволяющие понять, к какому сегменту относится каждый абонент. Далее подтягиваем к этой таблице доступные нам на данный момент помесячные прогнозы некоторой компоненты CLTV. В случае компоненты SM Mobile, получаем таблицу следующего вида:

ID клиента

Отчетная дата

Х-ка 1

Х-ка 2

Сегмент

Прогноз маржи на 1 месяц вперед 

Прогноз маржи на 2 месяца вперед 

Прогноз маржи на 24 месяца вперед 

123456

2023-02-01

1

South

1_South

110

100

...

80

123456

2023-03-01

1

South

1_South

100

98

...

78

234567

2023-03-01

0

West

0_West

3

0

...

-20

Далее внутри отчетной даты и сегмента вертикализируем ряд прогнозом на 1-24 месяц для удобства, получаем 24 строки вместо 24 столбов с прогнозами ранее с рядами y1, y2, y3, y4, ... y24  для каждого сегмента.

Отчетная дата

Х-ка 1

Х-ка 2

Сегмент

Сумма прогнозов маржи на k-тый месяц вперед 

Месяц прогноза (месяц k, где к от 1 до 24)

Количество клиентов в сегменте в отчетный месяц

2023-02-01

1

South

1_South

100 000 000

1

1 000 000

2023-03-01

1

South

1_South

100 020 000

2

1 000 200

2023-03-01

0

West

0_West

30 000 000

22

500 000

3. Экстраполяция

На графике ниже приведена динамика факта и прогноза для некоторой когорты клиентов (например, активных в декабре 2019 года с lifetime от года из северных регионов). Видим, что средний факт и прогноз маржи убывают с ростом периода из-за фактора выживаемости. Прирост с ростом периода становится все меньше и меньше стремится к определенному значению, не пересекая 0 значение, так как большинство прогнозируемых метрик не могут принимать отрицательные значения (гб, минуты, доход). Также можно отметить выпуклость кривой вниз. Запросим от нашего уравнения эти свойства: монотонное убывание, выпуклость вниз, непересечение оси абсцисс (не для всех компонент верно  это условие, в некоторых случаях ряд стремится к некоторому отрицательному значению и пересекает ось абсцисс. В таком случае константа будет отрицательной). Заявленным условиям удовлетворяет y=a+b*log(n)+e ,где y = прогноз на месяц n, где n натуральное.

Для каждого сегмента строим по модели, которая будет описывать зависимость компоненты CLTV  от месяца предсказания  уравнением y=a+b*log(n)+e (можно сделать это в цикле, строить парную регрессию для каждого сегмента, а можно добавить в уравнение переменную, отвечающую за сегмент и домножить ее на x). Для расчета коэффициентов используем последние 6 месяцев прогноза - 6 поколений (где поколение = группа абонентов, для которых доступен прогноз на 24 месяца вперед на рассматриваемый месяц). Таким образом, исходная таблица - это список абонентов за последние 6 месяцев, их прогнозы на каждый из 6 месяцев на 2 года вперед и ряд характеристик абонентов, которые позволяют определить, к какому сегменту относится абонент. 

Будем строить парную регрессию для каждого сегмента в цикле.

Итак, в каждом сегменте для каждой когорты у нас есть ряд прогнозов на 1, 2, 3, ...12, ...24 месяцев вперед, экстраполируем его методом наименьших квадратов (мы использовали  statsmodels). Спецификацию (формулу, как зависит у от х, логарифмически, линейно, экспоненциально ...) уравнения выбираем на основании вида ряда предиктов и ряда фактов. Для выбора наиболее подходящей спецификации можно использовать тест Рамсея и другие тесты на спецификацию.

Код ниже помогает создать список коэффициентов продления для выбранного сегмента сегмента segm, строит саммари и график модели для данного сегмента, можно удобно посмотреть основные статистики модели.

import numpy as np
import math
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
 
# df - таблица с рядами суммарных прогнозов по сегментам
SEGM = '...' # выбранный сегмент для расчета
df_segm = df[df['segment'] == SEGM]
 
form_reg = '(service_margin) ~ 1 + np.log(period_key)'
model = smf.ols(formula=form_reg, data=df_segm)
result = model.fit()
# вынимаем a и b из y = a + b(ln(x))
a = result.params[0]
b = result.params[1]
# смотрим саммари
print(result.summary())
 
N_PRED_HORIZON = 24
y_fact = list(df_segm['service_margin'])
y_pred = []
for period in range(1,25):
    y_pred+=[a+b*np.log(period)]
for period in range(25,61):
    y_fact+=[a+b*np.log(period)]
    y_pred+=[a+b*np.log(period)]
 
segment_coeffs = y_pred[N_PRED_HORIZON:]/y_pred[N_PRED_HORIZON-1]
 
# строим прогноз и факт на 1 графике
print(segm)
plt.plot(y_fact, label="y_fact")
plt.plot(y_pred, label="y_pred")
plt.legend(loc="upper right")
plt.show()

На этом этапе контролируются коэффициенты детерминации () и адекватность коэффициентов построенных моделей. Далее подставляем для каждого сегмента и периода с 25 по 60, получаем предсказанный \hat{y} и делим его на \hat{y}_{24}, получаем коэффициент перевода прогноза на 24 месяц в прогноз на выбранный период как в коде выше.

Пример: на сегменте ХХХ после применения МНК получили уравнение подставляем в уравнение x=25 , получаем y(x=25) , делим на прогноз на 24 период y(x=24) и получаем коэффициент  coef_{25}=(100-5*ln(25))/(100-5*ln(24))=83.9056/84.1097=0.9975  .

Вместо построения по модели для каждого сегмента можно добавить в уравнение по переменной, отвечающей за каждый сегмент и домножить ее на период. При 240 сегментах уравнение будет выглядеть примерно так y=a+b_{1}*log(x)*s_{1}+b_{2}*log(x)*s_{2}+...+b_{240}*log(x)*s_{240}+e, где s1, s2,... - активные переменные сегментов, принимают значения 0 и 1. Для каждого сегмента только одна переменная s будет равна 1, остальные занулятся, таким образом задача сведется к той же парной регрессии, как мы построили в предыдущем варианте.

4. Проблемы и подходы к их решению

  1. Не учтены важные переменные. (эндогенность) Эта проблема может возникнуть, если наша компонента CLTV сильно зависит от какого-то параметра. В нашем случае этим параметром является количество дней в месяце, от которого зависит в величина месячного платежа в тарифах с подневной оплатой. Отсюда получаем проблему, случайная ошибка больше не случайна, а зависит от количества дней в месяце прогноза, поэтому оценки коэффициентов не состоятельные. В этом случае можно поделить нашу целевую переменную на количество дней в месяце и строить модели для средненевной компоненты.

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

3. Первые 1-3 месяца прогноза "скачут" или имеют другой характер кривой. (выпуклая вверх). Такая проблема возникает для свежих и неактивных абонентов, потому что модели отрабатывают на них  хуже. В этом случае можно экстраполировать ряд начиная с 4-5 месяца прогноза или рассчитывалось скользящее среднее с окном в 3 месяца и на нем уже строить статистические модели.

Итак, мы обсудили, какие подходы к экстраполяции могут быть использованы для продления прогнозов до 5-летнего горизонта. О том, что с этими показателями дальше делать, а также об особенностях прогнозирования компонент CLTV расскажут ребята из команды CLTV билайна совсем скоро в следующих статьях.

Команда CLTV

Product Owner:

Салават Муллабаев @insanmisin

Team Lead:

Вячеслав Батанов

Data Analyst:

Максим Буркацкий

Дарья Еськова @DariaES

Татьяна Слесарева @deckerar

Оксана Суворова @ovsuvorova

Никита Лопатков @nicklpv

Катя Бойкова @Kaatun

Илья Ищенко @xbbt

Data Scientist:

Антон Мельников @a_melnikov

Наталия Култыгина @nataliiiya

Ярослав Сапронов @ya_sapr

Александр Светличный @a_svetlichnyy

Владлен Севернов @vsevernov

Олег Вавулов

Семён Кушелев @sml997

Data Engineer:

Сергей Реутов @s_reutov

Роман Полугодкин @Ropol

Теги:
Хабы:
Всего голосов 9: ↑9 и ↓0+9
Комментарии1

Публикации

Информация

Сайт
beeline.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия