Отток клиентов – одна из самых больших статей расходов любой
организации. Отток клиентов, также известный как отток клиентов или
оборот клиентов, – это процент клиентов, которые перестали использовать
продукт или услугу вашей компании в течение определенного периода времени.
Например, если вы начали год с 500 клиентов, но позже закончилось
с 480 клиентами, процент ушедших клиентов будет 4%.
Если бы мы могли выяснить, почему клиент уходит и когда он уходит с
разумной точностью, это очень помогло бы организации
разработайте стратегию своих инициатив по удержанию клиентов.

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

Понимание бизнеса

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

Понимание данных

Следующее описывает столбцы, присутствующие в данных:

Пол – является ли покупатель мужчиной или женщиной.

SeniorCitizen: является ли клиент пожилым гражданином или нет.

Партнер — есть ли у клиента партнер или нет (да, нет).

Иждивенцы — есть ли у клиента иждивенцы или нет (да, нет).

Tenure – количество месяцев, в течение которых клиент оставался в компании.

Телефонная служба — есть ли у клиента телефонная служба или нет (да, нет).

Несколько строк — есть ли у клиента несколько строк или нет.

InternetService — интернет-провайдер клиента (DSL, оптоволокно, нет).

OnlineSecurity — есть ли у клиента онлайн-защита или нет (да, нет, нет Интернета).

OnlineBackup — есть ли у клиента онлайн-резервное копирование или нет (да, нет, нет Интернета).

DeviceProtection — есть ли у клиента защита устройства или нет (да, нет, нет интернет-сервиса).

Техническая поддержка — есть ли у клиента техническая поддержка или нет (да, нет, нет Интернета).

StreamingTV — есть ли у клиента потоковое телевидение или нет (да, нет, нет интернет-сервиса).

StreamingMovies — есть ли у клиента потоковое воспроизведение фильмов или нет (да, нет, нет интернет-сервиса).

Контракт – срок действия контракта клиента (ежемесячно, один год, два года).

Безбумажное выставление счетов — наличие у клиента безбумажного выставления счетов или нет (да, нет).

Способ оплаты — способ оплаты клиента (электронный чек, чек по почте, банковский перевод (автоматически), кредитная карта (автоматически))

MonthlyCharges — сумма, ежемесячно взимаемая с клиента.

TotalCharges — общая сумма, списанная с клиента.

Отток – отток клиентов или нет (да или нет).

Гипотеза и вопросы

Гипотеза

Нет:
клиенты уходят из-за высокой оплаты.

Альтернативный вариант:
Клиенты, которые платят большие суммы, не уходят.

Вопросы
1. Сколько ежемесячно платят пенсионеры и не пенсионеры?

2. Сколько денег получают клиенты, пользующиеся услугами Интернета?

3. Каково соотношение клиентов и их типов договоров?

4. Какие категории контрактов приносят наибольший доход?

5. Используют ли высокооплачиваемые клиенты потоковое телевидение и/или потоковое кино?

6. Имеют ли лица, не являющиеся пенсионерами, несколько линий?

7. Расходуют ли клиенты с иждивенцами больше, чем клиенты без иждивенцев?

8. Какие способы оплаты клиенты предпочитают/используют чаще?

Подготовка данных

На этапе подготовки данных мы включим исследовательский анализ данных (одномерный, двумерный и многомерный), вычисление пропущенных значений, проектирование признаков и т. д.

Импорт библиотек

# Importing the required libraries

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import cufflinks as cf
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import RandomOverSampler
from imblearn.over_sampling import SMOTE
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import SMOTE
import matplotlib.ticker as mtick

import warnings
warnings.filterwarnings('ignore')

import os
import glob
# Previewing the data
telco = pd.read_csv('Telco-Customer-Churn.csv')
telco.head()

#checking for more information about the data
telco.info()

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

# Change the TotalCharges column into a float
telco['TotalCharges'] = pd.to_numeric(telco['TotalCharges'], errors='coerce').astype(np.float64)
# Checking the dtaaframe information 
telco.info()

На изображении выше показано, что наш столбец TotalCharges теперь является числовой (плавающей) переменной.

Одномерный анализ

# Plotting Senior Citizen Proportion

senior_citizen_counts = telco['SeniorCitizen'].value_counts()
labels = ['Not Senior Citizen', 'Senior Citizen']
colors = ['#008fd5', '#fc4f30']
explode = (0, 0.1)
plt.pie(senior_citizen_counts, labels=labels, explode=explode, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.title('Senior Citizen Proportion')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1))
plt.ylabel('')
plt.show()

Круговая диаграмма показывает нам, что клиенты в основном не пенсионеры. Пожилые люди составляют 16,2% клиентов.

#Plotting the proportion of multiple lines

