精华内容
下载资源
问答
  • 数据挖掘大作业文档,对银行客户流失进行分析,随着互联⽹⾦融的异军突起,银⾏业的竞争愈加激烈,防⽌客户流失和挽留⽼客户成为各⼤银⾏ 关⼼的重要问题。本⽂⾸先根据已有数据集对各特征进⾏描述性统计分析,初步...
  • 客户流失预测:用于预测电信公司客户流失的机器学习实现
  • 此外,我们将使用流行的Python库(例如Tensorflow,Keras)和机器学习技术(例如Adam Optimizer)来训练ANN模型并预测客户流失率。 数据:客户数据存储在: 论文:ANN案例研究论文: 研究论文 代码:Artificial_...
  • 对于公司来说,要想实现持续发展,准确预测客户流失至关重要。 先前的研究已经使用许多机器学习方法来预测客户流失。 通用模型无法充分利用时间序列功能。 为了克服这个缺点,我们提出了一个基于LSTM和CNN的模型,该...
  • 客户流失问题非常严重,从近5年的统计数字来看,三家运营商的移动客户数增长缓慢,中国联通在2015年甚至出现了负增长。因此建立一套系统的客户流失预警体系已是燃眉之急。案例原文详见某移动通讯公司客户流失预警...
  • 机器学习分类模型可预测银行的客户流失。 嗨,访客们! 我是数据科学的新手,但我正在通过使用在线可用数据集将所有学习实践付诸实践。 我已经使用Python生成了机器学习分类模型! 我仍在学习,随着我学到更多,我...
  • 信用卡客户流失与数据可视化分析
  • 橙色电信的客户流失数据集将用于开发预测模型,该数据集由清除的客户活动数据(功能)以及指定客户是否取消订阅的客户流失标签组成。这里提供了两个数据集:可以下载churn-80和churn-20数据集。 telecom_churn.csv
  • 随机森林预测宽带客户流失.ipynb
  • 电信行业客户流失数据,用于数据挖掘R中的实例文件数据
  • Churn-Prediction-of-Bank-Customers:预测银行客户流失
  • Python应用实战代码-Python 银行信用卡客户流失预测(kaggle)
  • 对银行客户数据进行数据分析,以预测客户流失的原因,并提供防止这种情况的建议。 数据集:Churn_Modelling.csv 记录数:10,000 功能数量:14 使用的图书馆:pandas,matplotlib,numpy,seaborn
  • 针对电信领域客户流失的问题,提出了改进聚类的客户流失预测模型。根据通信行业中实际客户流失数据的正负样本数量不平衡而且数据量特别大的特点,提出带有不同权重参数的改进聚类算法,并将其用于电信行业的客户流失...
  • 电信客户流失 重点客户保留计划 WA_Fn-UseC_-Telco-Customer-Churn.csv
  • 本文讨论了 2019 年第二季度电信行业的客户流失分析。 机器学习是数据挖掘的高级发展,用于从大量数据中提取特征。 论文讨论了监督机器学习模型。 通过支持向量机(SVM)分类步骤设计的监督模型,用于将流失客户和...
  • 客户流失率是评估不断增长的业务的最重要指标之一。 虽然这不是最幸福的衡量标准,但它可以使您的公司了解保留客户的事实。 Heroku应用程序My Heroku应用程序: : 生存分析 生存分析是统计的一个分支,用于分析直到...
  • 为了提高铁路零散白货客户流失预测的准确性和高效性,根据铁路零散白货客户的流失特征,提出了基于CDL模型的客户流失识别方法;在此基础上,针对数据量大的问题,提出了基于Hadoop并行框架的C4.5决策树客户流失预测...
  • 许多公司经历了不同的技术,这些技术可以预测客户流失率并帮助设计有效的客户保留计划,因为获取新客户的成本远高于保留现有客户的成本。 在本文中,已使用三种机器学习算法通过两个基准数据集IBM Watson数据集来...
  • 这是在银行中基于客户流失预测的随机森林分类器的一种简单而现实的问题解决方案。 该模型采用经过预处理的数据集,并在训练集上进行训练,然后在测试数据集上进行预测,准确度约为85%。 对于一家银行来说,与特定...
  • 使用人工神经网络的客户流失预测 问题陈述 任务是预测某个客户是否会放弃公司。 也就是说,要预测“客户流失”属性。 通常,为每个客户国家/地区提供的信息帐户长度区号电话国际计划VMail计划VMail消息日间日间通话...
  • 电信客户流失分析

    2021-07-03 11:37:32
    分析目的 现如今,在电信行业蓬勃发展的同时,电信...因此,本文选取了Kaggle中一个现实世界里的电信公司的客户流失数据,用其来探究电信客户流失背后的主要原因,并建立客户流失预警模型,帮助电信公司为优化业务、

    1.分析目的

    现如今,在电信行业蓬勃发展的同时,电信市场也趋于饱和,获取一个新客户的难度要远远高于维系一个老客户的难度,而老客户的流失意味着收益的流失和市场占有率的下降。可以说,电信运营商的竞争就是针对客户资源的竞争。然而,客户流失从来都是无法避免的,客户流失的原因也不尽相同。若想做到客户流失前预防、流失后召回,就必须通过数据分析和建模来总结经验、预测未来。因此,本文选取了Kaggle中一个现实世界里的电信公司的客户流失数据,用其来探究电信客户流失背后的主要原因,并建立客户流失预警模型,帮助电信公司为优化业务、提高客户留存、减少流失制定策略。无论是互联网行业还是传统行业,所有产品都需要关注用户流失,用户流失原因的拆解思路也都大致相同。因此,本文的探究思路是比较具有现实的推广意义的。

    2.分析思路

    首先,将数据集中的标签属性划分为不同的维度。在每一个维度下,通过数据处理和数据可视化的手段,逐个探究各个因素与客户流失率之间是否具备相关性。

    其次,处理数据并建模。通过手工筛选方式对数据做特征工程处理,然后选取逻辑回归模型、随机森林模型建立电信客户流失预警机制。

    最后,结合以上分析结果,分别从业务角度和用户角度为电信公司加强客户黏性、减少客户流失提出一些可供落地的建议。

    3.探索数据集

    3.1去除重复值

    每条数据记录代表一位客户,使用字段customerID对数据进行去重

    #保证数据完整性先备份数据
    data_cleaner = data.copy()
    
    #重复值处理
    data_cleaner = data_cleaner.drop_duplicates(['customerID'])
    print('去重前的数据形状为:{},去重后的数据形状为{}'.format(data.shape,data_cleaner.shape))
    
    去重前的数据形状为:(7043, 21),去重后的数据形状为(7043, 21)
    

    可见在本数据集中,没有重复值

    3.2变量类型转换

    TotalCharges为总计缴费,应转变为数值变量

    TotalCharges存在11个空字段,无法直接转化为浮点数类型,将空字段填充为np.nan进行处理

    data_cleaner['TotalCharges'] = data_cleaner['TotalCharges'].replace(' ',np.nan).astype(float)
    

    3.3缺失值处理

    TotalCharges 字段是客户的总计缴费,总计缴费=留存月数(tenure)×月度缴费(MonthlyCharges)

    data_cleaner['TotalCharges'].fillna(data_cleaner['tenure']*data_cleaner['MonthlyCharges']
                                        ,inplace=True)
    

    3.4异常值处理

    本数据集的数据主要有两种类型,一种是以str类型为主的离散型数据,二是以int,float为主的连续型数值数据。

    # 离散型数据
    for i in data_cleaner.select_dtypes(include='object'):
        print('\n','-'*20,i,'的值有')
        print(data_cleaner[i].value_counts())
    

    观察离散数据的分布情况,没有明显的异常值,各值均正常。

    绘制连续型数值MonthlyChargesTotalCharges 的箱型图与分布图,观察是否有异常值

    月度收费年度收费

    由上图可知,字段MonthlyChargesTotalCharges不存在异常值情况。

    4.流失率的影响因素分析

    4.1客户个人特征属性

    客户的个人特征属性包括Gender(性别)、SeniorCitizen(是否为老年人)、Partner(是否有配偶)、Dependents(是否有子女)。

    4.1.1 性别维度

    总体样本中,女性与男性客户比例接近1:1,女性客户3488人,占比49.52%;男性客户3555人,占比50.48%

    男女人数比例男女流失人数占比
    性别gender_loss

    将客户以性别分群,从上述环形图可知,该电信业务的男性客户稍多一些,但男女占比基本为1:1;客户流失方面,男女比例也基本持平,男女客户流失情况大致相同

    男女流失率

    作图并计算流失率,男性客户流失率在26.2%,女性客户流失率在26.9%,二者相差无几。因此可以断定,客户的性别与其是否流失并无直接联系。

    4.1.2 年龄维度

    将客户以是否为老年人进行分群,从客户体量来说,客户群体偏向年轻化,老年客户只占到所有客户的16.21%,仅为1142人;非老年人占83.79%,有5901人。非老年人与老年人用户占比接近5.2:1。老年人是样本中的小群体,大部分客户是非老年人

    年龄维度

    再用流失率对两组客户进行细分,作图并计算流失率,发现老年客户的流失率在41.68%,而非老年客户的流失率在23.61%。可以认为,客户的年龄与其是否流失有直接联系,老年人群相对于非老年人群更容易流失。

    年龄维度流失占比年龄维度流失率
    老年人-流失

    探究造成老年客户高流失率的原因。根据现实经验,老年人比较容易在电子产品上出现使用困难,尤其是在使用网络服务的时候。因此提取出老年客户的主要业务开通情况数据(包括电话业务、互联网业务以及技术支持服务)

    Phone Service服务中的老年人订购情况流失率
    电话业务老年人比例电话业务中的老年人流失
    Internet Service服务中的老年人订购情况流失率
    电信服务老年人电信老年人流失

    由上图可知,90%以上的老年客户都开通了电话业务和互联网业务,其中互联网业务的覆盖率更是达到了95%以上。

    从电话业务上看,无论是否开通此项业务,老年客户的流失率都是比较高的,均达到了40%+,猜测可能是老年客户的需求还没有被完全满足,具体是什么需求可以通过问卷、走访等形式进行调研。此外也不排除是由于死亡等不可抗力因素导致的流失。

    然而,开通了互联网服务的老年客户的流失率却相当高,达到了43.21%,几乎是未开通这项服务的老年客户的流失率的5倍。这个数据在一定程度上验证了上文的猜想,老年客户确实存在上网困难的问题,这最终导致了他们的流失。另一方面,也可能是互联网业务本身存在一定的问题,比如网络不稳定或者价格与服务质量不相匹配等等。在后文会对此展开讨论。

    对于使用上存在的问题,可以通过开通技术支持服务这项附加服务来解决。观察老年客户开通技术支持服务的情况。

    Tech Support服务中的老年人订购情况流失率
    技术支持人数技术支持流失

    大多数老年客户都开通了技术支持服务。通过计算发现,没有开通技术支持服务的老年客户的流失率在48.19%,而开通了技术支持服务的老年客户的流失率仅在19.62%。可以认为,开通技术支持服务能够有效缓解老年客户的流失情况。

    4.1.3 亲属维度

    DependentsDep_lossDep_loss_rate
    有无子女image-20210703000333046有无子女流失率
    PartnerPar_lossPar_loss_rate
    已婚未婚已婚未婚流失人数已婚未婚流失率

    从图上可以发现,无配偶、无子女客户的流失率更高。

    根据现实经验,有配偶或子女的人群在日常生活中使用手机的时长更长,他们更倾向于长期固定使用一个电话号码,而不是频繁更换移动运营商,因此他们流失率也相对较低。

    将是否有配偶和是否有子女两列合并为是否有亲属列(有配偶或有子女),画出是否有亲属与在网时长、月租费、总费用之间的箱线图。

    xiangxiangtuqinshu

    上图呈现出的结果与经验相符,有亲属客户的在网时长集中在20-60个月之间,而大多数无亲属客户的在网时长不到40个月。两类客户的月租费分布比较相似,有亲属客户的月租费整体相对高一些。然而总费用就呈现出显著的差异。有亲属客户的总费用集中在800-5000元之间,而无亲属客户的总费用集中在200-2400元之间。

    从上图还可以观察到,一些客户虽然无配偶或子女,但他们已经成长为超级忠诚客户,在网时长、月租费和总费用都相当高。此外,上图也证明了,在网时长和总费用之间呈现出显著的正相关关系。

    4.1.4 小结

    • 性别与是否流失无关;年龄和亲属关系与是否流失有关。
    • 老年客户的流失率更高,造成这种高流失率的原因可能是老年客户存在上网困难问题,而开通技术支持服务可以在一定程度上减少流失,也可能是互联网业务本身存在一定问题,更有可能是两者的共同作用
    • 有亲属(即有配偶或子女)的客户流失率较低,相比无亲属的客户,他们的平均在网时长更长,月租费和总费用都要更高

    4.2电信业务服务属性

    包括PhoneService(电话业务)、InternetService(互联网业务)、MultipleLines(多线业务)、OnlineSecurity(在线安全业务)、OnlineBackup(在线备份业务)、DeviceProtection(设备保护业务)、TechSupport(技术支持业务)、StreamingTV(网络电视)、StreamingMovies(网络电影)

    4.2.1电话业务

    PhoneServicePh_lossPh_loss_rate
    image-20210703103202562image-20210703103139194image-20210703102958185

    90%以上的客户都开通了电话业务。开通了电话业务的客户流失率为26.71%,未开通电话业务的客户流失率为24.93%,二者差异不大。这说明从业务角度看,电话服务并不是导致流失的原因之一

    4.2.2互联网业务

    InternetServiceIn_lossIn_loss_rate
    image-20210703105256661image-20210703105244326image-20210703105203063

    约有78%的客户开通了互联网服务,其中使用Fiber optic的客户占比较高,但其流失率也相当高,超过40%,差不多是DSL客户流失率的两倍。

    根据现实经验,Fiber optic属于光纤,网速快且稳定,使用体验比DSL更好。 然而它却带来了相当惊人的客户流失率,因此可以断定Fiber optic存在一定的问题,必须尽快改进以提升这项业务的质量。

    image-20210703105502762

    画出DSL和Fiber optic与月租费之间的箱型图,不难看出,开通了Fiber optic的客户的月租费几乎是开通DSL客户的月租费的两倍。很明显,高费用的Fiber optic并没有给客户带来相匹配的使用体验,优化该项业务迫在眉睫。

    4.2.3附加业务

    Multiple Linesloss_numberloss_rate
    image-20210703105821848image-20210703105945514image-20210703110035518
    OnlineSecurityloss_numberloss_rate
    image-20210703110240748image-20210703110427613image-20210703110438667
    OnlineBackuploss_numberloss_rate
    image-20210703110630699image-20210703110614660image-20210703110543301
    DeviceProtectionloss_numberloss_rate
    image-20210703110748678image-20210703110803975image-20210703110820604
    TechSupportloss_numberloss_rate
    image-20210703110951186image-20210703110921666image-20210703110936880
    StreamingTVloss_numberloss_rate
    image-20210703111235602image-20210703111323654image-20210703111258261
    StreamingMoviesloss_numberloss_rate
    image-20210703111538868image-20210703111503800image-20210703111522810

    从环形图来看,基本上每一项附加业务的开通客户数都在总体的30%左右,多线业务的开通人数比较多,在40%左右。而开通了在线安全、在线备份、设备保护和技术支持这四项附加业务的客户的流失率都比较低。

    其中,未开通在线安全服务或技术支持服务的客户的流失率大概是已开通客户的流失率的两倍,说明这两项附加业务的开通确实可以显著地减少客户流失。

    此外,涉及互联网服务支持的网络电视、电影业务的流失率相对较高,又一次印证了公司的基础互联网服务的确存在着比较大的问题。

    4.2.4小结

    • 从公司的两项主要业务来看,目前基础的互联网服务存在着比较大的问题。这之中使用Fiber optic的客户最多,但其带来的流失率也高得惊人。这可能是因为高额月费并没有给客户带来高质量的体验,因此优化业务迫在眉睫。依托互联网服务的网络电视和网络电影业务上的高流失率也证明了这一点
    • 虽然公司的基础网络业务确实有一定问题,但是通过多项附加业务的补充,该问题带来的流失率可以被有效降低。其中,应当将在线安全服务和技术支持服务作为推荐给客户的附加业务的优先级

    4.3客户消费属性

    包括PaperlessBilling(账单形式)、PaymentMethod(支付方式)、Contract(合同签订方式)、tenure(在网时长)、MonthlyCharges(月租费)、TotalCharges(总费用)。

    4.3.1账单形式

    PaperlessBillingloss_numberloss_rate
    image-20210703152924939image-20210703153014023image-20210703152954208

    PaperlessBilling中,yes代表电子计费,No代表纸质化计费。从上图中可以得知,使用电子账单服务的客户流失率更高。这可能是因为,电子账单比较容易被忽视,带给客户的体验不佳

    4.3.2支付方式

    PaymentMethodloss_numberloss_rate
    image-20210703154101859image-20210703154139536image-20210703154118664

    使用电子支票支付的客户的流失率要远远高于其他方式,这可能是因为客户更习惯于传统的支票、银行卡支付方式,对电子支付的接纳度不高。

    对比之下,使用银行或信用卡自动转账的客户的流失率最低,推测是因为无需人工操作,对于客户来说更加便捷,自动支付带来的消费惯性也会使得客户不会轻易更换运营商。因此应当引导客户采用其他三种方式进行支付,尤其是自动转账方式

    4.3.3合同签订方式

    Contractloss_numberloss_rate
    image-20210703154453324image-20210703154535157image-20210703154514469

    从环形图上可以看出,目前大多数客户仍然采用按月签订的方式;通过柱形图可以明显看到,合同签订方式对客户的流失率有较大的影响,合同期限越长,客户的流失率越低,客户的黏性也越大。按月签订合同的客户流失率非常高,达到42.71%。 当合同期限为1年时,流失率陡降至11.27%,合同期限为2年时,流失率仅有2.83%

    image-20210703155007039

    画出合同签订期限与总费用之间的环形图。可以明显看到,签订长期合同(1年或2年)的用户贡献了60%以上的收入,也再一次表明,将月租客户逐渐发展为年租客户应当成为公司的一项重要发展策略

    4.3.4在网时长

    下载

    密度曲线表明,客户的流失率随着在网时长的增加而逐渐减少,在网时间越长,说明客户黏性越大,更不容易流失。此外,在网的第20个月是客户流失与否的分水岭。在20个月之前,尤其是前3个月,客户有着较高的流失率,因此应当在入网的前三个月尽可能让新客户感受到业务的价值所在。而在第20个月以后,客户的流失率越来越低,此时公司已经拥有了稳定的客户群。

    image-20210703162037965

    从以上箱型图也可以看出,在网时间越长的客户,流失的可能性越低。 大多数未流失客户的在网时长都在16个月以上。客户的在网时长超过30个月的,其流失的可能性则比较小

    还能观察到,有个别在网时间很长的客户也已经流失,这反映出公司对忠诚客户的关怀不足。

    这里将在网时长作为整个客户生命。根据描述性统计,所有客户的平均生命周期大约为32个月,大多数客户的生命周期集中在8-56个月之间。画出所有客户的生命周期直方图

    image-20210703162316946

    这是双峰趋势图。可以观察到,大量客户的生命周期集中在1-3个月。再一次证明,应当在前3个月尽量引导客户进行消费。此外,高质量的客户集中在67个月之后,他们属于忠诚用户。

    4.3.5月度与年度费用

    image-20210703162730120

    画出月租费的区间分布直方图。从图上可以直观地看到所有客户的月租费分布情况,以及每个费用区间的客户流失情况。显然,月租费在70-100元内的客户更容易流失。画出月租费在这一区间的客户流失率柱形图

    image-20210703163053498

    计算得到,月租费在70-80元的客户流失率为39.82%,80-90元的客户流失率为36.12%,90-100元的客户流失率为37.80%。对于这部分客户,可以通过调研形式询问流失原因,若是由于月费价格高昂,则可以通过优惠券或减免形式对这一区间的在网客户进行补贴,以降低流失率

    image-20210703163406996 image-20210703163259203

    同样画出总费用的区间分布直方图,可以看到,流失率随着总费用的增长而不断降低,低消费人群更容易流失,总费用在2000元以内的客户的流失率最高,达到31.98%。这再一次证明,引导客户提高消费额度、延长客户合同存续期是提高客户留存、减少流失的不二之选。

    4.3.6小结

    • 客户的消费行为背后隐藏着他们的消费偏好,通过数据发现,客户更习惯纸质的账单形式和自动转账的支付方式,而使用电子账单和电子支付的客户的流失率则比较高
    • 客户在网时间越长,总费用越高,流失率越低,客户黏性越大。月租费在70-100元间的客户、总费用低于2000元的客户更容易流失。易流失客户的生命周期通常为1-3个月,而生命周期达到67个月的则为高度忠诚用户,对这两种客户应当采取不同的留存和维系策略
    • 延长客户的合同期限,推动客户从月签转向年签,引导客户提高消费额度,是提高留存的重要策略

    5.流失预警模型构建

    5.1 特征工程

    根据上述分析,本文选取了以下17个与流失率较为相关的特征

    df = data.loc[:,['SeniorCitizen','Partner','Dependents','tenure','PaperlessBilling','Contract','PaymentMethod'
                     ,'InternetService','OnlineSecurity','OnlineBackup','DeviceProtection','StreamingTV','StreamingMovies'
                     ,'TechSupport','MonthlyCharges','TotalCharges','Churn']]
    

    创造新特征Families

    df['P_trans'] = df['Partner'].map({'Yes':1,'No':0})
    df['D_trans'] = df['Dependents'].map({'Yes':1,'No':0})
    df['F_trans'] = df['P_trans'] + df['D_trans']
    df['Families'] = df['F_trans'].apply(lambda x: 0 if x==0 else 1)
    

    对分类型变量进行0-1编码处理

    columns = ['PaperlessBilling','OnlineSecurity','OnlineBackup','DeviceProtection'
              ,'TechSupport','StreamingTV','StreamingMovies','']
    for i in columns:
        df[i] = df[i].apply(lambda x:1 if x=='Yes' else 0)
    

    对标签进行编码处理

    from sklearn.preprocessing import LabelEncoder
    df['Churn'] = LabelEncoder().fit_transform(df['Churn'])
    

    对连续性变量进行分箱处理

    from sklearn.preprocessing import OrdinalEncoder
    for i in ['tenure','MonthlyCharges','TotalCharges']:
        df[i] = pd.cut(df[i],bins=10,right=False)
        df[i] = df[i].astype(str)
        df[i] = OrdinalEncoder().fit_transform(df[i][:,np.newaxis])
    

    删除相关虚拟变量,减少多重共线性

    df = df.drop(columns=['Contract_Month-to-month','PaymentMethod_Mailed check','InternetService_No','Partner'
    		    ,'Dependents','P_trans','D_trans','F_trans'])
    

    5.2 模型构建

    划分测试集与训练集

    x = df.drop(columns=['Churn'])
    y = df['Churn']
    from sklearn.model_selection import train_test_split
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,train_size=0.8,random_state=0)
    

    使用逻辑回归进行建模

    from sklearn.linear_model import LogisticRegression
    lr = LogisticRegression().fit(xtrain,ytrain)
    y_prod = lr.predict_proba(xtest)[:,1]
    y_predict = lr.predict(xtest)
    

    查看score与auc值

    from sklearn.metrics import roc_curve,auc,accuracy_score
    fpr_lr,tpr_lr,threshold_lr = roc_curve(ytest,y_prod)
    auc_lr = auc(fpr_lr,tpr_lr)
    score_lr = accuracy_score(ytest,y_predict)
    print('准确率为{0},AUC值为{1}'.format(score_lr,auc_lr))
    
    准确率为0.7856635911994322,AUC值为0.8160918640103579
    

    通过建立流失预警模型,可以提前预判哪些客户存在流失风险,并及时采取措施对这些客户进行挽留。相比流失后召回,流失预警的成本低、召回难度也相对小。

    6.结论与建议

    1.根据客户个人属性分群制定策略
    从数据来看,老年客户很可能因为在手机服务使用上存在一定困难而流失,而技术支持这项附加业务则可以有效改善这种状况,因此可以向老年客户推出包含电话、互联网和技术支持业务的温暖套餐,承诺定期线上回访。此外,还可以开通老年客户电信服务专线,将“送温暖”服务理念深入人心,进一步拉近与老年客户群之间的距离,提高留存率,也有利于吸纳更多的老年客户。

    对于有亲属的客户,可以推出包含主要业务和所有附加业务的家庭年费套餐,给予一定的折扣优惠或者免费赠送三个月的影视会员,针对网络电视和电影服务,承诺在合同期限内提供免费的技术升级。也可以开发仅限配偶和子女之间的“亲人圈”业务,合同以年计,同城的亲属之间通话免费,以此作为“亲人圈”的卖点,吸引客户的亲属入网。

    针对地点变动比较频繁的客户,推出“全国通”电话和流量套餐,力求减少这种不必要的流失。

    2.设立客户忠诚计划,引入积分和会员体系
    引入积分制度,建立积分商城。客户的任意电信消费都可以等额地兑换成积分,积累到地一定额度即可在积分商城内兑换虚拟或实物礼品,商城内也可以设置轮盘抽奖活动,增加趣味性、积分每年年底清零,公司也要定期向客户发送短信提醒其完成积分兑换。

    建立会员体系,进行差异化的运营和管理。客户连续使用本公司电信服务达到三个月即自动入会,成为普通会员。再根据总消费金额向上划分会员等级,例如铂金、黄金、钻石会员等等。同时要为不同等级的会员,配置不同层次的权益。比如专属客服、积分翻倍、赠送节日礼包、纪念品等等。

    3.吸纳新客户,维系老客户,召回流失客户

    • 新客策略
      根据图表分析,新客户在入网的前三个月最容易流失,而在短时间内留存客户的最有效手段就是让客户迅速感受并认同业务的价值。通过分析发现,电信附加业务可以在一定程度上弥补基础业务的不足。
      因此,对于新客户,除了入网即赠送消费券、给予折扣等常规促销手段,还可以开展附加业务首月免费体验活动。让新客户通过体验增值服务,感受到本公司电信业务的便捷、快捷与安全性。另外可以规定,新客户签订的合同期限越长,其获得的折扣和福利也会越多。因为比起说服老用户转变月签方式,培养新的长约客户显然来得更加高效。
      此外,开展老带新活动也是吸纳新客户的重要手段。经老客户推荐来的新客可以享受折上折,新客入网后老客即可获得积分,且拉新人数越多,积分越多。
    • 老客策略
      根据前文分析,在网时长超过20个月即可视为忠诚客户。对于忠诚客户,要定期维系和关怀,比如向客户发送生日短信、节日礼等等,忠诚客户的个性化需求也要满足。此外,也要定期对忠诚客户进行线上和线下回访,开展客户满意度调研,在优化当前业务的同时,发掘新的业务需求点。
    • 流失客户策略
      对于普通流失客户,可以通过批量发送短信或邮件的方式召回,内容中注明重新入网可享受的折扣优惠以及优惠的时限。
      对于高价值流失客户,可以通过电话回访、赠送伴手礼的方式进行召回。此外,也可以通过举办优惠活动大面积召回流失客户。

    4.提高业务服务质量,精准定位客户需求
    从客户的消费行为数据来看,多数客户尚未习惯使用电子支付,他们更倾向于传统的纸质账单形式和支票、银行卡的付款方式。因此要大力推荐并引导新老客户使用这两种方式,进而延长客户的存续期。

    从电信业务数据来看,目前互联网业务尤其是光纤方面仍然存在缺陷,对其进行技术改造和升级迫在眉睫。

    此外,开通在线安全、在线备份等附加业务对流失率的有效降低反映出客户对安全、便捷的业务的日益增长的需求。但在目前来说,开通附加业务的客户数量还比较少,因此要向客户大力宣传推广这些业务,唤醒他们的需求意识。

    展开全文
  • 基于神经元网络的客户流失数据挖掘预测模型.pdf
  • 客户损失 客户流失预测 给定用户最近30天的登录时间,请预测下个月是否将进行一次登录。 使用了numpy和sklearn。
  • Customer_Churn_PySpark 根据客户使用的电信服务预测客户流失
  • 针对高维混合数据,基于模糊粗糙集,在CEBARKNC算法的基础上,改进属性重要性的计算及约简的选取条件,进行特征选择,降低了数据维度,提高了效率,并将其应用于客户流失预测实例中.结果表明:改进的CEBARKNC算法得出的数据...
  • 基于数据挖掘的掌银客户流失预测建模方法研究.pdf
  • 研究表明,发展新用户所花费的宣传、促销等成本显然高于维持老用户的成本,因此,做好"客户流失预警"可以有效降低营销成本,做到精准营销。 如今,随着运营商的竞争不断加剧,电信运营商亟需提高用户留存率、增加...

    1 引言

    近年来,各行各业往往都会不可避免地面临用户流失的问题。研究表明,发展新用户所花费的宣传、促销等成本显然高于维持老用户的成本,因此,做好"客户流失预警"可以有效降低营销成本,做到精准营销。
    如今,随着运营商的竞争不断加剧,电信运营商亟需提高用户留存率、增加用户黏性,减少客户流失。因此,需要对电信客户进行流失分析与预测,发掘客户流失的原因,进而改善自身业务,提高用户的满意度,延长用户生命周期。

    2 数据来源与数据概况

    2.1 数据来源

    数据来源kaggle电信用户流失数据集。
    https://www.kaggle.com/blastchar/telco-customer-churn

    2.2 数据概况

    电信客户流失数据集描述了电信用户是否流失以及其相关信息,共包含7043条记录,21个字段。 读入数据集后,了解数据集的基本信息。

    > telco.data <- read.csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
    > # 展示数据集的前六行数据
    > head(telco.data)
    
      customerID gender SeniorCitizen Partner Dependents tenure PhoneService
    1 7590-VHVEG Female             0     Yes         No      1           No
    2 5575-GNVDE   Male             0      No         No     34          Yes
    3 3668-QPYBK   Male             0      No         No      2          Yes
    4 7795-CFOCW   Male             0      No         No     45           No
    5 9237-HQITU Female             0      No         No      2          Yes
    6 9305-CDSKC Female             0      No         No      8          Yes
         MultipleLines InternetService OnlineSecurity OnlineBackup DeviceProtection
    1 No phone service             DSL             No          Yes               No
    2               No             DSL            Yes           No              Yes
    3               No             DSL            Yes          Yes               No
    4 No phone service             DSL            Yes           No              Yes
    5               No     Fiber optic             No           No               No
    6              Yes     Fiber optic             No           No              Yes
      TechSupport StreamingTV StreamingMovies       Contract PaperlessBilling
    1          No          No              No Month-to-month              Yes
    2          No          No              No       One year               No
    3          No          No              No Month-to-month              Yes
    4         Yes          No              No       One year               No
    5          No          No              No Month-to-month              Yes
    6          No         Yes             Yes Month-to-month              Yes
                  PaymentMethod MonthlyCharges TotalCharges Churn
    1          Electronic check          29.85        29.85    No
    2              Mailed check          56.95      1889.50    No
    3              Mailed check          53.85       108.15   Yes
    4 Bank transfer (automatic)          42.30      1840.75    No
    5          Electronic check          70.70       151.65   Yes
    6          Electronic check          99.65       820.50   Yes
    
    > # 数据集的维度
    > dim(telco.data)
    
    [1] 7043   21
    

    每个字段的介绍如下表所示:

    字段名字段含义字段内容
    customerID客户ID
    gender性别Female & Male
    SeniorCitizen老年用户1表示是,0表示不是
    Partner伴侣用户Yes or No
    Dependents亲属用户Yes or No
    tenure在网时长0-72月
    PhoneService是否开通电话服务服务Yes or No
    MultipleLines是否开通多线服务Yes 、No or No phoneservice 三种
    InternetService是否开通上网服务No, DSL数字网络,fiber optic光纤网络
    OnlineSecurity是否开通网络安全服务Yes,No,No internetserive
    OnlineBackup是否开通在线备份服务Yes,No,No internetserive
    DeviceProtection是否开通设备保护服务Yes,No,No internetserive
    TechSupport是否开通技术支持服务Yes,No,No internetserive
    StreamingTV是否开通网络电视Yes,No,No internetserive
    StreamingMovies是否开通网络电影Yes,No,No internetserive
    Contract签订合同方式按月,一年,两年
    PaperlessBilling是否开通电子账单Yes or No
    PaymentMethod付款方式bank transfer,credit card,electronic check,mailed check
    MonthlyCharges月租费18.85-118.35
    TotalCharges累计付费18.85-8684.8
    Churn该用户是否流失Yes or No

    3 研究问题

    1. 分析用户特征与流失的关系
    2. 流失客户普遍具有哪些特征?
    3. 尝试找到合适的模型预测流失客户。
    4. 针对性给出增加用户黏性、降低客户流失率的建议。

    4 数据预处理

    查看数据集中每个变量的类型。

    > str(telco.data)
    
    'data.frame':	7043 obs. of  21 variables:
     $ customerID      : chr  "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
     $ gender          : chr  "Female" "Male" "Male" "Male" ...
     $ SeniorCitizen   : int  0 0 0 0 0 0 0 0 0 0 ...
     $ Partner         : chr  "Yes" "No" "No" "No" ...
     $ Dependents      : chr  "No" "No" "No" "No" ...
     $ tenure          : int  1 34 2 45 2 8 22 10 28 62 ...
     $ PhoneService    : chr  "No" "Yes" "Yes" "No" ...
     $ MultipleLines   : chr  "No phone service" "No" "No" "No phone service" ...
     $ InternetService : chr  "DSL" "DSL" "DSL" "DSL" ...
     $ OnlineSecurity  : chr  "No" "Yes" "Yes" "Yes" ...
     $ OnlineBackup    : chr  "Yes" "No" "Yes" "No" ...
     $ DeviceProtection: chr  "No" "Yes" "No" "Yes" ...
     $ TechSupport     : chr  "No" "No" "No" "Yes" ...
     $ StreamingTV     : chr  "No" "No" "No" "No" ...
     $ StreamingMovies : chr  "No" "No" "No" "No" ...
     $ Contract        : chr  "Month-to-month" "One year" "Month-to-month" "One year" ...
     $ PaperlessBilling: chr  "Yes" "No" "Yes" "No" ...
     $ PaymentMethod   : chr  "Electronic check" "Mailed check" "Mailed check" "Bank transfer (automatic)" ...
     $ MonthlyCharges  : num  29.9 57 53.9 42.3 70.7 ...
     $ TotalCharges    : num  29.9 1889.5 108.2 1840.8 151.7 ...
     $ Churn           : chr  "No" "No" "Yes" "No" ...
    

    4.1 因子变量处理

    需要将该数据集中的部分变量转化为因子类型。

    > telco.data <- within(telco.data,{
    +   SeniorCitizen <- factor(SeniorCitizen, levels = c(0,1), labels = c("No", "Yes"))
    +   Partner <- factor(Partner)
    +   Dependents <- factor(Dependents)
    +                      })
    > Factors <- c("gender", "PhoneService", "MultipleLines", "InternetService", "OnlineSecurity", "OnlineBackup", "DeviceProtection", "TechSupport", "StreamingTV", "StreamingMovies", "Contract", "PaperlessBilling", "PaymentMethod", "Churn")
    > telco.data[Factors] <- lapply(telco.data[Factors],factor)
    

    4.2 缺失值处理

    从图中可以看出,TotalCharges列有11个缺失值,占比大约0.16%。

    > colSums(is.na(telco.data))
    
          customerID           gender    SeniorCitizen          Partner 
                   0                0                0                0 
          Dependents           tenure     PhoneService    MultipleLines 
                   0                0                0                0 
     InternetService   OnlineSecurity     OnlineBackup DeviceProtection 
                   0                0                0                0 
         TechSupport      StreamingTV  StreamingMovies         Contract 
                   0                0                0                0 
    PaperlessBilling    PaymentMethod   MonthlyCharges     TotalCharges 
                   0                0                0               11 
               Churn 
                   0 
    
    > library(VIM)
    > par(cex = 0.72, font.axis = 3)
    > VIM::aggr(telco.data, prop = TRUE, numbers = TRUE)
    

    在这里插入图片描述

    处理缺失值数据的一种方法是插补均值、中位数或者众数。
    从直方图可知,TotalCharges数据呈偏态分布。根据正态分布选均值、中位数填充,偏态分布选中位数填充的原则,选择用TotalCharges列的中位数去填充这11个缺失值。

    > hist(telco.data$TotalCharges, breaks = 50, prob = TRUE, 
    +      main = "Histogram Of TotalCharges")
    

    在这里插入图片描述

    > library(Hmisc)
    > # 插补中位数
    > telco.data$TotalCharges <- as.numeric(Hmisc::impute(telco.data$TotalCharges, median))
    

    4.3 简化分类变量的属性值

    OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies这六个变量的属性值有Yes、No、No internet serive 三种。

    通过分析这六个变量和Churn生成的二维列联表,不难发现"No internetserive"出现 的频数是一致的,可以认为该属性值不影响客户流失率,所以简化属性值,将其并入"No"这一属性值。

    > for(i in 10:15)
    + {
    +   print(xtabs(~ Churn + get(names(telco.data)[i]), data = telco.data))
    + }
    

    结果如下:

         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  2037                1413 1724
      Yes 1461                 113  295
         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  1855                1413 1906
      Yes 1233                 113  523
         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  1884                1413 1877
      Yes 1211                 113  545
         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  2027                1413 1734
      Yes 1446                 113  310
         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  1868                1413 1893
      Yes  942                 113  814
         get(names(telco.data)[i])
    Churn   No No internet service  Yes
      No  1847                1413 1914
      Yes  938                 113  818
    
    > # 将“No internetserive”并入“No”这一属性值
    > levels(telco.data$OnlineSecurity)[2] <- "No"
    > levels(telco.data$OnlineBackup)[2] <- "No"
    > levels(telco.data$DeviceProtection)[2] <- "No"
    > levels(telco.data$TechSupport)[2] <- "No"
    > levels(telco.data$StreamingTV)[2] <- "No"
    > levels(telco.data$StreamingMovies)[2] <- "No"
    

    4.4 处理"量纲差异大"

    目前属于这类特征的变量有:MonthlyCharges和TotalCharges。我打算采用连续特征离散化的处理方式。原因是离散化后的特征对异常数据有更强的鲁棒性,降低过拟合的风险,模型会更稳定,预测的效果也会更好。

    数据离散化也称为分箱操作,其方法分为有监督分箱(卡方分箱、最小熵法分箱)和无监督分箱(等频分箱、等距分箱)。 本次为采用无监督分箱中的等频分箱进行操作。

    > library(Hmisc)
    > describe(telco.data[c("MonthlyCharges","TotalCharges")])
    
    telco.data[c("MonthlyCharges", "TotalCharges")] 
    
     2  Variables      7043  Observations
    -----------------------------------------------------------------------------------
    MonthlyCharges 
           n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
        7043        0     1585        1    64.76    34.39    19.65    20.05    35.50 
         .50      .75      .90      .95 
       70.35    89.85   102.60   107.40 
    
    lowest :  18.25  18.40  18.55  18.70  18.75, highest: 118.20 118.35 118.60 118.65 118.75
    -----------------------------------------------------------------------------------
    TotalCharges 
           n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
        7043        0     6531        1     2282     2447    49.65    84.61   402.23 
         .50      .75      .90      .95 
     1397.47  3786.60  5973.69  6921.02 
    
    lowest :   18.80   18.85   18.90   19.00   19.05, highest: 8564.75 8594.40 8670.10 8672.45 8684.80
    -----------------------------------------------------------------------------------
    
    > #根据描述性统计量将变量按0.25,0.5,0.75分位数分成4份
    > c_u_t <- function(x, n = 1) {
    +   result <- quantile(x, probs = seq(0, 1, 1/n))
    +   result[1] <- result[1]-0.001
    +   return(result)
    + }
    > telco.data <- transform(telco.data,
    +                         MonthlyCharges_c = cut(telco.data$MonthlyCharges,
    +                         breaks =c_u_t(telco.data$MonthlyCharges, n=4),
    +                         labels = c(1,2,3,4)),
    +                         TotalCharges_c = cut(telco.data$TotalCharges,
    +                         breaks = c_u_t(telco.data$TotalCharges, n=4),
    +                         labels = c(1,2,3,4)))
    > telco.data <- within(telco.data, {
    +   MonthlyCharges_c <- relevel(MonthlyCharges_c, ref = 1)
    +   TotalCharges_c <- relevel(TotalCharges_c, ref = 1)
    + })
    

    5 探索性数据分析

    查看流失客户的数量和占比,由图可知,客户流失率约为26.54%。

    > table(telco.data$Churn)
    
    
      No  Yes 
    5174 1869 
    
    > library(ggplot2)
    > options(digits=4)
    > ggplot(telco.data, aes(x = "" ,fill = Churn))+
    +   geom_bar(stat = "count", width = 0.5, position = 'stack')+
    +   coord_polar(theta = "y", start=0)+
    +   geom_text(stat="count", 
    +             aes(label = scales::percent(..count../nrow(telco.data), 0.01)), 
    +             size=4, position=position_stack(vjust = 0.5)) +
    +   theme(
    +     panel.background = element_blank(),
    +     axis.title = element_blank(),
    +     axis.text = element_blank(),
    +     axis.ticks = element_blank()
    +   )
    

    在这里插入图片描述

    5.1 用户特征与流失的关系

    根据数据集描述,将变量划分为用户属性、服务属性、合同属性,并从这三个维度进行分析。

    用户属性

    • 人口统计指标:‘gender’,‘SeniorCitizen’,‘Partner’,‘Dependents’
    • 用户活跃度:‘tenure’

    服务属性

    • 手机服务:‘PhoneService’, ‘MultipleLines’
    • 网络服务:‘InternetService’,‘OnlineSecurity’,‘OnlineBackup’, ‘DeviceProtection’,‘TechSupport’, ‘StreamingTV’,‘StreamingMovies’

    合同属性
    ‘MonthlyCharges’,‘TotalCharges’, ‘Contract’, ‘PaperlessBilling’, ‘PaymentMethod’

    5.1.1 用户属性分析

    用户属性包括:‘gender’,‘SeniorCitizen’,‘Partner’,‘Dependents’,‘tenure’。

    从图中可以得出以下结论:

    1. 性别对客户流失并无显著影响;
    2. 老年群体相较于其他群体,客户流失率较高;
    3. 无伴侣的客户流失率高于有伴侣的客户流失率;
    4. 无亲属的客户流失率高于有亲属的客户流失率。

    说明增加关联客户数量的产品有利于增加客户的忠诚度,减小客户流失。

    > library(cowplot)
    > p1 <- ggplot(telco.data, aes(x = gender, fill = Churn)) + 
    +   geom_bar(stat = 'count',position = "dodge")
    > p2 <- ggplot(telco.data, aes(x = SeniorCitizen, fill = Churn)) + 
    +   geom_bar(stat = 'count',position = "dodge")
    > p3 <- ggplot(telco.data, aes(x = Partner, fill = Churn)) + 
    +   geom_bar(stat = 'count',position = "dodge")
    > p4 <- ggplot(telco.data, aes(x = Dependents, fill = Churn)) + 
    +   geom_bar(stat = 'count',position = "dodge")
    > cowplot::plot_grid(p1, p2, p3, p4, nrow = 2, labels = LETTERS[1:4])
    

    在这里插入图片描述

    从用户活跃度即在网时长’tenure’来看,流失客户的在网时间较短,平均为10个月,且呈左偏分布;在网时间越长,客户流失率越低。

    > ggplot(telco.data, aes(x = Churn, y = tenure)) + geom_boxplot(aes(fill = Churn))
    

    在这里插入图片描述

    > ggplot(telco.data, aes(x = tenure)) +  geom_bar(fill = "lightblue") + facet_grid(Churn ~ .)
    

    在这里插入图片描述

    5.1.2 服务属性分析

    服务属性
    手机服务:‘PhoneService’, ‘MultipleLines’
    网络服务:‘InternetService’,‘OnlineSecurity’,‘OnlineBackup’, ‘DeviceProtection’,‘TechSupport’, ‘StreamingTV’,‘StreamingMovies’

    > p <- apply(telco.data, 2, function(R){
    +   ggplot(telco.data) + aes(x = R, fill = Churn) + geom_bar(stat = 'count',position = "fill")
    + })
    > p5 <- p['PhoneService']$PhoneService + labs(x = "PhoneService") 
    > p6 <- p['MultipleLines']$MultipleLines + labs(x = "MultipleLines")
    > p7 <- p['InternetService']$InternetService + labs(x = "InternetService")
    > p8 <- p['OnlineSecurity']$OnlineSecurity + labs(x = "OnlineSecurity")
    > p9 <- p['OnlineBackup']$OnlineBackup + labs(x = "OnlineBackup")
    > p10 <- p['DeviceProtection']$DeviceProtection + labs(x = "DeviceProtection")
    > p11 <- p['TechSupport']$TechSupport + labs(x = "TechSupport")
    > p12 <- p['StreamingTV']$StreamingTV + labs(x = "StreamingTV")
    > p13 <- p['StreamingMovies']$StreamingMovies + labs(x = "StreamingMovies")
    > cowplot::plot_grid(p5, p6, p7, nrow = 2)
    

    在这里插入图片描述

    > cowplot::plot_grid(p8, p9, p10, p11, p12, p13, nrow = 2)
    

    在这里插入图片描述

    由图可知:

    1. PhoneService电话服务对客户流失率影响不大。
    2. 开通多线通话服务的客户相比其他两类客户,流失率较高,可能是因为多条通话渠道导致的费用升高而且功能过剩。
    3. 开通Fiber optic光纤服务的客户流失率远高于开通DSL数字网络的客户流失率,这说明光纤服务是导致开通网络服务的客户流失的主要原因,需要进一步调查客户对光纤服务的反馈。总体而言,开通网络服务的客户流失率偏高。
    4. 在技术性服务(OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport)中,开通的客户流失率均比整体流失率26.54%低,而未开通的则高出整体流失率不少。
    5. 在娱乐性服务(StreamingTV、StreamingMovies)中,开通的客户流失率都比未开通的高。

    5.1.3 合同属性分析

    合同属性包括:
    ‘MonthlyCharges’,‘TotalCharges’, ‘Contract’, ‘PaperlessBilling’, ‘PaymentMethod’。

    > p14 <- p['Contract']$Contract + labs(x = 'Contract') 
    > p15 <- p['PaperlessBilling']$'PaperlessBilling' + labs(x = 'PaperlessBilling')
    > p16 <- p['PaymentMethod']$PaymentMethod + labs(x = 'PaymentMethod')
    > cowplot::plot_grid(p14, p15, p16, nrow = 3)
    

    在这里插入图片描述

    由图可知:

    1. 在签订合同上,按月签约的客户流失率最高,并且签约时间越长,客户流失率越低。这说明,按月签约的客户对产品的粘性不高。
    2. 在是否开通电子账单上,选择电子账单的客户流失率高于选择纸账单的客户流失率。
    3. 在支付方式上,选择Electronic check支付方式的客户流失率最高,其他三种流失率 差别不大。可以进一步调查选择Electronic check支付方式的客户,了解流失原因。
    > ggplot(telco.data, aes(x = Churn, y = MonthlyCharges)) + geom_boxplot(aes(fill = Churn))
    

    在这里插入图片描述

    > p17 <- ggplot(telco.data, aes(x = MonthlyCharges, fill= Churn, alpha = 0.5)) +
    +   geom_density()
    > p18 <- ggplot(telco.data, aes(x = TotalCharges, fill= Churn, alpha = 0.5)) +
    +   geom_density()
    > cowplot::plot_grid(p17, p18, nrow = 2)
    

    在这里插入图片描述

    由图可知,在月租费方面,流失客户的月租费整体水平要高于非流失客户; 月租费金额大约在70-100元的客户流失率较高。

    5.2 流失客户普遍具有的特征

    从用户属性来看,老年群体、无伴侣、无亲属、在网时间小于10个月的客户流失率较高。
    从服务属性来看,开通多线通话服务、开通Fiber optic光纤服务、未开通技术性服 务(OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport)、开通娱乐性服务(StreamingTV、StreamingMovies)的客户流失率较高。
    从合同属性来看,按月签约、开通电子账单、选择Electronic check支付方式、月租 费70-100元的客户流失率较高。

    6 电信客户流失预测模型

    6.1 特征选择

    经过上文的分析,目前认为与客户流失率关联较小的变量有:gender、PhoneService,而customerID是随机数,不影响建模,故可以筛选掉。

    观察变量之间的相关性。
    首先对分类变量进行相关性分析,一般使用卡方检验。
    在分类变量和目标变量Churn的卡方检验中,gender的P值为0.49,PhoneService的p值为 0.35,其他分类变量的P值都远小于0.01,所以不能拒绝gender、PhoneService和Churn相互独立的原假设,应被筛选掉。

    > sapply(telco.data[c(-1, -6, -19, -20, -21)], function(x){
    +   ch <- chisq.test(x, telco.data$Churn, simulate.p.value = T)
    +   list(chi_v=ch$statistic, p=ch$p.value)
    + })
    
          gender SeniorCitizen Partner   Dependents PhoneService MultipleLines
    chi_v 0.5224 160.4         159.4     189.9      1.004        11.33        
    p     0.4748 0.0004998     0.0004998 0.0004998  0.3388       0.005997     
          InternetService OnlineSecurity OnlineBackup DeviceProtection TechSupport
    chi_v 732.3           206.5          47.65        30.83            191        
    p     0.0004998       0.0004998      0.0004998    0.0004998        0.0004998  
          StreamingTV StreamingMovies Contract  PaperlessBilling PaymentMethod
    chi_v 28.16       26.54           1185      259.2            648.1        
    p     0.0004998   0.0004998       0.0004998 0.0004998        0.0004998    
          MonthlyCharges_c TotalCharges_c
    chi_v 359.8            400.1         
    p     0.0004998        0.0004998     
    

    其次,观察连续变量之间的相关性。
    tenure和TotalCharges的相关性为0.83,是强相关,去掉TotalCharges保留tenure方便计算。

    > # 计算相关矩阵
    > telco.cor <- cor(telco.data[,c('tenure','MonthlyCharges','TotalCharges')]) 
    > round(telco.cor, digits = 2)
    
                   tenure MonthlyCharges TotalCharges
    tenure           1.00           0.25         0.83
    MonthlyCharges   0.25           1.00         0.65
    TotalCharges     0.83           0.65         1.00
    

    最终,customerID、gender、PhoneService和TotalCharges被筛出掉。

    > telco <- telco.data[,c(-1, -2, -7, -19, -20, -23)]
    > head(telco)
    
      SeniorCitizen Partner Dependents tenure    MultipleLines InternetService
    1            No     Yes         No      1 No phone service             DSL
    2            No      No         No     34               No             DSL
    3            No      No         No      2               No             DSL
    4            No      No         No     45 No phone service             DSL
    5            No      No         No      2               No     Fiber optic
    6            No      No         No      8              Yes     Fiber optic
      OnlineSecurity OnlineBackup DeviceProtection TechSupport StreamingTV
    1             No          Yes               No          No          No
    2            Yes           No              Yes          No          No
    3            Yes          Yes               No          No          No
    4            Yes           No              Yes         Yes          No
    5             No           No               No          No          No
    6             No           No              Yes          No         Yes
      StreamingMovies       Contract PaperlessBilling             PaymentMethod Churn
    1              No Month-to-month              Yes          Electronic check    No
    2              No       One year               No              Mailed check    No
    3              No Month-to-month              Yes              Mailed check   Yes
    4              No       One year               No Bank transfer (automatic)    No
    5              No Month-to-month              Yes          Electronic check   Yes
    6             Yes Month-to-month              Yes          Electronic check   Yes
      MonthlyCharges_c
    1                1
    2                2
    3                2
    4                2
    5                3
    6                4
    

    6.2 划分数据集

    数据集中,流失客户有1869个样本,未流失客户有5174个样本。
    按照7:3划分训练集和测试集,用于模型的训练和有效性的评估。

    > set.seed(123)
    > train <- sample(nrow(telco), 0.7*nrow(telco))
    > telco.train <- telco[train,]
    > telco.test <- telco[-train,]
    > table(telco.train$Churn)
    
      No  Yes 
    3577 1353 
    
    > table(telco.test$Churn)
    
      No  Yes 
    1597  516 
    

    6.3 构建分类器并进行模型评估

    采用决策树、随机森林、支持向量机、逻辑回归四个模型。
    观察模型的准确度、精确度、召回率、特异度、f1值,绘制ROC曲线图,计算AOC值。

    > # 定义分类器性能标准
    > library(pROC)
    > telco_prediction <- function(algorithm, prob, test = telco.test, n = 2){
    +   pred <- predict(algorithm, telco.test, type = "class")
    +   table <- table(telco.test$Churn, pred)
    +   if(!all(dim(table)==c(2,2)))
    +     stop("Must be a 2 x 2 table")
    +   tn = table[1,1]
    +   fp = table[1,2]
    +   fn = table[2,1]
    +   tp = table[2,2]
    +   accuracy = round((tn+tp)/(tn+fp+fn+tp),n)
    +   precision = round(tp/(tp+fp),n)
    +   sensitivity = round(tp/(tp+fn),n)
    +   specificity = round(tn/(tn+fp),n)
    +   f1_score = round((2*precision*sensitivity)/(precision+sensitivity),n)
    +   # 绘制ROC
    +   modelroc <- roc(telco.test$Churn, prob[,2]) 
    +   plot(modelroc, print.auc=TRUE, auc.polygon=TRUE,legacy.axes=TRUE,
    +        grid=c(0.1, 0.2), 
    +        grid.col=c("green", "red"), max.auc.polygon=TRUE,
    +        auc.polygon.col="skyblue", print.thres=TRUE)
    +   auc <- auc(modelroc)
    +   # 输出指标
    +   data.frame(accuracy, precision, sensitivity, specificity, f1_score, auc)
    + }
    

    6.3.1 决策树

    在建立决策树之后,可以打印决策树的复杂性参数cp,观察决策树的误差等数据。 cp是参数复杂度(complexity parameter)作为控制树规模的惩罚因子,cp越大, 树分裂规模(nsplit)越小。
    输出参数(rel error)指示了当前分类模型树与空树之间的平均偏差比值。
    xerror为交叉验证误差,xstd为交叉验证误差的标准差。

    可以看到,当cp为0.01的时候,交叉误差最小。
    而决策树剪枝的目的就是为了得到更小交叉误差(xerror)的树。

    > library(rpart)
    > set.seed(123)
    > dtree <- rpart(Churn~., data = telco.train, method = "class",
    +                parms = list(split="information"))
    > dtree$cptable
    
           CP nsplit rel error xerror    xstd
    1 0.06245      0    1.0000 1.0000 0.02316
    2 0.01000      3    0.7871 0.8086 0.02156
    
    > # 按3次分割对应的复杂度参数0.01剪枝
    > dtree.pruned <- prune(dtree, cp=0.01)
    > # 绘制决策树
    > library(partykit)
    > plot(as.party(dtree.pruned), main = "Decision Tree")
    

    在这里插入图片描述

    > dtree.prob <- predict(dtree.pruned, telco.test, type="prob")
    > telco_prediction(dtree.pruned, dtree.prob, telco.test, 2)
    

    在这里插入图片描述

      accuracy precision sensitivity specificity f1_score    auc
    1      0.8      0.68        0.36        0.95     0.47 0.7972
    

    6.3.2 随机森林

    随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树。随机森林是通过自助法重复抽样技术,从原始样本训练集中有放回地随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策树组成的随机森林,最后根据所有决策树的预测结果来最终确定样本的预测结果。

    randomForest()函数中的两个重要参数为ntree和mtry,其中ntree为基分类器个数,默认为500;mtry为每个决策树包含的变量个数,默认为logN,数据量不大时可以循环选择最优参数值。

    > library(randomForest)
    > set.seed(123)
    > # 选择mtry
    > err <- as.numeric()
    > for(i in 1:(length(names(telco.train)))-1){
    +   mtry_test <- randomForest(Churn~., data = telco.train, mtry=i)
    +   err <- append(err, mean(mtry_test$err.rate))
    + }
    > print(err)
    
     [1] 0.3500 0.3479 0.2722 0.2769 0.2802 0.2837 0.2783 0.2784 0.2799 0.2817 0.2812
    [12] 0.2831 0.2829 0.2849 0.2843 0.2829 0.2876
    
    > mtry <- which.min(err)
    > mtry
    
    [1] 3
    
    > # 选择ntree
    > ntree_fit <- randomForest(Churn~., data = telco.train, mtry=mtry, ntree=1000)
    > plot(ntree_fit)
    

    在这里插入图片描述

    发现,mtry取3时err最小,ntree取500时误差趋于稳定。 因此,得到最终分类器,观察模型效果。

    > set.seed(123)
    > fit.rf <- randomForest(Churn~., data = telco.train, mtry = 3,
    +                            ntree= 500)
    > rf.prob <- predict(fit.rf, telco.test, type="prob")
    > telco_prediction(fit.rf, rf.prob, telco.test, 2)
    

    在这里插入图片描述

      accuracy precision sensitivity specificity f1_score    auc
    1      0.8      0.62         0.5         0.9     0.55 0.8269
    

    6.3.3 支持向量机

    支持向量机,一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

    kernel指定建模过程中使用的核函数,目的在于解决支持向量机线性不可分问题。有四类核函数可选,即线性核函数、多项式核函数、径向基核函数(高斯核函数)和神经网络核函数。研究人员发现,识别率最高,性能最好的是径向基核函数(默认的kernel值),其次是多项式核函数,最差的是神经网络核函数。

    > library(e1071)
    > set.seed(123)
    > fit.svm <- svm(Churn~., data =telco.train, probability=TRUE)
    > pred.svm <- predict(fit.svm, telco.test, probability=TRUE)
    > svm.prob <- attr(pred.svm, "probabilities")
    > telco_prediction(fit.svm, svm.prob, telco.test, 2)
    

    在这里插入图片描述

      accuracy precision sensitivity specificity f1_score    auc
    1     0.81      0.67        0.47        0.92     0.55 0.8295
    

    6.3.4 Logistic回归分析

    数据集中自变量较多,为了使构建的Logistic回归模型比较稳定和便于解释,应尽可能地剔除对回归模型贡献程度很小的变量。
    首先在训练集上使用所有自变量建立一个模型,然后使用逐步法构建一个模型,通过F检验对两个模型进行方差分析,评估两个模型是否有显著不同。

    > full.fit <- glm(Churn~.,data = telco.train, family = binomial())
    > summary(full.fit)
    > both.fit <- step(full.fit,direction = "both")
    > summary(both.fit)
    > anova(full.fit, both.fit, test = "Chisq")
    
    Analysis of Deviance Table
    
    Model 1: Churn ~ SeniorCitizen + Partner + Dependents + tenure + MultipleLines + 
        InternetService + OnlineSecurity + OnlineBackup + DeviceProtection + 
        TechSupport + StreamingTV + StreamingMovies + Contract + 
        PaperlessBilling + PaymentMethod + MonthlyCharges_c
    Model 2: Churn ~ SeniorCitizen + Dependents + tenure + MultipleLines + 
        InternetService + OnlineSecurity + OnlineBackup + TechSupport + 
        StreamingTV + StreamingMovies + Contract + PaperlessBilling + 
        PaymentMethod
      Resid. Df Resid. Dev Df Deviance Pr(>Chi)
    1      4906       4159                     
    2      4911       4162 -5    -2.92     0.71
    

    由结果可知,两者的差距并不显著。后续利用both.fit该模型进行分析。

    使用exp(coef())函数计算优势比,优势比可以解释为特征中1个单位的变化导致的结果发生比的变化。如果系数大于1,则说明当特征的值增加时,结果的发生比会增加。反之,系数小于1就说明,当特征的值增加时,结果的发生比会减小。

    > # 查看优势比
    > exp(coef(both.fit))
    
                             (Intercept)                     SeniorCitizenYes 
                                  0.5414                               1.1781 
                           DependentsYes                               tenure 
                                  0.7990                               0.9670 
           MultipleLinesNo phone service                     MultipleLinesYes 
                                  1.5816                               1.2939 
              InternetServiceFiber optic                    InternetServiceNo 
                                  2.3627                               0.4557 
                       OnlineSecurityYes                      OnlineBackupYes 
                                  0.6831                               0.8750 
                          TechSupportYes                       StreamingTVYes 
                                  0.7126                               1.3219 
                      StreamingMoviesYes                     ContractOne year 
                                  1.3802                               0.5219 
                        ContractTwo year                  PaperlessBillingYes 
                                  0.2259                               1.4270 
    PaymentMethodCredit card (automatic)        PaymentMethodElectronic check 
                                  0.9150                               1.3394 
               PaymentMethodMailed check 
                                  0.9616 
    

    both.fit模型输出的是Churn=Yes时的概率。
    可以看到,在保持其他变量不变的情况下:

    1. 开通Fiber optic互联网服务的客户流失风险是开通DSL服务的2.4倍,而未开通互联网服务的客户流失风险是开通DSL服务的0.5倍,所以,未开通互联网服务的客服流失风险最低;
    2. 按一年签订合同的客户流失风险是按月签订合同的0.5倍,按两年签订合同的客户流失风险是按月签订合同的0.2倍,所以签订合同的期限越长,客户流失的风险越低。

    之后利用构建的模型进行预测。

    > library(pROC)
    > glm.prob <- predict.glm(both.fit, telco.test, type = "response")
    > glm.class <- ifelse(glm.prob > 0.5, "Yes", "No")
    > telco.test$predict <- glm.class
    > true.value <- telco.test[,16]
    > predict.value <- telco.test[,18]
    > # 混淆矩阵
    > table <- table(true.value,predict.value)
    > tn = table[1,1]
    > fp = table[1,2]
    > fn = table[2,1]
    > tp = table[2,2]
    > accuracy = round((tn+tp)/(tn+fp+fn+tp),2)
    > precision = round(tp/(tp+fp),2)
    > sensitivity = round(tp/(tp+fn),2)
    > specificity = round(tn/(tn+fp),2)
    > f1_score = round((2*precision*sensitivity)/(precision+sensitivity),2)
    > # 绘制ROC
    > modelroc <- roc(true.value, glm.prob) 
    
    > plot(modelroc, print.auc=TRUE, auc.polygon=TRUE,legacy.axes=TRUE,
    +      grid=c(0.1, 0.2), 
    +      grid.col=c("green", "red"), max.auc.polygon=TRUE,
    +      auc.polygon.col="skyblue", print.thres=TRUE)  
    

    在这里插入图片描述

    > auc <- auc(modelroc)
    > # 输出指标
    > data.frame(accuracy, precision, sensitivity, specificity, f1_score, auc)
    
      accuracy precision sensitivity specificity f1_score   auc
    1     0.81      0.63        0.55         0.9     0.59 0.847
    

    6.4 输出特征重要性

    上述四个分类器的准确率都达到了80%以上,但由于正负样本比例不均衡,所以,accuracy不能客观评价算法的优劣。
    从结果来看,Logistic回归模型的sensitivity、f1值和auc值都较高,因此基于Logistic回归模型,输出特征重要性。

    ±---------------±---------±----------±------------±------------±---------±-------+
    | 模型 | accuracy | precision | sensitivity | specificity | f1_score | auc
    ±-----------------±---------±----------±------------±------------±---------±-------+
    | 决策树 | 0.8 | 0.68 | 0.36 | 0.95 | 0.47 | 0.7972 |
    ±-----------------±---------±----------±------------±------------±---------±-------+
    | 随机森林 | 0.8 | 0.62 | 0.5 | 0.9 | 0.55 | 0.8269 |
    ±-----------------±---------±----------±------------±------------±---------±-------+
    | SVM | 0.81 | 0.67 | 0.47 | 0.92 | 0.55 | 0.8295 |
    ±-----------------±---------±----------±------------±------------±---------±-------+
    | Logistic回归分析 | 0.81 | 0.63 | 0.55 | 0.9 | 0.59 | 0.847 |
    ±-----------------±---------±----------±------------±------------±---------±-------+

    > library(caret)
    > library(ggplot2)
    > library(dplyr)
    > importance <- caret::varImp(both.fit, scale = FALSE)
    > importance$var <- row.names(importance)
    > imp <- importance %>% 
    +   mutate(var = factor(var, levels = var[order(Overall)]))
    > ggplot(imp, aes(x = Overall, y=var)) + geom_bar(stat = "identity", fill = 'pink')+ theme_bw() + labs(x = "importance")
    

    在这里插入图片描述

    7 运营建议

    根据预测模型,构建一个潜在流失客户的列表。通过用户调研,详细了解客户对产品不满意的方面。

    7.1 用户层面

    1. 针对老年用户、无亲属、无伴侣用户,制定专属的个性化服务,如推出亲属套餐、温暖套餐等,提升用户的满意度。
    2. 可以为其提供签到积分换购、会员日充值优惠等活动。

    7.2 服务层面

    1. 针对新注册客户,降低第一年的月租费,以此渡过用户的流失高峰期。
    2. 重点改善“光纤网络”服务。
    3. 针对开通互联网服务、网络电视服务或电影服务的客户,提升网络体验,完善增值服务,例如对用户承诺免费提供网络升级的服务。
    4. 针对开通在线安全、在线备份、设备保护、技术支持等增值服务,对客户大力推广,可对其给予优惠,如首月免费体验、满减券等,鼓励客户使用增值服务。

    7.3 合同层面

    1. 针对单月合同用户,可推出“充值返钱”的活动,例如充值50返120,分6个月返,将月用户转化为半年用户,提高用户的在网时长,增加用户的黏性。
    2. 减少目前月租费在70-110元客户的部分费用,或采用赠送充值话费抵扣券的活动,以降低流失率。
    展开全文
  • 携程酒店浏览客户流失概率预测 广告 vs. 新闻推荐 基于Hadoop EcoSystem的数据分析平台 CTR预估建模过程 用户兴趣建模 用户兴趣建模流程 Spark带来的改善
  • 基于分布式混合数据挖掘的电信客户流失分析.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,447
精华内容 12,178
关键字:

客户流失

友情链接: LED.zip