前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爱数课实验 | 使用线性判别分析来预测客户流失

爱数课实验 | 使用线性判别分析来预测客户流失

作者头像
数据科学人工智能
发布2022-04-01 11:31:10
1.1K0
发布2022-04-01 11:31:10
举报
文章被收录于专栏:数据科学和人工智能

爱数课:idatacourse.cn

领域:消费

简介:本次实验通过线性判别来分析预测客户流失

数据:

./dataset/Discriminant-analysis-churn-dataset.csv

1. 目录

2. 简介

目前,电信运营商面临激烈的市场竞争,客户争夺愈演愈烈,每个企业都存在客户流失的问题。在竞争激烈的世界里,对于每家公司来说,找出客户流失的原因以应对这种情况至关重要。

预防客户流失的重要性:1.获得新客户的成本很高,而且需要付出很多努力,而防止客户流失的成本效益要高得多。2.竞争显着增加,产品往往相同甚至可以互换。客户流失的可能性正在增加。因此,每家公司都应该制定长期的客户忠诚度战略。3.导致客户流失的因素有很多,公司必须识别、理解和消除每一个因素,以便客户与公司保持联系。4.使用正确的客户体验管理工具,定期进行客户调查和接触至关重要。

商业成功的关键就在于充分了解客户的行为和偏好,为潜在客户和现有客户提供个性化的服务。使用客户行为分析技术,可以分析客户流失的原因,分析客户的喜好,可以预测客户业务情况的回馈,从而得到接近他们所需的信息。同时为防止客户流失做出改善例如:提供出色的客户服务和支持,提供超越购买的价值,个性化客户体验等等。

3. 项目介绍

由于服务和客户群体因素的影响,电信业务面临频繁客户流失的挑战。我们用于分析的数据集包括一个关于现有客户购买服务相关因素的列表,以及关于他们是否购买服务的信息。我们的目标是了解哪些因素对客户流失的影响较大,并根据服务相关因素预测哪些客户可能会而流失。本文将对流失用户做特征分析和流失原因分析,帮助运营商发现并改善用户体验,以及帮助确定挽留目标用户和制定方案。

4. 数据获取

4.1 数据集介绍

用于分析的数据集包含了5000个客户的信息,包括账户长度、语音邮件信息的数量、白天总费用、傍晚总费用、夜晚总费用、国际长途费用、客户服务电话的数量和是否流失等字段。各个字段类型及含义如下表所示:

列名

类型

含义说明

account_length

整型

账户长度

number_vmail_messages

整型

语音邮件信息的数量

total_day_charge

浮点型

白天总费用

total_eve_charge

浮点型

傍晚总费用

total_night_charge

浮点型

夜晚总费用

total_intl_charge

浮点型

国际长途总费用

number_customer_service_calls

整型

拨打客户服务电话数量

churn

整型

是否流失(1表示流失,0表示未流失)

4.2 读取数据

首先,使用Pandas库的red_csv()函数读取数据。使用head()方法查看数据的前几条信息。

代码语言:javascript
复制
import pandas as pd
import numpy as np
代码语言:javascript
复制
df = pd.read_csv('./dataset/Discriminant-analysis-churn-dataset.csv') #读取数据
代码语言:javascript
复制
df.head(5)#查看数据的前五行信息

4.3 查看数据基本信息

代码语言:javascript
复制
df.info() #查看数据基本信息

info()方法可以查看包括数据的维度,字段的名称和类型,以及有无缺失值,数据占用的内存等信息。可以看到,该数据集包含5000个样本和8个字段,没有缺失数据。只有整型和浮点型数据,没有字符型数据。

代码语言:javascript
复制
df.describe(include='all') #查看数据基本统计信息

describe()方法可以查看各个列的基本统计信息。从输出结果我们可以看到,账户长度account_length、白天总费用total_day_charge等字段的样本数量count,均值mean,方差std,最小值min,下四分位数25%,中位数50%,上四分位数75%,最大值max等信息。

5. 数据探索性分析

在前面的任务中,通过info()describe()等方法展示了数据的基本信息。我们将利用Python中的绘图库如Matplotlib、Seaborn等,通过绘图的方式对数据进行探索性分析。

5.1 流失客户与未流失客户饼状图

