ITPub博客

首页 > 数据库 > 数据库开发技术 > 电信流失用户画像

电信流失用户画像

原创 数据库开发技术 作者:阿黎逸阳的代码 时间:2023-04-16 18:00:28 0 删除 编辑

三大运营商电信、联通、移动,都想扩大自己的客户群体。

据研究,获取新客户所需的成本远高于保留现有客户的成本。

因此为了满足在激烈竞争中的优势,提前预测出用户是否会流失,采取保留措施成为一大挑战。

本文和你一起探索电信流失客户的画像,后续文章会对电信用户进行流失预测。

本文目录
  1. 数据读取与分析

    1.1 数据集介绍

    1.2 读取数据

    1.3 客户流失概率

    1.4 不同指标下各类别对应的客户流失率

  2. 流失客户画像分析-明细

    2.1 是否为老年入

    2.1 是否有伴侣

    2.3 是否有家属

    2.4 是否开通电话服务业务

    2.5 是否开通多线业务

    2.6 是否开通互联网业务

    2.7 是否开通网络安全服务

    2.8 是否开通在线备份

    2.9 是否开通设备保护

    2.10 是否订购技术支持服务

    2.11 是否订购网络电视

    2.12 是否订购网络电影

    2.13 签订合同方式

    2.14 是否开通电子账单

    2.15 客户端支付方式

    2.16 使用产品时长

    2.17 月费用

    2.18 总费用

  3. 流失客户画像分析-总结


一、数据读取与分析

 1   数据集介绍

首先介绍一下数据集,它总共包含了7043个用户的信息。

每行存储一个用户的样本,每条样本包含21条属性,由用户基本信息、开通业务信息、签署合约信息、目标变量组成,具体如下:

变量名 描述 数据类型 所属特征群或标签
customerID 客户ID 字符串 基本信息
gender 性别 字符串 基本信息
SeniorCitizen 是否为老年人 整型 基本信息
Partner 是否有配偶 字符串 基本信息
Dependents 是否有家属 字符串 基本信息
tenure 入网月数 整型 基本信息
PhoneService 是否开通电话业务 字符串 开通业务信息
MultipleLines 是否开通多线业务 字符串 开通业务信息
InternetService 是否开通互联网业务 字符串 开通业务信息
OnlineSecurity 是否开通在线安全业务 字符串 开通业务信息
OnlineBackup 是否开通在线备份业务 字符串 开通业务信息
DeviceProtection 是否开通设备保护业务 字符串 开通业务信息
TechSupport 是否开通技术支持业务 字符串 开通业务信息
StreamingTV 是否开通网络电视业务 字符串 开通业务信息
StreamingMovies 是否开通网络电影业务 字符串 开通业务信息
Contract 合约期限 字符串 签署合约信息
PaperlessBilling 是否采用电子结算 字符串 签署合约信息
PaymentMethod 付款方式 字符串 签署合约信息
MonthlyCharges 每月费用 浮点型 签署合约信息
TotalCharges 总费用 字符串 签署合约信息
Churn 客户是否流失 字符串 目标变量


 2   读取数据

接着把数据读取到Python中进行预处理,读取数据代码如下:

import osimport numpy as npimport pandas as pd 
os.chdir(r'F:\公众号\电信客户流失')data = pd.read_csv('Customer_Churn.csv')data.head(2)

参数解释:

import:导入库。

os.chdir:设置数据读取的位置。

pd.read_csv:读取csv格式的数据。

data.head(2):打印data数据的前2行。

得到结果:


 3   客户流失概率

然后看下客户流失的概率,代码如下:

data.Churn.value_counts()/len(data.Churn)

得到结果:

No     0.73463Yes    0.26537Name: Churn, dtype: float64

可以发现流失客户占比0.265。


 4   不同指标下各类别对应的客户流失率

最后看下不同指标下各类别客户流失的概率,代码如下:

data['y'] = 0data['y'][data['Churn'] =='Yes'] = 1#流失客户y标签值为1否则为0for i in data.columns[1:-2]:    pivot_result = pd.pivot_table(data, values='y', index=[i], aggfunc=['count', np.sum, np.mean], margins=True )    #对不同指标求缺失率    pivot_result.columns = ['客户数', '流失客户数', '客户流失率']    #重命名pivot_table列名    pivot_result['客户流失率'] = pivot_result['客户流失率'].apply(lambda x:round(x, 3))    #客户流失率值保留3位小数    display(pivot_result)    #展示结果    print('================================')

得到结果(由于循环把全量变量进行了分析,这里只放一个指标进行展示,在后文再展开说明):

可以发现在性别指标中,男生和女生分别对应的客户流失率为0.269和0.262,跟整体的客户流失率0.265差别不大。

说明性别指标对客户流失的影响不大。

二、流失客户画像分析-明细

 1   是否为老年人

是否为老年人指标不同值对应的客户流失率如下:

老年人和非老年人的客户数分别为1142和5901,在客户数上老年人的占比要远小于非老年人。

