电信行业用户流失预警案例——python实现多模型预测

常见的几种流失预警模型 建立预警模型的目的是提前识别潜在流失用户,为挽留用户赢得时间。 流失预警模型,不应该只是单一的模型,而应该是一系列模型。预警模型的优劣通常用准确率、召回率来衡量。准确率:预测为流失的用户中,有多少真的流失。召回率:真实的流失用户中,有多少被预测为流失。 对于结果类的预测模型,只关注预测的准确性。比如,预测股票的涨跌,只要模型预测准确,按预测结果操作即可。但对于策略类的预测模型,预测只是第一步,还需... 阅读详情

预警流失项目

代码及数据文件下载地址:电信行业用户流失预警案例——python实现多模型预测

#导入所需的库
import numpy as nm
import pandas as pd
import sklearn
#将数据文件转化为csv文件
#csv文件是逗号分隔文件,可以使用excel查看,便于后期处理。
""""
import csv
with open('list1_test.csv', 'w+', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')
    with open('list1_test.txt', 'r', encoding='utf-8') as filein:
        for line in filein:
            line_list = line.strip('\n').split(',')   #数据之间以,间隔
            spamwriter.writerow(line_list)
with open('list2_test1.csv', 'w+', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')
    with open('list2_test1.txt', 'r', encoding='utf-8') as filein:
        for line in filein:
            line_list = line.strip('\n').split(',')   #数据之间以,间隔
            spamwriter.writerow(line_list)
with open('list2_test2.csv', 'w+', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')
    with open('list2_test2.txt', 'r', encoding='utf-8') as filein:
        for line in filein:
            line_list = line.strip('\n').split(',')   #数据之间以,间隔
            spamwriter.writerow(line_list)
with open('list3_test.csv', 'w+', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')
    with open('list3_test.txt', 'r', encoding='utf-8') as filein:
        for line in filein:
            line_list = line.strip('\n').split(',')   #数据之间以,间隔
            spamwriter.writerow(line_list)
"""

合并数据文件

  调用pandas库中的merge函数,设置d_userid为合并标识,使用左连接方式,将用户所有信息连接到一个表格中,合并前需删除多余的month_id数据列,否则在合并时会出现填充错误。读取合并文件时设置参数为utf_8,否则会出现乱码。

#删除month_id数据列
inputfile1=r'month1list1.csv'
inputdata1=pd.read_csv(inputfile1,low_memory=False)
inputdata1=inputdata1.drop(['month_id'],axis=1)
inputfile2=r'month1list2a.csv'
inputdata2=pd.read_csv(inputfile2,low_memory=False)
inputdata2=inputdata2.drop(['month_id'],axis=1)
inputfile3=r'month1list2b.csv'
inputdata3=pd.read_csv(inputfile3,low_memory=False)
inputdata3=inputdata3.drop(['month_id'],axis=1)
outfile = r'month1list3.csv'
outdata = pd.read_csv(outfile,low_memory=False)
outdata =outdata.drop(['month_id'],axis=1)
#合并采用左连接方式
#第一次合并
outfile1 = pd.merge(outdata,inputdata1,left_on='d_userid',right_on='d_userid',how='left')
outfile1.to_csv('outfile.csv',encoding='utf_8',index=False)
outfile = r'outfile.csv'
outdata = pd.read_csv(outfile,low_memory=False)
#第二次合并
outfile2 = pd.merge(outdata,inputdata2,left_on='d_userid',right_on='d_userid',how='left')
outfile2.to_csv('outfile.csv',encoding='utf_8',index=False)
outfile = r'outfile.csv'
outdata = pd.read_csv(outfile,low_memory=False)
#第三次合并
outfile3 = pd.merge(outdata,inputdata3,left_on='d_userid',right_on='d_userid',how='left')
#文件保存
outfile3.to_csv('outfile.csv',encoding='utf_8',index=False)

数据去重

  通过调用drop_duplicates()方法,以d_userid作为唯一标识,去除数据集中的重复数据。

