精华内容
下载资源
问答
  • 客户流失预测模型
    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建立客户流失预测模型
  • 结合过滤式和封装式特征选择方法的优点及组合分类器的较高预测能力,提出了一种基于Fisher比率与预测风险准则的分步特征选择方法结合组合分类器的电信客户流失预测模型。首先,基于Fisher比率从原始特征集合中提取...
  • 基于支持向量机的客户流失预测模型研究,夏国恩,金炜东,本文将支持向量机(Support Vector Machine,SVM) 应用于客户流失预测研究中,通过实证研究,证实了该方法用于电信企业客户流失预测比BP神经
  • 针对现有客户流失预测模型预测准确率低下的问题,本文结合基于统计学习的客户聚类分析和分类预测技术来构建客户流失预测模型。根据模型计算结果,可以辨别出客户类别及流失倾向,并在此基础上提出了预防客户流失的保持...
  • 数据分析精华案例-客户流失预测模型
  • 客户流失预测项目数据: : 熊猫,numpy,matplotlib,seaborn,plotly,sklearn,xgboost 建立客户流失预测模型: 探索性数据分析特征工程使用Logistic回归调查功能如何影响保留率使用XGBoost构建分类模型流失预测...
  • 电信客户流失预测模型.pdf
  • 对于公司来说,要想实现持续发展,准确预测客户流失至关重要。 先前的研究已经使用许多机器学习方法来预测客户流失。 通用模型无法充分利用时间序列功能。 为了克服这个缺点,我们提出了一个基于LSTM和CNN的模型,该...
  • 对数据探索分析,进行模型训练,测试数据集评估结果,建立可预测客户流失模型,获取可能流失的用户名单。
  • 论文研究-融入个体活跃度的电子商务客户流失预测模型.pdf, 为提高个体层次上客户流失预测的精确度, 建立了融入个体活跃度的电子商务客户流失预测模型H-ULSSVM. 该模型...
  • 论文研究-基于SMC-RS-LSSVM的电子商务客户流失预测模型.pdf, 为提高个体层次上客户流失预测的精度,建立了基于SMC-粗糙集-最小二乘支持向量机的电子商务客户流失预测模型...
  • 企业数据分析案例-客户流失预测模型
  • 基于深度神经网络的客户流失预测模型.pdf
  • 论文研究-基于支持向量机的客户流失预测模型.pdf,
  • 人工智能-机器学习-基于商务智能的客户流失预测模型与算法研究.pdf
  • 基于自组织数据挖掘的电子商务客户流失预测模型.pdf
  • 基于分析型CRM数据挖掘的移动客户流失预测模型分析与设计,李易桥,,本文通过研究人脑对视觉信息的处理过程,提出了一种新的自然图像压缩方法,该方法。本文在对目前我国电信企业新的竞争格局分析的
  • 作者:真达、Mika数据:真达【导读】今天教大家如何用Python写一个电信用户流失预测模型。公众号后台,回复关键字“电信”获取完整数据。之前我们用Python写了员工流失预测模型,...

    作者:真达、Mika

    数据:真达  

    【导读】

    今天教大家如何用Python写一个电信用户流失预测模型。公众号后台,回复关键字“电信”获取完整数据。

    之前我们用Python写了员工流失预测模型,这次我们试试Python预测电信用户的流失。

    ????????????

    员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

    01

    商业理解

    流失客户是指那些曾经使用过产品或服务,由于对产品失去兴趣等种种原因,不再使用产品或服务的顾客。

    电信服务公司、互联网服务提供商、保险公司等经常使用客户流失分析和客户流失率作为他们的关键业务指标之一,因为留住一个老客户的成本远远低于获得一个新客户。

    预测分析使用客户流失预测模型,通过评估客户流失的风险倾向来预测客户流失。由于这些模型生成了一个流失概率排序名单,对于潜在的高概率流失客户,他们可以有效地实施客户保留营销计划。

    下面我们就教你如何用Python写一个电信用户流失预测模型,以下是具体步骤和关键代码。

    02

    数据理解

    此次分析数据来自于IBM Sample Data Sets,统计自某电信公司一段时间内的消费数据。共有7043笔客户资料,每笔客户资料包含21个字段,其中1个客户ID字段,19个输入字段及1个目标字段-Churn(Yes代表流失,No代表未流失),输入字段主要包含以下三个维度指标:用户画像指标、消费产品指标、消费信息指标。字段的具体说明如下:

    03

    数据读入和概览

    首先导入所需包。

    # 数据处理
    import numpy as np 
    import pandas as pd 
    
    # 可视化
    import matplotlib.pyplot as plt 
    import seaborn as sns 
    import plotly as py 
    import plotly.graph_objs as go 
    import plotly.figure_factory as ff 
    
    # 前处理
    from sklearn.preprocessing import LabelEncoder
    from sklearn.preprocessing import StandardScaler
    
    # 建模
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn import tree 
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.naive_bayes import GaussianNB
    from sklearn.neural_network import MLPClassifier
    from sklearn.svm import SVC
    from lightgbm import LGBMClassifier
    from xgboost import XGBClassifier
    
    # 模型评估
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
    from sklearn.metrics import roc_auc_score, roc_curve, scorer
    from sklearn.metrics import recall_score, precision_score, f1_score, cohen_kappa_score
    
    pd.set_option('display.max_columns', None) 
    

    读入数据集

    df = pd.read_csv('./Telco-Customer-Churn.csv')
    df.head()  
    

    04

    数据初步清洗

    首先进行初步的数据清洗工作,包含错误值和异常值处理,并划分类别型和数值型字段类型,其中清洗部分包含:

    • OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies:错误值处理

    • TotalCharges:异常值处理

    • tenure:自定义分箱

    • 定义类别型和数值型字段

    # 错误值处理
    repl_columns = ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 
                    'TechSupport','StreamingTV', 'StreamingMovies']
    
    for i in repl_columns:
        df[i]  = df[i].replace({'No internet service' : 'No'}) 
    
    # 替换值SeniorCitizen
    df["SeniorCitizen"] = df["SeniorCitizen"].replace({1: "Yes", 0: "No"}) 
    
    # 替换值TotalCharges
    df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan) 
    
    # TotalCharges空值:数据量小,直接删除
    df = df.dropna(subset=['TotalCharges']) 
    df.reset_index(drop=True, inplace=True)  # 重置索引
    
    # 转换数据类型
    df['TotalCharges'] = df['TotalCharges'].astype('float')
    
    # 转换tenure
    def transform_tenure(x):
        if x <= 12:
            return 'Tenure_1'
        elif x <= 24:
            return 'Tenure_2'
        elif x <= 36:
            return 'Tenure_3'
        elif x <= 48:
            return 'Tenure_4'
        elif x <= 60:
            return 'Tenure_5'
        else:
            return 'Tenure_over_5' 
    
    df['tenure_group'] = df.tenure.apply(transform_tenure)
    
    # 数值型和类别型字段
    Id_col = ['customerID']
    target_col = ['Churn']
    
    cat_cols = df.nunique()[df.nunique() < 10].index.tolist() 
    num_cols = [i for i in df.columns if i not in cat_cols + Id_col] 
    
    print('类别型字段:\n', cat_cols)
    print('-' * 30) 
    print('数值型字段:\n', num_cols)
    
    类别型字段:
     ['gender', 'SeniorCitizen', 'Partner', 'Dependents', 'PhoneService', 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling', 'PaymentMethod', 'Churn', 'tenure_group']
    ------------------------------
    数值型字段:
     ['tenure', 'MonthlyCharges', 'TotalCharges']
    

    05

    探索性分析

    对指标进行归纳梳理,分用户画像指标,消费产品指标,消费信息指标。探索影响用户流失的关键因素。

    1. 目标变量Churn分布

    经过初步清洗之后的数据集大小为7032条记录,其中流失客户为1869条,占比26.6%,未流失客户占比73.4%。

    df['Churn'].value_counts() 
    No     5163
    Yes    1869
    Name: Churn, dtype: int64
    
    trace0 = go.Pie(labels=df['Churn'].value_counts().index, 
                    values=df['Churn'].value_counts().values,
                    hole=.5,
                    rotation=90,
                    marker=dict(colors=['rgb(154,203,228)', 'rgb(191,76,81)'], 
                                line=dict(color='white', width=1.3))
                   )
    data = [trace0] 
    layout = go.Layout(title='目标变量Churn分布')
    
    fig = go.Figure(data=data, layout=layout)
    py.offline.plot(fig, filename='./html/整体流失情况分布.html')
    

    2.性别

    分析可见,男性和女性在客户流失比例上没有显著差异。

    plot_bar(input_col='gender', target_col='Churn', title_name='性别与是否流失的关系') 
    

    3. 老年用户

    老年用户流失比例更高,为41.68%,比非老年用户高近两倍,此部分原因有待进一步探讨。

    plot_bar(input_col='SeniorCitizen', target_col='Churn', title_name='老年用户与是否流失的关系') 
    

    4. 是否有配偶

    从婚姻情况来看,数据显示,未婚人群中流失的比例比已婚人数高出13%。

    plot_bar(input_col='Partner', target_col='Churn', title_name='是否有配偶与是否流失的关系') 
    

    5. 上网时长

    经过分析,这方面可以得出两个结论:

    • 用户的在网时长越长,表示用户的忠诚度越高,其流失的概率越低;

    • 新用户在1年内的流失率显著高于整体流失率,为47.68%。

    plot_bar(input_col='tenure_group', target_col='Churn', title_name='在网时长与是否流失的关系') 
    

    6. 付款方式

    支付方式上,支付上,选择电子支票支付方式的用户流失最高,达到45.29%,其他三种支付方式的流失率相差不大。

    pd.crosstab(df['PaymentMethod'], df['Churn']) 
    

    plot_bar(input_col='PaymentMethod', target_col='Churn', title_name='付款方式与是否流失关系') 
    

    7. 月费用

    整体来看,随着月费用的增加,流失用户的比例呈现高高低低的变化,月消费80-100元的用户相对较高。

    plot_histogram(input_col='MonthlyCharges', title_name='月费用与是否流失关系')
    

    8. 数值型属性相关性

    从相关性矩阵图可以看出,用户的往来期间和总费用呈现高度相关,往来期间越长,则总费用越高。月消费和总消费呈现显著相关。

    plt.figure(figsize=(15, 10))  
    sns.heatmap(df.corr(), linewidths=0.1, cmap='tab20c_r', annot=True)
    plt.title('数值型属性的相关性', fontdict={'fontsize': 'xx-large', 'fontweight':'heavy'}) 
    plt.xticks(fontsize=12)
    plt.yticks(fontsize=12)
    plt.show() 
    

    06

    特征选择

    使用统计检定方式进行特征筛选。

    # 删除tenure
    df = df.drop('tenure', axis=1) 
    
    from feature_selection import Feature_select
    
    # 划分X和y
    X = df.drop(['customerID', 'Churn'], axis=1) 
    y = df['Churn']   
    
    fs = Feature_select(num_method='anova', cate_method='kf', pos_label='Yes')
    x_sel = fs.fit_transform(X, y)  
    
    2020 09:30:02 INFO attr select success!
    After select attr: ['DeviceProtection', 'MultipleLines', 'OnlineSecurity', 'TechSupport', 'tenure_group', 'PaperlessBilling', 'InternetService', 'PaymentMethod', 'SeniorCitizen', 'MonthlyCharges', 'Dependents', 'Partner', 'Contract', 'StreamingTV', 'TotalCharges', 'StreamingMovies', 'OnlineBackup']
    

    经过特征筛选,gender和PhoneService字段被去掉。

    07

    建模前处理

    在python中,为满足建模需要,一般需要对数据做以下处理:

    • 对于二分类变量,编码为0和1;

    • 对于多分类变量,进行one_hot编码;

    • 对于数值型变量,部分模型如KNN、神经网络、Logistic需要进行标准化处理。

    # 筛选变量
    select_features = x_sel.columns
    
    # 建模数据
    df_model = pd.concat([df['customerID'], df[select_features], df['Churn']], axis=1)
    
    Id_col = ['customerID']
    target_col = ['Churn']
    
    # 分类型
    cat_cols = df_model.nunique()[df_model.nunique() < 10].index.tolist() 
    # 二分类属性
    binary_cols = df_model.nunique()[df_model.nunique() == 2].index.tolist()
    # 多分类属性
    multi_cols = [i for i in cat_cols if i not in binary_cols] 
    
    # 数值型
    num_cols = [i for i in df_model.columns if i not in cat_cols + Id_col] 
    
    # 二分类-标签编码
    le = LabelEncoder()
    
    for i in binary_cols:
        df_model[i] = le.fit_transform(df_model[i]) 
    
    # 多分类-哑变量转换
    df_model = pd.get_dummies(data=df_model, columns=multi_cols) 
    df_model.head() 
    

    08

    模型建立和评估

    首先使用分层抽样的方式将数据划分训练集和测试集。

    # 重新划分
    X = df_model.drop(['customerID', 'Churn'], axis=1) 
    y = df_model['Churn']  
    
    # 分层抽样
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y) 
    print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) 
    
    #修正索引
    for i in [X_train, X_test, y_train, y_test]:
        i.index = range(i.shape[0]) 
    
    (5625, 31) (1407, 31) (5625,) (1407,)
    
    # 保存标准化训练和测试数据
    st = StandardScaler()
    num_scaled_train = pd.DataFrame(st.fit_transform(X_train[num_cols]), columns=num_cols)
    num_scaled_test = pd.DataFrame(st.transform(X_test[num_cols]), columns=num_cols) 
    
    X_train_sclaed = pd.concat([X_train.drop(num_cols, axis=1), num_scaled_train], axis=1)
    X_test_sclaed = pd.concat([X_test.drop(num_cols, axis=1), num_scaled_test], axis=1) 
    

    然后建立一系列基准模型并比较效果。

    假如我们关注roc指标,从模型表现效果来看,Naive Bayes效果最好。

    我们也可以对模型进行进一步优化,比如对决策树参数进行调优。

    parameters = {'splitter': ('best','random'),
                  'criterion': ("gini","entropy"),
                  "max_depth": [*range(3, 20)],
                 }
    
    clf = DecisionTreeClassifier(random_state=25)
    GS = GridSearchCV(clf, parameters, scoring='f1', cv=10)
    GS.fit(X_train, y_train)
    
    print(GS.best_params_) 
    
    print(GS.best_score_) 
    
    {'criterion': 'entropy', 'max_depth': 5, 'splitter': 'best'}
    0.585900839405024
    
    clf = GS.best_estimator_
    
    test_pred = clf.predict(X_test)
    print('测试集:\n', classification_report(y_test, test_pred)) 
    
    测试集:
                   precision    recall  f1-score   support
    
               0       0.86      0.86      0.86      1033
               1       0.61      0.61      0.61       374
    
        accuracy                           0.79      1407
       macro avg       0.73      0.73      0.73      1407
    weighted avg       0.79      0.79      0.79      1407
    

    将这颗树绘制出来。

    import graphviz
    dot_data = tree.export_graphviz(decision_tree=clf, max_depth=3,
                                     out_file=None, 
                                     feature_names=X_train.columns,
                                     class_names=['not_churn', 'churn'], 
                                     filled=True,
                                     rounded=True
                                    )
    graph = graphviz.Source(dot_data) 
    

    输出决策树属性重要性排序:

    imp = pd.DataFrame(zip(X_train.columns, clf.feature_importances_))
    imp.columns = ['feature', 'importances']
    imp = imp.sort_values('importances', ascending=False)
    imp = imp[imp['importances'] != 0]
    
    table  = ff.create_table(np.round(imp, 4))
    py.offline.iplot(table)  
    

    后续优化方向:

    • 数据:分类技术应用在目标类别分布越均匀的数据集时,其所建立之分类器通常会有比较好的分类效能。针对数据在目标字段上分布不平衡,可采用过采样和欠采样来处理类别不平衡问题;

    • 属性:进一步属性筛选方法和属性组合;

    • 算法:参数调优;调整预测门槛值来增加预测效能。

    本文出品:CDA数据分析师(ID: cdacdacda)

    近期开班情况

    课程详情请扫码咨询

    展开全文
  • 【摘 要】  为减少用户流失,提高用户保有率,文章介绍一种基于智慧运营平台,将大数据技术和数据挖掘技术相结合,对电信客户流失进行预测模型。该模型利用大数据技术处理用户离网前的海量数据信息,分析流失...

    【摘 要】  为减少用户流失,提高用户保有率,文章介绍一种基于智慧运营平台,将大数据技术和数据挖掘技术相结合,对电信客户流失进行预测的模型。该模型利用大数据技术处理用户离网前的海量数据信息,分析流失用户特征,建立用户流失预测,提前锁定流失风险较高的用户,有针对性地制定维挽策略,精准开展维系挽留活动,能够有效降低用户离网率。

    【关键词】  大数据;流失预测;数据挖掘;客户流失;维系挽留

    引言

    随着移动通信成本逐步下降,移动用户渗透率超过100%,新增市场趋于饱和,面对新增市场的激烈竞争,存量用户的保有显得越来越重要。一项调查数据表明,争取1位新客户的成本是保住1位老客户的5倍。面对新的竞争形势,运营商需要从传统只重视增量发展模式向“增存并重”发展模式转变。如何最大限度地降低客户的流失并挽留客户,成为决策者关注的话题。

    客户流失给运营商带来了巨大损失,成功挽留一个即将流失的客户比重新发展一个客户节约大量成本。减少客户流失的关键是提前预测潜在的流失客户,采取相关措施提高客户的满意度,实现该预测的关键是数据挖 掘[1]和大数据技术。基于大数据技术的数据挖掘就是从海量的客户资料、使用行为、消费行为、上网轨迹等信息中提取有用的信息进行组合关联,准确判断客户流失的现状或倾向,可以让企业及时并有针对性的对客户进行挽留[2];因此,利用大数据技术进行数据挖掘,预测客户流失、减少客户流失的发生成为电信行业研究的重点。

    1 国内外研究现状

    在数据挖掘方面,国外有很多案例和做法值得学习,比如:文献[3]中运用决策树、Logistic回归、 人工神经网络等算法建立了移动用户流失预测模型。 Lightbridge[4]公司运用CART算法分析了新英格兰的一 家移动服务商的数据并建立了客户流失模型AT&T 公司很早就开始在大数据上的探索[5],2009年开始与 Teradata公司合作引进天睿公司的大数据解决方案。

    在过去的几十年中,中国企业都扮演着技术跟随者的角色,现阶段我国互联网企业在数据挖掘、大数据处理以及人工智能、云计算等领域都有了巨大的发展。 比如文献[6]中使用K-means聚类算法对电信客户进行细分,在此基础上探索了客户细分在营销中的实际应用。 文献[7]中利用神经网络算法建立用户流失预测模型,分析用户流失特征。文献[8]中利用Spark平台实现了多种神经网络算法,对用户流失问题提出了快速精确的模型。国内的电信企业虽然都建立了客户流失预测、客户 分群等模型,但大多都是基于数据挖掘软件如SPSS、SAS等应用,使用的数据量有限,不能全面分析用户流失行为。

    2 大数据平台及技术

    安徽联通构建基于B域、O域和M域数据融合的大数据平台——智慧运营平台,实现数字化转型及全业务流程的智慧运营。智慧运营平台通过企业级大数据平台 实现企业全量数据的接入及治理,当前包括Hadoop、 Universe、实时流处理三大资源池,共计140多个节 点,存储容量3PB、2200核CPU、8T内存计算资源,实现资源动态管理;流处理平台具备百万级别消息并发 处理能力,支持1分钟级别提供用户位置能力(见图1)。

    在这里插入图片描述

    智慧运营平台接入BSS、CBSS、OSS、SEQ、上 网等全网多种数据源,利用BDI(Big Data Integration, 数据集成套件)和Flume进行离线数据及日志数据的抽取、转换、加载等数据采集功能,实现高性能海量数 据处理和存储。利用Hadoop、Universe、实时流处理三大资源池,有效支撑上层各种应用的开发和运行。利用基于大数据分析平台构建的新一代智能数据挖掘系统 SmartMiner进行自动化数据挖掘,实现各种算法模型的训练和预测。借助智慧运营平台强大的大数据分析和处理能力,结合现网客户运营的经验,建立有效的用户流失预测模型,实现用户的流失预警、维系策略匹配、客户反馈优化等一整套流程,能够有效降低用户流失。

    3 离网预测模型构建

    3.1 离网预测原理

    离网预测模型[9]主要是根据历史数据特征,通过数据挖掘算法,建立预测模型,并将模型应用于现网用户,预测出离网概率高的用户。其主要包括数据准备、 模型训练和验证、离网预测三大部分[10]。如图2所示,数据准备阶段,根据出账和充值规律定义离网规则,通过对电信业务和用户行为的理解,从运营商各域数据里提取数据,并筛选离网预测特征字段,构建离网预测特征库。模型训练和验证阶段,选取数据挖掘算法,进行模型训练、评估和调优,训练出最佳模型。离网预测阶段,将训练的最佳模型应用于现网数据,实现准确的流失预测。进一步通过有效的维系手段,对预测流失用户进行精准维系,减少用户离网,提升在网用户价值。

    在这里插入图片描述

    3.2 随机森林算法

    传统数据挖掘中进行流失预测多采用决策树算法[11],它的特点有训练时间复杂度低、预测的过程比较快、模型容易展示等。但是单决策树容易过拟合,虽然可以通过剪 枝等方法减少这种情况的发生,但仍有不足。2001年Leo Breiman在决策树的基础上提出了随机森林算法[12]。
    想学习的同学欢迎加入大数据学习扣群:805127855,有大量干货(零基础以及进阶的经典实战)分享给大家,并且有清华大学毕业的资深大数据讲师给大家免费授课,给大家分享目前国内最完整的大数据高端实战实用学习流程体系

    随机森林是由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成过程中分别在行方向和列方向上添加随机过程,行方向上构建决策树 时采用有放回抽样(bootstrapping)得到训练数据,列方向上采用无放回随机抽样得到特征子集,并据此得到其 最优切分点。从图3中可以看到,通过K次训练,得到K棵不同的决策树{T1,T2,…,TK},再将这些树组合成一个分类模型系统,随机森林是一个组合模型,内部仍然是基于决策树,同单一的决策树分类不同的是,随机森林通过多个决策树投票结果进行分类,算法不容易出现过度拟合问题。

    在这里插入图片描述

    3.3 数据准备

    3.3.1 离网定义及数据需求

    为了进一步提前锁定离网倾向用户,经过历史数据的比对,结合用户使用行为的分析,决定将过缴费期10天未缴费的用户定义为流失用户。根据传统数据挖掘实现的离网预测案例的经验,考虑到大数据系统的处理能力,通过对连续3个月内离网的用户进行离网打标,增加离网用户的样本量,提高离网预测的准确率;通过对目标用户中隔月后离网的用户进行打标,预留1个月的 预测结果干预期,进行维系挽留。如图4所示,采用连续7个月的历史数据,对第N-6月的数据进行隔月后的连 续3个月(N-4月、N-3月、N-2月)离网用户打标,取N-6 月、N-5月、N-4月连续3个月的正负样本并集,解决了传统打标负样本量不足和维系干预期太短等问题。

    在这里插入图片描述

    3.3.2 数据特征提取

    根据业务经验,选取与用户流失可能存在相关性的所有属性,进行数据审查,筛选存在相关性较大的特 征属性。本次建模数据特征主要采用B域用户通信及消 费行为等基本属性、衍生属性(汇总、比例、趋势和波动)、挖掘属性等,增加O域样本数据,如上网行为、 终端属性指标(换机、应用偏好、掉话率、上网协议响 应成功率等)。如表1所示,数据维度包括基础信息维度、通信行为信息、账务信息、消费行为变化维度、交往圈信息、呼叫异网维度、投诉维度、通信行为维度及上网轨迹、掉话率等。根据这些维度数据合并汇总成数据挖掘特征宽表,用于模型训练和验证。

    在这里插入图片描述

    3.4 建立模型

    流失客户预测模型的建立,具体包括原始数据处理、特征宽表构建、模型训练、模型评估和模型调优五个部分。如图5所示,智慧运营平台通过连接全网数 据的接口,获取建模所需的BSS系统(业务支持系统)数 据和OSS系统(运营支持系统)数据。BSS系统是运营商 向用户开展业务的主要IT组成部分,OSS系统是电信服务提供商用来管理通信网络的主要系统。BSS数据包括 CRM(客户关系)、Billing(账单数据)、详单数据及投诉数据,OSS数据包括分组交换数据(Package Switch, PS)、测量报告数据(Measurement Report,MR)和电路交换数据(Circuit Switch,CS)。其中PS数据描述了用户连接网络的情况,如上网速度、掉线率和移动搜索文本 信息;MR数据可以用来给用户定位,获取用户运动轨迹;CS数据描述的是用户的通话质量,如掉话率等。

    我们将获取的原始数据存储到Hadoop分布式文 件系统中(HDFS),然后再利用Hive进行特征生成和处理工作。HDFS可以处理PB级别的超大文件,Hive可 以提供简单的SQL查询功能,并能将SQL语句转化为 MapReduce任务分布式运行。

    在这里插入图片描述

    特征宽表生成后,我们利用Spark的高效计算能 力,在SmartMiner中选取随机森林算法进行流失预测模型的训练,经过训练结果的多次验证和评估,我们将 随机森林设置为200颗树,SQR采样方法,树的最大深 度为15层,叶子最小样本数100个,最大分箱数32,进行模型建立。将分类器训练出来的模型应用到现网数据,可以预测未来3个月有离网倾向的用户,按照离网倾向的高低排名,锁定维系挽留的目标客户。

    3.5 模型评估

    训练模型的好坏可以通过对历史流失数据的检验来验证,模型评估参数一般包括准确率和覆盖率,准确率越高、覆盖率越大,模型效果越好,其中:准确率=预测流失准确的客户数 / 预测为流失的客户数;覆盖率=预测流失准确的客户数 / 实际流失的客户数。

    如图6所示,我们根据建模训练数据的规则,可以在第N月预测第N+2月、N+3月、N+4月的流失用户, 第N+1月为我们的维系窗口期。

    我们选取2016年16月数据进行训练,对710月数据进行模型预测,如图7所示,经过2016年9月至 2017年2月数据的验证,可以得到7~10月的预测数据 TOP50000中查准率基本在80%,查全率40%。

    在这里插入图片描述

    4 离网根因分析

    通过对离网用户的特征属性进行聚类分析,离网用户大致原因可以分为:资费原因、合约感知原因、社会交往影响原因、终端换机原因、地域变更原因、服务质量原因、通信质量原因、弃卡原因、新入网质量原因及其他原因等。如表2所示,提取2016年11月数据预测2017年1~3月离网概率top400000用户,对其离网情况进行验证,其准确率达到52%以上。

    在这里插入图片描述

    5 应用

    5.1 策略匹配

    通过对流失用户的根因分析,结合现有维系业务,将预测的离网用户,根据业务特征进行分类,匹配相应策略指导市分VIP维系客户经理进行外呼维系。如表3所示,将离网倾向较高的用户分为话务异常、业务异常和服务异常三类,针对话务异常用户,重点进行优惠活动介绍,增加用户黏性;对于业务异常用户,推荐合约 续约及更换SIM卡;对于服务异常用户,进行及时安抚并给予一定赠送。

    在这里插入图片描述

    5.2 维系效果

    针对三星级以上用户,我们利用在网维系系统进行了针对性的维系挽留。从2017年1月开始,我们将大数据系统预测出的离网倾向较高的高价值用户通过在网维系系统下发到市分VIP客户经理处,根据匹配的策略进行精准维系。如图8所示,2015年9月至12月,高价值 用户准离网率平均值为2.04%,全网准离网率为3.6%。 模型应用后,高价值离网率从2017年2月开始持续降低,如图9所示,截至2017年7月下降到1.35%,平均准离网率为1.49%,相比应用前的2.04%下降了0.55%, 每月多挽留客户8230户,高价值户均ARPU按90元计算,月均减少损失74万元,年减少损失888万元。

    在这里插入图片描述

    6 总结

    本文阐述了利用智慧运营大数据平台,对流失客户的特征进行的分析和研究,利用SmartMiner分析系统选取随机森林算法,建立客户流失预测模型,通过多次的训练和优化,逐步提高流失预测模型的准确性。通过对离网用户的根因分析,制定相应维系策略,匹配到相应的离网倾向用户,在全网进行了系统化的精准维系,有效提升了用户保有率。下一步将结合维系效果,继续优化模型参数,完善训练模型,进一步提升流失预测的准确率和覆盖率,继续研究用户流失根因,根据离网根因匹配维系策略,进一步降低用户流失,增强用户黏性,提升客户价值。
    想学习的同学欢迎加入大数据学习扣群:805127855,有大量干货(零基础以及进阶的经典实战)分享给大家,并且有清华大学毕业的资深大数据讲师给大家免费授课,给大家分享目前国内最完整的大数据高端实战实用学习流程体系

    展开全文
  • 客户使用随机森林进行预测表中的内容这是在银行中基于客户流失预测的随机森林分类器的一种简单而现实的问题解决方案。 该模型采用经过预处理的数据集,并在训练集上进行训练,然后在测试数据集上进行预测,准确度约...
  • 源自:数据分析不是个事儿作者:启方客户流失是所有与消费者挂钩行业都会关注的点。因为发展一个新客户是需要一定成本的,一旦客户流失,成本浪费不说,挽回一个客户的成本更大。今天分享一个用户流失...

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

    作者:启方

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

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

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

    一、提出问题

    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 客户流失是所有与消费者挂钩行业...
  • 基于数据挖掘的客户流失预测模型的建立.nh 基于数据挖掘的客户流失预测模型的建立.nh
  • 电信客户流失预测模型设计与实现,工作中总结的
  • 目前客户流失预测任务中常用的模型集成方法采用传统机器学习模型作为基学习器。而传统机器学习模型相比于深度学习模型,存在无法对时序数据进行有效建模、特征工程对模型效果影响较大等缺点。针对这些问题,提出基于...
  • 原标题:实例 | 教你用python写一个电信客户流失预测模型 CDA数据分析师 出品作者:真达、Mika数据:真达【导读】今天教大家如何用Python写一个电信用户流失预测模型。之前我们用Python写了员工流失预测模型,这次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,785
精华内容 2,714
关键字:

客户流失预测模型