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

任务3 如何判别客户是否为潜在流失对象?

数据集的基本背景以及各特征之间的关系分析可见
上一篇博文:电信客户流失数据分析(一)

数据集的输入与预处理(后续所有程序的基础):

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'])

下面进入正题。。。
在有7000多个样本的情况下,我们可以利用这些样本数据,来训练一个有监督的机器学习模型,使模型能够根据输入特征预测客户是否为潜在的流失对象。对于潜在的流失对象,及时采取措施进行挽留或许能有效减少将来发生流失情况的可能性。
在任务2中(见博文:电信客户流失数据分析(一)),通过分析,得到10个与流失有着密切关联性的输入特征,下面就利用这些输入特征展开建模工作。这10个输入特征包括:是否为老年人、合同期限、已使用年限、支付方式、月消费、是否使用网络服务,以及在使用了网络服务的情况下是否采用采用网络安全、网络备份、设备保护、技术支持。

3.1特征工程
特征工程的目的在于找到正确的方式去表示数据。根据输入特征、输出特征的数据内容和数据类型,我将目前这个10个输入特征分成了四类:
(1)第一类特征的数据内容为:‘yes’ or ‘no‘。目前属于这类特征的变量有:是否为老年人、是否流失。可以直接采用0-1变量进行编码。其中’1‘代表’yes‘,’0‘代表’no‘。

SeniorCitizen=list(Te_data['SeniorCitizen'])
Churn=list(Te_data['Churn'])
#将Churn转化为0-1变量
for i in range(Te_data.shape[0]):
    if Churn[i]=='Yes':
        Churn[i] = 1
    else :
        Churn[i] = 0

(2)第二类特征的数据类型是离散型,并且其数据内容为标称属性,标称属性的意思是数据值只提供了足够信息区分对象,而本身不具有任何顺序或数值计算的意义。目前属于这类特征的变量有:合同期限、是否使用网络服务。这类变量采用One-Hot的方式进行编码,构造虚拟变量。

Contract=Te_data['Contract']
Contract_dummies=pd.get_dummies(Contract)
InternetService=Te_data['InternetService']
InternetService_dummies=pd.get_dummies(InternetService)

(3)第三类特征的数据类型和数据内容属性与第二类特征相同。但是采用0-1变量进行编码足以表达其包含的信息内容,因此不必将其每一个类别都采用虚拟变量表示出来,造成特征的冗余。这类特征包括:支付方式、在使用了网络服务的情况下是否采用采用网络安全、网络备份、设备保护、技术支持。支付方式特征采用0-1变量的原因是只有采用电子支票支付的情况下,流失率才会出现明显的差异(如任务2所分析,下图所示)。因此支付方式这一特征只需区分是电子支票用户还是非电子支票用户即可。而在用户拥有网络服务的基础上,网络安全、网络备份、设备保护、技术支持等附加服务特征只需区分是否其拥有该项附加服务即可,而无需再表达其为网络服务用户这一信息,因此也采用0-1变量进行编码。
在这里插入图片描述

#将PaymentMethod ,OnlineSecurity,OnlineBackup,DeviceProtection ,TechSupport 转化为0-1编码
PaymentMethod=list(Te_data['PaymentMethod'])
OnlineSecurity=list(Te_data['OnlineSecurity'])
OnlineBackup=list(Te_data['OnlineBackup'])
DeviceProtection=list(Te_data['DeviceProtection'])
TechSupport=list(Te_data['TechSupport'])
for i in range(Te_data.shape[0]):
    if PaymentMethod[i]=='Electronic check':
        PaymentMethod[i] = 1
    else :
        PaymentMethod[i] = 0
        
    if OnlineSecurity[i]=='Yes':
        OnlineSecurity[i] = 1
    else :
        OnlineSecurity[i] = 0

    if OnlineBackup[i]=='Yes':
        OnlineBackup[i] = 1
    else :
        OnlineBackup[i] = 0

    if DeviceProtection[i]=='Yes':
        DeviceProtection[i] = 1
    else :
        DeviceProtection[i] = 0

    if TechSupport[i]=='Yes':
        TechSupport[i] = 1
    else :
        TechSupport[i] = 0

(4)第四类特征的数据类型是数值型,其数据内容具备顺序以及加减运算的数值意义。
目前属于这类特征的变量有:已使用年限,月消费。我打算采用连续特征离散化的处理方式。原因是离散化后的特征对异常数据有更强的鲁棒性,降低过拟合的风险,模型会更稳定,预测的效果也会更好。
数据离散化也称为分箱操作,其方法分为有监督分箱(卡方分箱、最小熵法分箱)和无监督分箱(等频分箱、等距分箱)。本次为采用无监督分箱中的等频分箱进行操作。

tenure=list(Te_data['tenure'])
tenure_cats=pd.qcut(tenure,6)
tenure_dummies=pd.get_dummies(tenure_cats)

MonthlyCharges=list(Te_data['MonthlyCharges'])
MonthlyCharges_cats=pd.qcut(MonthlyCharges,5)
MonthlyCharges_dummies=pd.get_dummies(MonthlyCharges_cats)

最终得到模型的23个输入特征以及1个输出特征。

#模型输出y
Churn_y=np.array(Churn).reshape(-1,1)

