您的位置:首页 > 其它

R:航空公司客户价值分析实战

2018-03-04 08:14 525 查看

一、背景及挖掘目标

1、行业背景

随着大数据的来临,传统的商业模式正在被一个新的营销模式—“数据化营销”所替代,采取不同的营销策略,将有限的资源集中在高价值的客户上,实现企业利润的最大化目标。
面对激烈的市场竞争,国内的某航空公司面临着旅客流失、竞争力下降、航空资源未充分利用等危机,通过建立合理的客户价值评估模型,对客户进行分群,分析比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化的客户服务是非常必要的。

2、挖掘目标

⑴借助航空公司的客户数据,对客户进行分类;
⑵对不同类的客户类别进行特征分析,比较不同类客户的客户价值;
⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;
⑷对不同价值的客户类别提供个性化的服务,并且制定相应的营销策略,使得公司的利益最大化。

二、分析方法及流程

1、分析方法

RFM模型是衡量客户价值和客户创利能力的重要工具和手段,它通过一个客户的近期购买行为、购买的总体频次以及购买的总体金额三个指标来描述客户的价值状况。分别为:最近消费时间间隔(Recently)、消费频率(Frequency)、消费金额(Money)。
在RFM模型的基础上,结合具体的业务背景,来对航空公司进行客户价值分析。我们选择在一定时间内累积的飞行里程数(M)和客户在一定时间内乘坐舱位对应的折扣系数的平均值C来代替消费金额指标。此外,航空公司会员入会时间的长短在一定时间内会影响客户价值,模型中增加了客户关系长度指标L。
利用客户入会时长L、消费时间间隔R、消费频率F、飞行里程数M以及折扣系数的平均值C来作为航空公司识别客户价值指标,见表1,记为LRFMC模型。表1:指标含义
[align=center]
指标对应含义
L会员入会时间距离观测窗口结束的月数
R客户最后一次乘坐飞机距离观测窗口结束的月数
F客户在观测窗口乘坐飞机的次数
M客户在观测窗口内累计飞行里程数
C客户在观测窗口乘坐舱位对应的折扣系数的平均值C
[/align]采用聚类分析的方法识别客户价值。通过对航空公司客户价值LRFMC五个指标进行K-Means聚类,识别最有价值客户。

2、分析流程

2.1分析流程

⑴从航空公司的数据源中进行数据提取;
⑵对数据进行数据探索以及数据预处理工作,包括数据的缺失值及异常值处理、数据的属性规约以及数据的变换等;
⑶对处理过的数据进行建模工作,基于旅客价值LRFMC模型进行客户分群,对各个客户进行特征提取,识别出有价值的客户;
⑷ 对不同价值的客户类别提供个性化的服务,并且制定相应的营销策略,使得公司的利益最大化。
具体数据分析流程如图1所示:



                       图1:LRFMC模型建模的总体流程
2.2数据抽取
选取时间宽度为两年的数据进行分析,抽取观测窗口有乘机记录的客户的详细数据形成历史数据。对后续新增客户的信息,按照后续新增数据最新的时间节点作为结束时间,形成新增数据。#查看工作目录
getwd()
#要保证工作目录下有数据文件,比如air_data.csv文件在“E:\数据分析小项目‘目录下
#设置工作目录
setwd('E:/数据分析小项目')
#读取数据文件
datafile <- read.csv("air_data.csv",header=TRUE,stringsAsFactors=FALSE,quote = "",fileEncoding="utf-8")
#查看数据维度
dim(datafile)
#查看数据的前6行
head(datafile)
</textarea>

2.3数据探索性分析

主要是进行缺失值分析和异常值分析,通过对数据的观察,发现原始数据中存在票价为空值,票价最小值为0、折扣率最小值为0、总飞行公里数大于0的记录,这个都是属于缺失值和异常值的范畴。

2.4数据预处理

2.4.1数据清洗

由于原始数据量比较大,上述被定义为缺失值和异常值的样本量很小,对问题的分学习影响不大,因此选择的是剔除缺失值和异常值。<textarea readonly="readonly" name="code" class="python">
###########---------导入查看变量缺失值函数的包------------#########
library(mice)
library(VIM)
#########------------对数据进行探索性分析------------############
#查看数据的属性
colnames(datafile)
#查看属性的数据类型
str(datafile)
#将乘坐飞机次数由字符型转为int型
datafile$FLIGHT_COUNT <- as.integer(datafile$FLIGHT_COUNT)
#将乘坐飞机次数为空的值删除
datafile <- datafile[-which(is.na(datafile$FLIGHT_COUNT)),]

