精华内容
下载资源
问答
  • 客户流失预测模型python
    2021-09-12 21:27:14


    这周忙于练车ing,刚考完科目一,在练科目二,(疲惫。jpg)不过在闲暇时间还是要继续我的项目,最近队友进度也很快,所以我也要抓紧啦。

    工具(任选)

    1.云服务器(你需要一个服务器)

    详细见我上一篇博文

    2.Anaconda和pycharm

    上一个介绍了在服务器端跑python代码,当时的原因主要有以下两点:

    • 我认知里面pytorch需要cpu和gpu性能,自己电脑配置不够
    • 怕出了啥故障hhhh,不搞坏自己的电脑
      但是呢,这周上课的时候学习了pycharm和anaconda的虚拟环境配置,在本地端也是一样的效果。
      简单复盘pycharm和anaconda的联系:
      首先需要直接去anaconda官网下载软件,正常安装就可以啦。(教程网上都有)
      配置上主要是在这里:
      配置python interpreter,在这里插入图片描述 调成anaconda里面的python.exe文件在这里插入图片描述
      在terminal这里有一个(base)的标志就配置成功了
      在这里插入图片描述
      anaconda有啥好处呢,软件存储也不小,为啥要下呢。主要是anaconda自己有很多包,就不用自己import一个未定义的包,要一个一个pip install 了,这个对于科学计算十分友好滴。
      还需要注意,anaconda使用下载安装包指令不是pip 是conda,具体可以上网搜。

    但是不知道为啥我的anaconda的jupyter notebook 不能正常运行(正常来讲安装完anaconda会有jurpter的 。这个可能下周出解决的话,写一篇blog。
    flag++

    3.谷歌的colab(需要vpn)

    直接vpn一挂,搜colab就可以了。
    这个是网页版的,里面配置了谷歌的云服务器,谷歌专门为深度学习等跑模型准备的。
    优点就是,性能不错,可以调GPU加速等。(妈妈再也不用担心我的电脑没有gpu啦)
    目前我自己来看稍微不太理想的就是要翻墙吧,毕竟是谷歌。
    (我后面跑出来的模型就是有一个特别大,用着个速度会稍微快一些)

    跑的算法和遇到的问题

    首先,明确我们的问题是需要帮助商家找到哪些顾客将要流失。也就是商家希望模型能够输出这些顾客名单,及时沟通处理还有密切关注。
    其实,我们对于深度学习的一些不是特别熟悉,于是我们下意识的想法是先在网上搜寻相关资料,于是我们在github和搜索引擎上,找寻到比较贴切的是kaggle的银行顾客流失和电信客户的流失。进行改进和学习。

    • 第一个跑出来的是这个算法:
      链接: link.
      在这里插入图片描述

      一直卡在series类当中,后面搜集发现,是convert_object版本问题,解决方案是换一种写法。
      链接: link.
      在这里插入图片描述

    • 第二个,也就是目前我们主要跑出来的是这个模型,基于对六种算法以及四种集成学习。
      链接: github链接:.
      github上有最后的模型存档和样例图。
      这个模型主要有问题有以下几个

      • 跑的时间特别,我用本地跑要跑10min左右才能跑完,colab稍微快一点
      • 样例图挺有专业分析性,我们不太能解读。
      • 多种样例融合,对比了精度,但是没有输出最精确的客户名单
      • 模型用的算法目前来看挺多,还要学习。

    待解决ing

    现在我们跑出来第二种算法,在对比代码,正在学习现有的框架(就是反向学习hhh)
    可能需要精简出其中一种算法,来进行模拟,以及增加顾客名单的输出。

    唠唠嗑——我的python学习

    我觉得python和英语特别像,语法规范没有C这么繁琐,我们python老师说:只要你觉得python能够懂你就可以试一试(xs)
    学过C和C++。所以我是先从项目开始学习。先从一个有功能性的python功能代码来感受。就是之前课程学习的python在服务器跑udp链接。
    你需要做的是:

    • 改一改,看看不同的输出
    • 学会看报错
      一提到报错,我之前一看到报错就觉得自己跟判了死刑一样,其实呢,只要不死机,报错就是你的小帮手hhh。python报错十分人性化,有的还提示你怎么改。所以呢,看报错可以有助于读懂代码,顺利跑通。
      总之,我认为学习总归要带有兴趣的嘛。所以如果学习一门语言的话,需要继续不断的练习代码,不如找一点感兴趣的,用手里的代码做一点什么,写一个小小的游戏pygame,做一个小小的demo,哪怕开源的,找到乐趣,反复练习也变得很有乐趣。
    更多相关内容
  • Python建立客户流失预测模型
  • 为什么做客户流失模型分析?1、企业再发展新用户成本很高2、客户的...1、使用Python分析并处理客户流失数据集2、选用逻辑斯蒂回归(logistic regression)简单建模3、最后使用拟合模型来进行客户流失预测案例参考Clint...

    为什么做客户流失模型分析?

    1、企业再发展新用户成本很高

    2、客户的流失会给企业造成很大的损失,一个老客户的价值相当于三个新客户的价值

    3、客户的流失不仅给企业带来经济上的损失,同时也给企业的名誉和口碑造成伤害

    三步快速客户流失模型分析!

    1、使用Python分析并处理客户流失数据集

    2、选用逻辑斯蒂回归(logistic regression)简单建模

    3、最后使用拟合模型来进行客户流失预测

    案例参考Clinton W. Brownley《Foundations for Analytics with Python》

    数据地址https://raw.githubusercontent.com/EricChiang/churn/master/data/churn.csv

    处理客户流失数据集

    客户流失数据集是一个记录电信公司现有的和曾经的客户的数据文件,有1个输出变量和20个输入变量。

    输出变量是一个布尔型变量,表示客户是否已经流失。

    输入变量是客户的电话计划和通话行为的特征,包括状态、账户时间、区号、电话号码、是否有国际通话计划、是否有语音信箱、语音信箱消息数量、白天通话时长、白天通话次数、白天通话费用、傍晚通话时长、傍晚通话次数、傍晚通话费用、夜间通话时长、夜间通话次数、夜间通话费用、国际通话时长、国际通话次数、国际通话费用和客户服务通话次数。

    创建一个新列churn01,并使用numpy的where函数根据churn这一列中的值用1或0来填充它。churn这一列中的值不是True就是False,所以如果churn中的值是True,那么churn01中的值就是1,如果churn中的值是False,那么churn01中的值就是 0。

    输出处理好的数据:

    选用逻辑斯蒂回归简单建模

    在这个数据集中,因变量是一个二值变量,表示客户是否已经流失。因变量是一个二值变量,所以需要将预测值限制在0和1之间,逻辑斯蒂回归可以满足这个要求。逻辑斯蒂回归通过使用逻辑函数(或称逻辑斯蒂函数)的反函数估计概率的方式来测量自变量和二值型因变量之间的关系。

    对客户服务通话次数这部分数据进行了摘要分析,先按照一个新变量 total_charges 中的值使用等宽分箱法将数据分成 5 个组,然后为每个分组计算 5 个统计量:总数、最小值、均值、最大值和标准差。创建一个新变量total_charges,表示白天、傍晚、夜间和国际通话费用的总和。

    churn['total_charges'] = churn['day_charge'] + churn['eve_charge'] + \churn['night_charge'] + churn['intl_charge']dependent_variable = churn['churn01']independent_variables = churn[['account_length', 'custserv_calls', 'total_charges']]independent_variables_with_constant = sm.add_constant(independent_variables, prepend=True)logit_model = sm.Logit(dependent_variable, independent_variables_with_constant).fit()print(logit_model.summary2())# print("\nQuantities you can extract from the result:\n%s" % dir(logit_model))print("\nCoefficients:\n%s" % logit_model.params)print("\nCoefficient Std Errors:\n%s" % logit_model.bse)

    建模结果如下:

    new_observations = churn.loc[churn.index.isin(range(16)), independent_variables.columns]new_observations_with_constant = sm.add_constant(new_observations, prepend=True)y_predicted = logit_model.predict(new_observations_with_constant)y_predicted_rounded = [round(score, 2) for score in y_predicted]print(y_predicted_rounded)

    预测结果如下:

    变量 y_predicted中包含着16个预测值。为了使输出更简单易懂,可以将预测值保留两位小数。

    展开全文
  • 对数据探索分析,进行模型训练,测试数据集评估结果,建立可预测客户流失模型,获取可能流失的用户名单。
  • 源自:数据分析不是个事儿作者:启方客户流失是所有与消费者挂钩行业都会关注的点。因为发展一个新客户是需要一定成本的,一旦客户流失,成本浪费不说,挽回一个客户的成本更大。今天分享一个用户流失...

    源自:数据分析不是个事儿

    作者:启方

    客户流失是所有与消费者挂钩行业都会关注的点。因为发展一个新客户是需要一定成本的,一旦客户流失,成本浪费不说,挽回一个客户的成本更大。

    今天分享一个用户流失预测,以电信行业为例。

    所以,电信行业在竞争日益激烈当下,如何挽留更多用户成为一项关键业务指标。为了更好运营用户,这就要求要了解流失用户的特征,分析流失原因,预测用户流失,确定挽留目标用户并制定有效方案。

    一、提出问题

    1、哪些用户可能会流失?

    2、流失概率更高的用户有什么共同特征?

    二、理解数据

    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 :客户的职位(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)

    2、导入数据


    3、查看数据集信息

    三、数据清洗

    1、查找缺失值

    数据集中有5174名用户没流失,有1869名客户流失,数据集不均衡。

    2、查看数据类型

    TotalCharges表示总费用,这里为对象类型,需要转换为float类型

    3、转换类型

    再次查找缺失值:

    这里存在11个缺失值,由于数量不多我们可以直接删除这些行

    4、处理缺失值

    5、数据归一化处理

    四、数据可视化呈现

    1、查看流失客户占比


    由图中结果可以看出,流失客户占整体客户的26.6%。

    2、性别、老年人、配偶、亲属对流客户流失率的影响

    性别、老年人占比结果

    配偶、亲属占比结果

    可以看出,男性与女性用户之间的流失情况基本没有差异,而在老年用户中流失占比明显比非老年用户更高,在所有数据中未婚与已婚人数基本持平,但未婚中流失人数比已婚中的流失人数高出了快一倍,从经济独立情况来看,经济未独立的用户流失率要远远高于经济独立的用户。

    3、提取特征

    4、构造相关性矩阵

    5、使用热地图显示相关系数

    结论:

    从上图可以看出,互联网服务、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影之间存在较强的相关性,多线业务和电话服务之间也有很强的相关性,并且都呈强正相关关系。

    6、使用one-hot编码

    7、电信用户是否流失与各变量之间的相关性

    由图上可以看出,变量gender 和 PhoneService 处于图形中间,其值接近于 0 ,这两个变量对电信客户流失预测影响非常小,可以直接舍弃。

    8、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视、网络电影和无互联网服务对客户流失率的影响

    由上图可以看出,在网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影六个变量中,没有互联网服务的客户流失率值是相同的,都是相对较低。

    这可能是因为以上六个因素只有在客户使用互联网服务时才会影响客户的决策,这六个因素不会对不使用互联网服务的客户决定是否流失产生推论效应。

    9、签订合同方式对客户流失率的影响

    由图上可以看出,签订合同方式对客户流失率影响为:按月签订 > 按一年签订 > 按两年签订,这可能表明,设定长期合同对留住现有客户更有效。

    10、付款方式对客户流失率的影响

    由图上可以看出,在四种支付方式中,使用Electronic check的用户流流失率最高,其他三种支付方式基本持平,因此可以推断电子账单在设计上影响用户体验。

    五、数据预处理

    由前面结果可知,CustomerID表示每个客户的随机字符,对后续建模不影响,我这里选择删除CustomerID列;gender 和 PhoneService 与流失率的相关性低,可直接忽略。

    对客户的职位、月费用和总费用进行去均值和方差缩放,对数据进行标准化:

    使用箱线图查看数据是否存在异常值:

    由以上结果可以看出,在三个变量中不存在明显的异常值。

    查看对象类型字段中存在的值:

    综合之前的结果来看,在六个变量中存在No internet service,即无互联网服务对客户流失率影响很小,这些客户不使用任何互联网产品,因此可以将No internet service 和 No 是一样的效果,可以使用 No 替代 No internet service。

    使用Scikit-learn标签编码,将分类数据转换为整数编码:

    六、构建模型

    1、建立训练数据集和测试数据集

    2、选择机器学习算法

    3、训练模型

    4、评估模型

    召回率(recall)的含义是:原本为对的当中,预测为对的比例(值越大越好,1为理想状态)
    精确率、精度(precision)的含义是:预测为对的当中,原本为对的比例(值越大越好,1为理想状态)
    F1分数(F1-Score)指标综合了Precision与Recall的产出的结果

    F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。

    综上所述,在10种分类算法中朴素贝叶斯(Naive Bayes)的F1分数最大为63.31%,所以使用朴素贝叶斯模型效果最好。

    七、实施方案

    八、结论

    通过上述分析,我们可以大致勾勒出容易流失的用户特征:

    老年用户与未婚且经济未独立的青少年用户更容易流失。

    电话服务对用户的流失没有直接的影响。

    提供的各项网络服务项目能够降低用户的流失率。

    签订合同越久,用户的留存率越高。

    采用electronic check支付的用户更易流失。

    针对上述诊断结果,可有针对性的对此提出建议:
    推荐老年用户与青少年用户采用数字网络,且签订2年期合同(可以各种辅助优惠等营销手段来提高2年期合同的签订率),若能开通相关网络服务可增加用户粘性,因此可增加这块业务的推广,同时考虑改善电子账单支付的用户体验。

    最后,分享源码:

    # coding: utf-8
    
    
    # # 电信客户流失预测
    
    
    # ## 1、导入数据
    
    
    # In[1]:
    
    
    import numpy as np
    import pandas as pd 
    import os
    
    
    
    
    # In[2]:
    
    
    # 导入相关的包
    import matplotlib.pyplot as plt
    import seaborn as sns
    from pylab import rcParams
    import matplotlib.cm as cm
    
    
    import sklearn
    from sklearn import preprocessing
    from sklearn.preprocessing import LabelEncoder               # 编码转换
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import StratifiedShuffleSplit
    
    
    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.naive_bayes import GaussianNB                   # 朴素贝叶斯
    from sklearn.tree import DecisionTreeClassifier              # 决策树分类器
    from xgboost import XGBClassifier
    from catboost import CatBoostClassifier
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.ensemble import GradientBoostingClassifier     
    
    
    from sklearn.metrics import classification_report, precision_score, recall_score, f1_score
    from sklearn.metrics import confusion_matrix
    from sklearn.model_selection import GridSearchCV
    from sklearn.metrics import make_scorer
    from sklearn.ensemble import VotingClassifier
    
    
    from sklearn.decomposition import PCA
    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_score
    
    
    import warnings
    warnings.filterwarnings('ignore')
    
    
    get_ipython().magic('matplotlib inline')
    
    
    
    
    # In[3]:
    
    
    # 读取数据文件
    telcom=pd.read_csv(r"F:\data\WA_Fn-UseC_-Telco-Customer-Churn.csv")
    
    
    
    
    # ## 2、查看数据集信息
    
    
    # In[4]:
    
    
    telcom.head(10)
    
    
    
    
    # In[5]:
    
    
    # 查看数据集大小
    telcom.shape
    
    
    
    
    # In[6]:
    
    
    # 获取数据类型列的描述统计信息
    telcom.describe()
    
    
    
    
    # ## 3、数据清洗
    
    
    # In[7]:
    
    
    # 查找缺失值
    pd.isnull(telcom).sum()
    
    
    
    
    # In[8]:
    
    
    telcom["Churn"].value_counts()
    
    
    
    
    # 数据集中有5174名用户没流失,有1869名客户流失,数据集不均衡。
    
    
    # In[9]:
    
    
    telcom.info()
    
    
    
    
    # TotalCharges表示总费用,这里为对象类型,需要转换为float类型  
    
    
    # In[10]:
    
    
    telcom['TotalCharges']=telcom['TotalCharges'].convert_objects(convert_numeric=True) # convert_numeric=True表示强制转换数字(包括字符串),不可转换的值变为NaN
    telcom["TotalCharges"].dtypes
    
    
    
    
    # In[11]:
    
    
    # 再次查找是否存在缺失值
    pd.isnull(telcom["TotalCharges"]).sum()
    
    
    
    
    # 这里存在11个缺失值,由于数量不多我们可以直接删除这些行
    
    
    # In[12]:
    
    
    # 删除缺失值所在的行
    telcom.dropna(inplace=True)
    telcom.shape
    
    
    
    
    # In[13]:
    
    
    # 数据归一化处理
    # 对Churn 列中的值 Yes和 No分别用 1和 0替换,方便后续处理
    telcom['Churn'].replace(to_replace = 'Yes', value = 1,inplace = True)
    telcom['Churn'].replace(to_replace = 'No', value = 0,inplace = True)
    telcom['Churn'].head()
    
    
    
    
    # In[14]:
    
    
    telcom['Churn'].replace(to_replace='Yes', value=1, inplace=True)
    telcom['Churn'].replace(to_replace='No',  value=0, inplace=True)
    telcom['Churn'].head()
    
    
    
    
    # ## 4、数据可视化呈现
    
    
    # In[15]:
    
    
    # 查看流失客户占比
    """
    画饼图参数:
    labels  (每一块)饼图外侧显示的说明文字
    explode  (每一块)离开中心距离
    startangle  起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
    shadow   是否阴影
    labeldistance label  绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
    autopct   控制饼图内百分比设置,可以使用format字符串或者format function
         '%1.1f'指小数点前后位数(没有用空格补齐)
    pctdistance 类似于labeldistance,指定autopct的位置刻度
    radius   控制饼图半径
    """
    churnvalue=telcom["Churn"].value_counts()
    labels=telcom["Churn"].value_counts().index
    
    
    rcParams["figure.figsize"]=6,6
    plt.pie(churnvalue,labels=labels,colors=["whitesmoke","yellow"], explode=(0.1,0),autopct='%1.1f%%', shadow=True)
    plt.title("Proportions of Customer Churn")
    plt.show()
    
    
    
    
    # In[16]:
    
    
    # 性别、老年人、配偶、亲属对流客户流失率的影响
    f, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,10))
    
    
    plt.subplot(2,2,1)
    gender=sns.countplot(x="gender",hue="Churn",data=telcom,palette="Pastel2") # palette参数表示设置颜色,这里设置为主题色Pastel2
    plt.xlabel("gender")
    plt.title("Churn by Gender")
    
    
    plt.subplot(2,2,2)
    seniorcitizen=sns.countplot(x="SeniorCitizen",hue="Churn",data=telcom,palette="Pastel2")
    plt.xlabel("senior citizen")
    plt.title("Churn by Senior Citizen")
    
    
    plt.subplot(2,2,3)
    partner=sns.countplot(x="Partner",hue="Churn",data=telcom,palette="Pastel2")
    plt.xlabel("partner")
    plt.title("Churn by Partner")
    
    
    plt.subplot(2,2,4)
    dependents=sns.countplot(x="Dependents",hue="Churn",data=telcom,palette="Pastel2")
    plt.xlabel("dependents")
    plt.title("Churn by Dependents")
    
    
    
    
    # In[17]:
    
    
    # 提取特征
    charges=telcom.iloc[:,1:20]
    # 对特征进行编码
    """
    离散特征的编码分为两种情况:
    1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
    2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
    """
    corrDf = charges.apply(lambda x: pd.factorize(x)[0])
    corrDf .head()
    
    
    
    
    # In[18]:
    
    
    # 构造相关性矩阵
    corr = corrDf.corr()
    corr
    
    
    
    
    # In[19]:
    
    
    # 使用热地图显示相关系数
    '''
    heatmap    使用热地图展示系数矩阵情况
    linewidths 热力图矩阵之间的间隔大小
    annot      设定是否显示每个色块的系数值
    '''
    plt.figure(figsize=(20,16))
    ax = sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, 
                     linewidths=0.2, cmap="YlGnBu",annot=True)
    plt.title("Correlation between variables")
    
    
    
    
    # 结论:从上图可以看出,互联网服务、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影之间存在较强的相关性,多线业务和电话服务之间也有很强的相关性,并且都呈强正相关关系。
    
    
    # In[20]:
    
    
    # 使用one-hot编码
    tel_dummies = pd.get_dummies(telcom.iloc[:,1:21])
    tel_dummies.head()
    
    
    
    
    # In[21]:
    
    
    # 电信用户是否流失与各变量之间的相关性
    plt.figure(figsize=(15,8))
    tel_dummies.corr()['Churn'].sort_values(ascending = False).plot(kind='bar')
    plt.title("Correlations between Churn and variables")
    
    
    
    
    # 由图上可以看出,变量gender 和 PhoneService 处于图形中间,其值接近于 0 ,这两个变量对电信客户流失预测影响非常小,可以直接舍弃。
    
    
    # In[22]:
    
    
    # 网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视、网络电影和无互联网服务对客户流失率的影响
    covariables=["OnlineSecurity", "OnlineBackup", "DeviceProtection", "TechSupport", "StreamingTV", "StreamingMovies"]
    fig,axes=plt.subplots(nrows=2,ncols=3,figsize=(16,10))
    for i, item in enumerate(covariables):
        plt.subplot(2,3,(i+1))
        ax=sns.countplot(x=item,hue="Churn",data=telcom,palette="Pastel2",order=["Yes","No","No internet service"])
        plt.xlabel(str(item))
        plt.title("Churn by "+ str(item))
        i=i+1
    plt.show()
    
    
    
    
    # 由上图可以看出,在网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影六个变量中,没有互联网服务的客户流失率值是相同的,都是相对较低。
    # 
    # 这可能是因为以上六个因素只有在客户使用互联网服务时才会影响客户的决策,这六个因素不会对不使用互联网服务的客户决定是否流失产生推论效应。
    
    
    # In[23]:
    
    
    # 签订合同方式对客户流失率的影响
    sns.barplot(x="Contract",y="Churn", data=telcom, palette="Pastel1", order= ['Month-to-month', 'One year', 'Two year'])
    plt.title("Churn by Contract type")
    
    
    
    
    # 由图上可以看出,签订合同方式对客户流失率影响为:按月签订 > 按一年签订 > 按两年签订,这可能表明,设定长期合同对留住现有客户更有效。
    
    
    # In[24]:
    
    
    # 付款方式对客户流失率的影响
    plt.figure(figsize=(10,5))
    sns.barplot(x="PaymentMethod",y="Churn", data=telcom, palette="Pastel1", order= ['Bank transfer (automatic)', 'Credit card (automatic)', 'Electronic check','Mailed check'])
    plt.title("Churn by PaymentMethod type")
    
    
    
    
    # 由图上可以看出,在四种支付方式中,使用Electronic check的用户流流失率最高,其他三种支付方式基本持平,因此可以推断电子账单在设计上影响用户体验。
    
    
    
    
    
    
    
    
    # ## 5、数据预处理
    
    
    # 由前面结果可知,CustomerID表示每个客户的随机字符,对后续建模不影响,我这里选择删除CustomerID列;gender 和 PhoneService 与流失率的相关性低,可直接忽略。
    
    
    # In[26]:
    
    
    telcomvar=telcom.iloc[:,2:20]
    telcomvar.drop("PhoneService",axis=1, inplace=True)
    
    
    # 提取ID
    telcom_id = telcom['customerID']
    
    
    telcomvar.head()
    
    
    
    
    # In[27]:
    
    
    # 对客户的职位、月费用和总费用进行去均值和方差缩放,对数据进行标准化
    """
    标准化数据,保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值而主导。
    """
    scaler = StandardScaler(copy=False)
    # fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
    scaler.fit_transform(telcomvar[['tenure','MonthlyCharges','TotalCharges']])
    
    
    
    
    # In[28]:
    
    
    # tranform()的作用是通过找中心和缩放等实现标准化
    telcomvar[['tenure','MonthlyCharges','TotalCharges']]=scaler.transform(telcomvar[['tenure','MonthlyCharges','TotalCharges']])
    
    
    
    
    # In[29]:
    
    
    # 使用箱线图查看数据是否存在异常值
    plt.figure(figsize = (8,4))
    numbox = sns.boxplot(data=telcomvar[['tenure','MonthlyCharges','TotalCharges']], palette="Set2")
    plt.title("Check outliers of standardized tenure, MonthlyCharges and TotalCharges")
    
    
    
    
    # 由以上结果可以看出,在三个变量中不存在明显的异常值
    
    
    # In[30]:
    
    
    # 查看对象类型字段中存在的值
    def uni(columnlabel):
        print(columnlabel,"--" ,telcomvar[columnlabel].unique())  # unique函数去除其中重复的元素,返回唯一值
    
    
    telcomobject=telcomvar.select_dtypes(['object'])
    for i in range(0,len(telcomobject.columns)):
        uni(telcomobject.columns[i])
    
    
    
    
    # 综合之前的结果来看,在六个变量中存在No internet service,即无互联网服务对客户流失率影响很小,这些客户不使用任何互联网产品,因此可以将No internet service 和 No 是一样的效果,可以使用 No 替代 No internet service
    
    
    # In[31]:
    
    
    telcomvar.replace(to_replace='No internet service', value='No', inplace=True)
    telcomvar.replace(to_replace='No phone service', value='No', inplace=True)
    for i in range(0,len(telcomobject.columns)):
        uni(telcomobject.columns[i])
    
    
    
    
    # In[32]:
    
    
    # 使用Scikit-learn标签编码,将分类数据转换为整数编码
    def labelencode(columnlabel):
        telcomvar[columnlabel] = LabelEncoder().fit_transform(telcomvar[columnlabel])
    
    
    for i in range(0,len(telcomobject.columns)):
        labelencode(telcomobject.columns[i])
    
    
    for i in range(0,len(telcomobject.columns)):
        uni(telcomobject.columns[i])
    
    
    
    
    # ## 6、构建模型
    
    
    # ### (1)建立训练数据集和测试数据集
    
    
    # In[33]:
    
    
    """
    我们需要将数据集拆分为训练集和测试集以进行验证。
    由于我们所拥有的数据集是不平衡的,所以最好使用分层交叉验证来确保训练集和测试集都包含每个类样本的保留人数。
    交叉验证函数StratifiedShuffleSplit,功能是从样本数据中随机按比例选取训练数据(train)和测试数据(test)
    参数 n_splits是将训练数据分成train/test对的组数,可根据需要进行设置,默认为10
    参数test_size和train_size是用来设置train/test对中train和test所占的比例
    参数 random_state控制是将样本随机打乱
    """
    X=telcomvar
    y=telcom["Churn"].values
    
    
    sss=StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    print(sss)
    print("训练数据和测试数据被分成的组数:",sss.get_n_splits(X,y))
    
    
    
    
    # In[34]:
    
    
    # 建立训练数据和测试数据
    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]
    
    
    
    
    # In[35]:
    
    
    # 输出数据集大小
    print('原始数据特征:', X.shape,
          '训练数据特征:',X_train.shape,
          '测试数据特征:',X_test.shape)
    
    
    print('原始数据标签:', y.shape,
          '   训练数据标签:',y_train.shape,
          '   测试数据标签:',y_test.shape)
    
    
    
    
    # ### (2)选择机器学习算法
    
    
    # In[36]:
    
    
    # 使用分类算法,这里选用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')]  
    ]
    
    
    
    
    # ### (3)训练模型
    
    
    # In[37]:
    
    
    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)
        class_eva=pd.DataFrame([recall,precision])
        Classify_result.append(class_eva)
        name=pd.Series(name)
        names.append(name)
        y_pred=pd.Series(y_pred)
        prediction.append(y_pred)
    
    
    
    
    # ### (4)评估模型
    
    
    # In[38]:
    
    
    # 评估模型
    """
    召回率(recall)的含义是:原本为对的当中,预测为对的比例(值越大越好,1为理想状态)
    精确率、精度(precision)的含义是:预测为对的当中,原本为对的比例(值越大越好,1为理想状态)
    F1分数(F1-Score)指标综合了Precision与Recall的产出的结果
    F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。
    """
    
    
    names=pd.DataFrame(names)
    names=names[0].tolist()
    result=pd.concat(Classify_result,axis=1)
    result.columns=names
    result.index=["recall","precision","f1score"]
    result
    
    
    
    
    # 综上所述,在10种分类算法中朴素贝叶斯(Naive Bayes)的F1分数最大为63.31%,所以使用朴素贝叶斯模型效果最好。
    
    
    # ## 7、实施方案
    
    
    # 预测数据集特征(由于没有提供预测数据集,这里选取后10行作为需要预测的数据集)
    pred_X = telcomvar.tail(10)
    
    
    # 提取customerID
    pre_id = telcom_id.tail(10)
    
    
    # 使用朴素贝叶斯方法,对预测数据集中的生存情况进行预测
    model = GaussianNB()
    model.fit(X_train,y_train)
    pred_y = model.predict(pred_X)
    
    
    # 预测结果
    predDf = pd.DataFrame({'customerID':pre_id, 'Churn':pred_y})
    predDf
    

         精 彩 文 章 

    END
    最后说个题外话,相信大家都知道视频号了,随着灰度范围扩大,越来越多的小伙伴都开通了视频号。小詹也开通了一个视频号,会分享互联网那些事、读书心得与副业经验,欢迎扫码关注,和小詹一起向上生长!「没有开通发布权限的尽量多互动,提升活跃度可以更快开通哦」
    
    
    展开全文
  • 原标题:一个完整的数据分析案例 | 用Python建立客户流失预测模型(含源数据+代码)来源:数据分析不是个事儿作者:启方原文:https://mp.weixin.qq.com/s/_20MN6V6aV1T3Ekd7C9neQ 客户流失是所有与消费者挂钩行业...

    原标题:一个完整的数据分析案例 | 用Python建立客户流失预测模型(含源数据+代码)

    来源:数据分析不是个事儿

    作者:启方

    原文:

    https://mp.weixin.qq.com/s/_20MN6V6aV1T3Ekd7C9neQ

    b996e84e1f9a44e4a59def37816935a2.png

    客户流失是所有与消费者挂钩行业都会关注的点。因为发展一个新客户是需要一定成本的,一旦客户流失,成本浪费不说,挽回一个客户的成本更大。

    今天分享一个用户流失预测,以电信行业为例。

    所以,电信行业在竞争日益激烈当下,如何挽留更多用户成为一项关键业务指标。为了更好运营用户,这就要求要了解流失用户的特征,分析流失原因,预测用户流失,确定挽留目标用户并制定有效方案。

    一、提出问题

    1、哪些用户可能会流失?

    2、流失概率更高的用户有什么共同特征?

    二、理解数据

    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 :客户的职位(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)

    2、导入数据

    303eccfb3fdd449995d818131e51e337.jpeg

    87157f9363b24cad8b349a67c0ee780d.jpeg

    3、查看数据集信息

    9bfa6f089f0944058d7491e08e1ef11f.jpeg

    11cdd55310f34e3fabcccaf718791bc2.jpeg

    三、数据清洗

    1、查找缺失值

    c382a96879d745669500b7f896b7a735.jpeg

    2ccf3f66112843edb21b79562b2b239a.jpeg

    数据集中有5174名用户没流失,有1869名客户流失,数据集不均衡。

    2、查看数据类型

    00ed9907344f41709559912a781ff53a.jpeg

    TotalCharges表示总费用,这里为对象类型,需要转换为float类型

    3、转换类型

    f8267b4e63ca4ec28e8fb72f8e451568.jpeg

    再次查找缺失值:

    ab3a1353389446a098243825fa4c21f2.jpeg

    这里存在11个缺失值,由于数量不多我们可以直接删除这些行

    4、处理缺失值

    7c9fb11dbe1a48f8a26c78a87f7df198.jpeg

    5、数据归一化处理

    f0ebbb4dc368464f899988d47ff20f9f.jpeg

    四、数据可视化呈现

    1、查看流失客户占比

    287ef3c47f604729a98722a197980c25.jpeg

    f44b10bec4e94597975b8fc69a01b22b.jpeg

    由图中结果可以看出,流失客户占整体客户的26.6%。

    2、性别、老年人、配偶、亲属对流客户流失率的影响

    ef6207e807314aabab8e111bf8a8be32.jpeg

    7e2f561476e64313af31e98d412948a0.jpeg

    性别、老年人占比结果

    000ff1f9a1184a5cae17228c86b039bd.jpeg

    配偶、亲属占比结果

    可以看出,男性与女性用户之间的流失情况基本没有差异,而在老年用户中流失占比明显比非老年用户更高,在所有数据中未婚与已婚人数基本持平,但未婚中流失人数比已婚中的流失人数高出了快一倍,从经济独立情况来看,经济未独立的用户流失率要远远高于经济独立的用户。

    3、提取特征

    a4aaf50c82b04c0ab3888d47c2959bd4.jpeg

    52e2e536b685418db4d7bb06196e72af.jpeg

    4、构造相关性矩阵

    9c47064fe20e46b2be9af4799f1bb64f.jpeg

    5、使用热地图显示相关系数

    d614517dabf74187ae777745718bcd2f.jpeg

    b54109babbb94c52a1e9fe6eeb3a521f.jpeg

    结论:

    从上图可以看出,互联网服务、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影之间存在较强的相关性,多线业务和电话服务之间也有很强的相关性,并且都呈强正相关关系。

    6、使用one-hot编码

    ea3443df7fb545b4be0432059aeca2a2.jpeg

    7、电信用户是否流失与各变量之间的相关性

    85225189954f47b8acf4c4603f5eb3a8.jpeg

    56a87f6e63df4364b3e339e4b1c85143.jpeg

    由图上可以看出,变量gender 和 PhoneService 处于图形中间,其值接近于 0 ,这两个变量对电信客户流失预测影响非常小,可以直接舍弃。

    8、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视、网络电影和无互联网服务对客户流失率的影响

    0aa3a28174494283b949df6608d3200b.jpeg

    3edca5eacf7b46e3b439f8eb4feb02a8.jpeg

    由上图可以看出,在网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视和网络电影六个变量中,没有互联网服务的客户流失率值是相同的,都是相对较低。

    这可能是因为以上六个因素只有在客户使用互联网服务时才会影响客户的决策,这六个因素不会对不使用互联网服务的客户决定是否流失产生推论效应。

    9、签订合同方式对客户流失率的影响

    95bc739e3345422b86d92f27ea479d4f.jpeg

    由图上可以看出,签订合同方式对客户流失率影响为:按月签订 > 按一年签订 > 按两年签订,这可能表明,设定长期合同对留住现有客户更有效。

    10、付款方式对客户流失率的影响

    fa0134263cfd44a499e0ed3715d416c1.jpeg

    由图上可以看出,在四种支付方式中,使用Electronic check的用户流流失率最高,其他三种支付方式基本持平,因此可以推断电子账单在设计上影响用户体验。

    五、数据预处理

    由前面结果可知,CustomerID表示每个客户的随机字符,对后续建模不影响,我这里选择删除CustomerID列;gender 和 PhoneService 与流失率的相关性低,可直接忽略。

    21b9eeb846a74e4c8df9a738d0dec37a.jpeg

    对客户的职位、月费用和总费用进行去均值和方差缩放,对数据进行标准化:

    c0e842a62fde4a8a9e309feb4c20998e.jpeg

    使用箱线图查看数据是否存在异常值:

    7b64347662ac4e6bb0578a2da43481af.jpeg

    由以上结果可以看出,在三个变量中不存在明显的异常值。

    查看对象类型字段中存在的值:

    aa24c6727e714af89de5680ec2bbb566.jpeg

    综合之前的结果来看,在六个变量中存在No internet service,即无互联网服务对客户流失率影响很小,这些客户不使用任何互联网产品,因此可以将No internet service 和 No 是一样的效果,可以使用 No 替代 No internet service。

    ca5b53e1eeb047c69e22b354392c94ff.jpeg

    使用Scikit-learn标签编码,将分类数据转换为整数编码:

    2f0d9eb484c94b85b9e3dc2b5d27c38d.jpeg

    六、构建模型

    1、建立训练数据集和测试数据集

    e450a4ccb714484b83831aee6e37d33c.jpeg

    c5172fa832e44cab9a9d3a7f26cc3d63.jpeg

    2、选择机器学习算法

    b2f23540549c49aa9a12a454bc3828ad.jpeg

    3、训练模型

    741679b9bf1d4497a93eae0da1df868f.jpeg

    4、评估模型

    召回率(recall)的含义是:原本为对的当中,预测为对的比例(值越大越好,1为理想状态)

    精确率、精度(precision)的含义是:预测为对的当中,原本为对的比例(值越大越好,1为理想状态)

    F1分数(F1-Score)指标综合了Precision与Recall的产出的结果

    F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。

    5de1acefca634f6a8e0bb0c0e63da748.jpeg

    综上所述,在10种分类算法中朴素贝叶斯(Naive Bayes)的F1分数最大为63.31%,所以使用朴素贝叶斯模型效果最好。

    七、实施方案

    2651f0a8e73040cf98890f6e3e8fd5ef.jpeg

    13d59a8559fd46d987ab09156b54f872.jpeg

    八、结论

    通过上述分析,我们可以大致勾勒出容易流失的用户特征:

    老年用户与未婚且经济未独立的青少年用户更容易流失。

    电话服务对用户的流失没有直接的影响。

    提供的各项网络服务项目能够降低用户的流失率。

    签订合同越久,用户的留存率越高。

    采用electronic check支付的用户更易流失。

    针对上述诊断结果,可有针对性的对此提出建议:

    推荐老年用户与青少年用户采用数字网络,且签订2年期合同(可以各种辅助优惠等营销手段来提高2年期合同的签订率),若能开通相关网络服务可增加用户粘性,因此可增加这块业务的推广,同时考虑改善电子账单支付的用户体验。

    最后,分享源码:

    https://paste.ubuntu.com/p/tsZjWrVvY9/

    数据源地址:

    https://www.datafountain.cn/dataSets/35/details

    【数据说话】分析Python岗位就业前景 返回搜狐,查看更多

    责任编辑:

    展开全文
  • 零售电商客户流失模型,基于tensorflow,xgboost4j-spark实现线性模型LR,FM,GBDT,RF,进行模型效果对比,离线/在线serving部署方式总结。LR使用LibSVM格式的数据集, 采用 TFRecords + tf.data.Dataset + model +...
  • 逻辑回归 sigmoid函数绘制 逻辑回归模型案例 股票客户流失预警模型 股票客户流失预警模型评估 多项逻辑回归(多分类回归)
  • 原标题:实例 | 教你用Python写一个电信客户流失预测模型【导读】今天教大家如何用Python写一个电信用户流失预测模型。之前我们用Python写了员工流失预测模型,这次我们试试Python预测电信用户的流失。01 商业理解...
  • 如果有人能为他们预测哪些客户即将流失,他们将不胜感激,因为这样他们可以主动向客户提供更好的服务,并挽回这些即将流失客户。喜欢本文记得收藏、点赞、关注。 完整版代码、数据、技术交流文末获取 数据集 该...
  • 流失预测流程一共分为四个步骤,分别为(1)数据预处理(2)特征选择(3)模型选择(4)模型评估 1. 数据理解 数据取自于kaggle平台分享的数据集,共有21个字段7043条记录。 数据主要包括影响客户流失的各种因素...
  • 原标题:实例 | 教你用python写一个电信客户流失预测模型 CDA数据分析师 出品作者:真达、Mika数据:真达【导读】今天教大家如何用Python写一个电信用户流失预测模型。之前我们用Python写了员工流失预测模型,这次...
  • 关注一下~,更多商业数据分析案例等你来撩前言利用逻辑回归进行客户流失预警建模中涵盖了许多比较细的知识点,思维导图只展示了极小的一部分,相关知识点链接将穿插在文中。(源数据源代码空降文末获取)数据读入数据...
  • Python 银行信用卡客户流失预测(kaggle)

    千次阅读 多人点赞 2020-12-08 08:08:00
    1.背景越来越多的客户不再使用信用卡服务,银行的经理对此感到不安。如果有人能为他们预测哪些客户即将流失,他们将不胜感激,因为这样他们可以主动向客户提供更好的服务,并挽回这些即将流失客户...
  • 本文采用来自kaggle平台的电信客户数据集,来分析人们对电信服务的使用情况,以及帮助电信运营商找出客户流失的原因,并建立流失预测模型,从而降低客户流失率。数据集链接如下:...
  • 电信行业用户流失预警案例——python实现多模型预测
  • 逻辑回归模型——股票客户流失预警模型
  • 分类问题属于机器学习问题的类别,其中给定一组功能,任务是预测离散值。...因此,我们的任务是根据各种客户特征预测客户流失。$pip install pytorch数据集让我们将所需的库和数据集导入到我们的Python应用程序...
  • 分类问题属于机器学习问题的类别,其中给定一组功能,任务是预测离散值。...因此,我们的任务是根据各种客户特征预测客户流失。$ pip install pytorch数据集让我们将所需的库和数据集导入到我们的Python应用程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,187
精华内容 1,274
热门标签
关键字:

客户流失预测模型python