multiple_lines_counts = telco['MultipleLines'].value_counts()
labels = ['No', 'Yes', 'No phone service']
colors = ['#008fd5', '#fc4f30', '#6d904f']
explode = (0.03, 0.03, 0.1)
plt.pie(multiple_lines_counts, labels=labels, explode=explode, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.title('Multiple Lines Proportion')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1))
plt.ylabel('')
plt.show()

48,1% клиентов не используют несколько линий, тогда как 42,2% имеют несколько линий. Это может быть связано с тем, что у этих клиентов есть иждивенцы, телефонные линии которых также могут быть зарегистрированы на имя клиентов.

Также мы видим, что у 9,7%клиентов нет телефонной связи. В какой-то момент нам, возможно, придется продолжить расследование, чтобы выяснить, пользуется ли эта группа клиентов только Интернетом без телефонной линии. Либо оптоволокно, либо DSL, для которых не обязательно требуется телефонная линия.

# Plotting Gender Proportion

gender_counts = telco['gender'].value_counts()
labels = ['Female', 'Male']
colors = ['#008fd5', '#fc4f30']
explode = (0, 0.05)
plt.pie(gender_counts, labels=labels, explode=explode, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.title('Gender Proportion')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1))
plt.ylabel('')
plt.show()

Похоже, соотношение женщин и мужчин сбалансировано

# Plotting the proportion of Internet Service Users

internet_service_counts = telco['InternetService'].value_counts()
labels = ['DSL', 'Fiber optic', 'No']
colors = ['#008fd5', '#fc4f30','#6d904f']
explode = (0.03, 0.03, 0.1)

percentages = round(internet_service_counts/internet_service_counts.sum()*100, 2).astype(str) + '%'

ax = internet_service_counts.plot(kind='bar', color=colors, edgecolor='black', linewidth=1.2, 
                                  figsize=(8,6), rot=0)
ax.set_title('Internet Service Proportion', fontsize=14)
ax.set_xlabel('Internet Service Type', fontsize=12)
ax.set_ylabel('Number of Customers', fontsize=12)
ax.set_ylim(0, 5000)

for i, p in enumerate(ax.patches):
    width, height = p.get_width(), p.get_height()
    x, y = p.get_xy() 
    ax.annotate(f'{height}\n{percentages[i]}', (x + 0.15, y + height + 200))

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()

3096, что составляет 43,96% клиентов, используют оптоволокно Интернет-услуги, в то время как клиенты, использующие DSL и не использующие (Нет) Интернет-услуги, 34,37% и 21,67% соответственно.

# Plotting the ratio of customer churn

customer_churn_counts = telco['Churn'].value_counts()
labels = ['No', 'Yes']
colors = ['#008fd5', '#fc4f30']
explode = (0.03, 0.03)

percentages = round(customer_churn_counts/customer_churn_counts.sum()*100, 2).astype(str) + '%'

ax = customer_churn_counts.plot(kind='bar', color=colors, edgecolor='black', linewidth=1.2, 
                                  figsize=(8,6), rot=0)
ax.set_title('Customer Churn Proportion', fontsize=14)
ax.set_xlabel('Customer Churn', fontsize=12)
ax.set_ylabel('Number of Customers', fontsize=12)
ax.set_ylim(0, 7000)

for i, p in enumerate(ax.patches):
    width, height = p.get_width(), p.get_height()
    x, y = p.get_xy() 
    ax.annotate(f'{height}\n{percentages[i]}', (x + 0.15, y + height + 200))

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()

На графике распределения оттока показано соотношение клиентов, которые уходят, и тех, кто этого не делает. 5 174 клиента, что составляет 73,46 %, остались, а 1 869 – это 26,54 % клиентов, которые ушли.

Двумерный анализ

# Create a boxplot of MonthlyCharges by Churn status
sns.boxplot(x='Churn', y='MonthlyCharges', data=telco)
plt.show()

Клиенты, которые уходят, платят в среднем 80 в месяц, а те, кто не уходит, платят в среднем от 60 до 70 в месяц.

# Create a boxplot of TotalCharges by Churn status
sns.boxplot(x='Churn', y='TotalCharges', data=telco, flierprops={'markerfacecolor': 'magenta', 'marker': 'o'})
plt.title('Churn by Total Charges')

plt.show()

Наш блок-график оттока показывает нам две характерные блок-диаграммы. то есть для csutomers, которые сбивали и тех, кто не сбивал. У тех, кто уволился, в среднем около 1000 общая сумма платежей, а у тех, кто остался, в среднем около 2000, в два раза больше, чем у тех, кто уволился. Удивительно, но некоторые выбросившиеся клиенты, отмеченные фиолетовыми точками, имели гораздо более высокие общие расходы. Поскольку они кажутся высокооплачиваемыми клиентами, было бы неплохо предложить им индивидуальные продукты / услуги, чтобы удержать их.

# Convert Churn column to binary encoding
telco['Churn_bin'] = telco['Churn'].apply(lambda x: 1 if x == 'Yes' else 0)