#确定要探索分析的属性
col <- c(15:18,20:29)
#查看变量的缺失值情况
summary(datafile[,col])
#探索缺失数据的模式
md.pattern(datafile[,col])
#以图形方式描述缺失数据
aggr(datafile[,col],number=T)
####--------------数据预处理-----------#####
#异常值处理,进行数据的清洗工作,将变量缺失的数据删除
#丢弃票价为空的记录,实际上是选取了样本的子集
delete_na <- datafile[-which(is.na(datafile$SUM_YR_1)|is.na(datafile$SUM_YR_2)),]
#保留票价为非0的,或者平均折扣率与飞行公里数同时为0的记录

index <- (delete_na$SUM_YR_1!=0)|(delete_na$SUM_YR_2!=0)|((delete_na$avg_discount==0)&(delete_na$SEG_KM_SUM==0))

delete_data <- delete_na[index,]
</textarea>

2.4.2属性规约

基于航空公司客户价值的LRFMC模型,选择与LRFMC指标相关的6个属性,其中选取了LOAD_TIME(观测窗口的结束时间),FFP_DATE(观测窗口的开始时间),LAST_TO_END(最后一次乘机时间至观测窗口结束时长),FLIGHT_COUNT(观测窗口的飞行次数),SEG_KM_SUM(观测窗口的总飞行公里数),avg_discount(平均折扣率),删除其余不必要的属性。

2.4.3数据变换

⑴属性构造
由于在原始数据并没有完整的给出LRFMC模型的5个指标,需要通过原始变量提炼相应指标,具体的计算公式如下:
会员入会时间=观测窗口的结束时间-观测窗口的开始时间(单位:月)L=LOAD_TIME- FFP_DATE
客户最近一次乘坐飞机距离窗口结束的月数=最后一次乘机时间至观测窗口结束时长(单位:月)R= LAST_TO_END
客户在观测窗口乘坐飞机的次数=观测窗口的飞行次数(单位:次)F= FLIGHT_COUNT
客户在观测时间内的累计飞行里程=观测窗口的总飞行公里数(单位:公里)M= SEG_KM_SUM
客户在观测时间内乘坐舱位所对应的的折扣系数的平均值=平均折扣率(单位:无)C= avg_discount
⑵数据的标准化处理
通过R语言中的summary函数来查看每个指标数据的分布情况,其数据取值范围如表2所示,发现五个指标的数据差异较大,为了消除数据数量级较大带来的影响,对数据进行了标准化处理。表2:LRFMC指标取值范围
属性名称
LRFMC
最大值
12.171.02.003680.0000
中位数
42.57105.07.00101980.7121
均值
49.62172.511.97173200.7221
最小值
114.57731.0213.005807171.5000
<textarea readonly="readonly" name="code" class="python">
#属性规约,选择后期需要进行K-Means分类的属性
deleted_data <- delete_data[,c('FFP_DATE','LOAD_TIME','FLIGHT_COUNT','avg_discount','SEG_KM_SUM','LAST_TO_END')]

#数据变换,客户入会时长需要另外计算,入会时长按照月来进行计算
class(deleted_data$FFP_DATE)
class(deleted_data$LOAD_TIME)
#因为入会时间和观测窗口结束时间都是字符串,所以更改数据类型
deleted_data$FFP_DATE <- as.Date(deleted_data$FFP_DATE)
deleted_data$LOAD_TIME <- as.Date(deleted_data$LOAD_TIME)
#计算客户入会时间,并将最终结果转为月数
deleted_data$L <- as.numeric((deleted_data$LOAD_TIME-deleted_data$FFP_DATE)/30)

#只选择LRFMC模型需要的5个属性
deleted_data <- deleted_data[,c('L','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount')]
#列名重命名
colnames(deleted_data) <- c('L','R','F','M','C')

#对数据分布进行查看,看是否需要标准化处理
summary(deleted_data)

#5个指标的数据范围差异太大,所以需要进行标准化处理
zscorefile <- scale(deleted_data)
#对列名再次重命名
colnames(zscorefile) <- c('ZL','ZR','ZF','ZM','ZC')
<textarea>

2.4.4模型构建

