Часть 1

В этом среднем блоге я поделюсь тем, как я создал сквозной проект по прогнозированию оттока клиентов. Я выбрал Customer Churn в качестве своего проекта, во-первых, потому что мне очень понравилась постановка задачи, а во-вторых, потому что я хотел попробовать свои силы на несбалансированном наборе данных и учиться на этом пути. При выполнении этого проекта я работал с различными методами, такими как SMOTE, ADASYN и т. д., для обработки несбалансированного набора данных. Я также развернул этот проект с помощью Streamlit.

Мое веб-приложение выглядит так.

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

Отток клиентов — это потеря клиентов или клиентов.

Почему важно прогнозировать отток клиентов? Как это помогает?

Отток клиентов может быть очень хорошим бизнес-показателем для таких компаний, как Netflix, Amazon, Meesho и т. д. Если организация уже знает, что x процентов пользователей могут потерять интерес к их продукту или недовольны своим продуктом, то она может внести некоторые коррективы. провести анализ того, почему конкретный пользователь находится на грани выхода из службы, и удержать этого пользователя. Говорят, что удержание существующего клиента обходится дешевле, чем привлечение нового. Следовательно, прогнозирование того, уйдет ли клиент или нет, поможет организации удержать существующих клиентов и развивать свой бизнес.

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

После понимания постановки задачи начинается поиск набора данных…

Для этого проекта я использовал следующий набор данных из Kaggle. Этот набор данных имеет 5630 строк и 20 столбцов.



Давайте перейдем прямо к части кодирования,

Внедрение начинается…

Мы начнем с импорта всех необходимых библиотек, таких как Numpy, Pandas, Matplotlib и Seaborn.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

После импорта библиотек мы прочитаем набор данных и просмотрим его первые пять строк.

path = '/content/E Commerce Dataset.csv'
data = pd.read_csv(path)
data.head()

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

data.shape
data.info()

Метод Shape сообщает нам общее количество строк и столбцов, присутствующих в нашем наборе данных. Этот набор данных имеет 5630 строк и 20 столбцов. Метод info() используется для просмотра всех столбцов вместе с типом данных каждого столбца. Вывод информации должен выглядеть примерно так, как показано на скриншоте ниже.

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

data.describe()

Вывод для описания должен выглядеть примерно так, как показано на снимке экрана ниже.

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

В этом проекте мы хотим предсказать, уйдет клиент или нет, поэтому давайте посмотрим на колонку оттока.

data['Churn']

Вывод выглядит так..

Столбец Churn имеет два значения: 0 и 1. 0 означает отсутствие оттока и 1 означает отток.

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

data.isnull().sum()

На приведенном выше снимке экрана видно, что такие столбцы, как Tenure, WareHouseToHome, HoursSpendOnApp, OrderAmountHikeFromLastYear, CouponUsed, OrderCount и DaySinceLastOrder, имеют значения NULL.

Давайте посмотрим на распределение зависимой переменной Churn.

(data[data['Churn'] == 1].shape[0] / data.shape[0]) * 100

В результате получилось 17%. Только 17% данных показывают отток.

churn = data['Churn'].value_counts().reset_index()
churn.head()
sns.barplot(x = churn['index'], y = churn['Churn'])

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

Из приведенной выше визуализации мы можем сделать вывод, что набор данных сильно несбалансирован.

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

Визуализация данных и предварительная обработка

  1. Распределение столбца Tenure
plt.figure(figsize=(8,5))
sns.kdeplot(x = data['Tenure'], hue = data['Churn'])

Статистика:

  1. Меньше срок владения → больше вероятность оттока
  2. Максимальный срок пребывания – более 20, после чего вероятность того, что клиент уйдет, снижается.
  3. Они перекошены вправо.
    На приведенном выше графике показана взаимосвязь между пребыванием в должности и оттоком. Чем меньше стаж, тем больше шансов уйти. Таким образом, один из способов уменьшить отток клиентов – удерживать клиентов на более длительный срок, что снижает вероятность оттока.

2. Разные значения в столбце PreferedOrderCat.

data['PreferedOrderCat'].unique()

Как видно из скриншота выше, есть две избыточные категории: Мобильный телефон и Мобильный телефон.

data['PreferedOrderCat'].replace({'Mobile Phone' : 'Mobile'}, inplace = True)

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

3. Предпочитаемая категория заказа и отток

ax = sns.countplot(x = data['PreferedOrderCat'], hue = data['Churn'])
plt.xticks(rotation = 90)

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