# Bar chart of churn rate by internet service type
sns.barplot(data=telco, x='InternetService', y='Churn_bin')
plt.title('Churn Rate by Internet Service Type')
plt.show()

Из этой гистограммы видно, что группа клиентов с наибольшим оттоком — это те, кто использует оптоволоконный доступ в Интернет. Теперь это может быть не фактической/единственной причиной. они сбиваются, но это дает нам представление о некоторых возможных проблемах, которые им, возможно, нужно решить. Около 40% пользователей Интернета — это огромная цифра, требующая особого внимания.

Многомерный анализ

# Create a heatmap of correlations between numeric variables
corr = telco[['tenure', 'MonthlyCharges', 'TotalCharges', 'SeniorCitizen']].corr()
sns.heatmap(corr, cmap='coolwarm', annot=True)
plt.show()

В многомерном анализе общая сумма расходов имеет более сильную корреляцию со сроком пребывания в должности, чем ежемесячные платежи. На приведенной выше тепловой карте видно, что существует более высокая корреляция между переменными "должность" и "общие расходы" до 83 %. >. Это указывает на то, что чем дольше клиент остается в сети, тем больше общая сумма начисляется ему.

# Plotting monthly charges for customers wirh deifferent contracts
telco_filtered = telco.dropna(subset=['Churn', 'MonthlyCharges', 'Contract'])

fig = px.box(telco_filtered, x='Contract', y='MonthlyCharges', color='Churn', 
             color_discrete_map={'Yes': '#FF69B4', 'No': '#1E90FF'})

fig.update_layout(title='Monthly Charges by Churn and Contract Type',
                  xaxis_title='Contract Type',
                  yaxis_title='Monthly Charges',
                  width=800, height=500)

fig.show()

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

Ответы на наши вопросы

  1. Сколько ежемесячно платят пожилые и не пенсионеры?

Из приведенного выше анализа мы видим, что пожилые люди платят в среднем около 80 долларов США в месяц, а лица, не являющиеся пенсионерами, платят около 60 долларов США в месяц. По сути, пенсионеры платят больше, чем неграждане.

2. Сколько денег получают клиенты, пользующиеся услугами Интернета?

Если посмотреть на общую среднемесячную плату, 250 000 долларов США были получены от клиентов, которые использовали оптоволоконный интернет-сервис, в то время как клиенты, которые использовали DSL, внесли около 140 000 долларов США в доход компании.

3. Каково соотношение клиентов и типа их контрактов?

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

4. Какие категории контрактов приносят наибольший доход?

Графики выше показывают типы контрактов и то, сколько генерирует каждый из них.

Слева обратите внимание, что между тремя контрактами нет большой разницы. Все три контракта приносят около 60 долларов США порога средней ежемесячной платы.

Напротив, сюжет справа; среднее значение общих расходов показывает, что ежемесячный контракт приносит наименьший доход в размере почти 1500 долларов США, а двухлетний контракт приносит самый высокий доход в размере около 3500 долларов США.

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

5. Используют ли высокооплачиваемые клиенты потоковое телевидение и/или потоковое кино?

Гистограмма показывает распределение высокооплачиваемых клиентов, пользующихся потоковым телевидением или нет. Справа около 2000 высокооплачиваемых клиентов используют услугу Stream TV, а 1000 высокооплачиваемых клиентов не используют услугу Stream TV.
Мы также видим, что слева 1500 клиентов, которые также являются высокооплачиваемыми клиентами, не пользуются этой услугой. Если внимательно посмотреть на график, оранжевая полоса слева указывает на отсутствие доступа в Интернет.
Мы можем сделать вывод, что высокооплачиваемые клиенты пользуются услугой Stream TV, а те, кто не пользуется услугой Stream TV, также не пользуются интернет-сервисом.

На диаграмме показана сумма, которую платят высокооплачиваемые клиенты, пользующиеся услугой потокового просмотра фильмов.
Наблюдая за графиком, мы можем сказать, что высокооплачиваемые клиенты, не пользующиеся услугой потокового просмотра фильмов, платят около 80 долларов США<. /strong> в месяц, в то время как высокооплачиваемые клиенты, использующие Stream Movies, ежемесячно платят около 95 долларов США.

6. Имеют ли лица, не являющиеся пенсионерами, несколько линий?

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

7. Расходуют ли клиенты с иждивенцами больше, чем клиенты без иждивенцев?

Судя по графику, ежемесячная плата клиентов с иждивенцами составляет около59 долларов США, в то время как клиенты без иждивенцев платят в среднем 67 долларов США в месяц.
Следовательно, клиенты с иждивенцами тратят меньше, чем клиенты без иждивенцев.

8. Какие способы оплаты клиенты предпочитают/используют чаще?

Судя по приведенному выше графику, электронные чеки являются наиболее предпочтительным средством оплаты, которое используют клиенты.
2365 клиентов, что составляет 33,63%, предпочитают использовать электронные чеки.