数据挖掘实战:2万字深度分析《电信用户流失预测模型》

深度分析|《电信用户流失预测模型》(所有分类模型精度平均得分在0.8以上) 本文对于老手, 今后处理“分类问题”有借鉴意义。啥分类模型都碰瓷一遍,选得分最高的模型。 本文对于新手,是刻意练习python数据分析的不二选择。同一份数据,反复操练,以培养python代码的肌肉记忆 阅读详情
AI摘要

本文通过用户属性、行为数据深入分析电信客户流失,发现易流失特征如1-5号职位用户、电子支付、低月费高总费用户。建议优化电子账单服务并针对特定群体推出优惠。利用XGB模型揭示了流失预测的重要特征,助力精准营销。

1.研究背景

1、做好用户流失预测可以降低营销成本。老生常谈,新客户开发成本是老客户维护成本的5倍。

2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。

3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户。

2.提出问题

1、流失客户有哪些显著性特征?

2、当客户在哪些特征下什么条件下比较容易发生流失?

3.数据集描述

该数据是datafountain上的《电信客户流失数据》,这里提供一个下载地址。

数据下载地址:

https://www.datafountain.cn/datasets/35guide

该数据集有21个变量,7043个数据点。变量可分为以下三个部分:用户属性、用户行为、研究对象。

用户属性

customerID :用户ID
gender:性别(Female & Male)
SeniorCitizen :老年人(1表示是,0表示不是)
Partner :是否有配偶(Yes or No)
Dependents :是否经济独立(Yes or No)
tenure :客户的职位(0-72,共73个职位)

用户行为

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)

4.分析思路

分析视角是分析方法的灵魂。

分析方法有上百种,但分析视角只有四种:

  • 对比视角

  • 分类视角

  • 相关视角

  • 描述视角

一旦将业务需求拆解成指标,接下来只需要针对每个指标进行分析视角四选一即可。

数据集描述,已经将变量分为三个维度了:用户属性、用户行为、研究对象(是否流失客户),三个维度组合一下就得出了以下解题思路了:

  • 哪些属性的用户比较容易流失?

  • 哪些行为的用户比较容易流失?

以上两个分析思路运用的是【对比视角】,该视角下具体的分析方法有:

  • 数值型数据:均值比较

  • 分类型数据:频数分布比较(交叉分析)

以上的分析方法是统计分析,只能一个维度一个维度地去比较。但实际情况中,并不是每个维度的权重都一样的,那如何去研究各个维度的权重?

权重问题属于分类视角,故我们可以采用分类模型,要用哪个分类模型呢?不知道。可以全部采用,看模型精度得分,然后选得分最高的模型进行进一步预测。

  • Random Forest 随机森林

  • SVC 支持向量机

  • LogisticRegression 逻辑回归

  • KNN 近邻算法

  • Naive Bayes  朴素贝叶斯

  • Decision Tree 决策树

  • AdaBoost

  • GradientBoosting

  • XGB

  • CatBoost

5.分析结论及运营建议

5.1 分析结论

综合统计分析和XGB算法输出特征重要性得出流失客户有以下特征(依特征重要性从大到小排列):

  1. tenure :1-5号职位的用户比较容易流失

  2. PaymentMethod :使用电子支票支付的人

  3. MonthlyCharges 、TotalCharges : 总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失

  4. PaperlessBilling : 开通电子账单

  5. Partner : 单身

  6. OnlineBackup : 没开通在线备份业务

  7. InternetService :开通了Fiber optic 光纤网络

  8. TechSupport :没开通“技术支持服务”

  9. DeviceProtection :没开通设备保护业务

  10. OnlineSecurity :没开通网络安全服务

  11. Contract :按月签订合同方式

  12. Dependents :无经济独立

  13. SeniorCitizen :青年人

  14. TotalCharges :总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失

当条件覆盖得越多,人群越精确,但与此同时,覆盖的人群也会越少。业务方可直接在数据库中,通过SQL检索符合要求的客户,然后做针对性的运营工作。

5.2 运营建议

如何留住客户,可以从两方面去思考:

  • 增加用户的沉没成本(损失厌恶)

    • 会员等级

    • 积分制

    • 充值赠送

    • 满减券

    • 其他增值服务

  • 培养用户的条件反射(习惯)

    • 会员日

    • 定期用户召回

    • 签到

    • 每日定时抽奖

    • 小游戏

电子账单解锁新权益

  • 现象:“开通电子账单”的人反而容易流失。

  • 基本假设:价格敏感型客户。电子账单,让客户理性消费。

  • 建议:让“电子账单”变成一项“福利。跟连锁便利店,联名发"商品满减券",每月的账单时间,就将"商品满减券“和账单一起推送过去。文案:您上月消费了XX元,解锁了xx会员权益。

  • 底层规律:增加沉没成本。

“单身用户”尊享亲情网

  • 现象:“单身用户”容易流失。

  • 基本假设:社交欲望低。

  • 建议:一个单身用户拥有建立3个人以内的“亲情网”的权益。

  • 底层规律:增加沉没成本。

推广“在线备份、设备保护、技术支持、网络保护”等增值服务。

6.数据清洗

6.1 导入模块

6.1.1 数据处理
import pandas as pd
import numpy as np
6.1.2 可视化
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid',font_scale=1.3)
plt.rcParams['font.family']='SimHei'
plt.rcParams['axes.unicode_minus']=False

6.1.3 特征工程

import sklearn
from sklearn import preprocessing                            #数据预处理模块
from sklearn.preprocessing import LabelEncoder               #编码转换
from sklearn.preprocessing import StandardScaler             #归一化
from sklearn.model_selection import StratifiedShuffleSplit   #分层抽样
from sklearn.model_selection import train_test_split         #数据分区
from sklearn.decomposition import PCA                        #主成分分析 (降维)

