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

— Винс Ломбарди

Отток клиентов

Отток клиентов происходит, когда клиенты или подписчики службы перестают вести дела с компанией. Бизнес считает клиента уволенным, если он не взаимодействует с бизнесом в течение определенного периода времени. Отток клиентов — важный показатель, потому что привлекать новых клиентов намного дороже, чем удерживать существующих клиентов. Привлечение клиентов требует работы с лидами через канал продаж и использования ресурсов продаж и маркетинга на протяжении всего процесса для совершения продажи. Благодаря удержанию клиентов вы уже заслужили доверие и лояльность существующих клиентов и хотите продолжать строить конструктивные отношения с этими клиентами. Согласно исследованию, проведенному Bain & Company, повышение коэффициента удержания клиентов всего на пять процентов может увеличить прибыль на 25–95 процентов, в зависимости от отрасли.

Причины оттока клиентов

Существует четыре основные причины оттока клиентов.

1. Плохое обслуживание клиентов. Исследование Oracle показало, что почти 9 из 10 клиентов отказались от бизнеса из-за плохого опыта. Кроме того, они обнаружили, что отличное обслуживание клиентов может быть огромной победой: 86% клиентов готовы платить больше за лучшее обслуживание клиентов.

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

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

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

Как удержать клиентов

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

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

3. Поддерживайте связь с клиентами. Будьтепроактивны в общении с клиентами. Если клиенты какое-то время не взаимодействовали с вашим брендом, вам следует связаться с ними и восстановить отношения. Вы можете предоставить им рекламные предложения или напомнить им, что их подписка скоро истечет и пора ее продлить.

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

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

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

Дорожная карта

В оставшейся части этой статьи будет представлена ​​программа, которая попытается точно предсказать вероятность оттока клиентов. Следующие шаги будут выполняться с использованием машинного обучения и Python.

1. Импортируйте необходимые программные библиотеки.

2. Получите доступ к набору данных и импортируйте его в фрейм данных.

3. Анализ данных и исследование.

4. Очистка и нормализация данных.

5. Разделите данные на наборы тестовых и обучающих данных.

6. Обучите модель на обучающих данных.

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

8. Оцените производительность модели.

9. Сделайте выводы из наблюдений.

Программа

Цель: предсказать вероятность оттока клиентов, используя несколько моделей.

Импортируйте необходимые программные библиотеки

import pandas as pd
import numpy as np
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
%matplotlib inline

Набор данных для этого проекта можно найти на Kaggle по этому адресу: https://www.kaggle.com/blastchar/telco-customer-churn?select=WA_Fn-UseC_-Telco-Customer-Churn.csv

Доступ к набору данных и импорт его

# Load the data into Google Colab. 
from google.colab import files  
uploaded = files.upload()
# Store the data into a data frame.
customers = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv.csv')

Анализ и исследование данных

# Print the first 5 rows
customers.head(5)

# Show the number of rows and columns in the data frame. 
customers.shape

(7043, 21)

Существует 7043 записи о клиентах с 20 функциями и 1 целевой переменной.

Определения для переменных данных показаны ниже.

  • Идентификатор клиента: идентификационный номер клиента.
  • Пол: пол клиента (мужской или женский).
  • Пожилой гражданин: клиент является пожилым гражданином или нет (0, 1).
  • Партнер: у клиента есть партнер или нет (да, нет).
  • Иждивенцы: у клиента есть иждивенцы или нет (Да, Нет).
  • Стаж: количество месяцев, в течение которых клиент оставался в компании.
  • Телефонная служба: у клиента есть телефонная служба или нет (да, нет).
  • Несколько линий: у клиента есть несколько линий (да, нет, нет телефонной службы)
  • Интернет-услуги: интернет-провайдер клиента (DSL, оптоволокно, нет)
  • Онлайн-безопасность: у клиента есть онлайн-безопасность (да, нет, нет интернет-сервиса)
  • Онлайн-резервное копирование: у клиента есть онлайн-резервное копирование (да, нет).
  • Защита устройства: у клиента есть защита устройства (Да, Нет).
  • Техническая поддержка: Клиент имеет техническую поддержку: (Да, Нет).
  • Потоковые фильмы: у клиента есть потоковые фильмы: (Да, Нет).
  • Контракт: Срок контракта.
  • Безбумажный биллинг: у клиента есть безбумажный биллинг.
  • Способ оплаты: как производятся платежи.
  • Ежемесячные платежи: сумма ежемесячного платежа.
  • Total Charges: общая сумма платежа.
  • Отток: отток клиентов (нет = сохраняется, да = уходит)
