Пример использования кода Python

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

Хотя статистические методы могут быть очень мощными, они делают несколько строгих предположений о типах данных и их распределении и обычно могут обрабатывать только ограниченное количество переменных. Методы, основанные на регрессии, обычно основаны на уравнении фиксированной формы и предполагают единственное наилучшее решение, что означает, что мы можем сравнить только несколько альтернативных решений вручную. Кроме того, когда модели применяются к реальным данным, ключевые допущения методов часто нарушаются. Здесь я покажу методы машинного обучения (ML) путем интеграции переменных CLTV и транзакций клиентов с тегом RFM переменные для прогнозирования покупок потребителей.

Я буду использовать здесь два подхода -

1-й подход - метод маркетингового анализа RFM (недавность, частота и денежный поток) используется для сегментации клиентов и

При втором подходе с использованием общей ценности клиента (CLTV) алгоритм ML будет обучен прогнозированию. Я буду использовать данные за 3 месяца для расчета RFM и использовать их для прогнозирования следующих 6 месяцев.

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

  • pt = цена, уплаченная потребителем в момент t,
  • ct = прямые затраты на обслуживание клиента в момент времени t,
  • i = ставка дисконтирования или стоимость капитала для фирмы,
  • rt = вероятность того, что клиент совершит повторную покупку или останется «живым» в момент времени t,
  • AC = стоимость приобретения, и
  • T = временной горизонт для оценки CLTV.

Сбор данных

Давайте загрузим и посмотрим данные.

У нас есть вся необходимая информация, которая нам нужна:

  • Пользовательский ИД
  • Цена за единицу
  • Количество
  • Дата счета

С помощью всех этих функций мы можем построить уравнение для денежного выражения = количество активных клиентов * количество заказов * средний доход на заказ.

df[‘InvoiceDate’] = pd.to_datetime(df[‘InvoiceDate’]) #convert the type of Invoice Date Field from string to datetime.
df[‘InvoiceYearMonth’] = df[‘InvoiceDate’].map(lambda date: 100*date.year + date.month) #create YearMonth field
df[‘Monetary’] = df[‘UnitPrice’] * df[‘Quantity’] #calculate Monetary for each row and create a new data frame with YearMonth — Monetary columns
monetary = df.groupby([‘InvoiceYearMonth’])[‘Monetary’].sum().reset_index()

Прежде чем мы углубимся в оценку RFM, мы можем провести некоторый анализ, чтобы узнать больше о поведении клиентов, например о ежемесячных активных клиентах / ежемесячном количестве заказов / среднем доходе на заказ / количестве новых клиентов. / Ежемесячный показатель удержания клиентов и т. Д. Заинтересованные могут посетить здесь, чтобы узнать о таком анализе. Итак, начну с сегментации.

Сегментация клиентов

Предположим, что некоторые общие сегменты -

  • Низкая ценность - клиенты, которые менее активны, чем другие, не очень частые покупатели / посетители и приносят очень низкий - нулевой - возможно, отрицательный доход.
  • Средняя ценность - клиенты, которые встречаются довольно часто и приносят умеренный доход.
  • Высокая ценность - клиенты с высоким доходом, частым обращением и низким уровнем бездействия; бизнес всегда хочет сохранить этих клиентов.

Мы рассчитаем значение RFM и применим неконтролируемое машинное обучение, чтобы идентифицировать разные кластеры для каждого, применяя кластеризацию K-средних к присвоить оценку давности. Количество кластеров, как правило, определяется бизнесом, нам нужен алгоритм K-средних. Однако Метод локтя K-средних помогает нам узнать оптимальное количество кластеров.

Новизна

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

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

Точно так же мы можем сделать Частота и Денежный и, наконец, общий балл.

Мы делим эти кластеры на High / Mid / Low - от 0 до 2 - Low / от 3 до 4 - Value / 5 + - High Value клиентов.

Описательная статистика соответствующего RFM приведена ниже:

Мы видим, что даже несмотря на то, что средняя давность составляет 90 дней, медиана составляет 49. Отрицательное значение в денежном выражении при минимальном значении указывает на возврат элементов. Значения тестовой статистики и приведенные ниже графики распределения и QQ подтверждают, что набор данных не соответствует нормальному распределению. Поэтому использование непараметрического
фреймворка для прогнозов оправдано.

Свидетельства статистических тестов подразумевают, что данные характеризуются непараметрическим характером поведения. Это оправдывает развертывание передовых алгоритмов машинного обучения
и глубокого обучения для прогностического моделирования. Однако я не использовал здесь алгоритм глубокого обучения.

Мы можем начать действовать с этой сегментацией. Стратегии просты для всех трех классов:

  • Улучшение удержания ценных клиентов
  • Улучшить удержание и увеличить частоту клиентов со средней ценностью
  • Увеличение числа малоценных клиентов

Пожизненная ценность клиента (CLTV)

CLTV здесь довольно просто. Сначала мы выберем любое временное окно из 3, 6, 12 или 24 месяцев. Мы можем вычислить CLTV для каждого клиента в этом конкретном временном окне с помощью уравнения: Общий валовой доход - Общая стоимость . Это уравнение основано на исторических данных и дает нам историческую ценность. Если мы видим, что у некоторых клиентов исторически очень высокая отрицательная пожизненная ценность, то, вероятно, мы слишком поздно, чтобы принимать меры. Давайте воспользуемся алгоритмом ML для прогнозирования.

Прогнозирование CLTV

