成为新会员获取本项目完整报告、代码、数据和AI智能体

加入会员群

用户明明还在网,为什么突然就走了?通信行业尤其明显。根据公开统计,全国移动电话客户总数已远超总人口,市场渗透率超过百分之百,新增空间几乎见顶。再加上携号转网落地、网络升级换代,客户的选择权变大了,三家运营商之间的存量争夺愈发激烈。圈内有个大致的测算:获取一位新客户的成本,是维系一位老客户的五到七倍。所以把发展模式从”拼命拉新”转向”增存并重”,已经不是选择题。

本项目完整报告、代码、数据和AI智能体

下载资料(17页)

本文将我们的电信客户流失多模型预测建模经验沉淀为一个对话式AI智能体,把数据清洗、价值分群到多模型预测的全流程,封装成可以和数据分析师自然对话的智能体。你只要描述业务场景和手里有的字段,它就能帮你把模型搭起来、把关键代码写出来、把挽留策略讲清楚。

阅读原文进群获取本文完整代码、数据、AI智能体及更多最新AI见解和行业洞察,可与900+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路;遇代码运行问题,更能享24小时调试支持。

下面用一张竖版流程图概括整篇文章的脉络:
原始客户账单与行为数据

缺失值检测(本次数据无缺失)

异常值识别(箱线图 + 三倍标准差替换)

特征列联分析与描述性统计

客户价值分群(K-Means + RFM思想)

多模型并行预测(CART / LR / SVM / BPNN)

流失概率输出 → 差异化挽留策略匹配

摘要

中文摘要
本文回答以下核心问题:第一,如何借助数据挖掘方法从客户账单与行为数据中识别流失规律?第二,在聚类、决策树、逻辑回归、支持向量机、神经网络五类模型中,哪一类对电信客户流失的预测效果更优?第三,如何基于客户价值分群设计差异化的挽留策略?我们基于某公开平台约5000条客户记录,经清洗后保留4972条,先以RFM思想做价值分群,再用五种模型对比预测,最终给出分层运营建议。

English Abstract
This paper addresses three questions. First, how to识别 churn patterns from billing and behavioral data via data mining. Second, among clustering, decision tree, logistic regression, SVM and neural network, which model predicts telecom churn best. Third, how to design differentiated retention strategies by customer value segments. Using about 5000 public records (4972 after cleaning), we segment customers with RFM-based K-Means, then compare five models and propose layered retention actions.

研究背景与价值

客户是通信企业生存发展的根本。在大数据背景下,如何从海量数据中挖出有价值的信息、识别客户真实需求,是企业持续增收的关键。本次分析希望结合电信客户流失数据,建立有效的预测模型,把”事后挽留”变成”事前预警”。

注释(故事化):客户流失这件事,很像水库漏水。你一边拼命往里灌新水(拉新),一边池底在悄悄渗(流失)。当市场饱和、新增见顶,最划算的做法不是换更大的水泵,而是先把漏点堵上。本文做的,就是给每个客户装一个”渗漏监测仪”。

指标选择

结合业务需要,本文选取地区、国际计划、语音信箱、各时段通话时长与费用、客服联系次数、是否流失等十八个变量。其中地区、国际计划、语音信箱为定性变量,其余为定量变量。最终用于建模的核心字段含义如下表所示。

表 1 变量名称及含义表

指标变量含义备注
Area_Code2用户所在地区定性变量,取值0、1、2
Intl_Plan是否使用国际计划定性变量,0无1有
Vmail是否使用语音信箱定性变量,0不使用1使用
Vmail_Message每月使用语音信箱次数定量变量
Day_Mins每月白日通话时长(分钟)定量变量
Day_Calls每月白日通话次数定量变量
Day_Charge每月白日通话费用定量变量
Eve_Mins / Eve_Calls / Eve_Charge傍晚通话时长/次数/费用定量变量
Night_Mins / Night_Calls / Night_Charge夜间通话时长/次数/费用定量变量
Intl_Mins / Intl_Calls / Intl_Charge国际通话时长/次数/费用定量变量
CustServ_Calls联系客服次数定量变量
Churn用户流失情况定性变量,0未流失1已流失