在这个项目中,churn客户是否流失,流失客户人数与未流失客户人数的分布比例对模型预测至关重要,若分布不均则会对模型的预测效果产生影响。下面通过绘制饼状图的方式展现流失客户与未流失客户的的占比情况。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']   # 用来正常显示中文标签
%config InlineBackend.figure_format = 'svg'#让图表变成矢量形式,显示更清晰 
代码语言:javascript
复制
fig =plt.figure(figsize=(6,4),dpi= 120)#figsize设置图形大小,dpi设置图形分辨率
plt.pie(df['churn'].value_counts(),explode=(0.1,0),labels=['未流失','流失'],autopct='%.2f%%')
plt.title('流失与未流失客户占比') #设置标题

5.2 账户长度按客户是否流失分组箱线图

代码语言:javascript
复制
fig =plt.figure(figsize=(6,4),dpi= 120)#figsize设置图形大小,dpi设置图形分辨率
sns.boxplot(x='churn',y='account_length',data=df,palette='Set2')#绘制箱线图
plt.xlabel('客户是否流失') #设置x轴标签
plt.ylabel('账户长度')#设置y轴标签
plt.title('账户长度按客户是否流失分组箱线图')#设置标题

分析账户长度与客户是否流失的关系,账户长度按客户是否流失分组箱型线可以看到,两组的差别并不明显,账户长度对客户流失并没有太大影响。

5.3 语音邮件数量按客户是否流失分组箱线图

代码语言:javascript
复制
ig =plt.figure(figsize=(6,4),dpi= 120)#figsize设置图形大小,dpi设置图形分辨率
sns.boxplot(x='churn',y='number_vmail_messages',data=df,palette='Set2')#绘制箱线图
plt.xlabel('客户是否流失') #设置x轴标签
plt.ylabel('语音邮件数量')#设置y轴标签
plt.title('语音邮件数量按客户是否流失分组箱线图')#设置标题

分析语音邮件数量与客户是否流失的关系,从语音邮件数量按客户是否流失分组箱型线中可以看出,流失客户的语音邮件数量较未流失客户少。

5.4 白天总费用按客户是否流失分组箱线图

代码语言:javascript
复制
ig =plt.figure(figsize=(6,4),dpi= 120)#figsize设置图形大小,dpi设置图形分辨率
sns.boxplot(x='churn',y='total_day_charge',data=df,palette='Set3')
plt.xlabel('客户是否流失') #设置x轴标签
plt.ylabel('白天总费用')#设置y轴标签
plt.title('白天总费用按客户是否流失分组箱线图')#设置标题

分析白天总费用与客户是否流失的关系,从白天总费用按客户是否流失分组箱线图中可以看出,那些流失客户的白天总费用相较于未流失客户比较高。这可能表明,流失的客户对他们的套餐资费并不满意等等。

5.5 客户服务电话数量用按客户是否流失分组箱线图

代码语言:javascript
复制
ig =plt.figure(figsize=(6,4),dpi= 120)#figsize设置图形大小,dpi设置图形分辨率
sns.boxplot(x='churn',y='number_customer_service_calls',data=df,palette='Set3')
plt.xlabel('客户是否流失') #设置x轴标签
plt.ylabel('客户服务电话数量')#设置y轴标签
plt.title('客户服务电话数量按客户是否流失分组箱线图')#设置标题

分析客户服务电话数量与客户是否流失的关系,从客户服务电话数量用按客户是否流失分组箱线图可以看出,客户流失的客户服务电话数量相对较高。这表明或许已流失的客户尝试联系客服,但可能没有得到满意的解决等。

6. 模型构建

判别分析(Discriminant Analysis)是一种分类方法,它通过一个已知类别的“训练样本”来建立判别准则,并通过预测变量来为未知类别的数据进行分类。线性判别式分析(Linear Discriminant Analysis,简称为LDA)是其中一种,也是模式识别的经典算法,在1996年由Belhumeur引入模式识别和人工智能领域。LDA以Bayes判别思想为基础,当分类只有两种且总体服从多元正态分布条件下,Bayes判别与Fisher判别、距离判别是等价的。

基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。

6.1 数据集划分

我们把数据划分为训练集和测试集,训练集用于训练模型,测试集用于评估模型性能。在Sklearn中的model_selection模块的train_test_split()函数可以进行训练集和测试集的划分。我们将数据按照分为训练集和测试集。

代码语言:javascript
复制
y = df['churn'].values
X  = df.drop('churn',axis=1)