6.1.4 分类算法
from sklearn.ensemble import RandomForestClassifier     #随机森林
from sklearn.svm import SVC,LinearSVC                   #支持向量机
from sklearn.linear_model import LogisticRegression     #逻辑回归
from sklearn.neighbors import KNeighborsClassifier      #KNN算法
from sklearn.cluster import KMeans                     #K-Means 聚类算法
from sklearn.naive_bayes import GaussianNB              #朴素贝叶斯
from sklearn.tree import DecisionTreeClassifier         #决策树
6.1.5 分类算法--集成学习
import xgboost as xgb
from xgboost import XGBClassifier                      
from catboost import CatBoostClassifier                
from sklearn.ensemble import AdaBoostClassifier        
from sklearn.ensemble import GradientBoostingClassifier 
6.1.6 模型评估
from sklearn.metrics import classification_report,precision_score,recall_score,f1_score  #分类报告
from sklearn.metrics import confusion_matrix           #混淆矩阵
from sklearn.metrics import silhouette_score           #轮廓系数(评价k-mean聚类效果)
from sklearn.model_selection import GridSearchCV       #交叉验证
from sklearn.metrics import make_scorer
from sklearn.ensemble import VotingClassifier          #投票
6.1.7 忽略警告
import warnings
warnings.filterwarnings('ignore')

6.2 读取数据

df=pd.read_csv(r'C:\Users\Think\Desktop\刻意练习数据\电信数据集\Customer-Churn.csv',header=0)
#预览数据
df.head()
#查看数据大小
df.shape
#查看数据数据及分布
df.describe()

这里安利一下spyder编辑器,下图是这个编辑器的界面。编程过程中,有赋值变量的操作,该编辑器都会在右上角呈现,双击一下,就可以像在Execel上查看数据,非常方便。

查看该数据集的详情。

6.3 数据清洗

6.3.1 缺失值处理
#查看缺失值
df.isnull().sum()

注:缺失值的数据类型是 float 类型。一旦有变量的数据类型转换成float 类型,需再次查看缺失值。

6.3.2 重复值处理
#查看重复值
df.duplicated().sum()

【输出】

6.3.3 数值类型转换
#查看数据类型
df.info()

【输出】

TotalCharages总费用应该跟MonthlvCharges是同一个数据类型(float64)。故需将TotalCharages由object转换成float64,且需要再次查看缺失值。

#总费用 TotalCharges  该列的数据类型应是float64,不是object
# df['TotalCharges'].astype('float64')
# 此处用“astype”转化数据类型报错 “could not convert string to float”
#改用强制转化 convert_numeric=True   
df['TotalCharges']=df['TotalCharges'].convert_objects(convert_numeric=True)
df['TotalCharges'].dtype

输出如下:

再次查看缺失值:

TotalCharges列有11个缺失值,处理缺失值的原则是尽量填充,最后才是删除。缺失值填充的原则:

  • 分类型数据:众数填充

  • 数值型数据:正态分布,均值/中位数填充;偏态分布,中位数填充。

TotalCharges列是数值型数据,先画直方图查看数据分布形态。

#分别作直方图:全部客户类型、流失客户类型、留存客户类型
plt.figure(figsize=(14,5))
plt.subplot(1,3,1)
plt.title('全部客户的总付费直方图')
sns.distplot(df['TotalCharges'].dropna())

plt.subplot(1,3,2)
plt.title('流失客户的总付费直方图')
sns.distplot(df[df['Churn']=='Yes']['TotalCharges'].dropna())

plt.subplot(1,3,3)
plt.title('留存客户的总付费直方图')
sns.distplot(df[df['Churn']=='No']['TotalCharges'].dropna())

结果如下:

从三个直方图看,该列数据是偏态分布,故选择中位数填充。

df.fillna({'TotalCharges':df['TotalCharges'].median()},inplace=True)
#再次确认是否还有空值
df.isnull().sum()

结果如下:

6.4 查看样本分布

研究对象'Churn'列重新编码“Yes”=1,“No”=0。重新编码有下面两种方法。

方法一:replace

df['Churn'].replace(to_replace = 'Yes', value = 1,inplace = True)
df['Churn'].replace(to_replace = 'No', value = 0,inplace = True)

方法二:map函数

df['Churn']=df['Churn'].map({'Yes':1,'No':0})

预览数据:

df['Churn'].head()

结果如下:

绘制饼图,查看流失客户占比。

churn_value=df["Churn"].value_counts()
labels=df["Churn"].value_counts().index

plt.figure(figsize=(7,7))
plt.pie(churn_value,labels=labels,colors=["b","w"], explode=(0.1,0),autopct='%1.1f%%', shadow=True)
plt.title("流失客户占比高达26.5%")
plt.show()  

结果如下:

【分析】:流失客户样本占比26.5%,留存客户样本占比73.5%,明显的“样本不均衡”。

解决样本不均衡有以下方法可以选择:

  • 分层抽样

  • 过抽样

  • 欠抽样

7.特征选择

提取特征

feature=df.iloc[:,1:20]

7.1 整数编码

查看变量间的两两相关性

#重新编码
corr_df = feature.apply(lambda x: pd.factorize(x)[0])
corr_df.head()
#相关性矩阵
corr=corr_df.corr()
corr

结果如下:

相关性矩阵可视化

#绘制热力图观察变量之间的相关性强弱
plt.figure(figsize=(15,12))
ax = sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, 
                 linewidths=0.2, cmap="RdYlGn",annot=True)
plt.title("Correlation between variables")

结果如下:

【分析】:从热力图来看,互联网服务、网络安全、在线备份、设备维护服务、技术支持服务、开通网络电视服务、开通网络电影之间相关性很强,且是正相关。电话服务和多线业务之间也存在很强的正相关关系。

7.2 独热编码

查看研究对象"Churn"与其他变量下的标签相关性。独热编码,可以将分类变量下的标签转化成列

df_onehot = pd.get_dummies(df.iloc[:,1:21])
df_onehot.head()

结果如下:

绘图查看用户流失('Churn')与各个维度之间的关系

plt.figure(figsize=(15,6))
df_onehot.corr()['Churn'].sort_values(ascending=False).plot(kind='bar')
plt.title('Correlation between Churn  and variables ')

结果如下:

【分析】:从图看gender(性别)、PhoneService(电话服务)相关性几乎为0,故两个维度可以忽略。