#数据去重
initfile_locate=r'outfile.csv'
#打开文件
initfile=pd.read_csv(initfile_locate,encoding='utf-8',low_memory=False)
initfile.drop_duplicates(subset='d_userid',inplace=True)
#保存文件
initfile.to_csv(initfile_locate,encoding='utf_8',index=False)
#查看去重后的数据集信息
initfile.shape
(150822, 29)
#查看去重后的数据前十项
initfile.head(10)
d_userid mou dou arpu mou_var dou_var arpu_var sms flux_4g call_ring ... brand_code start_date end_date service_type pay_mode cert_age chnl_type product_class_desc comp_type activity_type
0 1000925 165 349 30 22.34 -182.69 -5.95 1 1.00 24 ... 3G03 2017/11/1 0:00 2050/12/31 0:00 40AAAAAA 1 43.0 社会实体渠道 NaN 无 单卡
1 1000927 141 0 18 -4.60 0.00 0.00 0 0.00 18 ... 3G03 2017/1/1 0:00 2050/12/31 0:00 20AAAAAA 1 53.0 社会实体渠道 NaN 无 单卡
2 1000929 163 2 18 40.14 0.13 4.12 0 0.00 23 ... 3G03 2017/12/9 12:59 2050/12/31 0:00 40AAAAAA 1 46.0 社会实体渠道 NaN 无 单卡
3 1000930 37 475 18 -4.86 22.12 0.00 0 0.00 2 ... 3G03 2017/5/28 10:13 2050/12/31 0:00 20AAAAAA 1 59.0 营业厅 NaN 无 单卡
4 1000932 6 147 18 1.00 28.06 4.15 0 0.36 1 ... 3G03 2017/12/7 18:36 2050/12/31 0:00 40AAAAAA 1 30.0 社会实体渠道 NaN 无 单卡
5 1001009 18 6 18 3.80 1.01 4.11 0 1.00 3 ... 3G03 2017/12/1 14:59 2050/12/31 0:00 20AAAAAA 1 21.0 社会实体渠道 NaN 无 单卡
7 1001010 97 0 19 -13.34 0.00 0.90 0 0.00 6 ... 3G03 2017/3/11 10:55 2050/12/31 0:00 20AAAAAA 1 32.0 营业厅 NaN 无 单卡
9 1001012 154 176 23 -20.23 -15.74 0.58 0 0.98 6 ... 3G03 2017/8/1 0:00 2050/12/31 0:00 40AAAAAA 1 46.0 营业厅 NaN 无 单卡
11 1001014 69 5 14 16.26 -0.14 4.56 0 1.00 10 ... 3G03 2017/10/13 15:24 2050/12/31 0:00 20AAAAAA 1 64.0 营业厅 NaN 无 单卡
13 1001016 8 0 13 0.23 0.01 4.22 0 0.00 0 ... 3G03 2017/11/15 9:10 2018/4/30 23:59 20AAAAAA 1 48.0 社会实体渠道 NaN 无 单卡

10 rows × 29 columns

#统计显示数据集相关信息
initfile.columns
initfile.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 150822 entries, 0 to 150827
Data columns (total 29 columns):
 #   Column              Non-Null Count   Dtype  
---  ------              --------------   -----  
 0   d_userid            150822 non-null  int64  
 1   mou                 150822 non-null  int64  
 2   dou                 150822 non-null  int64  
 3   arpu                150822 non-null  int64  
 4   mou_var             150822 non-null  float64
 5   dou_var             150822 non-null  float64
 6   arpu_var            150822 non-null  float64
 7   sms                 150822 non-null  int64  
 8   flux_4g             150822 non-null  float64
 9   call_ring           150822 non-null  int64  
 10  unicom_score        150822 non-null  float64
 11  innet_months        150822 non-null  int64  
 12  is_card             150822 non-null  int64  
 13  is_group            150822 non-null  int64  
 14  is_lv               150822 non-null  int64  
 15  is_trans            150822 non-null  int64  
 16  is_acct_lost        150822 non-null  int64  
 17  product_mode        150808 non-null  float64
 18  product_id          150808 non-null  float64
 19  brand_code          150808 non-null  object 
 20  start_date          150808 non-null  object 
 21  end_date            150808 non-null  object 
 22  service_type        150822 non-null  object 
 23  pay_mode            150822 non-null  object 
 24  cert_age            146287 non-null  float64
 25  chnl_type           150822 non-null  object 
 26  product_class_desc  82618 non-null   object 
 27  comp_type           150822 non-null  object 
 28  activity_type       150822 non-null  object 
dtypes: float64(8), int64(12), object(9)
memory usage: 34.5+ MB