# View statistical details. 
customers.describe()

Статистика показывает, что самый длинный срок пребывания в должности составляет 72 месяца, а максимальная ежемесячная плата составляет 118,75 долларов США.

Минимальная ежемесячная плата составляет 18,25 долларов США.

Клиент может рассчитывать на среднюю ежемесячную плату в размере 64,76 долларов США. Я предполагаю, что расходы указаны в долларах США (USD).

# Show information about the dataframe.
customers.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7043 entries, 0 to 7042
Data columns (total 21 columns):
 #   Column            Non-Null Count  Dtype  
---  ------            --------------  -----  
 0   customerID        7043 non-null   object 
 1   gender            7043 non-null   object 
 2   SeniorCitizen     7043 non-null   int64  
 3   Partner           7043 non-null   object 
 4   Dependents        7043 non-null   object 
 5   tenure            7043 non-null   int64  
 6   PhoneService      7043 non-null   object 
 7   MultipleLines     7043 non-null   object 
 8   InternetService   7043 non-null   object 
 9   OnlineSecurity    7043 non-null   object 
 10  OnlineBackup      7043 non-null   object 
 11  DeviceProtection  7043 non-null   object 
 12  TechSupport       7043 non-null   object 
 13  StreamingTV       7043 non-null   object 
 14  StreamingMovies   7043 non-null   object 
 15  Contract          7043 non-null   object 
 16  PaperlessBilling  7043 non-null   object 
 17  PaymentMethod     7043 non-null   object 
 18  MonthlyCharges    7043 non-null   float64
 19  TotalCharges      7043 non-null   object 
 20  Churn             7043 non-null   object 
dtypes: float64(1), int64(2), object(18)
memory usage: 1.1+ MB
# Check for NA or missing data.
customers.isna().sum()
customerID          0
gender              0
SeniorCitizen       0
Partner             0
Dependents          0
tenure              0
PhoneService        0
MultipleLines       0
InternetService     0
OnlineSecurity      0
OnlineBackup        0
DeviceProtection    0
TechSupport         0
StreamingTV         0
StreamingMovies     0
Contract            0
PaperlessBilling    0
PaymentMethod       0
MonthlyCharges      0
TotalCharges        0
Churn               0
dtype: int64
# Show the number of customers retained and the number of customers # churned.
customers['Churn'].value_counts()

No 5174

Да 1869

5 174 клиента были сохранены, а 1 869 клиентов ушли.

# Visualize the counts for customers retained and customers churned. 
sns.countplot(customers['Churn'])

# Show percentages for customers staying and customers leaving.
retained = customers[customers.Churn == 'No']
churned = customers[customers.Churn == 'Yes']
num_retained = retained.shape[0]
num_churned = churned.shape[0]

# Print the percentage of customers that stayed with the company. 
print(num_retained / (num_retained + num_churned) * 100 , "% of customers that stayed with the company.")

# Print the percentage of customers that left the company.
print(num_churned / (num_retained + num_churned) * 100,"% of customers that left the company.")

73,4630129206304 % клиентов, которые остались в компании.
26,536987079369588 % клиентов, которые покинули компанию.

Мы обнаружили, что 73,46% клиентов были удержаны (остались в компании), а 26,54% клиентов ушли (покинули компанию).

# Visualize the churn count for males and females.
sns.countplot(x='gender', hue='Churn', data = customers)

# Visualize the churn count for senior citizens.
sns.countplot(x='SeniorCitizen', hue='Churn', data = customers)

# Visualize the churn count for contract type.
sns.countplot(x='Contract', hue='Churn', data = customers)

# Visualize the churn count for phone service.
sns.countplot(x='PhoneService', hue='Churn', data = customers)

# Visualize the churn count for the type of internet service.
sns.countplot(x='InternetService', hue='Churn', data = customers)

