Сегментация трафика сайта и оптимизация конверсий с помощью деревьев решений (Decision Trees)

В этой статье я поделюсь с вами кейсом по сегментации трафика и оптимизации коэффициента конверсии клиентов интернет-магазина. Кейс основан на реальных данных одной американской компании – Vandelay Industries, которая занимается производством продуктов из латекса.

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

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

Эксплораторный анализ данных (EDA)

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

Распределение признаков в датасете

Рис. 1: Распределение признаков в датасете

Построив график распределения каждой характеристики, мы получили несколько новых сведений о посетителях, посещающих сайт Vandelay Industries:

  1. Более половины посетителей в датасете находятся в США: Скорее всего, Vandelay Industries является американской компанией;
  2. Возраст посетителей, по-видимому, находится в пределах 17-123 лет. И это странно. При ближайшем рассмотрении оказалось, что у 2 пользователей действительно возраст составляет от 100 до 123 лет. Проверить эти записи невозможно, но в наборе данных с 300 000+ посетителями эти 2 записи навряд-ли повлияют на наши результаты, поэтому я их оставлю;
  3. Заметно, что новых посетителей в 2 раза больше, чем вернувшихся: Vandelay Industries хорошо работает над тем, чтобы клиенты возвращались на ее сайт;
  4. Большинство посетителей заходят на сайт, нажимая на результаты в выдаче поисковой системы: это противоположно тому, чтобы заходить через рекламу или непосредственно набирая адрес сайта;
  5. Большинство посетителей посещают менее 10 страниц в течение сеанса;
  6. Классы в колонке «Конверсия» несбалансированы: быстрый подсчет показывает, что текущий коэффициент конверсии сайта составляет около 3 %. Как правило, размерм среднего коэффициента конверсии для платформы электронной коммерции составляет 1-2 %, так что компания работает отнюдь не плохо. Это будет наш целевой атрибут.

Следующим этапом моего EDA станет построение матрицы корреляций.

Матрица корреляций признаков с тепловой картой

Рис. 2: Матрица корреляций признаков с тепловой картой

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

Читайте также:  Оптимизация цепочек поставок с помощью машинного обучения

Теперь я реализую baseline модель для прогнозирования коэффициента конверсии.

Базовая модель дерева решений

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

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

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

X = data_new.iloc[:,:5]
y = data_new.loc[:,'converted']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=22)

dtree = DecisionTreeClassifier(max_depth=2, random_state=22)
dtree.fit(X_train, y_train)
#using accuracy as our performance metric
score = dtree.score(X_test, y_test)
print(score)

Мой Jupyter Notebook вывел значение 0.9818469323213156. Это означает что точность нашей модели составляет ~98 %, что кажется отличным результатом, если не учитывать, что деревья решений имеют тенденцию к переобучению. Мы также знаем, что обучали эту модель на несбалансированном наборе данных.

Также стоит учесть, что Accuracy – не самая лучшая метрика качества ML-модели, поскольку она просто измеряет долю правильных классификаций, а значит, говорит нам только половину истории. Давайте посмотрим на confusion matrix:

Матрица несоответствий (confusion matrix)

Рис. 3: Матрица несоответствий (confusion matrix)

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

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

!pip install imbalanced-learn
from imblearn.under_sampling import RandomUnderSampler

# Instantiate the RandomUnderSampler
rus = RandomUnderSampler(random_state=22)

# Perform under-sampling
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)

# Check the distribution of classes after under-sampling
print("Distribution of classes after under-sampling:")
print(pd.Series(y_resampled).value_counts())

# Create a DecisionTreeClassifier model
dtree = DecisionTreeClassifier(max_depth=2, random_state=22)

# Train the model on the resampled data
dtree.fit(X_resampled, y_resampled)

# Make predictions on the test set
y_pred = dtree.predict(X_test)

# Evaluate the model
print(classification_report(y_test, y_pred))

Вот какие получились результаты:

Decision Tree Train Accuracy: 0.925721977484092
Decision Tree Test Accuracy: 0.954427577482606

              precision    recall  f1-score   support

           0       1.00      0.96      0.98     61212
           1       0.40      0.88      0.55      2028

    accuracy                           0.95     63240
   macro avg       0.70      0.92      0.76     63240
weighted avg       0.98      0.95      0.96     63240

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

Читайте также:  Классические методы предиктивной аналитики

Давайте теперь взглянем снова на confusion matrix.

Матрица несоответствий (confusion matrix)

Рис. 4: Матрица несоответствий (confusion matrix)

Матрица несоответствий показывает, что наш классификатор теперь работает гораздо лучше, чем первый. Мы видим, что 96 % пользователей сайта, которые не совершил конверсию, и 88 % пользователей, которые ее совершили, теперь были правильно классифицированы.

На данный момент наш классификатор «достаточно хорош», и мы можем использовать его для предсказания вероятности того, что пользователь совершит покупку на сайте, учитывая его демографические данные. Следующий фрагмент кода предоставит нам вероятности классов:

# To get the probability of conversion
# ['country', 'age', 'new_user', 'source', 'total_pages_visited']

w = [[0, 24, 0, 2, 5]]

dtree_new.predict_proba(w)

Результат:

>> array([[0.95968863, 0.04031137]])

Это означает следующее – 96% вероятность того, что пользователи не конвертируются в клиентов, 4% – что конвертируются.

Подготовка рекомендаций

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

Общее количество посещенных страниц

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

Если мы рассмотрим важность признаков для нашего переобученного классификатора:

country importance: 1.7146843233999107%
age importance: 0.0%
new_user importance: 0.0%
source importance: 0.0%
total_pages_visited importance: 98.28531567660009%

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

Читайте также:  Проведение A/B-тестов дизайна сайта с помощью машинного обучения с Python

Демографические данные

Распределение данных в датафрейме Pandas

Рис. 5: Распределение данных в датафрейме Pandas

Мы уже знаем, что большинство пользователей сайта – жители США, поэтому вполне логично, что среди людей из США происходит больше всего сеансов с конверсиями и сеансов без них. Вторая по величине группа посетителей – из Китая. Быстрый подсчет показывает, что менее 1 % пользователей из Китая в итоге конвертируются, несмотря на то, что это вторая по численности демографическая группа.

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

(16.892999999999997, 27.6]    6175
(27.6, 38.2]                  3365
(38.2, 48.8]                   615
(48.8, 59.4]                    40
(59.4, 70.0]                     3
(112.4, 123.0]                   1
(101.8, 112.4]                   1
(91.2, 101.8]                    0
(80.6, 91.2]                     0
(70.0, 80.6]                     0
Name: age, dtype: int64

Итак, выводы следующие:

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

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

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