数据集分析

  通过使用matplotlib.pyplot中的相关方法对数据进行可视化分析,通过绘图查看数据分布和相关关系,通过绘制热图查看与用户流失最相关的15个 因素,便于后期建模预测。

#导入绘图分析相关包
import matplotlib.pyplot as plt
#可以直接在python console里面生成图像。
%matplotlib inline
import seaborn as sns
color=sns.color_palette()
sns.set_style('darkgrid')
#查看用户流失列的数据分布
initfile["is_acct_lost"].value_counts().plot(kind = 'bar')
<AxesSubplot:>

在这里插入图片描述

#查看低价值用户数量分布
initfile["is_lv"].value_counts().plot(kind = 'bar')
<AxesSubplot:>

在这里插入图片描述

#热图绘制,查看与用户流失最相关的因素
para = 15
#查看相关度最高的15个特征
corrmat = initfile.corr() #获得相关性矩阵
cols = corrmat.nlargest(para,"is_acct_lost").index
cm = nm.corrcoef(initfile[cols].values.T)
#绘制热图
sns.set(font_scale=1.25)
hm = sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={
   
   'size':10},yticklabels=cols.values,
                 xticklabels=cols.values)
plt.show()

在这里插入图片描述

  通过热图可以发现与用户流失最相关的因素分别是:is_lv(低价值用户),arpu(月均出账费),arpu_var(月出账费-方差),product_id(产品 编码),is_card(是否单卡),is_trans(是否转网),is_group(是否集客),dou(户均上网流量),sms(短信使用条数),flux_4g(4G流量使用量), call_ring(呼叫圈个数),cert_age(年龄),mou(户均通话时长)。接下来对其中的部分因素进行分析,并选择多个因素进行相关分析。

