В этой статье я поделюсь с вами кейсом по сегментации трафика и оптимизации коэффициента конверсии клиентов интернет-магазина. Кейс основан на реальных данных одной американской компании – Vandelay Industries, которая занимается производством продуктов из латекса.
Данные для машинного обучения собирались со счетчиков аналитики интернет-магазина и включили в себя основную информацию о посетителях сайта, такую как страна, возраст, количество страниц, которые они посетили в течение сессии, новый или повторный пользователь, через какой маркетинговый канал они зашли на сайт, а также совершили ли они покупку (т.е. совершили конверсию).
Учитывая эту информацию, наша задача – спрогнозировать коэффициент конверсии и дать рекомендации команде разработчиков и маркетологов по улучшению коэффициента конверсии.
Эксплораторный анализ данных (EDA)
Датасет с историей посещений сайта был предварительно очищен и не содержит пропущенных значений. Поэтому мы можем сразу приступить к EDA и построению графиков распределений признаков.
Рис. 1: Распределение признаков в датасете
Построив график распределения каждой характеристики, мы получили несколько новых сведений о посетителях, посещающих сайт Vandelay Industries:
- Более половины посетителей в датасете находятся в США: Скорее всего, Vandelay Industries является американской компанией;
- Возраст посетителей, по-видимому, находится в пределах 17-123 лет. И это странно. При ближайшем рассмотрении оказалось, что у 2 пользователей действительно возраст составляет от 100 до 123 лет. Проверить эти записи невозможно, но в наборе данных с 300 000+ посетителями эти 2 записи навряд-ли повлияют на наши результаты, поэтому я их оставлю;
- Заметно, что новых посетителей в 2 раза больше, чем вернувшихся: Vandelay Industries хорошо работает над тем, чтобы клиенты возвращались на ее сайт;
- Большинство посетителей заходят на сайт, нажимая на результаты в выдаче поисковой системы: это противоположно тому, чтобы заходить через рекламу или непосредственно набирая адрес сайта;
- Большинство посетителей посещают менее 10 страниц в течение сеанса;
- Классы в колонке «Конверсия» несбалансированы: быстрый подсчет показывает, что текущий коэффициент конверсии сайта составляет около 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:
Рис. 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.
Рис. 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 является наиболее важным для предсказания того, будет ли пользователь конвертироваться в клиента.
Демографические данные
Рис. 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 лет, мы можем порекомендовать команде маркетинга нацелиться на эту демографическую группу с помощью рекламы и других маркетинговых каналов. Маркетинговая команда также может отправлять рекламные/напоминающие письма пользователям, которые провели много времени на сайте (просмотрели много страниц), но еще не совершили конверсию, поскольку мы знаем, что время, проведенное на сайте положительно коррелирует с тем, совершит ли пользователь покупку или нет.