数据来源

数据原始数据集约5000条记录,每条包含上述十八个特征标签。

数据处理

缺失值识别与处理

导入数据后,利用pandas库检测缺失值,结果显示无缺失,无需特殊处理。

异常值识别与处理

异常值指明显偏离其余样本的点,也称离群点。本文采用箱线图识别十四个定量变量的离群情况,并对异常值做均值替换,以维持数据整体趋势、确保模型稳健。

导师答辩高频提问:为什么用三倍标准差而不是1.5倍四分位距(箱线图须)来替换异常值? 标准答案:箱线图用于”识别”离群点更直观,但替换时用三倍标准差原则更贴合正态假设下的统计替换逻辑,能减少对整体分布和后续建模的扰动;二者分工不同,前者看、后者改。

下图展示十四个定量变量的箱线分布,红色点为离群点。

图 1 定量变量的箱线图

图 1 定量变量的箱线图

接着计算各指标均值与标准差,将”均值±三倍标准差”之外的点判定为异常值,并用该列均值替换。这种替换能减弱异常值对分布和统计指标的影响,使后续模型更可靠。

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。

描述性统计与列联分析

清洗后最终数据集为4972条,其中流失样本占14.18%,未流失占85.82%。

图 2 样本流失比例图

图 2 样本流失比例图

对地区、国际计划、语音通话三个离散变量分别与流失做列联分析。

表 2 客户所在地区与是否流失的列联表

地区未流失客户数流失客户数总计客户流失率
02138344248213.86%
11074177125114.15%
21055184123914.85%
总计4267705497214.18%

三个地区流失率相差不大,可初步认为地区对流失影响较小。

表 3 是否使用国际计划与流失列联表

是否使用国际计划未流失客户数流失客户数总计客户流失率
否(0)3993507450011.27%
是(1)27419847241.95%
总计4267705497214.18%

使用国际计划的客户流失率高达41.95%,远高于未使用者的11.27%,说明该类客户更易流失。

表 4 是否使用语音通话与流失列联表

是否使用语音通话未流失客户数流失客户数总计客户流失率
否(0)121610213187.74%
是(1)3051603365416.50%
总计4267705497214.18%

使用过语音通话的客户流失率更高,提示语音服务体验可能与流失相关。

对连续变量做描述性统计:

表 5 定量变量描述性统计表

指标名称均值标准差最小值最大值
Vmail_Message7.7713.560.0052.00
Day_Mins180.3753.752.60351.50
Day_Calls100.0219.7430.00165.00
Day_Charge30.669.140.4459.76
Eve_Mins60.2115.156.69109.11
Eve_Calls10.072.001.0017.00
Eve_Charge17.064.291.9030.91
Night_Mins20.045.052.3239.50
Night_Calls10.042.021.0018.00
Night_Charge9.022.271.0417.77
Intl_Mins10.312.670.4020.00
Intl_Calls4.462.441.0020.00
Intl_Charge2.780.720.115.40
CustServ_Calls1.571.300.009.00

模型建立与评价

聚类分析:基于RFM思想的价值分群

不同客户为企业带来的收益不同,价值高的群体流失会造成较大损失,低价值群体过度挽留反而浪费成本。这就像给客户分VIP等级(行业术语:RFM价值分群),先看清谁是谁,再决定投入多少精力。

本文从十八个属性中抽取八个连续型变量,按RFM思想构建客户价值指标,并标准化以消除量纲影响。

表 6 客户价值指标表

指标含义
Day_Mins每月白日通话时长
Day_Charge每月白日通话费用
Eve_Mins每月傍晚通话时长
Eve_Charge每月傍晚通话费用
Night_Mins每月夜间通话时长
Night_Charge每月夜间通话费用
Intl_Mins每月国际通话时长
Intl_Charge每月国际通话费用

第一轮对话:基础数据清洗与标准化

背景:我手头有一份通信客户的账单数据(约5000行),字段包含各时段通话时长、费用及是否流失。 目标:请帮我完成缺失值检测、箱线图异常值识别,并用三倍标准差原则对异常值做均值替换,最后做Z分数标准化。 约束:用Python的pandas与scikit-learn思路实现,变量名自行重命名,关键建模步骤用省略号标注。