#模型输入x
SeniorCitizen_x=np.array(SeniorCitizen).reshape(-1,1)
Contract_x=Contract_dummies.values
InternetService_x=InternetService_dummies.values
PaymentMethod_x=np.array(PaymentMethod).reshape(-1,1)
OnlineSecurity_x=np.array(OnlineSecurity).reshape(-1,1)
OnlineBackup_x=np.array(OnlineBackup).reshape(-1,1)
DeviceProtection_x=np.array(DeviceProtection).reshape(-1,1)
TechSupport_x=np.array(TechSupport).reshape(-1,1)
tenure_x=tenure_dummies.values
MonthlyCharges_x=MonthlyCharges_dummies.values

X=np.concatenate([SeniorCitizen_x,Contract_x,InternetService_x,PaymentMethod_x,OnlineSecurity_x,\ OnlineBackup_x,DeviceProtection_x,TechSupport_x,tenure_x,MonthlyCharges_x],axis=1)

3.2模型构建
尝试采用决策树这种经典的二分类模型作为咱们的机器学习模型。决策树的优点在于模型容易理解以及能够可视化,更能了解哪些特征对输出结果影响较大。但是缺点也十分明显,就是容易过拟合,泛化性能差。

#数据导入
import pandas as pd
import numpy as np
data_frame=pd.read_excel("Save_X.xlsx")
X=np.array(data_frame.values[:,1:])
data_frame2=pd.read_excel("Save_y.xlsx")
y=np.array(data_frame2.values[:,1])
#模型训练
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
x_train, x_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
tree = DecisionTreeClassifier(max_depth=6,random_state=0)
tree.fit(x_train,y_train)
print("training set score:{:.3f}".format(tree.score(x_train, y_train)))
print("test set score:{:.3f}".format(tree.score(x_test, y_test)))
print("Feature importances : \n{}".format(tree.feature_importances_))

我将处理过的特征存储到excel表中,建模的时候重新读取进来。利用sklearn库的DecisionTreeClassifier模型进行建模以及训练,树的深度设置为6,得到训练集的拟合优度为0.805,测试集的拟合优度为0.798,说明当前输入特征对模型目标的解释性较强,预测效果较好。

3.3结果可视化与结论
进一步获取各输入特征在预测模型中的重要性指数,进行可视化展示如下图所示:

扫描二维码关注公众号,回复: 11008932 查看本文章
#特征重要性可视化
import matplotlib.pyplot as plt
def plot_feature_importance(model):
    n_features = data_frame.shape[1]
    plt.barh(range(n_features-1),model.feature_importances_,align='center')
    plt.yticks(range(n_features-1),data_frame.columns[1:])
    plt.xlabel('Features importance')
    plt.ylabel('feature')
plot_feature_importance(tree)
plt.show()

在这里插入图片描述
对于模型决策影响较大的指标包括:合同期限是否为‘month to month’,顾客是否为光纤网络的使用者,顾客已使用的年限是否小于4个月,顾客是否使用电子支票作为支付方式等。它们都能较好的反映流失客户与非流失客户的区别,从而使模型做出正确的分类。我们也可以将决策树可视化,进一步了解模型的决策过程:

#决策树可视化
from sklearn.tree import export_graphviz
export_graphviz(tree,out_file='te_tree.dot',class_names=['Churn_no','Churn_yes'],feature_names=data_frame.columns[1:],impurity=False,filled=True)

import graphviz
with open("te_tree.dot") as f:
    dot_graph=f.read()
graph=graphviz.Source(dot_graph)
graph.render("tree")

由于决策树过大,我们仅展示局部子树,看看从这些子树的决策过程中,我们可以得到哪些结论:
在这里插入图片描述
第一颗子树从是否为网络服务使用者这一分类特征的用户群体发展而来。其中红色系格子和白色格子代表非流失客户,蓝色系格子代表流失客户。可以明显发现,网络服务的使用者更有可能成为流失客户,除非其不是老年人且申请了网络安全这一附加服务;而非网络服务的使用者则不太可能成为流失客户,除非其是老年人且支付方式为电子支票的用户。基于上述分析,给出一个运营建议:
1)当年轻用户为网络服务的使用者时,可以给他推荐网络安全方面的附加服务,防止其因基础网络问题而成为流失客户。

在这里插入图片描述
第二颗子树从使用年限是否为4个月到14个月这一分类特征的用户群体发展而来。同样的红色系格子和白色格子代表非流失客户,蓝色系格子代表流失客户。当使用年限在4个月到14个月这段期间的客户,更有可能成为流失客户,除非月消费达到58.92元到79.15元这个区间;另外,使用年限是在14个月到29个月之间的客户同样容易流失。基于上述分析,给出一个运营建议:
2)对于使用年限小于29个月的客户,他们更可能发生流失的事件,需要对他们持续投入挽留的运营策略。

在这里插入图片描述
第三颗子树从是否为网络安全服务用户这一分类特征的用户群体发展而来。若一个顾客申请了网络安全服务,其更可能不会发生流失行为,除非他是一个老年人;而没有申请网络安全服务的顾客,则更有可能成为流失客户,除非其申请了技术支持的服务。基于上述分析,给出一条运营建议是:
3)老年客户群体始终是容易发生流失行为的客户,需要对其服务需求作及时的关注和了解。

最后,从整颗树的角度进行分析,还可以得到一些结论:
4)合同期限越短的用户越容易发生流失行为。因此,在电信公司开展推广工作时,应尽可能与新用户签订一个长期的合同。
5)采用光纤网络技术的用户相较于采用其他服务的用户而言,更容易发生流失行为。需关注目前该项服务存在的问题,及时给予改进。

另外,若想进一步提高模型的预测准确率,可以使用提升树等一些列的改进模型。

若你对客户终身价值这一指标感兴趣,欢迎继续浏览下一篇博文:电信客户流失数据分析(三)

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

猜你喜欢

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