#查看is_trans(转网)与is_acct_lost的相关关系。
cust_0=initfile["is_trans"][initfile["is_acct_lost"]==0].value_counts()
cust_1=initfile["is_trans"][initfile["is_acct_lost"]==1
用python进行分析电信行业的用户流失预测(二)--数据可视化 文章目录前言四、数据可视化呈现1、查看流失客户占比2、性别、老年人、配偶、亲属对流客户流失率的影响3、提取特征4、构造相关性矩阵5、使用热地图显示相关系数6、使用one-hot编码7、电信用户是否流失与各变量之间的相关性8、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视、网络电影和无互联网服务对客户流失率的影响 前言 这篇文章紧跟用python进行分析的用户流失预测实操,以电信行业为例的后续内容,聚焦可视化操作。 四、数据可视化呈现 1、查看流失客户占比 ##数据可视化分析 # #1,查看 阅读详情

相关推荐

机器学习——用户流失预警

文章目录前言一、 数据清洗与格式转换二、 探索性数据分析 前言 客户流失预警 提示:以下是本篇文章正文内容,下面案例可供参考 一、 数据清洗与格式转换 import warnings warnings.filterwarnings('ignore') #忽视 import pandas as pd import numpy as np # 加载数据集 churn_df = pd.read_csv('churn.csv') col_names = churn_df.columns.tolist() #所

weixin_44822403的博客 1342

电信用户流失预警分析(python)

1用户流失预测分析 简单介绍下使用的基本场景是:业务部门希望数据部门能对流失用户做分析,找到流失用户的典型特征。 · 当客户在哪些特征的什么条件下比较容易发生流失行为 · 到底流失客户的哪些特性最显著 · 业务部门就能针对这些客户的典型特征做有针对性的业务优化及挽回动作。 · 数据集大概率会出现样本不均衡问题,原因是流失用户一定是少量的 代码: 填充缺失值和样本均衡 填充缺失值使用的是均值...

markliu的博客 2001

Kaggle案例精选——电信客户流失预测(Telecom Customer Churn Prediction)Part One:数据说明;数据导入、处理;数据总览;描述性分析

数据集来自kaggle社区,电信客户流失数据分析与预测。 此部分包括数据导入、简单处理、描述性统计分析等内容。 设计饼图、柱状图、组合散点图和表格等的绘制技术。

Haoyu_xie的博客 9112

基于Python电信运营商客户流失分析与预测

标题:基于Python电信运营商客户流失分析与预测内容:1.摘要 本研究旨在通过Python编程语言对电信运营商客户流失进行深入分析与预测,识别影响客户流失的关键因素并构建高效的预测模型。基于某电信公司提供的10,000条客户数据,包含月度费用、合约类型、服务使用时长、客户 demographics 等23个特征变量,采用逻辑回归、随机森林和XGBoost三种机器学习算法进行建模与比较。数据预处理阶段完成了缺失值填补、类别变量编码及特征标准化,同时通过SMOTE方法解决样本不平衡问题(流失客户占比约26.5

Candy5204的博客 1548

大数据分析案例-基于朴素贝叶斯算法构建电信客户流失分析预警模型

在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发展状态,转而进入稳步发展阶段。近年来,随着通信的成本逐年下降,电信市场用户覆盖率近乎100%,几乎没有可开发的新市场,移动、联通、电信三大电信企业完全占据了电信服务市场,电信行业的不断进步,使得各大电信运营商自身服务体系不断完善,目前我国的三大运营商均实现了全业务经营 ,这意味着行业内存在产品、服务、模式等方面的高度同质化,企业间难以实现差异化竞争优势。现如今的竞争环境,迫使运营商的经营重点向有利于电信消费者的方向移动,为了维持客户的保有量,对

m0_64336780的博客 1万+

大数据分析案例-基于决策树算法构建银行客户流失预测模型

银行客户流失是指银行的客户终止在该行的所有业务并销号。但在实际运营中,对于具体业务部门,银行客户流失可以定位为特定的业务终止行为。商业银行的客户流失较为严重,流失率可达20%。而获得新客的成本是维护老客户的5倍。因此,从海量客户交易数据中挖掘出对流失有影响的信息,建立高效的客户流失预警体系尤为重要。时代与技术的发展使得数据的获取与挖掘成为可能,本实验将通过python对用户做特征分析和顾客流失分析,帮助银行发现并改善顾客体验,以及确定挽留的目标顾客并帮助银行制定方案。

m0_64336780的博客 1万+

工作:三菱PLC与伺服之CC-Link IE Field Network通讯应用

CC-LINK-IE

好记性不如烂笔头 2万+

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.csdn.net/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3927

esp32 python开发环境搭建_eclipse esp32开发环境搭建

安装方法基本是按照官网提供的方法来操作https://github.com/espressif/idf-eclipse-plugin#GettingStarted但是官网的方法安装之后还是不能编译成功的,第一次编译会出现一下问题问题1:Building in: E:\eclipse-workspace\helloworlk\buildcmake -G Ninja -DCMAKE_TOOLCHAIN...

weixin_39978276的博客 1258

SAP CEWB 高效批量调整工艺路线与BOM的实战指南

本文详细介绍了SAP CEWB工具在批量调整工艺路线与BOM中的高效应用。通过实战案例和操作指南,帮助制造业企业快速掌握批量修改技巧,显著提升工作效率,避免手工操作带来的错误和耗时。特别适合需要频繁更新工艺路线和BOM的企业用户。

weixin_42524708的博客 393

Proteus仿真实战:用AT89C51+L298N搭建直流电机PID调速系统(附完整工程文件)

本文详细介绍了使用Proteus仿真平台结合AT89C51单片机和L298N驱动模块搭建直流电机PID闭环调速系统的全过程。从硬件选型、电路连接到PID算法实现与参数整定,提供了完整的开发指南和工程文件,帮助读者快速掌握闭环调速系统的设计与调试技巧。

weixin_28724661的博客 444

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

【2025最新版】ABAP 开发百科全书专栏文章目录(上)

本文汇总了一系列SAP ABAP技术文章,内容涵盖实用技巧合集、函数式编程实践(如Currying、reduce应用)、设计模式实现(如Visitor、Singleton)、动态代理与Mock技术、性能优化方案(如Lazy Loading)、日期处理与内存管理,以及ABAP与JavaScript的编程范式对比。还涉及CDS视图、Fiori字段追踪、单元测试优化等实战经验,深入剖析了ABAP底层机制(如Internal Session、Function Module实现原理),并提供了多种反模式改进方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2434

EM的理论与实践(基础篇)

EM理论与实践

m0_61544122的博客 2364

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

下一篇: 基于朴素贝叶斯和预训练Bert模型的中文句子情感分类实践
超市里捏碎的饼干
博客等级 码龄8年 445粉丝 5原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值