import pandas as pd  # 引入表格处理库
import numpy as np   # 引入数值计算库

源表 = pd.read_csv('D:/data/churn_info.csv')  # 读取原始客户数据
空值检查 = 源表.isnull().any(axis=0)  # 按列判断是否存在缺失
print(空值检查)

定量字段 = 源表.iloc[:, 4:17]  # 截取需观察的连续变量
# ......(省略:用matplotlib绘制箱线图识别离群点的完整绘图代码)

均值表 = 定量字段.mean()  # 计算各列均值
标准差表 = 定量字段.std()  # 计算各列标准差
z分数 = (定量字段 - 均值表) / 标准差表  # 计算标准分数
异常标记 = (z分数 > 3) | (z分数 < -3)  # 标记三倍标准差之外的点

for 列名 in 定量字段.columns:  # 遍历每一列
    列均值 = 均值表[列名]  # 取该列均值
    源表.loc[异常标记[列名], 列名] = 列均值  # 异常值用列均值替换

数值列 = 源表.select_dtypes(include=[np.number]).columns  # 取数值型列
源表[数值列] = (源表[数值列] - 源表[数值列].mean()) / 源表[数值列].std()  # Z分数标准化
源表.to_csv('D:/data/churn_scaled.csv', index=False)  # 保存处理结果

K-Means聚类建模

采用"手肘法"先确定最优K值。损失函数定义为各样本到所属簇中心的平方误差和(SSE),随K增大SSE下降但降幅减缓,拐点即为最佳K。

图 3 聚类数K与簇内误差平方和SSE关系图

图 3 聚类数K与簇内误差平方和SSE关系图

由图3可见,K取4之前SSE下降较快,之后明显减缓,故确定K=4。采用K-Means对八个价值变量聚类,结果如下。

图 4 聚类结果可视化

图 4 聚类结果可视化

表 7 聚类结果表(标准化后聚类中心)

类别记录数X1(Day_Mins)X2(Day_Charge)X3(Eve_Mins)X4(Eve_Charge)X5(Night_Mins)X6(Night_Charge)X7(Intl_Mins)X8(Intl_Charge)
11244-0.06-0.06-0.56-0.560.870.870.630.63
21298-0.93-0.930.570.57-0.42-0.420.230.23
312140.120.12-0.12-0.120.260.26-1.19-1.19
412160.940.940.080.08-0.70-0.700.290.29

为更清晰体现差异,用雷达图展示各类别属性特征。

图 5 雷达图

图 5 雷达图

类别1在夜间通话维度突出,属夜间高频用户;类别2在傍晚通话维度突出;类别3各维度均不突出,属轻度使用用户;类别4在白日通话维度突出且有一定国际需求,为重点发展对象。

聚类结果评价

统计各类别流失情况:

图 6 各类别客户流失情况

图 6 各类别客户流失情况

类别1(1244人,占25.02%):流失率12.86%,消费高、多夜间使用、有国际需求,建议重点维护、定制套餐。类别2(1298人,占26.11%):流失率11.02%,总体费用不高、多傍晚使用,可作为一般价值客户,开通更多服务。类别3(1214人,占24.42%):流失率11.53%,费用低、各时段使用均少,可不重点投入,避免成本浪费。类别4(1216人,占24.46%):流失率21.55%,白日高频、有国际需求,流失最严重,需及时改变营销策略并尽力挽回。

导师答辩高频提问:手肘法确定K=4是否主观?有没有更客观的验证? 标准答案:手肘法是经验法,可辅以轮廓系数(Silhouette)或间隙统计量(Gap Statistic)做客观校验;本文在K=4附近SSE拐点明显,且业务上四类价值分层可解释,故取4类合理。

决策树:CART算法与剪枝

决策树通过递归划分使子集信息量最大,本文选用CART算法,以基尼指数为划分指标,并用后剪枝降低过拟合。

第一轮对话:基础决策树模型

