Требуются месяцы, чтобы найти клиента… секунды, чтобы его потерять.
— Винс Ломбарди
Отток клиентов
Отток клиентов происходит, когда клиенты или подписчики службы перестают вести дела с компанией. Бизнес считает клиента уволенным, если он не взаимодействует с бизнесом в течение определенного периода времени. Отток клиентов — важный показатель, потому что привлекать новых клиентов намного дороже, чем удерживать существующих клиентов. Привлечение клиентов требует работы с лидами через канал продаж и использования ресурсов продаж и маркетинга на протяжении всего процесса для совершения продажи. Благодаря удержанию клиентов вы уже заслужили доверие и лояльность существующих клиентов и хотите продолжать строить конструктивные отношения с этими клиентами. Согласно исследованию, проведенному 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