电信客户流失分析与预测

本文探讨了电信行业的用户流失问题,通过对用户特征、服务属性和合同属性的分析,揭示了用户流失的原因,并使用决策树、随机森林等模型进行预测。建议针对老年用户、无配偶用户、新注册用户和特定服务的用户制定个性化策略,以提高用户黏性和满意度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目背景
近年来,不论是传统行业还是互联网行业,都面临着用户流失问题。研究表明,企业可以在一周内失去100个用户,而同时又得到另外一个用户,从表明上来看业绩没有受到任何影响,而实际上争取这些新用户所花费的宣传、促销等成本显然要比保持老用户昂贵的多,从企业投资回报程度的角度来看是非常不经济的。
维护好老用户的重要性主要体现在以下四个方面:

留住老用户可使企业的竞争更长久。
留住老用户还会使成本大幅度降低。
留住老用户,还会大大有利于发展新用户。用户口碑效应,如果1个满意的用户引发8笔潜在的生意,那么其中至少1笔成交。
获取更多的用户份额。忠诚的用户会更愿意购买企业的的产品,其支出也会比随意消费者大得多。
二、分析目的
本文将对流失用户做特征分析和流失原因分析,帮助运营商发现并改善用户体验,以及确定挽留目标用户并制定方案。

三、数据来源
此数据集来自kaggle电信用户流失数据集

四、提出问题
分析用户特征与流失的关系
从整体情况看,流失用户的普遍具有哪些特征?
尝试找到合适的模型预测流失用户。
针对性给出增加用户黏性、预防流失的建议。

五、分析流程
在这里插入图片描述
六、理解数据
1、采集数据
本数据集来自DF ,数据源地址:
https://www.datafountain.cn/dataSets/35/details#
本数据集描述了电信用户是否流失以及其相关信息,共包含7044条数据,共20个字段,介绍下各个字段:
customerID :用户ID。
gender:性别。(Female & Male)
SeniorCitizen :老年人 (1表示是,0表示不是)
Partner :是否有配偶 (Yes or No)
Dependents :是否经济独立 (Yes or No)
tenure :客户的入网时间(天)
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:月费用
TotalCharges:总费用
Churn:该用户是否流失(Yes or No)

2、导入包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

3、导入数据

data = pd.read_csv(r'D:\数据分析\telco-customer-churn\WA_Fn-UseC_-Telco-Customer-Churn.csv')

4.数据转化

data.columns=['用户ID','性别','老年人' ,'是否有配偶' ,'是否经济独立' ,'客户的入网时间','是否开通电话服务业务' ,'是否开通了多线业务'
,'是否开通互联网服务' ,'是否开通网络安全服务','是否开通在线备份业务','是否开通了设备保护业务','是否开通了技术支持服务','是否开通网络电视'
,'是否开通网络电影','签订合同年限' ,'是否开通电子账单','付款方式','月费用','总费用','该用户是否流失']
data.head()
#强制转换为数字,不可转换的变为NaN
data['总费用'] = pd.to_numeric(data['总费用'],errors='coerce')
test=data.loc[:,'总费用'].value_counts().sort_index()
print(test.sum())
#运行结果:7032
print(data.客户的入网时间[data['总费用'].isnull().values==True])
#运行结果:11

经过观察,发现这11个用户‘tenure’(入网时长)为0个月,推测是当月新入网用户。根据一般经验,用户即使在注册的当月流失,
也需缴纳当月费用。因此将这11个用户入网时长改为1,将总消费额填充为月消费额,符合实际情况。

#将总消费额填充为月消费额
#参数如下:
# df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad‘, axis=None)
# to_replace:被替换的值,value:替换后的值,inplace:是否要改变原数据,False是不改变,True是改变,默认是False
data.loc[:,'总费用'].replace(to_replace=np.nan,value=data.loc[:,'月费用'],inplace=True)#查看是否替换成功
print(data[data['该用户是否流失']==0][['该用户是否流失','月费用','总费用']])

#将‘tenure’入网时长从0修改为1

data.loc[:,'该用户是否流失'].replace(to_replace=0,value=1,inplace=True)
print(pd.isnull(data['总费用']).sum())
print(data['总费用'].dtypes)

七、用户流失分析
根据一般经验,将用户特征划分为用户属性、服务属性、合同属性,并从这三个维度进行分析。

# 查看流失用户数量和占比。
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.pie(data['该用户是否流失'].value_counts(),labels=['未流失','流失'],autopct='%.2f%%',explode=(0.1,0))
plt.title('用户流失占比')

在这里插入图片描述

#查看数量上的对比
churnDf=data['该用户是否流失'].value_counts().to_frame()
x=churnDf.index
y=churnDf['该用户是否流失']
plt.bar(x,y,width 
### 使用决策树算法进行电信运营商客户流失预测建模 #### 数据准备 为了构建有效的流失预测模型,需先收集并预处理数据。这包括但不限于用户基本信息、消费行为、服务使用情况以及合约详情等。确保数据质量良好,缺失值已妥善处理,并进行了合理的编码转换[^2]。 #### 特征工程 特征的选择对于任何机器学习项目都至关重要。针对本案例中的电信运营商客户流失问题,应考虑如下几个方面: - 用户基本属性:年龄、性别、职业类别等; - 账单相关指标:月均费用、账单金额波动程度等; - 产品和服务偏好:是否订阅额外的服务包如网络安全支持、在线存储空间等; - 客户交互记录:客服热线拨打频率、投诉次数等; - 合同条款细节:合同期限长短、续约意愿表达等; 值得注意的是,在实际操作过程中可能还需要探索其他潜在有用的特征组合,避免过度依赖个人经验或直觉做出选择,尽可能依据业务理解挖掘有价值的信号源[^4]。 #### 构建决策树模型 一旦完成了上述准备工作,则可着手于训练基于决策树的分类器。这里推荐采用C5.0版本而非原始ID3/CART框架下的实现形式,因为前者引入了一系列优化措施使得最终得到的结果更加稳定可靠[^3]。 ```python from sklearn.tree import DecisionTreeClassifier import pandas as pd # 假设df是一个包含了所有必要字段的数据框对象 X = df.drop(['churn'], axis=1) # 自变量集合 y = df['churn'] # 应变量(即目标) clf = DecisionTreeClassifier(criterion='entropy') model = clf.fit(X, y) def visualize_tree(tree, feature_names): """可视化展示决策路径""" from sklearn.externals.six import StringIO import pydotplus dot_data = StringIO() export_graphviz(tree, out_file=dot_data, filled=True, rounded=True, special_characters=True, feature_names=feature_names) graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) return Image(graph.create_png()) visualize_tree(model, list(df.columns[:-1])) ``` 通过调整参数`criterion='gini'/'entropy'`可以选择不同的分裂准则,默认情况下会利用基尼指数来进行节点划分。而在某些特定场景下改用信息增益率或许能带来更好的泛化能力表现。 #### 模型评估调优 完成初步拟合后应当立即开展性能评测工作,通常借助交叉验证法获取更为可信的成绩估计值。此同时也要关注过拟合风险的存在否——如果发现测试集上的得分远低于训练阶段所达到的最佳水平的话就意味着当前结构可能存在记忆效应倾向,此时可以通过剪枝手段加以缓解[^1]。 最后提醒一点就是务必重视解释性的维护,毕竟企业内部相关人员往往不具备深厚的技术背景却同样渴望了解背后的工作机制原理所在。因此建议定期输出重要性排名靠前的关键因子列表供管理层审阅参考之用[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值