背景:清洗后的客户数据已因子化(Churn、地区、国际计划、语音信箱转为因子),训练集占80%。 目标:用R的rpart包构建一棵CART分类树预测客户流失,输出变量重要性。 约束:使用基尼指数划分,控制参数minsplit=20、maxdepth=10、cp=0.005,关键建模代码用省略号标注。

资料库 <- read.csv("churn_scaled.csv")  # 读取标准化后数据
资料库$流失 <- as.factor(资料库$Churn)  # 将目标转为因子
资料库$地区 <- as.factor(资料库$Area_Code2)  # 地区因子化
资料库$国际 <- as.factor(资料库$Intl_Plan)  # 国际计划因子化
资料库$语音 <- as.factor(资料库$Vmail)  # 语音信箱因子化

set.seed(10)  # 设定随机种子保证可复现
抽样 <- sample(1:nrow(资料库), nrow(资料库$流失)*0.8)  # 抽取80%索引
训练集 <- 资料库[抽样, ]  # 训练样本
验证集 <- 资料库[-抽样, ]  # 测试样本

控制参数 <- rpart.control(minsplit=20, minbucket=20, maxdepth=10, xval=5, cp=0.005)
基础树 <- rpart(流失 ~ ., data=训练集, method="class",
               parms=list(split="gini"), control=控制参数)
# ......(省略:printcp、plotcp绘制复杂度与划分次数关系图的代码)

重要性 <- 基础树$variable.importance  # 提取变量重要性

第二轮对话:引入剪枝约束

背景:基础树节点偏多、结构复杂,且第六次划分后性能无明显提升。 目标:在cp=0.014处对树做剪枝,得到更简洁、泛化更强的决策树,并绘制剪枝后树与ROC曲线。 约束:用prune函数剪枝,验证集预测后绘制ROC,关键预测与绘图代码用省略号标注。

剪枝后决策树第一个分裂节点仍是"白日通话时长",说明该变量对流失影响最大。剪枝后准确率93.9%,AUC=0.88,模型简化且泛化能力增强。

图 7 CP值与分裂次数关系图

图 7 CP值与分裂次数关系图

图 8 原始决策树图

图 8 原始决策树图

图 9 剪枝后CART决策树图

图 9 剪枝后CART决策树图

图 10 剪枝后决策树ROC曲线图

图 10 剪枝后决策树ROC曲线图

逻辑回归:逐步筛选显著变量

逻辑回归适用于因变量为定性变量的分类。为防止多重共线性,先对连续变量做相关性分析,发现"时长"与"费用"相关系数接近1(高度相关,符合常识),故删去所有费用变量、保留时长变量。

图 11 相关系数热力图

图 11 相关系数热力图

建模与变量选择

逐步回归筛选出9个显著变量,模型表达式为:

Y = 2.05X1 + 2.19X2 + 0.04X3 + 0.01X4 + 0.02X5 + 0.04X6 + 0.08X7 - 0.11X8 + 0.46*X9

其中X1为国际计划、X2为语音信箱、X3为语音信箱次数、X4-X7为各时段通话时长、X8为国际通话次数、X9为客服联系次数。

表 10 逐步回归结果表

自变量名称回归系数Pr(>|z|)Pr(>Chi)
(Intercept)-0.10< 2e-16
Intl_Plan2.05< 2e-16< 2.20e-16
Vmail2.190.00< 2.20e-16
Vmail_Message0.040.010.02
Day_Mins0.01< 2e-16< 2.2e-16
Eve_Mins0.020.000.00
Night_Mins0.040.000.00
Intl_Mins0.080.000.00
Intl_Calls-0.110.000.00
CustServ_Calls0.46< 2e-16< 2.2e-16

每个自变量p值均小于0.05,模型有效。按80%/20%划分训练测试集,准确率为86.4%,AUC=0.84。

图 12 Logistic回归ROC曲线图

图 12 Logistic回归ROC曲线图

导师答辩高频提问:为什么把高度相关的"费用"变量删掉而不是做降维(如PCA)? 标准答案:逻辑回归对共线性敏感,直接删去与时长完全线性相关的费用变量最简洁、可解释;PCA虽能降维但会损失业务含义,不利于向业务方解释系数。