LRFMC模型主要由两个部分组成,第一部分是根据航空公司业务指标,对客户进行聚类分群;第二部分是对每个业务群进行特征分析,分析客户价值,并采取特定的营销手段,来使得公司的利润最大化。
⑴客户聚类结果
对数据进行聚类分群如下表所示:                         表3:客户聚类结果
[align=center]
聚类类别聚类个数聚类中心
ZLZRZFZMZC
客户群153360.48296123
-0.79944875
2.48351216
2.42472275
0.3087468
客户群2157451.16049784
-0.37732916
-0.37732916
-0.09498699
-0.1557095
客户群312134-0.31370040
1.68554920
-0.57392324
-0.53674300
-0.1743790
客户群424666-0.70030743
-0.41494899
-0.16116894
-0.16107783
-0.2530821
客户群541700.05542063
-0.00249783
-0.22544385
-0.22944009
2.1972694
[/align] 
⑵客户价值分析

图2:客户群特征分析图
重要保持客户(客户群1):
这类客户的平均折扣率(C)较高(一般所乘航班的舱位的等级较高),最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较高。他们是公司的高价值客户,是最理想的客户类型,对航空公司的贡献率大,但是所占的比例较小。
航空公司应当优先将资源投放在他们身上,对他们做到一对一精准营销,比如提供相应的优惠政策,提高这类客户的忠诚度和满意度,尽可能延长这类客户的高消费水平。
重要发展客户(客户群5):
这类客户的平均折扣率(C)较高,最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较低。这类客户入会时长(L)短,他们是公司的潜在价值客户
航空公司在运营过程中也要相应加大对这部分客户的投入,比如以短信和邮件的方式询问客户是否满意、提供适当的优惠服务等,加强这类客户的满意度,使他们逐渐成为公司的忠实客户。
重要挽留客户(客户群2):
这类客户的平均折扣率(C)、乘坐的次数(F)或里程(M)较高,但是已经较长时间已经没有乘坐过本公司航班,即(R)较高或者乘坐的频率变小,他们是公司的重要挽留客户
航空公司在运营过程中要积极推测这类客户的异常情况,进行竞争分析,观察其他航空公司有什么营销策略,然后采取有针对性的营销手段,延长客户的生命周期。
一般和低价值客户(客户群3、4):
这类客户的平均折扣率(C)较低,最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较低。入会时长(L)也较短,因此可能只是在机票打折的时候才会乘坐本航班。
重要发展客户、重要保持客户、重要挽留客户可以称作为客户生命周期管理中的发展期、稳定期、衰退期三个阶段。
⑶模型应用
①会员的升级和保级
对那些接近但尚未达到的高消费客户采取一定的促销活动,刺激他们通过消费达到相应的升级标准。
②首次兑现
对那些接近但尚未达到首次兑现机票的会员,对他们进行提醒,使他们达到首次兑现标准。<textarea readonly="readonly" name="code" class="python">
#利用K-Means构建LRFMC模型
result <- kmeans(zscorefile,5)
#查看各个类样本的数量
table(result$cluster)
#查看类中心
result$centers
#将各个聚类以柱形图展示
barplot(table(result$cluster),col=rainbow(5))
<textarea>




三、数据清洗、建模、评估的个人总结

1、数据简单查看

查看数据的维度:dim
查看数据的属性:colnames
查看数据类型:str
注:有一些算法,比如说组合算法,要求分类变量为因子型变量;层次聚类,要求是一个距离矩阵,可以通过str函数进行查看
查看前几行数据:head
注:可以初步观察数据是不是有量纲的差异,会后续的分析做准备
查看因子型变量的占比情况:table/prop.table
注:可以为后续数据抽样做准备,看是否产生类不平衡的问题

2、数据缺失值处理

summary函数进行简单的查看
利用mice和VIM包查看数据缺失值情况,代表性函数: md.pattern、aggr
caret包中的preProcess函数,可以进行缺失值的插补工作,有knn、袋装、中位数方法
missForest包中的missForest函数,可以用随机森林的方法进行插补
可以用回归分析的方法完成缺失值插补工作
如果样本量很多,缺失的数据很少,可以选择直接剔除的方法

3、数据异常值处理

summary函数进行简单的查看,比如:最大值、最小值等
boxplot函数绘制箱线图

4、数据抽样

sample函数进行随机抽样
caret包中的createDataPartition()函数对训练样本和测试样本进行等比例抽样
caret包中的createFold函数根据某一个指标进行等比例抽样
DMwR包中SMOTE函数可以解决处理不平衡分类问题
注:比如决策树算法中,如果样本严重不平衡,那么模型会出现欠拟合现象

5、变量的多重共线性处理

结合业务,先删除那些和分析无关的指标
corrgram包的corrgram函数查看相关系数矩阵
caret包中的findCorrelation函数查看多重共线性
如果相关性太大,可以考虑删除变量;如果变量比较重要,可以考虑主成分/因子分析进行降维处理

6、模型评估

混淆矩阵
ROC曲线
AUC值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  R数据分析