Итак, давайте выполним следующие шаги:

  • Определите подходящий временной интервал для расчета CLTV.
  • Определите функции, которые мы собираемся использовать для предсказания будущего, и создайте их.
  • Рассчитайте CLTV для обучения модели машинного обучения.
  • Создайте и запустите модель машинного обучения
  • Проверить, пригодится ли модель

Мы уже получили оценки RFM для каждого идентификатора клиента. Чтобы реализовать это правильно, давайте разделим наш набор данных. Я возьму данные за 3 месяца, рассчитаю RFM и буду использовать их для прогнозирования следующих 6 месяцев.

# создать 3- и 6-метровые фреймы данных
m3 = DF_uk [(DF_uk.InvoiceDate ‹date (2011,6,1)) & (DF_uk.InvoiceDate› = date (2011,3,1))]. reset_index (drop = True)
m6 = DF_uk [(DF_uk.InvoiceDate ›= date (2011,6,1)) & (DF_uk.InvoiceDate‹ date (2011,12,1))]. Reset_index (drop = True)

Теперь аналогичный процесс кластеризации, вычисления RFM и общей оценки каждого фрейма данных и, наконец, объединения фреймов данных за 3 и 6 месяцев, чтобы увидеть корреляцию между CLTV и набор функций, который у нас есть.

Здесь, применяя кластеризацию K-средних, мы можем идентифицировать существующие группы CLTV и строить на их основе сегменты. Принимая во внимание бизнес-часть этого анализа, нам необходимо по-разному относиться к клиентам в зависимости от их прогнозируемого CLTV. В этом примере мы применим кластеризацию и будем иметь 3 сегмента (количество сегментов действительно зависит от динамики и целей вашего бизнеса):
- Низкий CLTV
- Средний CLTV
- Высокий CLTV

Мы собираемся применить кластеризацию K-средних для определения сегментов и наблюдения за их характеристиками:

2 - лучший результат со средним значением 8,2k CLTV, тогда как 0 - худший с 396. Есть еще несколько шагов до обучения модели машинного обучения:

  • Нужно заняться разработкой функций. Мы должны преобразовать категориальные столбцы в числовые столбцы.
  • Мы проверим корреляцию функций с нашей меткой, кластеры CLTV.
  • Мы разделим наш набор функций и обозначим (CLTV) как X и y. Мы используем X, чтобы предсказать y.
  • Создаст набор данных для обучения и тестирования. Обучающий набор будет использоваться для построения модели машинного обучения.

Мы применим нашу модель к набору Test, чтобы увидеть его реальную производительность.

from sklearn.model_selection import KFold, cross_val_score, train_test_split
#convert categorical columns to numerical
DF_class = pd.get_dummies(DF_cluster)
#calculate and show correlations
corr_matrix = DF_class.corr()
corr_matrix[‘LTVCluster’].sort_values(ascending=False)
#create X and y, X will be feature set and y is the label — LTV
X = DF_class.drop([‘LTVCluster’,’m6_Monetary’],axis=1)
y = DF_class[‘LTVCluster’]
#split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05, random_state=42)

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

Сравнение алгоритмов машинного обучения

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

FP = confusion_matrix.sum (axis = 0) - np.diag (confusion_matrix)

FN = confusion_matrix.sum (axis = 1) - np.diag (confusion_matrix)

TP = np.diag (confusion_matrix)

TN = confusion_matrix.values.sum () - (FP + FN + TP)

TPR = TP / (TP + FN) # Чувствительность, частота попаданий, отзыв или истинно положительная частота

TNR = TN / (TN + FP) # Специфичность или истинно отрицательная скорость

PPV = TP / (TP + FP) # Точность или положительная прогностическая ценность

NPV = TN / (TN + FN) # Отрицательная прогностическая ценность

FPR = FP / (FP + TN) # Частота выпадений или ложных срабатываний

FNR = FN / (TP + FN) # Ложноотрицательная ставка

FDR = FP / (TP + FP) # Частота ложного обнаружения

ACC = (TP + TN) / (TP + FP + FN + TN) # Общая точность

Модель XGB

У нас есть мульти-классификационная модель с 3 группами (кластерами). На тестовом наборе точность показывает 78%. Наши истинные положительные стороны находятся на диагональной оси и являются здесь наибольшими числами. Ложноотрицательные значения - это сумма других значений в строках. Ложные срабатывания - это сумма других значений в столбцах. Точность и отзыв приемлемы для 0. Для кластера 0, который имеет низкий уровень CLTV, если модель идентифицирует , что покупатель принадлежит к кластеру 0, вероятность того, что он будет правильным (точность). Классификатор успешно определяет 90% реальных клиентов кластера 0 (отзыв). Нам нужно улучшить модель для других кластеров. Классификатор с трудом обнаруживает 43% клиентов среднего CLTV.

Давайте поэкспериментируем, изменив глубину и OneVsRestClassifier -

Здесь можно увидеть некоторые улучшения. Тем не менее, есть еще возможности для улучшения, например,

  • Добавление дополнительных функций и улучшение проектирования функций
  • Попробуйте ANN / DNN

ROCAUC

По умолчанию для визуализаций ROCAUC с несколькими классами строится кривая для каждого класса в дополнение к кривым микро- и макро-среднего для каждого класса. Это позволяет пользователю проверять соотношение между чувствительностью и специфичностью для каждого класса.

Ошибка предсказания класса

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

Резюме

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

Со мной можно связаться здесь.

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