相关技术文章图片

Python电信客户流失预测研究:神经网络、K-Means聚类、RFM、CART决策树、Logistic回归、SVM多模型融合及客户分群

附AI智能体、代码和数据

探索观点

支持向量机:径向基核函数

支持向量机(SVM)通过将数据映射到高维空间寻找最优分割超平面,本文选用径向基函数(RBF)作为核函数处理非线性关系。基于前述9个显著变量建模。

建模与评价

对测试集预测得到混淆矩阵,准确率94.5%,精准率94.4%,反查率99.5%,F1得分为0.969。ROC曲线下AUC=0.91,性能良好。

图 13 SVM模型ROC曲线图

图 13 SVM模型ROC曲线图

library(e1071)  # 引入支持向量机库
library(pROC)   # 引入ROC绘制库

set.seed(10)    # 设定随机种子
样本表 <- read.csv("churn_scaled.csv")  # 读取数据
样本表$流失 <- as.factor(样本表$Churn)  # 目标因子化
样本表$国际 <- as.factor(样本表$Intl_Plan)  # 国际计划因子化
样本表$语音 <- as.factor(样本表$Vmail)  # 语音信箱因子化

选取列 <- 样本表[, c(2,3,4,5,8,11,14,15,17,18)]  # 取9个显著变量+目标
行数 <- nrow(选取列)  # 样本总量
训练量 <- round(行数*0.8)  # 训练集大小
下标 <- sample(1:行数, 训练量)  # 随机抽样索引
训练数据 <- 选取列[下标, ]  # 训练集
测试数据 <- 选取列[-下标, ]  # 测试集

支持向量模型 <- svm(流失 ~ ., data=训练数据, kernel="radial", probability=TRUE)
# ......(省略:predict预测测试集并生成混淆矩阵的代码)

概率值 <- attr(predict(支持向量模型, 测试数据, probability=TRUE), "probabilities")[,1]
曲线 <- roc(测试数据$流失, 概率值)  # 绘制ROC

BP神经网络:三层隐含层

BP神经网络是按误差反向传播训练的多层前馈网络,含输入层、隐含层、输出层,能完成复杂非线性映射。

第一轮对话:基础三层(单隐含层)神经网络

背景:数据已标准化,目标为Churn(0/1),其余17个变量作输入。 目标:用Python的TensorFlow/Keras搭建一个单隐含层BP神经网络做二分类。 约束:输入层17节点、单隐含层、输出层1节点(sigmoid),用binary_crossentropy损失,关键编译与训练代码用省略号标注。

import pandas as pd  # 引入表格库
import numpy as np   # 引入数值库
from sklearn.model_selection import train_test_split  # 引入数据集划分
from sklearn.preprocessing import StandardScaler  # 引入标准化
import tensorflow as tf  # 引入深度学习框架
from tensorflow import keras  # 引入建模接口

数据集 = pd.read_csv("churn_scaled.csv")  # 读取标准化数据
特征 = 数据集.drop('Churn', axis=1)  # 取输入特征
标签 = 数据集['Churn']  # 取目标列
训练特征, 测试特征, 训练标签, 测试标签 = train_test_split(特征, 标签, test_size=0.2)

基础模型 = keras.models.Sequential()  # 建立序列模型
基础模型.add(keras.layers.Dense(11, activation='relu', input_dim=训练特征.shape[1]))  # 隐含层
基础模型.add(keras.layers.Dense(1, activation='sigmoid'))  # 输出层
# ......(省略:compile与fit训练、evaluate评估的关键代码)

第二轮对话:拓展为三层隐含层

背景:单隐含层映射能力有限,希望提升拟合能力但避免过拟合。 目标:把网络改为三层隐含层(11→6→3节点),隐含层均用relu,输出层用sigmoid,重新训练并输出混淆矩阵与AUC。 约束:保持标准化输入,batch_size=256、epochs=50,关键训练与评估代码用省略号标注。

