Подробное руководство по кластеризации K-средних для данных клиентов в Python.

Введение

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

Учитывая группу клиентов, какие между ними есть сходства и различия, и какие группы возникают в результате?

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

В этом руководстве мы будем использовать концепции, изученные в моих предыдущих статьях, чтобы обогатить наши данные о клиентах метриками с использованием RFM-анализа и включить прогнозные метрики, такие как Lifetime Value и Churn Risk, как указано ранее. Мы будем использовать тот же набор данных Kaggle для согласованности, а блокнот реализации можно найти здесь.

Пройдемся по шагам:

  • Превратите наш набор данных о транзакциях в расширенные функции клиентов и используйте метод, известный как анализ RFM (Recency-Frequency-Monetary Value).
  • Рассчитайте дополнительные функции, такие как: пожизненная ценность клиента и риск оттока клиентов.
  • Подберите алгоритм кластеризации для поиска групп с использованием всех метрик.
  • Интерпретируйте результаты.

Шаг 1: Сбор данных

Мы начнем, как и в других учебниках, со сбора данных о транзакциях. Нам просто нужно 3 столбца: идентификатор клиента, дата/время транзакции и стоимость транзакции. Мы можем ввести другие функции уровня клиента, такие как «Общие расходы», «Вовлечение рекламы», «Местоположение» и даже «Предпочтения продукта», но обязательно агрегируйте их по клиентам при разработке функций. шаг.

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

Давайте посмотрим на набор данных.

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

Шаг 2: Разработка функций

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

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

Функции RFM

Поскольку детали реализации анализа RFM (Recency-Frequency-Monetary Value) для преобразования транзакционных данных в функции на уровне клиента были широко освещены в предыдущих сообщениях, настоятельно рекомендуется проверить их, чтобы лучше понять — это также было реализовано в блокноте, указанном в верхней части этой статьи.

В двух словах, мы просто используем транзакционные данные, чтобы определить:

  • Давность: сколько времени прошло с момента последней транзакции каждого клиента?
  • Частота. Сколько уникальных периодов времени клиент взаимодействовал с компанией?
  • Денежная ценность: какова средняя ценность бизнеса (доход), полученная от каждого взаимодействия.
  • Возраст. Как долго каждый клиент является клиентом компании?

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

Customer_ID   recency    frequency            value       age                                     1                 131            1         8.145000       131                      2                  69            1         7.770000        69                       3                 121            1         3.640000       121                      5                   4            4        14.672500       100

Временные характеристики

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

# Extract day, month, day of week and day of year from Transaction Date. df is the transaction table.
def get_temporal_features(df, date_col, id_col):
  # Get Dates and IDs of each transaction
  temp = df[[id_col, date_col]]
  # Get Day of Week
  temp['DayOfWeek'] = temp[date_col].dt.day_name()
  # Get Month Name
  temp['Month'] = temp[date_col].dt.month_name()
  # One hot encode using dummies
  dummies = pd.get_dummies(temp[['DayOfWeek', 'Month']])
  dummies[id_col] = df[id_col].values
  # Aggregate by customer
  dummies = dummies.groupby(id_col).sum()
  return dummies

В приведенном выше коде мы вычислим следующие временные характеристики транзакций:

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

Для DayOfWeek это может выглядеть примерно так:

Здесь Клиент 1 купил в общей сложности дважды и в пятницу, тогда как Клиент 2 также совершил 2 транзакции, но одну в воскресенье, а другую в четверг. Эта логика аналогичным образом применяется к месяцам.

Дополнительные функции

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

Мы сделаем это, импортировав модели, которые уже подходят для этой задачи, и просто предскажем функции, которые мы создали для каждого клиента. Краткий обзор моделей, которые мы обучили:

  • Модель риска оттока: прогнозирует вероятность того, что покупатель не вернется в магазин в следующем месяце.
  • Модель жизненного цикла. Прогнозирует сумму, которую клиент потратит в следующем месяце.

Поскольку мы подгоняем наши модели к созданным нами функциям RFM, это будет просто:

import pickle

# Load Churn Risk and Lifetime value predictive models
churn_model = pickle.load(open(churn_model_path, 'rb'))
ltv_model = pickle.load(open(ltv_model_path, 'rb'))