#数据集划分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                   test_size=0.3,random_state=160,stratify=y)

6.2 归一化处理

由于数据中包含变量的维度各不相同,对其进行归一化处理,以便每个变量的范围对判别系数的影响相同。在Sklearn的preprocessing模块的MinMaxScaler类可以对数据进行Min-Max归一化处理。

代码语言:javascript
复制
from sklearn.preprocessing import MinMaxScaler

#MinMaxScaler进行归一化
scaler = MinMaxScaler()
X_train.loc[:,:]=scaler.fit_transform(X_train)
X_test.loc[:,:]=scaler.transform(X_test)

6.3 模型训练与评估

LDA线性判别分析步骤:

第一步:计算每一类的的信息向量的均值。

第二步:计算类内散布矩阵:

S_w=\sum\limits_{i=1}^cS_i

其中:

S_i=\sum\limits_{x\in D_i}^n(x-m_i)(x-m_i)^T
m_i=\frac{1}{n_i}\sum\limits_{x\in D_i}^nx_k

第三步:计算类间散布矩阵:

S_b=\sum\limits_{i=1}^cN_i(m_i-m)(m_i-m)^T

其中是全局信息向量均值,和分别是类别内的信息向量均值和样本个数。

第四步:求解矩阵 的特征向量和特征值,并将它们排序

第五步:选取个最大特征值对应的特征向量形成特征矩阵。即特征转换矩阵的宽度,和将为后空间的维度。

第六步:将信息矩阵与特征转换矩阵相乘从而实现降维。

使用Scikit-learn中的LinearDiscriminantAnalysis类可以构建线性判别分析模型,LinearDiscriminantAnalysis位于sklearn.discriminant_analysis包,首先将其导入,然后再将划分好的训练集X_triany_train带入模型中,调用fit方法进行模型训练。

代码语言:javascript
复制
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis() #声明一个LinearDiscriminantAnalysis对象
lda.fit(X_train, y_train)#训练模型

LinearDiscriminantAnalysis()

代码语言:javascript
复制
print('模型预测准确率:',lda.score(X_test,y_test))

模型预测准确率:0.864

可以看到建立的线性判别分析模型在客户是否流失这个问题上准确率还是非常高的,达到了。

6.4 模型对比分析

使用Scikit-learn中的LogisticRegression类可以构建逻辑回归模型,LogisticRegression位于sklearn.linear_model包,首先将其导入,然后再将划分好的训练集X_triany_train带入模型中,调用fit方法进行模型训练。

代码语言:javascript
复制
from sklearn.linear_model import LogisticRegression


model_lr= LogisticRegression(class_weight='balanced',random_state=10)
model_lr.fit(X_train,y_train)

LogisticRegression(class_weight='balanced', random_state=10)

代码语言:javascript
复制
print('模型预测准确率:',model_lr.score(X_test,y_test))

模型预测准确率:0.7193333333333334

逻辑回归模型在客户是否流失这个问题上准确率为。

判断客户是否流失,是商业成功的重要部分。促使商家充分了解客户的行为和偏好,为潜在客户和现有客户提供个性化的服务,改善客户服务和支持工作,提高商业竞争力等等。本案例我们学习了通过饼状图和箱线图进行数据可视化的方法,通过构建线性判别分析模型和逻辑回归模型进行分类,判断客户是否流失。

爱数课(iDataCourse)是一个面向院校的大数据和人工智能课程和资源平台。平台提供权威的课程资源、数据资源、案例实验资源,助力院校大数据和人工智能专业建设,课程建设和师资能力建设。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学人工智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 目录
  • 2. 简介
  • 3. 项目介绍
  • 4. 数据获取
    • 4.1 数据集介绍
      • 4.2 读取数据
        • 4.3 查看数据基本信息
        • 5. 数据探索性分析
          • 5.1 流失客户与未流失客户饼状图
            • 5.2 账户长度按客户是否流失分组箱线图
              • 5.3 语音邮件数量按客户是否流失分组箱线图
                • 5.4 白天总费用按客户是否流失分组箱线图
                  • 5.5 客户服务电话数量用按客户是否流失分组箱线图
                  • 6. 模型构建
                    • 6.1 数据集划分
                      • 6.2 归一化处理
                        • 6.3 模型训练与评估
                          • 6.4 模型对比分析
                          相关产品与服务
                          大数据
                          全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档