Резюме результатов включает следующее:

  • 73,46% клиентов остались, а 26,54% ушли.
  • Пол, похоже, не играет роли в оттоке клиентов.
  • Большинство клиентов молодые, а не пенсионеры.
  • Клиенты с ежемесячными контрактами более склонны к оттоку, чем клиенты с годовыми или двухлетними контрактами.
  • У большинства клиентов есть телефонная связь.
  • Вероятность оттока клиентов с оптоволоконным интернет-сервисом выше, чем у клиентов с DSL или без интернет-сервиса.
# Visualize the tenure and monthly charge features to see if there  # are any differences for customer churn.
numerical_features = ['tenure', 'MonthlyCharges']
fig, ax = plt.subplots(1, 2, figsize=(16, 4))
customers[customers.Churn == 'No'][numerical_features].hist(bins=20, color="darkblue", alpha=0.5, ax=ax)
customers[customers.Churn == 'Yes'][numerical_features].hist(bins=20, color="tab:orange", alpha=0.5, ax=ax)

Диаграмма сроков пребывания (слева) показывает, что большинство ушедших клиентов проработали в компании от 1 до 9 месяцев, в то время как у большинства оставшихся клиентов срок пребывания в компании составлял от 22 до 72 месяцев.

График ежемесячных платежей (справа) показывает, что у большинства постоянных клиентов, оставшихся в компании, ежемесячная плата составляла от 18 до 30 долларов. У большинства ушедших клиентов ежемесячная плата составляла от 70 до 110 долларов.

Очистка и нормализация данных

# Remove the following features because they add little value to the # model. Having unnecessary features increases the model complexity. 
cols = ['customerID', 'gender', 'PhoneService', 'Contract', 'TotalCharges']
customers = customers.drop(columns = cols, axis = 1)
# Convert all the non-numeric columns to numerical data types.
for column in customers.columns:
   if customers[column].dtype == np.number:
      continue
   customers[column] = LabelEncoder().fit_transform(customers[column])
# View the updated data set. 
customers.head()

Разделить данные на тестовые и обучающие наборы данных

Сначала нам нужно разделить наши данные на значения x (данные, которые мы будем использовать для прогнозирования) и значения y (данные, которые мы пытаемся предсказать).

x_data = customers.drop('Churn', axis = 1) 
y_data = customers['Churn']

# Scale the x data to have values between 0 and 1 inclusively. 
x_data = StandardScaler().fit_transform(x_data)

Используйте функцию разделения тренировочного теста для создания обучающих данных и тестовых данных. Набор тестовых данных будет составлять 30% от исходного набора данных.

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3, random_state=42)

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

Модель логистической регрессии

# Create an instance of the classifier and assign it to a model      # variable. 
model_lg = LogisticRegression()
# Train the model using the fit method and training data. 
model_lg.fit(x_training_data, y_training_data)
# Make predictions on the test data. 
predictions_lr = model_lg.predict(x_test_data)
# Calculate the Accuracy Score.
lg = accuracy_score(y_test_data, predictions_lr)
print(lg)

0.8088026502602934

# Show Confusion Maxtrix.
cm1 = confusion_matrix(y_test_data, predictions_lr)
sns.heatmap(cm1/np.sum(cm1), annot = True, fmt=  '0.2%', cmap = 'Reds')

Модель логистической регрессии правильно предсказала, что 80,88% клиентов останутся или уйдут.

  • 66,54% правильно предсказали сохранение клиентов.
  • 14,34% правильно предсказали отток клиентов.

Было неверно предсказано, что 19,12% клиентов останутся или уйдут.

  • 6,29% неверно предсказали отток клиентов.
  • 12,83% неверно предсказали, что клиенты останутся.

Модель дерева решений

# Create an instance of the classifier and assign it to a model     # variable. 
model_dt = DecisionTreeClassifier(criterion = 'entropy', random_state=42)
# Train the Model using the fit method and training data. 
model_dt.fit(x_training_data, y_training_data)
# Make predictions on the test data. 
predictions_dt = model_dt.predict(x_test_data)
# Calculate the Accuracy Score.
dt = accuracy_score(y_test_data, predictions_dt)
print(dt)

0.7283483199242783

# Show Confusion Maxtrix
cm2 = confusion_matrix(y_test_data, predictions_dt)
sns.heatmap(cm2/np.sum(cm2), annot = True, fmt=  '0.2%', cmap = 'Reds')