老年人的流失率为0.417,远高于非老年人的流失率0.236。

说明如果想增加用户留存,可以考虑给老年人一些优惠活动或采取一些激励措施来减少老用户的流失。


 2   是否有伴侣

是否有伴侣指标不同值对应的客户流失率如下:

有伴侣和没有伴侣的客户数分别为3402和3641,在客户数上两者分布较为均匀。

但是没有伴侣的客户流失率为0.33,远高于有伴侣客户的流失率0.197。

客户留存的方式可以根据不同地区不同人文习惯采取相应的措施。


 3   是否有家属

是否有家属指标不同值对应的客户流失率如下:

有家属和没有家属的客户数分别为2110和4933,在客户数上有家属的少于没有家属的。

同时有家属的客户流失率为0.155,低于没有家属客户的流失率0.313。


 4   是否开通电话服务业务

是否开通电话服务业务指标不同值对应的客户流失率如下:

开通和没开通电话服务业务的客户数分别为6361和682,开通电话服务业务的客户数远超没开通的。

开通和没开通电话服务业务分别对应的客户流失率为0.267和0.249,客户流失率没开通电话服务业务的略高于开通的。

说明是否开通电话服务业务指标对客户流失的影响不大。


 5   是否开通多线业务

是否开通多线业务指标不同值对应的客户流失率如下:

没有开通、没有电话服务和开通的客户数分别为3390、682和2971,没有开通多线业务的客户数最多,没有电话服务的客户数最少。

没有开通、没有电话服务和开通的客户流失率分别为0.25、0.249和0.286,没有开通和没有电话服务的客户流失率非常接近,略低于开通多线业务的客户。

说明是否开通多线业务指标对客户流失的影响不大。


 6   是否开通互联网业务

是否开通互联网业务指标不同值对应的客户流失率如下:

开通数字用户线路、光纤和没有开通互联网业务的客户数分别为2421、3096和1526,开通光纤的客户数最多,没有开通互联网业务的客户数最少。

客户流失率最高的是开通光纤业务的客户,值为0.419,其次是开通数字用户线路的客户,值为0.19,最低的是没有开通互联网业务的客户,值为0.074。


 7   是否开通网络安全服务

是否开通网络安全服务指标不同值对应的客户流失率如下:

没有开通网络安全服务、没有互联网服务和开通网络安全服务的客户数分别为3498、1526和2019。

客户流失率最高的是没有开通网络安全服务的客户,值为0.418,其次是开通网络安全服务的客户,值为0.146,最低的是没有网络服务的客户,值为0.074。


 8   是否开通在线备份

是否开通在线备份指标不同值对应的客户流失率如下:

没有开通在线备份、没有互联网服务和开通在线备份的客户数分别为3088、1526和2429。

客户流失率最高的是没有开通在线备份的客户,值为0.399,其次是开通在线备份的客户,值为0.215,最低的是没有网络服务的客户,值为0.074。


 9   是否开通设备保护

是否开通设备保护指标不同值对应的客户流失率如下:

没有开通设备保护、没有互联网服务和开通设备保护的客户数分别为3095、1526和2422。

客户流失率最高的是没有开通设备保护的客户,值为0.391,其次是开通设备保护的客户,值为0.225,最低的是没有网络服务的客户,值为0.074。


 10   是否订购技术支持服务

是否订购技术支持服务指标不同值对应的客户流失率如下:

没有订购技术支持服务、没有互联网服务和订购技术支持服务的客户数分别为3473、1526和2044。

客户流失率最高的是没有订购技术支持服务的客户,值为0.416,其次是订购技术支持服务的客户,值为0.152,最低的是没有网络服务的客户,值为0.074。


 11   是否订购网络电视

是否订购网络电视指标不同值对应的客户流失率如下:

没有订购网络电视、没有互联网服务和订购网络电视的客户数分别为2810、1526和2707。

客户流失率最高的是没有订购网络电视的客户,值为0.335,其次是订购网络电视的客户,值为0.301,最低的是没有网络服务的客户,值为0.074。

 12   是否订购网络电影

是否订购网络电影指标不同值对应的客户流失率如下:

没有订购网络电影、没有互联网服务和订购网络电影的客户数分别为2785、1526和2732。

客户流失率最高的是没有订购网络电影的客户,值为0.337,其次是订购网络电影的客户,值为0.299,最低的是没有网络服务的客户,值为0.074。

 13   签订合同方式

签订合同方式指标不同值对应的客户流失率如下:

Month-to-month、One year和Two year的客户数分别为3875、1473和1695。

客户流失率最高的是Month-to-month的客户,值为0.427,其次是One year的客户,值为0.113,最低的是Two year的客户,值为0.028。

 14   是否开通电子账单

是否开通电子账单指标不同值对应的客户流失率如下:

没有开通电子账单和开通电子账单的客户数分别为2872和4171。

开通电子账单客户流失率较高,值为0.336,没有开通电子账单客户流失率为0.163。


 15   客户端支付方式

客户端支付方式指标不同值对应的客户流失率如下:

Bank transfer、Credit card、Electronic check和Mailed check的客户数分别为1544、1522、2365和1612。

客户流失率最高的是Electronic check(电子支票)的客户,值为0.453,其次是Mailed check(邮寄支票)的客户,值为0.191,Bank transfer(银行转账)和Credit card(信用卡)最低,值分别为0.167和0.152。


由于使用产品时长、月费用、总费用三个指标的值个数较为分散,应用上面的pivot_table分析得不出结论,于是采用IV分析法。

 16   使用产品时长

首先定义计算IV的函数,代码如下:

#切割变量def bin_cut(data,x,y,n=10): #x为待分箱的变量,y为target变量.n为分箱数量    total = y.count()         #计算总样本数    bad = y.sum()             #计算坏样本数    good = total-bad          #计算好样本数    if x.value_counts().shape[0]==2:        d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.cut(x,2)})    elif x.value_counts().shape[0]<=50:        cutOffPoints = ChiMerge_MaxInterval_Original(data, i, 'flag')        cutOffPoints.append(max(data[i]))        cutOffPoints.insert(0, min(data[i])-0.1)        d1 = pd.DataFrame({'x':data_1[i],'y':data_1['flag'],'bucket':pd.cut(data_1[i],cutOffPoints)})    else:        d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.qcut(x,n,duplicates='drop')}) #用pd.cut实现等频分箱    d2 = d1.groupby('bucket',as_index=True)     #按照分箱结果进行分组聚合    d3 = pd.DataFrame(d2.x.min(),columns=['min_bin'])    d3['min_bin'] = d2.x.min()  #箱体的左边界    d3['max_bin'] = d2.x.max()  #箱体的右边界    d3['bad'] = d2.y.sum()      #每个箱体中坏样本的数量    d3['total'] = d2.y.count()  #每个箱体的总样本数    d3['bad_rate'] = d3['bad']/d3['total']  #每个箱体中坏样本所占总样本数的比例    d3['badattr'] = d3['bad']/bad           #每个箱体中坏样本所占坏样本总数的比例    d3['goodattr'] = (d3['total'] - d3['bad'])/good    #每个箱体中好样本所占好样本总数的比例    d3['woe'] = np.log(d3['badattr']/d3['goodattr'])   #计算每个箱体的woe值    iv = ((d3['badattr']-d3['goodattr'])*d3['woe']).sum()      #计算变量的iv值    d4 = (d3.sort_values(by='min_bin')).reset_index(drop=True) #对箱体从大到小进行排序    cut = []    cut.append(float('-inf'))    for i in d4.min_bin:        cut.append(i)    cut.append(float('inf'))    woe = list(d4['woe'].round(3))    return iv,cut,woe,d4

然后计算使用产品时长的IV值,代码如下:

i = 'tenure'iv,cut,woe,d4 = bin_cut(data,data[i],data['y'],n=10)print('===========', i, '============')print('iv=', iv)d4

入参详解:

data:数据集

data[i]:待计算IV的变量

data['y']:因变量y

得到结论:

使用产品时长变量的IV值为0.823,一般变量IV值高于0.3,属于强变量,即对于客户流失有强相关。

从bad_rate一列可以看出,入网时长越短,客户流失率越高。


 17   月费用

计算月费用的IV值,代码如下:

i = 'MonthlyCharges'iv,cut,woe,d4 = bin_cut(data,data[i],data['y'],n=10)print('===========', i, '============')print('IV=', iv)d4

得到结论:

月费用变量的IV值为0.364,一般变量IV值高于0.3,属于强变量,即对于客户流失有强相关。

从bad_rate一列可以看出,月费用越低,客户流失率越低,但是当月费用高于100元时,流失率有所下降。


 18   总费用

计算总费用的IV值,代码如下:

i = 'TotalCharges'data[i] = data[i].fillna(0)data[i] = data[i].replace(' ', 0).astype(float)iv,cut,woe,d4 = bin_cut(data,data[i],data['y'],n=10)print('===========', i, '============')print('IV=', iv)d4

得到结论:

 总费用变量的IV值为0.332,一般变量IV值高于0.3,属于强变量,即对于客户流失有强相关。

从bad_rate一列可以看出,总费用越低,客户流失率越高,可能和客户是新用户相关。


三、流失客户画像分析-总结

总结的流失客户画像如下:

至此,电信流失客户画像已讲解完毕。后续文章会对电信客户流失进行预测,敬请期待。

往期回顾:
白羊座
520表白代码合集
黑客帝国中的代码雨
逻辑回归项目实战-附Python实现代码
Python绘制米老鼠,为余生请多指教打call
Python常用函数合集1—clip函数、range函数等



扫一扫关注我

13162366985

投稿微信号、手机号

原文作者:阿黎逸阳的代码;如有侵权,请联系管理员删除。

下一篇: 企业欺诈识别
请登录后发表评论 登录
全部评论

注册时间:2020-02-15

  • 博文量
    282
  • 访问量
    130893