# Append predictions to current data
rfm[['buy_prob', 'churn_risk']] = churn_model.predict(rfm)
rfm['pred_spend'] = ltv_model.predict(rfm)

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

Давайте объединим все имеющиеся у нас функции и объединим их по идентификатору клиента.

Теперь, когда все наши описательные показатели готовы, мы можем начать кластеризацию клиентов.

Шаг 3: Модель (или алгоритм в данном случае)

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

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

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

Для двух 2D-точек p и q:

Мы можем описать алгоритм следующим образом:

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

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

К счастью, в scikit-learn есть класс, который уже реализовал этот алгоритм, хотя я настоятельно рекомендую попробовать реализовать его самостоятельно в качестве упражнения. Алгоритм K-средних требует аргумента, который представляет собой количество кластеров, которые необходимо найти. Однако часто это неизвестно. В конце концов, сколько групп является наиболее описательным числом групп? Здесь мы представляем Метод локтя. Здесь мы просто подгоним несколько алгоритмов K-средних с увеличением числа групп для поиска, вычислим сумму квадратов расстояний и нанесем их на график в зависимости от количества используемых групп.

from sklearn.cluster import KMeans

sq_distances = []
K = range(1,15)
for k in K:
   km = KMeans(n_clusters=k)
   km = km.fit(_features)
   sq_distances.append(km.inertia_)

Мы ищем пик изгиба, который происходит примерно в 3–4 кластерах, что указывает на то, что это идеальное количество кластеров для соответствия алгоритму K-средних. Итак, давайте сделаем это.

# Fit model
kmeans = KMeans(n_clusters=3).fit(_features)

# Append segments to features
features['segment'] = kmeans.predict(features)

# Append segments to normalized features
_features['segment'] = features.segment.values

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

Полученные результаты

Графики ниже отображают центры каждого из 3 кластеров (обозначенных здесь 0, 1 и 2). Я разделил их для наглядности:

Number of customers in each cluster:
Cluster_0: 5635
Cluster_1: 5941 
Cluster_2: 2091

Именно здесь должен проявиться ваш внутренний Data Scientist. Каждый набор данных отличается и будет сгруппирован по-разному. Алгоритм K-средних используется для поиска групп в данных, но нам еще предстоит ответить на вопрос, что эти группы представляют. Давайте проработаем это интуитивно. В приведенной ниже матрице показаны те же данные, что и выше, за исключением того, что в ней показано, насколько высока или низка каждая функция по сравнению с другими кластерами. Каждая функция нормализована для ясности.

Давайте пройдемся по быстрой интерпретации,

Кластер 0: этот кластер содержит наибольшее количество клиентов. У них относительно низкая новизна, высокая частота, ценность, ToDateValue и риск оттока. Это самые ценные клиенты, учитывая, что они недавно начали заниматься бизнесом и часто участвуют в этом. Они также имеют самую высокую среднюю стоимость за транзакцию, а также самую высокую стоимость на сегодняшний день. Именно поэтому модель Lifetime Value предсказывает для них высокие расходы. Поскольку модель риска оттока предсказывает, вернутся ли они в следующем месяце, их высокий риск оттока свидетельствует о том, что они недавно появились. Это клиенты, чьи предпочтения должны соблюдаться, поскольку они приносят большую часть дохода.

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

Кластер 2: самая низкая давность и возраст. Несколько средний риск оттока, относительно низкий для всего остального. Это самые новые клиенты, у которых еще не было достаточно времени, чтобы показать свою истинную ценность. Они, как правило, покупают в мае (возможно, в мае есть акция, которая совпадает с этими покупателями).

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

Заключение

В этой статье мы собрали транзакционные данные и выполнили важные преобразования, чтобы получить богатый набор данных о клиентах. Затем мы использовали метод локтя и кластеризацию K-средних, чтобы выделить 3 группы в данных. Мы даже можем сделать забавный 3D-график, чтобы действительно визуализировать найденные группы.

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

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

Надеюсь, вам понравилась эта статья! Обязательно оставляйте комментарии и предложения — как и в случае с любым алгоритмом обучения, я всегда стремлюсь к улучшению!

Рекомендации