基于线性判别分析(LDA)的客户流失预测

线性判别分析简述:

线性判别分析(Linear Discriminant Analysis, 简称LDA)是一个经典的降维算法。LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用。它与PCA(主成分分析)有一定的相似性。常见的LDA其实有两种,在NLP(自然语言处理)领域中LDA是隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA),是一种处理文档的主题模型。
LDA的个人理解为:将数据在低维度上进行投影,投影后希望每类别数据的投影点尽可能的接近,不同类别数据的类别中心之间的距离尽可能的大。也就是就是“投影后类内方差最小,类间方差最大”。
借图

数据来源:

https://www.kaggle.com/blastchar/telco-customer-churn
在这里插入图片描述

数据说明:

关于电信运营商客户数据集,每一行代表一个客户,每一列包含列元数据中描述的客户属性。原始数据包含7043行和21列。

各个字段的含义:
{
‘customerID’: ‘客户ID’,
‘gender’: ‘性别’,
‘SeniorCitizen’: ‘是否老年人’,
‘Partner’: ‘客户是否有配偶’,
‘Dependents’: ‘客户是否有亲属’,
‘tenure’: ‘客户本产品使用时长’,
‘PhoneService’: ‘是否订购电话服务’,
‘MultipleLines’: ‘是否有多重号码’,
‘InternetService’: ‘是否连接宽带网络’,
‘OnlineSecurity’: ‘是否开通网络安全服务’,
‘OnlineBackup’: ‘是否开通线上备份’,
‘DeviceProtection’: ‘是否开通设备保护’,
‘TechSupport’: ‘是否订购技术支持服务’,
‘StreamingTV’: ‘是否订购网络电视’,
‘StreamingMovies’: ‘是否订购网络电影’,
‘Contract’: ‘客服团队沟通维系频率’,
‘PaperlessBilling’: ‘客户是否有电子账单’,
‘PaymentMethod’: ‘客户支付方式’,
‘MonthlyCharges’: ‘每月消费金额’,
‘TotalCharges’: ‘累积消费金额’,
‘Churn’: ‘是否流失’,
}

实现过程:

导入数据集文件,查看数据集大小,并初步观察前5条的数据内容。
在这里插入图片描述
查看数据的详细情况,将TotalCharges(累计消费金额)的数据类型由字符串转换为浮点型。采用强制转换,如果遇到空值,则转换为NaN。
在这里插入图片描述
在这里插入图片描述
结合数据分析,累计消费金额为0的应该为新入网的客户,因此将这些客户使用时长改为1,将累计消费金额填充为每月消费金额。
在这里插入图片描述
在这里插入图片描述
查看流失客户数量和占比。
在这里插入图片描述
在这里插入图片描述
分析流失客户办理网络服务的情况。
在这里插入图片描述
在这里插入图片描述
分析所有客户办理网络后对网络附加服务的办理情况。
在这里插入图片描述
在这里插入图片描述
分析流失客户当中网络附加服务的办理情况。
在这里插入图片描述
在这里插入图片描述
分析完成后便可以开始建模进行预测。首先观察数据类型,发现大多数都是离散特征。因此对于连续特征,采用标准化方式处理;对于离散特征,特征之间没有大小关系,采用one-hot编码;特征之间有大小关联,则采用数值映射。特征编码完成后就对特征进行提取,选择MothlyCharges、TotalCharges作为特征值,选择tenure为目标。并调用Sklearn包将数据划分为训练集合测试集。这里我设置了0.3,即将30%的数据设置为测试集。
在这里插入图片描述
使用LDA对数据集进行训练,并计算该模型的正确率。
在这里插入图片描述
得出LDA的正确率有80%。最后使用该模型对数据进行测试,得出预测结果。选择最后10条数据进行预测。
在这里插入图片描述

总结:

分析可知在办理了网络服务的客户中,办理光纤用户的流失占比较高,大于办理普通宽带的客户,因此建议降低光纤的资费或提高服务质量。在剩余的网络附加服务中,办理了安全、备份、保护、技术支持服务的流失率较低,而办理了网络电视、电影服务的流失率占比较高。因此建议可以适当降低资费甚至赠送网络电视等服务来挽留客户。对使用LDA模型预测出的可能流失的客户可以打电话、发信息等方式进行营销,使用赠送优惠券等方式挽留可能流失的客户。

实现代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snschurn_df = pd.read_csv('./WA_Fn-UseC_-Telco-Customer-Churn.csv')
churn_df.shape
churn_df.head(5)churn_df.info()churn_df['TotalCharges']=pd.to_numeric(churn_df['TotalCharges'],errors='coerce')
churn_df['TotalCharges']print


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部