Модель дерева решений правильно предсказала, что 72,84% клиентов останутся или уйдут.

  • 59,16% правильно предсказали, что клиенты останутся.
  • 13,68% правильно предсказали отток клиентов.

Было неверно предсказано, что 27,17% клиентов останутся или уйдут.

  • 13,68% неверно предсказали отток клиентов.
  • 13,49% неверно предсказали, что клиенты останутся.

Случайная модель Форреста

# Create an instance of the classifier and assign it to a model     # variable. 
model_rf = RandomForestClassifier(n_estimators=100, max_depth=10)

Параметры:

  • n_estimators — количество деревьев в лесу.
  • max_depth — максимальная глубина дерева
# Train the model using the fit method and training data.
model_rf.fit(x_training_data, y_training_data)
# Make predictions on the test data. 
predictions_rf = model_rf.predict(x_test_data)
# Calculate the Accuracy Score.
rf = accuracy_score(y_test_data, predictions_rf)
print(rf)

0.7998106956933271

# Show Confusion Maxtrix.
cm3 = confusion_matrix(y_test_data, predictions_rf)
sns.heatmap(cm3/np.sum(cm3), annot = True, fmt=  '0.2%', cmap = 'Reds')

Модель случайного леса правильно предсказала, что 79,98% клиентов останутся или уйдут.

  • 66,78% правильно предсказали сохранение клиентов.
  • 13,20% правильно предсказали отток клиентов.

Было неверно предсказано, что 20,02% клиентов останутся или уйдут.

  • 6,06% неверно предсказали отток клиентов.
  • 13,96% неверно предсказали, что клиенты останутся.

K ближайших соседей

# Create an instance of the classifier and assign it to a model     # variable. 
model_kn = KNeighborsClassifier(n_neighbors=9, leaf_size=20)
# Train the model using the fit method and training data.
model_kn.fit(x_training_data, y_training_data)
# Make predictions on the test data. 
predictions_kn = model_kn.predict(x_test_data)
# Calculate the Accuracy Score.
kn = accuracy_score(y_test_data, predictions_kn)
print(kn)

0.7662091812588736

# Show Confusion Maxtrix.
cm4 = confusion_matrix(y_test_data, predictions_kn)
sns.heatmap(cm4/np.sum(cm4), annot = True, fmt=  '0.2%', cmap = 'Reds')

Модель K ближайших соседей правильно предсказала, что 76,62% клиентов останутся или уйдут.

  • 62,85% правильно предсказали сохранение клиентов.
  • 13,77% правильно предсказали отток клиентов.

Было неверно предсказано, что 23,38% клиентов останутся или уйдут.

  • 9,99% неверно предсказали отток клиентов.
  • 13,39% неверно предсказали, что клиенты останутся.
# Show Accuraccy Score by Model.
models = pd.DataFrame({
    'Model':['Logistic Regression', 'Decision Tree', 'Random Forest', 'KNeighbours'],
    'Accuracy_score' :[lg, dt, rf, kn]
})
models
sns.barplot(x='Accuracy_score', y='Model', data=models)

models.sort_values(by='Accuracy_score', ascending=False)

Выводы: модель логической регрессии имеет самый высокий показатель точности. Эта модель правильно предсказала, что 81% клиентов будут удержаны или уйдут, а 19% клиентов были неверно предсказаны, что они останутся или уйдут.

Большинство ушедших клиентов проработали в компании от 1 до 9 месяцев, в то время как у большинства оставшихся клиентов срок пребывания в компании составлял от 22 до 72 месяцев. Компания может рассмотреть возможность поощрения клиентов, чтобы удержать их как минимум на 2 года.

У большинства клиентов, оставшихся в компании, ежемесячная плата составляла от 18 до 30 долларов, в то время как у большинства ушедших клиентов ежемесячная плата составляла от 70 до 110 долларов. Компания может рассмотреть возможность снижения ежемесячных платежей, чтобы сохранить клиентов и повысить конкурентоспособность.

Спасибо, что прочитали мою статью! Если у вас есть какие-либо вопросы или комментарии, пожалуйста, дайте мне знать.

Если вам нравится читать такие истории и вы хотите поддержать меня как писателя, подумайте о том, чтобы зарегистрироваться и стать участником Medium. Членство дает вам неограниченный доступ к историям на Medium. Зарегистрироваться можно по этой ссылке https://medium.com/@dniggl/membership