['SeniorCitizen','Partner','Dependents', 'Contract',MultipleLines,'InternetService',  'OnlineSecurity', 'OnlineBackup', 'DeviceProtection','TechSupport', 'StreamingTV', 'StreamingMovies','PaperlessBilling','PaymentMethod'] 等都有较高的相关性,将以上维度合并成一个列表kf_var,然后进行频数比较。

kf_var=list(df.columns[2:5])
for var in list(df.columns[7:18]):
    kf_var.append(var)
print('kf_var=',kf_var)

结果如下:

8.统计分析

8.1 频数分布比较

8.1.1 卡方检验

组间有显著性差异,频数分布比较才有意义,否则可能会做无用功。"卡方检验",就是提高频数比较结论可信度的统计方法。

#分组间确实是有显著性差异,频数比较的结论才有可信度,故需进行”卡方检验“
from scipy.stats import chi2_contingency   #统计分析 卡方检验
#自定义卡方检验函数
def KF(x):
    df1=pd.crosstab(df['Churn'],df[x])
    li1=list(df1.iloc[0,:])
    li2=list(df1.iloc[1,:])
    kf_data=np.array([li1,li2])
    kf=chi2_contingency(kf_data)
    if kf[1]<0.05:
        print('Churn by {} 的卡方临界值是{:.2f},小于0.05,表明{}组间有显著性差异,可进行【交叉分析】'.format(x,kf[1],x),'\n')
    else:
        print('Churn by {} 的卡方临界值是{:.2f},大于0.05,表明{}组间无显著性差异,不可进行交叉分析'.format(x,kf[1],x),'\n')
#对 kf_var进行卡方检验
print('kf_var的卡方检验结果如下:','\n')
print(list(map(KF, kf_var)))

kf_var的卡方检验结果如下:

Churn by SeniorCitizen 的卡方临界值是0.00,小于0.05,表明SeniorCitizen组间有显著性差异,可进行【交叉分析】

Churn by Partner 的卡方临界值是0.00,小于0.05,表明Partner组间有显著性差异,可进行【交叉分析】

Churn by Dependents 的卡方临界值是0.00,小于0.05,表明Dependents组间有显著性差异,可进行【交叉分析】

Churn by MultipleLines 的卡方临界值是0.99,大于0.05,表明MultipleLines组间无显著性差异,不可进行交叉分析

Churn by InternetService 的卡方临界值是0.00,小于0.05,表明InternetService组间有显著性差异,可进行【交叉分析】

Churn by OnlineSecurity 的卡方临界值是0.00,小于0.05,表明OnlineSecurity组间有显著性差异,可进行【交叉分析】

Churn by OnlineBackup 的卡方临界值是0.00,小于0.05,表明OnlineBackup组间有显著性差异,可进行【交叉分析】

Churn by DeviceProtection 的卡方临界值是0.00,小于0.05,表明DeviceProtection组间有显著性差异,可进行【交叉分析】

Churn by TechSupport 的卡方临界值是0.00,小于0.05,表明TechSupport组间有显著性差异,可进行【交叉分析】

Churn by StreamingTV 的卡方临界值是0.00,小于0.05,表明StreamingTV组间有显著性差异,可进行【交叉分析】

Churn by StreamingMovies 的卡方临界值是0.00,小于0.05,表明StreamingMovies组间有显著性差异,可进行【交叉分析】

Churn by Contract 的卡方临界值是0.00,小于0.05,表明Contract组间有显著性差异,可进行【交叉分析】

Churn by PaperlessBilling 的卡方临界值是0.00,小于0.05,表明PaperlessBilling组间有显著性差异,可进行【交叉分析】

Churn by PaymentMethod 的卡方临界值是0.00,小于0.05,表明PaymentMethod组间有显著性差异,可进行【交叉分析】

从卡方检验的结果,kf_var包含的特征,组间都有显著性差异,可进行频数比较。

8.1.2 柱形图

频数比较--柱形图

plt.figure(figsize=(20,25))
a=0
for k in kf_var:
    a=a+1
    plt.subplot(4,4,a)
    plt.title('Churn BY '+ k)
    sns.countplot(x=k,hue='Churn',data=df)

结果如下:

因为PaymentMethod的标签比较长,影响看图,所以单独画。

plt.xticks(rotation=45)
sns.countplot(x='PaymentMethod',hue='Churn',data=df)

可以直接从柱形图去判断对哪个维度对流失客户的影响大吗?不能,因为“样本不均衡”(流失客户样本占比26.5%,留存客户样本占比73.5%),基数不一样,故不能直接通过“频数”的柱形图去分析。解决办法:交叉分析,且作同行百分比('Churn'作为“行”)

8.1.3 交叉分析
print('ka_var列表中的维度与Churn交叉分析结果如下:','\n')
for i in kf_var:
    print('................Churn BY {}...............'.format(i))
    print(pd.crosstab(df['Churn'],df[i],normalize=0),'\n') #交叉分析,同行百分比

ka_var列表中的维度与Churn交叉分析结果如下:

【SeniorCitizen 分析】:年轻用户 在流失、留存,两个标签的人数占比都高。

【Parter 分析】:单身用户更容易流失。

【Denpendents 分析】:经济不独立的用户更容易流失。

【MultipleLines 分析】:是否开通MultipleLines,对留存和流失都没有明显的促进作用。

【InternetService 分析】:办理了 “Fiber optic 光纤网络”的客户容易流失。

【OnlineSecurity 分析】:没开通“网络安全服务”的客户容易流失。

【OnlineBackup 分析】:没开通“在线备份服务”的客户容易流失。

【DeviceProtection 分析】:没开通“设备保护业务”的用户比较容易流失

【TechSupport 分析】:没开通“技术支持服务”的用户容易流失。

【StreamingTV 分析】:是否开通“网络电视”服务,对用户留存、流失,没有明显的促进作用。

【StreamingMovies 分析】:是否开通“网络电影”服务,对用户留存、流失,没有明显的促进作用。

【Contract 分析】逐月签订合同的用户最容易流失。

