电信客户流失数据分析(一)

来做个数据分析项目-

背景:在kaggle网站上发现了这个数据集,就顺手拿来做个数据分析的项目,希望发现一些有趣的结果吧~~感兴趣的朋友可以在kaggle网站上下载:https://www.kaggle.com/blastchar/telco-customer-churn。电信客户流失数据集共7043条记录,21个字段。字段包括20个输入特征以及1个目标特征。目标特征为是否为流失顾客,输入特征包括:顾客Id,性别,是否老年人,是否有伴侣,是否有小孩,已使用年限,是否使用电话服务,是否使用网络服务,服务合同期限,支付方式、账单类型、月消费、总消费等一系列描述。

下面我提出一系列相关问题和任务,开始数据挖掘工作!

任务1:探索数据集

拿到数据集要做的第一步是去了解和熟悉数据集,并且对数据缺失、数据错误问题进行预处理。

1.1输入数据集

import pandas as pd
Telco_data=pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')

1.2 检查数据集内容

Telco_data.head(10)

数据预览
#数据集大小

Telco_data.shape

(7043, 21)

#数据集是否有缺失值

Telco_data.isnull().sum()

没有缺失值

#检查数据类型

Telco_data.dtypes

对于该数据集的初步探索我们可以了解到,这是一个7403*21的数据集,目前显示没有缺失值,然而有一个特征的数据类型是错误的。根据日常经验和对数据集内容的观察可以发现,TotalCharges字段的数据类型应该是float,而非object,该字段应该是一个连续数值型字段。产生这个错误的原因在于:在使用pandas进行读取csv文件的过程中,pandas会将缺失值读取为空字符串。

检查缺失值的记录个数:

Te_data[Te_data['TotalCharges'].isin([' '])]

目前有11条记录具有缺失值,由于其数量相对于总体样本而言,微不足道。因此我采取删除记录的处理方式。

1.3修复错误输入的数据集

重新输入数据集,将空字符串转化为缺失值表示符号“NaN”,并删除带有缺失值的字段,最后将TotalCharges字段的数据类型转化为数值型,得到正确输入的数据集(后续所有操作的基础是下面的代码):

import seaborn as sns
import pandas as pd
import numpy as np
Te_data = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
Te_data.replace(to_replace=r'^\s*$',value=np.nan,regex=True,inplace=True)
Te_data.dropna(axis=0, how='any', inplace=True)
Te_data['TotalCharges'] = pd.to_numeric(Te_data['TotalCharges'])

1.4汇总统计分析
字段内容统计:

Te_data.describe(include='all')

任务2:哪些输入特征与顾客流失具有关联性?

2.1分析思路
解决任务2,首先必须回答的一个问题就是,顾客为什么会流失?(因果性)第一个原因,相信也是绝大多数流失客户给出的答案,就是“电信公司所提供的服务让我无法满意”。这是从公司产品的维度给出的回答。第二个原因,顾客因为个人情况,比如年纪大需求发生变化,从而流失。这是从个人属性变化的角度给出的回答。
第二个要回答的问题是,什么样的行为表现说明了顾客有流失的倾向?(相关性)行为表现的背后往往代表顾客对于公司,对于产品的态度,从而体现顾客的一些标签属性,比如忠诚用户、活跃用户等等。
根据上面的三个回答,我将所有输入特征分成了三个维度:产品、个人属性、用户行为,如下图所示,分别对他们进行分析。

2.2产品维度分析
对于本例的电信公司而言,其主要的产品是电话服务、网络服务以及这两个服务基础上的一些附加服务。统计得到,在本数据集的样本中,同时使用网络服务和电话服务的顾客有4832名,只使用电话服务的顾客有1520名,只使用网络服务的有680名。在样本量没有明显失衡的情况下,下面进行两种假设:

假设1:由于该电信公司的电话服务问题,造成客户流失。
假设2:由于该电信公司的网络服务问题,造成客户流失。

采用countplot函数画出的计数图来验证上面两组假设:

sns.countplot(x='PhoneService',hue='Churn',data=Te_data,order=['Yes','No'],hue_order=['Yes','No'])
sns.countplot(x='InternetService',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['DSL','Fiber optic','No'])

在这里插入图片描述
第一幅图是有接受电话服务和没有接受电话服务他们的流失情况。可以看出,流失率差别不大。假设1不成立。
在这里插入图片描述
在第二幅图中,接受网络服务的用户的流失率明显高于没有接受服务的顾客,尤其是采用光纤网络技术(Fiber optic)的用户,流失率接近40%。推断这项服务存在一定的问题,是急需改进的一项服务。同时也证明了假设2的推断是成立的:是否为网络服务用户与是否发生流失有较为密切的关联性。
针对网络服务,我们可以进一步探讨拥有其他的附加服务是否会影响了用户的流失情况。同样是采用计数图的方式:

fig,axes = plt.subplots(2,2,figsize=(14,10))
sns.countplot(x='OnlineSecurity',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Yes','No','No internet service'],ax=axes[0,0])
sns.countplot(x='OnlineBackup',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Yes','No','No internet service'],ax=axes[0,1])
sns.countplot(x='DeviceProtection',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Yes','No','No internet service'],ax=axes[1,0])
sns.countplot(x='TechSupport',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Yes','No','No internet service'],ax=axes[1,1])

在这里插入图片描述
我们可以发现,使用网络服务的客户,如果继续付费采用网络安全、网络备份、设备保护、技术支持等附加性服务,会有效降低其流失的可能性。这里显示的一个信息就是,虽然该电信公司的基础网络服务具有一定的问题,但是通过附加服务的补充,可以有效降低因服务问题所带来的流失。
产品维度总结:是否使用网络服务,以及在使用了网络服务的情况下是否采用采用网络安全、网络备份、设备保护、技术支持等附加性服务,与顾客流失具有较大的关联性。

2.3个人属性维度分析
个人属性包括性别、是否为老年人、是否有伴侣、是否有待抚养的孩子。根据经验判断,除了是否为老年人这一因素,其他指标并不是造成流失的主要原因。而老年人流失的原因我个人认为是由于年龄变化,对于通话或网络服务的需求发生了改变,而产生的流失,也不排除死亡等因素造成的影响。因此做出假设:

假设3:老年群体相对于非老年人的群体而言更倾向于流失。

采用countplot函数画出的计数图来验证假设3:

sns.countplot(x='SeniorCitizen',hue='Churn',data=Te_data,order=[0,1],hue_order=['Yes','No'])

在这里插入图片描述
其中,0代表非老年人,1代表老年人。通过上图证实了我们的假设,老年人群体的流失率明显高于一般群体。因此可以判断顾客是否为老年人与其流失的可能具有关联性。

2.4用户行为维度分析
从用户行为的角度进行分析,各特征不再与流失指标具有因果性,而是相关性。即该维度的特征不是导致流失的原因,但是其能预示顾客发生流失行为的可能性。按这个思路进行分析,我同样先给出我认为与顾客流失有所关联的指标:合同期限、已使用年限、支付方式、月消费、总消费。其中,合同期限、已使用年限、总消费能较好的体现一个顾客对于该公司的忠诚度,而是否忠诚与流失具有密切的关系。而用户的支付方式、月消费情况,可以显示用户的消费观念,而消费观念也会对是否流失具有一定影响。
另外,总消费与使用年限往往具有较为密切的联系,使用时间越长,在电信平台的累积消费也会越多。总消费≈使用时间*月消费。因此,对总消费与使用年限进行一个回归分析:

sns.regplot(x='tenure',y='TotalCharges',order=4,data=Te_data)

在这里插入图片描述
从图片可以看到,他们具有一定的线性关系,进一步计算这两个特征的相关系数:

corr=Te_data[['tenure','TotalCharges']].corr()
corr

结果显示,他们相关系数高于0.8,具有高度的线性相关性。因此,后面分析,我将忽略总消费这一特征,通过分析使用年限就可以较好的体现使用年限和总消费这两个指标与流失的关联性。
根据上述分析,下面开始进行对各指标进行假设验证:

假设4:合同期限与流失情况具有密切相关性。
假设5:已使用年限与流失情况具有密切相关性。
假设6:支付方式与流失情况具有密切相关性。
假设7:月消费与流失情况具有密切相关性。

sns.countplot(x='Contract',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Month-to-month','One year','Two year'])

在这里插入图片描述
明显可以看出,签订的合同期限越长,流失率越低,假设4成立。

sns.boxplot(x='Churn', y='tenure', data=Te_data,order=['Yes','No'])

在这里插入图片描述
从箱型图可以看出,非流失客户群体使用年限的中位数、第一四分位数、第三四分位数都分别高于流失客户群体的对应指标。用户使用年限低于15个月,更有可能为流失客户,另一方面,若使用年限大于30个月,则更有可能不会流失。相对而言,使用年限越长的客户,流失的可能性就越小,假设5成立。

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
sns.countplot(x='PaymentMethod',hue='Churn',data=Te_data,hue_order=['Yes','No'],order=['Electronic check','Mailed check','Bank transfer (automatic)','Credit card (automatic)'])

在支付方式方面,采用电子支票支付的顾客的流失率明显高于其他支付方式的顾客。支付方式与流失率具有关联性,假设6成立。

sns.boxplot(x='Churn', y='MonthlyCharges', data=Te_data,order=['Yes','No'])

在这里插入图片描述

在月消费方面,流失用户的月消费整体水平要高于非流失用户群体,而其变异性则小于非流失用户群体,假设7成立。
用户行为维度分析总结:合同期限、已使用年限、支付方式、月消费、总消费与顾客流失具有关联性。

任务2总结,经过分析筛选,20个输入特征中,目前认为与顾客流失关联性较大的指标包括:是否使用网络服务,以及在使用了网络服务的情况下是否采用采用网络安全、网络备份、设备保护、技术支持,是否为老年人,合同期限,已使用年限,支付方式,月消费。

下一篇:电信客户流失数据分析(二) 任务3 如何判别客户是否为潜在流失对象?

发布了2 篇原创文章 · 获赞 0 · 访问量 16

猜你喜欢

转载自blog.csdn.net/gdben_user/article/details/105645585