增强模型 = keras.models.Sequential()  # 新建序列模型
增强模型.add(keras.layers.Dense(11, activation='relu', input_dim=训练特征.shape[1]))  # 第一隐含层
增强模型.add(keras.layers.Dense(6, activation='relu'))  # 第二隐含层
增强模型.add(keras.layers.Dense(3, activation='relu'))  # 第三隐含层
增强模型.add(keras.layers.Dense(1, activation='sigmoid'))  # 输出层
增强模型.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# ......(省略:fit训练、predict预测、confusion_matrix生成混淆矩阵的代码)

预测值 = (增强模型.predict(测试特征) > 0.5).astype(int)  # 按阈值转类别
混淆矩阵 = confusion_matrix(测试标签, 预测值)  # 输出混淆矩阵
图 14 BP神经网络结构图

图 14 BP神经网络结构图

图 15 BP神经网络结构图(三层隐含层)

图 15 BP神经网络结构图(三层隐含层)

图 16 激活函数图像

图 16 激活函数图像

按80%/20%划分,三层BP神经网络测试集准确率95.3%,召回率99.2%,AUC=0.92,分类效果最好。

图 17 BP神经网络ROC曲线图

图 17 BP神经网络ROC曲线图

五模型实测对比

表 14 各模型在测试集上的表现对比

模型准确率AUC关键特点
K-Means分群(无监督)————用于价值分层,不直接预测流失
CART决策树(剪枝后)93.9%0.88可解释强,首节点为白日通话时长
Logistic回归86.4%0.84系数可解释,9个显著变量
支持向量机(RBF)94.5%0.91反查率99.5%,泛化好
BP神经网络(三层)95.3%0.92准确率与AUC最高

注释(故事化):五种方法像五个不同专长的医生给同一位病人会诊。决策树最会"讲道理"(可解释),逻辑回归最"循证"(系数显著),支持向量机最"稳",神经网络最"准"。企业落地时,往往用神经网络做主预测,用决策树做原因解释,各取所长。

结论与建议

聚类分析将客户分为4类,白日通话时长长、费用高的客户(类别4)流失最严重(21.55%);傍晚有通话需求的客户流失比例较低。决策树首节点为白日通话时长,印证其重要性。逻辑回归AUC=0.84,SVM=0.91,BP神经网络=0.92,单看AUC,神经网络预测效果最好。

建议方面:对高价值客户(夜间+白日高频)增强粘性,如为高价值套餐客户提供免费升级宽带、专属客服、生日关怀;对低价值客户(各时段使用均少)采取预存送话费、免费流量体验包等激励,逐步转化。同时建立流失预警监控,快速匹配挽留策略。

总结

核心问题与解决方案

问题一:如何从账单与行为数据中识别流失规律?
解决方案:先做缺失值与异常值清洗,再用列联表与描述统计定位高风险特征(如使用国际计划者流失率41.95%、白日通话时长长的客户易流失),为建模指明方向。

问题二:五类模型中哪一个预测客户流失最准?
解决方案:在测试集上对比,BP神经网络准确率95.3%、AUC=0.92居首,SVM(94.5%/0.91)次之;决策树可解释性最佳,适合做流失原因解释。

问题三:如何把模型结果转化为可落地的挽留动作?
解决方案:先以K-Means按RFM思想把客户分为4类价值群体,再对高价值群体做专属服务、对低价值群体做激励转化,并配套流失预警监控。

技术创新与业务价值

技术创新:将无监督的RFM价值分群与有监督的多模型预测(CART、LR、SVM、BPNN)结合,既给出"谁会走",也给出"为什么走"与"值不值得留"。业务价值:通过价值分层,把有限的挽留资源精准投向高价值、高流失风险群体(类别4流失率21.55%),预计可显著降低单位挽留成本、提升留存率。可量化结果:BP神经网络AUC达0.92、SVM反查率99.5%,可为运营商建立"事前预警+差异化挽留"的运营闭环提供可靠模型支撑。

作者系通信行业数据挖掘方向分析师,拥有多年客户行为建模经验。

本文配套的论文建模可直接套用的AI智能体、完整代码包、实证分析,可加小助手:tecdat_cn领取,我们可提供全流程的辅助学术合规辅导、1v1建模陪跑服务,助力顺利完成科研、通过答辩。