因为"Churn BY PaymentMethod"打印出来显示不全,故我就从临时表将“交叉表”给截图出来了:

【分析】使用“电子支票”支付的人更容易流失。

8.2 均值比较

组间有显著性差异,均值比较才有意义。显著性检验,先通过了齐性检验,再通过方差分析,最后才能做均值比较。

8.2.0 齐性检验,方差分析
#自定义齐性检验 & 方差分析 函数
def ANOVA(x):
    li_index=list(df['Churn'].value_counts().keys())
    args=[]
    for i in li_index:
        args.append(df[df['Churn']==i][x])
    w,p=stats.levene(*args)             #齐性检验
    if p<0.05:
        print('警告:Churn BY {}的P值为{:.2f},小于0.05,表明齐性检验不通过,不可作方差分析'.format(x,p),'\n')
    else:
        f,p_value=stats.f_oneway(*args) #方差分析
        print('Churn BY {} 的f值是{},p_value值是{}'.format(x,f,p_value),'\n')
        if p_value<0.05:
            print('Churn BY {}的均值有显著性差异,可进行均值比较'.format(x),'\n')
        else:
            print('Churn BY {}的均值无显著性差异,不可进行均值比较'.format(x),'\n')

对MonthlyCharges、TotalCharges维度分别进行齐性检验和方差分析

print('MonthlyCharges、TotalCharges的齐性检验 和方差分析结果如下:','\n')
ANOVA('MonthlyCharges')
ANOVA('TotalCharges')

【输出】:MonthlyCharges、TotalCharges的齐性检验 和方差分析结果如下:

警告:Churn BY MonthlyCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析

警告:Churn BY TotalCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析

8.3 总结

用户出现以下特征比较容易流失:

  • SeniorCitizen:青年人

  • Partner :单身

  • Dependents :无经济独立

  • InternetService:开通了 “Fiber optic 光纤网络”

  • OnlineSecurity:没开通“网络安全服务”

  • OnlineBackup:没开通“在线备份业务”

  • DeviceProtection:没开通通了“设备保护业务

  • TechSupport:没开通“技术支持服务”

  • Contract:“按月”签订合同方式

  • PaperlessBilling:开通电子账单

  • PaymentMethod:使用“电子支票”支付的人

我们可以在SQL(数据库)上找有以上特征的客户,进行精准营销,即可以降低用户流失。虽然特征选得越多,越精确,但覆盖的人群也会越少。故,我们还需要计算“特征”的【重要性】,将最为重要的几个特征作为筛选条件。

计算特征的【重要性】,是“分类视角”,接下来我们会挑选常见的分类模型,进行批量训练,然后挑出得分最高的模型,进一步计算“特征重要性”。

9.特征工程

9.1 提取特征

有前面的流失率与各个维度的相关系数柱状图可知:流失率与gender(性别)、PhoneService(电话服务)相关性几乎为0,可以筛选掉,而customerID是随机数,不影响建模,故可以筛选掉。最终得到特征 churn_var

churn_var=df.iloc[:,2:20]
churn_var.drop("PhoneService",axis=1, inplace=True)
churn_var.head()

结果如下:

9.2 处理“量纲差异大”

“MonthlyCharges"、"TotalCharges"两个特征跟其他特征相比,量纲差异大。

处理量纲差异大,有两种方法:

  1. 标准化

  2. 离散化

以上两种方法,哪个能让模型精度提高,就选哪个。根据模型的最后得分,我选了“离散化”来处理量纲差异大。

9.2.1 标准化
scaler = StandardScaler(copy=False)
scaler.fit_transform(churn_var[['MonthlyCharges','TotalCharges']])  #fit_transform拟合数据
churn_var[['MonthlyCharges','TotalCharges']]=scaler.transform(churn_var[['MonthlyCharges','TotalCharges']])  #transform标准化

print(churn_var[['MonthlyCharges','TotalCharges']].head() )#查看拟合结果

【输出】

9.2.2 特征离散化

特征离散化后,模型易于快速迭代,且模型更稳定。

1、处理'MonthlyCharges':

#查看'MonthlyCharges'列的4分位
churn_var['MonthlyCharges'].describe() 

离散操作 18.25=<churn_var['MonthlyCharges']<=35.5,标记 “1” 35.5<churn_var['MonthlyCharges']<=70.35,标记 “2” 70.35<churn_var['MonthlyCharges']<=89.85,标记 “3” 89.85=<churn_varf['MonthlyCharges']<=118.75,标记“4”

#用四分位数进行离散
churn_var['MonthlyCharges']=pd.qcut(churn_var['MonthlyCharges'],4,labels=['1','2','3','4'])
churn_var['MonthlyCharges'].head()

结果如下:

2、处理'TotalCharges':

#查看'TotalCharges'列的4分位
churn_var['TotalCharges'].describe()

结果如下:

离散操作:18=<churn_var['TotalCharges']<=402,标记 “1” 402<churn_var['TotalCharges']<=1397,标记 “2” 1397<churn_var['TotalCharges']<=3786,标记 “3” 3786<churn_var['TotalCharges']<=8684,标记 “4”

#用四分位数进行离散 
churn_var['TotalCharges']=pd.qcut(churn_var['TotalCharges'],4,labels=['1','2','3','4'])
churn_var['TotalCharges'].head()

【输出】

9.3 分类数据转换成“整数编码”

9.3.1 查看churn_var中分类变量的label(标签)
#自定义函数获取分类变量中的label
def Label(x):
    print(x,"--" ,churn_var[x].unique()) 
#筛选出数据类型为“object”的数据点
df_object=churn_var.select_dtypes(['object']) 
print(list(map(Label,df_object)))

结果如下:

通过同行百分比的“交叉分析”发现,label “No internetserive”的人数占比在以下特征[OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingTV]都是惊人的一致,故我们可以判断label “No internetserive”不影响流失率。因为这6项增值服务,都是需要开通“互联网服务”的基础上才享受得到的。不开通“互联网服务”视为没开通这6项增值服务,故可以将 6个特正中的“No internetserive” 并到 “No”里面。