def calculate_ratios(ax):
  l = len(ax.patches)
  cnt = 0
  without_churn = []
  with_churn = []
  for p in ax.patches:
    if cnt < l/2:
      without_churn.append(p.get_height())
    else:
      with_churn.append(p.get_height())
    cnt += 1;

  print("without_churn : ", without_churn)
  print("with_churn : ", with_churn)

  ratio = []
  for i in range(len(without_churn)):
    ratio.append(with_churn[i] / without_churn[i])

  print("ratio : ", ratio)


calculate_ratios(ax)

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

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

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

4. Варьирование пола и отток клиентов

plt.figure(figsize = (8, 5))
g = sns.countplot(x = data['Gender'], hue = data['Churn'])
calculate_ratios(g)

(churning[churning['Gender'] == 'Male'].shape[0] / data[data['Gender'] == 'Male'].shape[0]) * 100

Я получил результат 17,73% из приведенного выше кода.

Выводы. Клиенты-мужчины чаще уходят. В среднем уходит почти 18 % клиентов-мужчин.

5. Изменение количества зарегистрированных устройств и их отток

dev = sns.countplot(x = data['NumberOfDeviceRegistered'], hue = data['Churn'])
calculate_ratios(dev)

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

6. Уникальное значение в столбце Предпочтительный способ оплаты.

data['PreferredPaymentMode'].unique()

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

data['PreferredPaymentMode'].replace({'Credit Card':'CC','Cash on Delivery':'COD'}, inplace = True)

Мы можем использовать приведенный выше код для замены значений.

7. Разновидность столбцов WareHouseToHome и столбца Жалоба с оттоком

sns.lineplot(x = data['WarehouseToHome'], y = data['Complain'], hue = data['Churn'])

Аналитика. На приведенном выше графике видно, что у большинства уходящих клиентов больше жалоб. Это показывает, что организация или компания должны сосредоточиться на разрешении жалоб клиентов. Можно сказать, что жалобы — одна из причин оттока клиентов.

8. Какая категория наиболее предпочтительна?

order = data['PreferedOrderCat'].value_counts().reset_index()
sns.barplot(x = order['PreferedOrderCat'], y = order['index'])

Аналитика. Из приведенного выше графика видно, что предпочтительнее использовать категории "Ноутбуки и аксессуары".

9. Корреляция оценки удовлетворенности и суммы кэшбэка

sns.lineplot(x = data['SatisfactionScore'], y = data['CashbackAmount'])

Тезис: из этого графика видно, что сумма кэшбэка не имеет прямого отношения к показателю удовлетворенности.

Проверка несогласованных значений данных в каждом столбце

  1. Идентификатор клиента:
data['CustomerID'].unique()

На приведенном выше снимке экрана показаны некоторые значения. Чтобы просмотреть все значения для этого столбца, мы можем использовать цикл for.

for key, value in data['CustomerID'].items():
  if not isinstance(value, int):
    print(value)

Этот код ничего не возвращает, это означает, что все значения соответствуют типу данных столбца.

2. Срок пребывания

data['Tenure'].unique()

Столбец Tenure имеет одно значение NULL.

3. Предпочитаемое устройство входа

data['PreferredLoginDevice'].unique()

Столбец PreferredLoginDevice не содержит избыточных или противоречивых данных.

4. Склад-Дома

data['WarehouseToHome'].unique()

Столбец WareHouseToHome имеет одно значение NULL.

То же самое можно сделать и для других столбцов.

Обработка пропущенных значений

Существует множество способов обработки отсутствующих значений.

  1. Удаление строк с отсутствующими значениями или значениями NaN.
  2. Использование fillna для заполнения значений
  3. Используйте импутеры.

В этом проекте мы собираемся использовать Knn Imputer для обработки пропущенных значений.

data.drop(columns = ['CustomerID'], inplace = True)

Мы удаляем идентификатор клиента, так как он не имеет значений NULL.

from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
one_hot_encoded_data = pd.get_dummies(data, columns = ['PreferredLoginDevice', 'PreferredPaymentMode', 'Gender', 'PreferedOrderCat', 'MaritalStatus'])
new_data = imputer.fit_transform(one_hot_encoded_data)
one_hot_encoded_data[:]= imputer.transform(new_data)

Приведенный выше код можно использовать для реализации Knn Imputer.

Давайте проверим, есть ли в каком-либо столбце пропущенные значения:

one_hot_encoded_data.isnull().sum()

Как мы видим на скриншоте выше, обрабатываются все NULL или отсутствующие значения.

До сих пор мы выполняли предварительную обработку данных и визуализацию данных. В следующей части мы рассмотрим обучение моделей. Оставайтесь с нами для следующей части и продолжайте учиться до тех пор :)

Ссылка на мой репозиторий GitHub: https://github.com/sunidhib2002/Customer-Churn-

Я надеюсь, что вы нашли это полезным. Спасибо за прочтение !

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

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