churn_var.replace(to_replace='No internet service',value='No',inplace=True)

而特征MultipleLines的“ No phoneservice”在流失客户、留存客户样本中的人数占比几乎接近,且比较少,故可以将“ No phoneservice”并到“No”。

churn_var.replace(to_replace='No phone service',value='No',inplace=True)
df_object=churn_var.select_dtypes(['object']) 
print(list(map(Label,df_object.columns)))

结果如下:

9.3.2 整数编码

整数编码的方法有两种:

1、sklearn中的LabelEncoder()

2、pandas中的factorize 此处选用 LabelEncoder()

def labelencode(x):
    churn_var[x] = LabelEncoder().fit_transform(churn_var[x])
for i in range(0,len(df_object.columns)):
    labelencode(df_object.columns[i])
print(list(map(Label,df_object.columns)))

结果如下:

9.4 处理“样本不均衡”

分拆变量

x=churn_var
y=df['Churn'].values
print('抽样前的数据特征',x.shape)
print('抽样前的数据标签',y.shape)

【输出】 抽样前的数据特征 (7043, 17) 抽样前的数据标签 (7043,)

处理样本不均衡常用的方式有三种:

  1. 分层抽样

  2. 过抽样

  3. 欠抽样

笔者先后尝试了“分层抽样”和“欠抽样”,前者最终得到的模型中精度最高的是0.63,而后者最终得到的模型中精度最低是0.78,最高是0.84。所以说“抽样方式”的选择极为重要,大家要在这里多试错。

分层抽样

sss=StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
print(sss)
print("训练数据和测试数据被分成的组数:",sss.get_n_splits(x,y))
# 分拆训练集和测试集
for train_index, test_index in sss.split(x, y):
    print("train:", train_index, "test:", test_index)
    x_train,x_test=x.iloc[train_index], x.iloc[test_index]
    y_train,y_test=y[train_index], y[test_index]

“过抽样”让模型精度更高,故我选“过抽样”。

from imblearn.over_sampling import SMOTE
model_smote=SMOTE()
x,y=model_smote.fit_sample(x,y)
x=pd.DataFrame(x,columns=churn_var.columns)
#分拆数据集:训练集 和 测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)

输出数据集大小

print('过抽样数据特征:', x.shape,
      '训练数据特征:',x_train.shape,
      '测试数据特征:',x_test.shape)

print('过抽样后数据标签:', y.shape,
      '   训练数据标签:',y_train.shape,
      '   测试数据标签:',y_test.shape)

【输出】

过抽样后数据特征:(10348, 17) 训练数据特征:(7243, 17) 测试数据特征:(3105, 17) 过抽样后数据标签:(10348,)    训练数据标签:(7243,)    测试数据标签:(3105,)

10.数据建模

使用分类算法

Classifiers=[["Random Forest",RandomForestClassifier()],
             ["Support Vector Machine",SVC()],
             ["LogisticRegression",LogisticRegression()],
             ["KNN",KNeighborsClassifier(n_neighbors=5)],
             ["Naive Bayes",GaussianNB()],
             ["Decision Tree",DecisionTreeClassifier()],
             ["AdaBoostClassifier", AdaBoostClassifier()],
             ["GradientBoostingClassifier", GradientBoostingClassifier()],
             ["XGB", XGBClassifier()],
             ["CatBoost", CatBoostClassifier(logging_level='Silent')]  
]

训练模型

Classify_result=[]
names=[]
prediction=[]
for name,classifier in Classifiers:
    classifier=classifier
    classifier.fit(x_train,y_train)
    y_pred=classifier.predict(x_test)
    recall=recall_score(y_test,y_pred)
    precision=precision_score(y_test,y_pred)
    f1score = f1_score(y_test, y_pred)
    class_eva=pd.DataFrame([recall,precision,f1score])
    Classify_result.append(class_eva)
    name=pd.Series(name)
    names.append(name)
    y_pred=pd.Series(y_pred)
    prediction.append(y_pred)

11.模型评估

names=pd.DataFrame(names)
names=names[0].tolist()
result=pd.concat(Classify_result,axis=1)
result.columns=names
result.index=["recall","precision","f1score"]
result

【输出】 特征工程,采用“标准化”处理量纲差异,采用“分层抽样”处理样本不均衡。最终模型精度得分,最高分是0.63,是“朴素贝叶斯”模型

特征工程,采用“离散化”处理量纲差异,采用“过抽样”处理样本不均衡。最终模型精度得分,最高分是0.84,是“XGB”模型

12.基于“XGB”模型输出特征重要性

笔者尝试了两个算法分别输出“特征重要性”:CatBoost算法 和 XGB 算法

  • CatBoost算法

model = CatBoostClassifier()
model.fit(x_train,y_train,eval_set=(x_test, y_test),plot=True)
#特征重要性可视化
catboost=pd.DataFrame(columns=['feature','feature_importance'])
catboost['feature']=model.feature_names_
catboost['feature_importance']=model.feature_importances_
catboost=catboost.sort_values('feature_importance',ascending=False) #降序排列
plt.figure(figsize=(10,10))
plt.title('特征重要性')
sns.barplot(x='feature_importance',y='feature',data=catboost)

【输出】

-XGB 算法

model_xgb= XGBClassifier()
model_xgb.fit(x_train,y_train)
from xgboost import plot_importance
plot_importance(model_xgb,height=0.5)
plt.show()

【输出】

由于 XGB算法精度得分最高,故我们以XGB得到的“特征重要性”进行分析。【分析】

1、第一重要特征:tenure

plt.figure(figsize=(20,4))
sns.countplot(x='tenure',hue='Churn',data=df)

【输出】

【分析】 由图可知,流失客户集中在1-5号职位,运营团队需要重点关注1-5号职位。

2、第二重要特征:PaymentMethod

【分析】 使用“电子支票”支付的人更容易流失。

3、第三重要特征:MonthlyCharges 查看流失用户、留存用户在付费方面的偏好:'MonthlyCharges'、'TotalCharges',离散化后,可进行卡方检验,然后交叉分析。

  • 卡方检验:'MonthlyCharges'、'TotalCharges'

df['MonthlyCharges-']=churn_var['MonthlyCharges']
df['TotalCharges-']=churn_var['TotalCharges']
print('kf_var的卡方检验结果如下:','\n')
KF('MonthlyCharges-')
KF('TotalCharges-')

【输出】 kf_var的卡方检验结果如下:

Churn by MonthlyCharges 的卡方临界值是0.00,小于0.05,表明MonthlyCharges组间有显著性差异,可进行【交叉分析】

Churn by TotalCharges 的卡方临界值是0.00,小于0.05,表明TotalCharges组间有显著性差异,可进行【交叉分析】

  • 交叉分析

for i in ['MonthlyCharges','TotalCharges']:
    print('................Churn BY {}...............'.format(i))
    print(pd.crosstab(df['Churn'],df[i],normalize=0),'\n')

【输出】

18.25=<churn_var['MonthlyCharges']<=35.5,标记 “1” 35.5<churn_var['MonthlyCharges']<=70.35,标记 “2” 70.35<churn_var['MonthlyCharges']<=89.85,标记 “3” 89.85=<churn_varf['MonthlyCharges']<=118.75,标记“4” 【分析】 月付费70.35--118.75元的用户更容易流失

18=<churn_var['TotalCharges']<=402,标记 “1” 402<churn_var['TotalCharges']<=1397,标记 “2” 1397<churn_var['TotalCharges']<=3786,标记 “3” 3786<churn_var['TotalCharges']<=8684,标记 “4” 【分析】 总付费18--1397元的用户更容易流失

基于"MonthlyCharges"和“TotalCharges”画四分图:求两个维度的均值

 print('MonthlyCharges的均值是{:.2f},TotalCharges的均值是{:.2f}'.format(df['MonthlyCharges'].mean(),df['TotalCharges'].mean()))

流失客户四分图:

df_1=df[df['Churn']==1] #流失客户
df_0=df[df['Churn']==0] #留存客户
plt.figure(figsize=(10,10))   
sns.scatterplot('MonthlyCharges','TotalCharges',hue='Churn', palette=plt.cm.RdYlBu,data=df_1)
plt.axhline(y=df['TotalCharges'].mean(),ls="-",c="k")
plt.axvline(x=df['MonthlyCharges'].mean(),ls="-",c="green")

【输出】

【分析】 四分图的右下区域,流失客户比较集中,即总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失。

留存客户四分图

plt.figure(figsize=(10,10)) 
sns.scatterplot('MonthlyCharges','TotalCharges',hue='Churn', palette=plt.cm.RdYlBu_r,data=df_0)
plt.axhline(y=df['TotalCharges'].mean(),ls="-",c="k")
plt.axvline(x=df['MonthlyCharges'].mean(),ls="-",c="green")

【输出】

【结论】 综合“ 统计分析” 和 “XGB算法输出特征重要性” 得出流失客户有以下特征(依特征重要性从大到小排列):

  1. tenure:1-5号职位的用户比较容易流失

  2. PaymentMethod:使用“电子支票”支付的人

  3. MonthlyCharges 、TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失

  4. PaperlessBilling:开通电子账单

  5. Partner:单身

  6. OnlineBackup:没开通“在线备份业务”

  7. InternetService:开通了 “Fiber optic 光纤网络”

  8. TechSupport:没开通“技术支持服务”

  9. DeviceProtection:没开通通了“设备保护业务

  10. OnlineSecurity:没开通“网络安全服务”

  11. Contract:“按月”签订合同方式

  12. Dependents:无经济独立

  13. SeniorCitizen :青年人

  14. TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失


觉得还不错就给我一个小小的鼓励吧!


电信客户流失数据分析 这里写自定义目录标题电信客户流失数据分析研究背景提出问题数据集描述特征工程1、数据预处理1.1、特征类型处理1.2、缺失值处理1.3、异常值处理1.4、分类变量标签整理2、特征选择2.1、方差过滤2.2、卡方检验过滤2.3、模型整体效果过滤2.4、利用随机森林进行特征重要性筛选相关回归分析1、二联列联表的相关性度量2、连续型变量的差异检验3、多重对应分析4、Logistic回归分析分类与模型预测有效性1、决策树和随机森林2、支持向量机3、模型预测有效性总结与建议 电信客户流失数据分析 研究背景 用户流失率的 阅读详情

相关推荐

电信客户流失分析与预测

一、项目背景 近年来,不论是传统行业还是互联网行业,都面临着用户流失问题。研究表明,企业可以在一周内失去100个用户,而同时又得到另外一个用户,从表明上来看业绩没有受到任何影响,而实际上争取这些新用户所花费的宣传、促销等成本显然要比保持老用户昂贵的多,从企业投资回报程度的角度来看是非常不经济的。 维护好老用户的重要性主要体现在以下四个方面: 留住老用户可使企业的竞争更长久。 留住老用户还会使成本大幅度降低。 留住老用户,还会大大有利于发展新用户。用户口碑效应,如果1个满意的用户引发8笔潜在的生意,那么其中至

jackwang1780的博客 8309

《数据挖掘工程师实战》— 电信运营商:客户流失预警

数据分析算法应用之客户流失预警实战 四、分析与准备数据—开会与讨论 State:州名/区域 Account Length:账户长度 Area Code:区号 Phone:电话号码 ‘Int’l Plan:国际漫游需求与否 VMail Plan:参与活动 VMail Message:语音邮箱 Day Mins:白天通话分钟数 Day Calls:白天打电话个数 Day Charge:白天收费情况 Eve Mins:晚间通话分钟数 Eve Calls:晚间打电话个数 Eve Charge:晚间收费情况 Ni.

一粒飞鸿丶的博客 1552

大数据分析在用户流失预警模型中的准确性提升

《大数据分析在用户流失预警模型中的准确性提升》 关键词:大数据分析、用户流失预警、机器学习、算法优化、模型准确性 摘要:本文将深入探讨大数据分析在用户流失预

AI天才研究院 1276

实战 | 电信客户流失分析与预测

本文所有代码都通过运行!将从以下方面进行分析:1.背景 2.提出问题 3.理解数据 4.数据清洗 5.可视化分析 6.用户流失预测 7.结论和建议本项目带你根据以上过程详细分析电信客户数...

python爬虫人工智能大数据 1万+

电信客户流失预测实战:朴素贝叶斯建模与避坑指南

在机器学习分类任务中,客户流失分析是常见的业务应用场景,而朴素贝叶斯凭借其简洁的原理和高效的计算,成为快速建立基线的热门选择。该算法基于贝叶斯定理与条件独立假设,通过特征概率估计判断用户流失倾向,尤其适合特征维度适中、业务解释性要求高的场景。实际项目中,电信客户流失预测涉及大量类别型变量与连续型变量,数据处理质量直接影响模型效果。正确使用One-Hot编码、处理缺失值、构造有效特征(如合约期限、月费用分箱)是提升泛化能力的关键。通过交叉验证、ROC-AUC指标评估和阈值调整,朴素贝叶斯能在准确率与可解释性间

weixin_42651281的博客 329

CART决策树客户流失预测实战:从原理到工程落地

决策树是机器学习中基础且应用广泛的分类算法,其核心通过递归二分与基尼不纯度衡量节点纯度,构建出可解释的树形规则。CART决策树作为经典实现,无需数据标准化即可处理连续值与类别特征,训练成本低,输出规则可直接转化为业务语言,因此在客户流失预测、风控、精准营销等场景中常作为首选基线模型。以运营商客户流失预测为例,通过滑窗法定义流失标签,构造费用波动率、投诉次数等特征,借助scikit-learn训练CART模型,用混淆矩阵、AUC评估效果,并结合预剪枝与成本复杂度剪枝应对过拟合,配合class_weight与阈

weixin_29053383的博客 199

机器学习(一)——基于决策树算法建立用户流失预测模型

一、项目背景 1.1 流失用户定义 不同产品都存在不同的使用周期,因此在定义流失用户上,需要进行用户调研,如可对时隔1周、1个月、3个月、半年未下单客户进行用户调研,从而了解用户不再产生浏览和购买行为的原因,进而定义流失。 1.2 探究用户流失目的 研究用户流失的首要目的是避免用户继续流失,其次才是挽回流失。在研究过程中,可通过观察用户的生命周期来判断其流失原因: (1)获取期:新用户通过推广、宣传来到产品中,属尝鲜型; (2)提升期:用户有购买行为; (3)成...

weixin_48367833的博客 7980

电信用户流失预测数据集

电信用户流失预测数据集

深度分析|《电信用户流失预测模型Telco customer churn》(所有分类模型精度平均得分在0.8以上)

1、研究背景 1、做好“用户流失预测”可以降低营销成本。老生常谈,“新客户开发成本”是“老客户维护成本”的5倍。 2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。 3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户 2、提出问题 1、流失客户有哪些显著性特征? 2、当客户在哪些特征下什么条件下比较容易发生流失? 3、数据集描述 该数据是datafountain上的《电信客户流失数据》点...

fulk6667g78o8的专栏 6259

电信运营商客户流失分析与预测python源码+分析报告+数据+截图

电信运营商客户流失分析与预测python源码+分析报告+数据+截图 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

电信客户流失数据集,运营商流失客户数据集

这个数据集包含了电信服务客户的详细信息,旨在帮助分析和预测客户流失(Churn)。以下是该数据集的各列描述及其应用场景。 数据集内容 gender: 客户性别(男性/女性) SeniorCitizen: 是否为老年公民(1 = 是,0 = 否) Partner: 客户是否有伴侣(是/否) Dependents: 客户是否有受抚养人(是/否) tenure: 客户在公司停留的月数 PhoneService: 客户是否有电话服务(是/否) MultipleLines: 客户是否有多个电话线路(否,是,无电话服务) InternetService: 互联网服务类型(DSL, 光纤, 无) OnlineSecurity: 客户是否有在线安全服务(是,否,无互联网服务) OnlineBackup: 客户是否有在线备份服务(是,否,无互联网服务) DeviceProtection: 客户是否有设备保护服务(是,否,无互联网服务) TechSupport: 客户是否有技术支持服务(是,否,无互联网服务) StreamingTV: 客户是否有流媒体电视服务(是,否,无互联网服务) Streaming

作为文科生,我是如何转行数据挖掘工程师的,附电信用户实战案例

随着大数据的时代的来临,各个行业都受到了数据分析不同程度的影响和作用。尤其是在电信行业,数据分析已经逐渐成为电信运营商的战略优势之一。 大家好,我是一名CDA持证人,今天想跟大家分享一下,我如何从文科生转行成为了一名电信行业的数据挖掘工程师。 主要内容分成以下三块: 第一部分我作为文科生转行数据挖掘的历程; 第二部分关于目前从事数据挖掘,主要针对商业数据挖掘所需要掌握的一些技能; 第三部分案例分享:数据分析思维如何应用到电信行业,电信用户流失预测模型 01、文科生转行数据挖掘工程师的历程 首先看到第一部分.

m0_59164304的博客 567

Verilog除法器(32位无符号+带符号)

32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a reg_b 存放除数b reg_r 存放余数(初始清零) 具体做法: 做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正...

qq_38600065的博客 1万+

基于数据挖掘技术构建电信5G客户预测模型的研究与应用

标题:基于数据挖掘技术构建电信5G客户预测模型的研究与应用内容:1.摘要 随着 5G 技术的快速发展,电信运营商面临着如何精准识别潜在 5G 客户的挑战。本研究旨在基于数据挖掘技术构建电信 5G 客户预测模型,以提高营销效率和客户转化率。研究方法上,收集了大量电信客户的历史数据,包括通话时长、流量使用、套餐类型等,运用数据挖掘算法如逻辑回归、决策树和随机森林等进行建模。通过对模型的训练和验证,结果表明随机森林模型在预测 5G 客户方面表现最优,准确率达到了 85%。研究结论认为,基于数据挖掘技术构建的 5G

Candy5204的博客 1401

整理的15个公开且可直接使用的电力视觉输电线路领域数据集

而巡检数据是目前来说影响我们做科研的最大阻碍,为此本内容主要总结了,现有的且公开免费的巡检数据集,供大家使用。STN PLAD数据集133个航拍图像,五个电力部件:电力塔及其塔的ID、绝缘子,防震锤,联板(yoke),图像的尺寸在5472×3648到5472×3078。IDID数据集:2000张图像,包含三个类别,正常绝缘子,破损绝缘子和闪络绝缘子三个类别,用于目标检测的实验。TTPLA数据集,用于实例分割,1100张尺寸为3840×2160,包含两个类别,电力杆塔和电力线。主要用于电力杆塔的目标检测。

weixin_42048361的博客 5019

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7775

作为文科生,我是如何转行数据挖掘工程师的 | 附电信用户实战案例

CDA数据分析师 出品随着大数据的时代的来临,各个行业都受到了数据分析不同程度的影响和作用。尤其是在电信行业,数据分析已经逐渐成为电信运营商的战略优势之一。大家好,我是一名CDA持证人,今天想跟大家分享一下,我如何从文科生转行成为了一名电信行业的数据挖掘工程师。主要内容分成以下三块:第一部分我作为文科生转行数据挖掘的历程;第二部分关于目前从事数据挖掘,主要针对商业数据挖掘所需要掌握的一些技能...

weixin_38754337的博客 265

2019年7月28日解决战网BLZBNTBNA00000005BLZBNTBNA00000006BLZBNTBTS0000005DBLZBNTBTS0000004A 007D0 008A4 00840

Blizzard—Battle.net—2019年7月28解决战网BLZBNTBNA00000005BLZBNTBNA00000006BLZBNTBTS0000005DBLZBNTBTS0000004A 007D0 008A4 008402019年7月28日再次更新写在前面■■■ 排查网路问题 ■■■■■■ 排查电脑自身问题 ■■■■尝试重置internet设置■网络的设置和防火墙规则■如果还是不...

MCGC高质人类协作会-MCG贴吧 3万+

决策树算法建立电信客户流失模型

原文链接:http://tecdat.cn/?p=1603▍数据概览使用收视服务的用户最多,订阅付费节目其次,订阅游戏业务用户数量最少。订阅收视业务的用户增长最快,其次是订阅游戏业务的用户,而订阅付费节目的用户增长缓慢,同时流失严重。相比较16年,用户净增长37%,然而17年上半年的流失比例相比较去年增加8%。▍不同维度的流失率比较我们比较了不同营业厅和是否发放数字机顶盒的用户流失情况。...

拓端研究室TRL 486

weblogic等保测评操作过程

weblogic网络安全等级测评保护操作

qq_48257021的博客 2761

从标记基因到功能分析:手把手教你人工注释单细胞亚群的完整流程

本文详细介绍了人工注释单细胞亚群的完整流程,从标记基因筛选到功能分析验证,特别针对肿瘤微环境、发育轨迹等复杂场景提供解决方案。通过差异表达分析、多维数据整合和实验验证,帮助研究者准确识别细胞类型,提升单细胞转录组研究的生物学解读深度。

jenkins8butler的博客 245

专题|R语言、SPSS电信客户流失预测实例汇总:KNN、决策树、聚类、RFM分群、挽留策略研究

本文以我国电信行业进入存量竞争时代为背景,针对运营商客户流失问题,通过构建客户行为特征指标体系,结合C5.0决策树与聚类分析模型,实现客户流失预测与精准营销。研究发现手机品牌、国际通话占比等6项关键指标对流失行为具有显著影响,并提出基于客户分群的差异化挽留策略,为运营商提升存量运营效率提供数据支持。本文针对电信行业客户流失问题,以某运营商历史数据为基础,通过构建特征工程体系,结合K近邻算法建立预测模型。

大数据部落 1226

强化学习在视觉导航中的应用

强化学习在视觉导航中的应用​ ,人工智能,计算机视觉,大模型,AI,强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境进行交互,以最大化累积奖励为目标的机器学习范式。它不依赖于预定义的规则或大量标注数据,而是让智能体在试错过程中学习最优策略。计算机视觉(Computer Vision)则赋予智能体 “观察” 环境的能力,使其能够从图像或视频中提取有用信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

是什么用户_用户运营本质是什么?从3个方面解析用户流失预警体系如何搭建...

流失用户运营本质是什么?其本质就是基于用户大数据分析的流失预警。流失预警需要运营能够根据用户流失特征准确预测哪些用户面临流失?是平台的高价值用户还是一般价值用户?我们从三个方面来探讨用户流失预警体系如何搭建。流失用户运营本质是什么?这是用户运营中面临的一个最具挑战的课题。相信许多企业非常关注这个课题,也许每天运营大boss会盯着用户数据面板大声呵斥:用户流失率为什么这么高?你们在做流失用户的召回工...

weixin_30392607的博客 418

【SpringBoot 3.x 第56节】再见 Feign?原生 HTTP 接口强势上位,这才是微服务调用的正确姿势!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1017

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

电信用户流失预测:决策树模型构建与业务应用

用户流失预测是数据挖掘在商业智能中的核心应用,通过机器学习算法识别潜在流失客户。决策树模型因其可解释性和处理混合特征的优势,成为分类预测的首选方法。在电信行业,基于消费行为、服务记录等特征构建的预测模型,能准确识别高风险用户并制定针对性挽留策略。特征工程中的时间窗口选择、交叉特征构建直接影响模型效果,而SMOTE算法可有效解决样本不均衡问题。实际部署时需关注模型解释性,通过SHAP值分析验证特征重要性,并将预测结果转化为可执行的业务动作,最终实现降低流失率、提升运营效率的目标。

weixin_29172963的博客 6

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 「干货满满」AI工程师成长记 - 工作方法!
下一篇: 我抄我自己的论文,能算学术不端吗?有学者做了一份论文复用指南
Wang_AI
博客等级 码龄12年 997粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值