赞
踩
随着大数据的来临,传统的商业模式正在被一个新的营销模式—“数据化营销”所替代,采取不同的营销策略,将有限的资源集中在高价值的客户上,实现企业利润的最大化目标。
面对激烈的市场竞争,国内的某航空公司面临着旅客流失、竞争力下降、航空资源未充分利用等危机,通过建立合理的客户价值评估模型,对客户进行分群,分析比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化的客户服务是非常必要的。
⑴借助航空公司的客户数据,对客户进行分类;
⑵对不同类的客户类别进行特征分析,比较不同类客户的客户价值;
⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;
⑷对不同价值的客户类别提供个性化的服务,并且制定相应的营销策略,使得公司的利益最大化。
RFM模型是衡量客户价值和客户创利能力的重要工具和手段,它通过一个客户的近期购买行为、购买的总体频次以及购买的总体金额三个指标来描述客户的价值状况。分别为:最近消费时间间隔(Recently)、消费频率(Frequency)、消费金额(Money)。
在RFM模型的基础上,结合具体的业务背景,来对航空公司进行客户价值分析。我们选择在一定时间内累积的飞行里程数(M)和客户在一定时间内乘坐舱位对应的折扣系数的平均值C来代替消费金额指标。此外,航空公司会员入会时间的长短在一定时间内会影响客户价值,模型中增加了客户关系长度指标L。
利用客户入会时长L、消费时间间隔R、消费频率F、飞行里程数M以及折扣系数的平均值C来作为航空公司识别客户价值指标,见表1,记为LRFMC模型。
表1:指标含义
指标 | 对应含义 |
L | 会员入会时间距离观测窗口结束的月数 |
R | 客户最后一次乘坐飞机距离观测窗口结束的月数 |
F | 客户在观测窗口乘坐飞机的次数 |
M | 客户在观测窗口内累计飞行里程数 |
C | 客户在观测窗口乘坐舱位对应的折扣系数的平均值C |
采用聚类分析的方法识别客户价值。通过对航空公司客户价值LRFMC五个指标进行K-Means聚类,识别最有价值客户。
⑴从航空公司的数据源中进行数据提取;
⑵对数据进行数据探索以及数据预处理工作,包括数据的缺失值及异常值处理、数据的属性规约以及数据的变换等;
⑶对处理过的数据进行建模工作,基于旅客价值LRFMC模型进行客户分群,对各个客户进行特征提取,识别出有价值的客户;
⑷ 对不同价值的客户类别提供个性化的服务,并且制定相应的营销策略,使得公司的利益最大化。
具体数据分析流程如图1所示:
图1:LRFMC模型建模的总体流程
选取时间宽度为两年的数据进行分析,抽取观测窗口有乘机记录的客户的详细数据形成历史数据。对后续新增客户的信息,按照后续新增数据最新的时间节点作为结束时间,形成新增数据。
主要是进行缺失值分析和异常值分析,通过对数据的观察,发现原始数据中存在票价为空值,票价最小值为0、折扣率最小值为0、总飞行公里数大于0的记录,这个都是属于缺失值和异常值的范畴。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #对数据进行基本的探索,返回缺失值以及最大值,最小值
- import pandas as pd
- datafile = 'data/air_data.csv' #航空原始数据文件
- resultfile = 'explore_result.xls' #数据探索结果文件
- #将数据导入
- data = pd.read_csv(datafile,encoding='utf-8')
- #查看数据的各个属性的相关信息
- data.info()
- #将每个属性的描述性统计量展示
- explore=data.describe(percentiles=[],include='all').T
- #计算属性对应的空值个数
- explore['null']=len(data)-explore['count']
- #选取部分探索内容
- explore = explore[['null','max','min']]
- #属性列名的重命名
- explore.columns = [u'空值记录数',u'最大值',u'最小值']
- #对索引命名
- explore.index.name=u'属性名称'
- #将探索的结果保存到excel文件
- explore.to_excel(resultfile,header=True)
- <textarea>

数据探索分析结果表(部分)
由于原始数据量比较大,上述被定义为缺失值和异常值的样本量很小,对问题的分学习影响不大,因此选择的是剔除缺失值和异常值。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #数据清洗,过滤掉不符合规则的数据
- import pandas as pd
- datafile = 'data/air_data.csv'#航空数据源文件
- cleanedfile = 'cleaned_data.csv'#数据被清洗后保存的文件
- #导入航空客户数据原文件
- data = pd.read_csv(datafile,encoding='utf-8')
- #删除票价为空的记录
- data = data[(data['SUM_YR_1'].notnull())&(data['SUM_YR_2'].notnull())]
- #删除异常记录:保留票价非0,或者平均折扣率和总飞行公里数同时为0的记录
- index1 = (data['SUM_YR_1']!=0)|(data['SUM_YR_2']!=0)
- index2 = (data['SEG_KM_SUM']==0)&(data['avg_discount']==0)
- data = data[index1|index2]
- #导出结果
- data.to_csv(cleanedfile)
- <textarea>

基于航空公司客户价值的LRFMC模型,选择与LRFMC指标相关的6个属性,其中选取了LOAD_TIME(观测窗口的结束时间),FFP_DATE(观测窗口的开始时间),LAST_TO_END(最后一次乘机时间至观测窗口结束时长),FLIGHT_COUNT(观测窗口的飞行次数),SEG_KM_SUM(观测窗口的总飞行公里数),avg_discount(平均折扣率),删除其余不必要的属性。
⑴属性构造
由于在原始数据并没有完整的给出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指标取值范围
属性名称 | L | R | F | M | C |
最大值 | 12.17 | 1.0 | 2.00 | 368 | 0.0000 |
中位数 | 42.57 | 105.0 | 7.00 | 10198 | 0.7121 |
均值 | 49.62 | 172.5 | 11.97 | 17320 | 0.7221 |
最小值 | 114.57 | 731.0 | 213.00 | 580717 | 1.5000 |
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #属性规约,删除冗余属性,只保留相关属性
- import pandas as pd
- import numpy as np
- datafile = 'cleaned_data.csv'#被清洗后的航空数据文件
- resultfile = 'scale_data.csv'#数据被属性规约后保存的文件
- #导入被清洗过后的数据文件(选取的数据子集)
- data=pd.read_csv(datafile,encoding='utf-8')
- #编写函数:属性规约、数据变换函数
- def reduction_data(data):
- data = data[['LOAD_TIME','FFP_DATE','FLIGHT_COUNT','avg_discount','SEG_KM_SUM','LAST_TO_END']]
- #数据变换:将结束时间转换为时间类型
- d_loadtime=pd.to_datetime(data['LOAD_TIME'])
- #数据变换:将入会时间转换为时间类型
- d_ffpdate=pd.to_datetime(data['FFP_DATE'])
- #客户入会时长需要另外计算,入会时长按照月来进行计算
- recency=d_loadtime-d_ffpdate #得到的是天数
- temp_data=data.copy()
- #将入会时长由天数转为月数
- temp_data['L']=recency.map(lambda x: x / np.timedelta64(30 * 24 * 60, 'm'))
- temp_data['R'] = data['LAST_TO_END']
- temp_data['F'] = data['FLIGHT_COUNT']
- temp_data['M'] = data['SEG_KM_SUM']
- temp_data['C'] = data['avg_discount']
- new_data = temp_data[['L', 'R', 'F', 'M', 'C']]
- return new_data
-
- #调用属性规约、变换函数,得到建模数据new_data
- new_data = reduction_data(data)
- #查看LRFMC各个指标的取值范围,判断是否需要进行标准化
- new_data.describe()
- <textarea>

- <textarea readonly="readonly" name="code" class="python">
- #由以上结果可知5个指标的取值范围差异太大,需要标准化处理
- ascore_data=(new_data-new_data.mean(axis=0))/(new_data.std(axis=0))
- #将属性列名重命名
- ascore_data.columns=['ZL','ZR','ZF','ZM','ZC']
- #将标准化后的数据保存到excel文件
- ascore_data.to_csv(resultfile,index=False)
- <textarea>
LRFMC模型主要由两个部分组成,第一部分是根据航空公司业务指标,对客户进行聚类分群;第二部分是对每个业务群进行特征分析,分析客户价值,并采取特定的营销手段,来使得公司的利润最大化。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #K-Means聚类算法
- import pandas as pd
- from sklearn.cluster import KMeans #导入K均值聚类算法
- inputfile = 'scale_data.csv'
- #聚类数目
- k=5
- #将标准化后的数据导入建模
- data = pd.read_csv(inputfile,encoding="utf-8")
- #建立模型
- kmodel=KMeans(n_clusters=k,n_jobs=4)
- #训练模型
- kmodel.fit(data)
- r1 = pd.Series(kmodel.labels_)
- #每个聚类对应的样本个数
- r1=r1.value_counts()
- #聚类的中心
- r2=pd.DataFrame(kmodel.cluster_centers_)
- #将r1和r2进行列合并
- r=pd.concat([r2,r1],axis=1)
- #列名命名
- r.columns=list(data.columns)+['聚类个数']
- #起索引名称
- r.index.name='聚类类别'
- #重新设置索引
- r.index=([u'客户群体1',u'客户群体2',u'客户群体3',u'客户群体4',u'客户群体5'])
- #将聚类结果保存到excel文件
- r.to_excel('result_cluster.xls')
- <textarea>

⑴客户聚类结果
对数据进行聚类分群如下表所示:
表3:客户聚类结果
聚类类别 | 聚类个数 | 聚类中心 | ||||
ZL | ZR | ZF | ZM | ZC | ||
客户群1 | 5336 | 0.48296123 | -0.79944875 | 2.48351216 | 2.42472275 | 0.3087468 |
客户群2 | 15745 | 1.16049784 | -0.37732916 | -0.37732916 | -0.09498699 | -0.1557095 |
客户群3 | 12134 | -0.31370040 | 1.68554920 | -0.57392324 | -0.53674300 | -0.1743790 |
客户群4 | 24666 | -0.70030743 | -0.41494899 | -0.16116894 | -0.16107783 | -0.2530821 |
客户群5 | 4170 | 0.05542063 | -0.00249783 | -0.22544385 | -0.22944009 | 2.1972694 |
⑵客户价值分析
图2:客户群特征分析图
重要保持客户(客户群1):
这类客户的平均折扣率(C)较高(一般所乘航班的舱位的等级较高),最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较高。他们是公司的高价值客户,是最理想的客户类型,对航空公司的贡献率大,但是所占的比例较小。
航空公司应当优先将资源投放在他们身上,对他们做到一对一精准营销,比如提供相应的优惠政策,提高这类客户的忠诚度和满意度,尽可能延长这类客户的高消费水平。
重要发展客户(客户群5):
这类客户的平均折扣率(C)较高,最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较低。这类客户入会时长(L)短,他们是公司的潜在价值客户。
航空公司在运营过程中也要相应加大对这部分客户的投入,比如以短信和邮件的方式询问客户是否满意、提供适当的优惠服务等,加强这类客户的满意度,使他们逐渐成为公司的忠实客户。
重要挽留客户(客户群2):
这类客户的平均折扣率(C)、乘坐的次数(F)或里程(M)较高,但是已经较长时间已经没有乘坐过本公司航班,即(R)较高或者乘坐的频率变小,他们是公司的重要挽留客户。
航空公司在运营过程中要积极推测这类客户的异常情况,进行竞争分析,观察其他航空公司有什么营销策略,然后采取有针对性的营销手段,延长客户的生命周期。
一般和低价值客户(客户群3、4):
这类客户的平均折扣率(C)较低,最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较低。入会时长(L)也较短,因此可能只是在机票打折的时候才会乘坐本航班。
重要发展客户、重要保持客户、重要挽留客户可以称作为客户生命周期管理中的发展期、稳定期、衰退期三个阶段。
⑶模型应用
①会员的升级和保级
对那些接近但尚未达到的高消费客户采取一定的促销活动,刺激他们通过消费达到相应的升级标准。
②首次兑现
对那些接近但尚未达到首次兑现机票的会员,对他们进行提醒,使他们达到首次兑现标准。
(1)查看数据的维度:shape
(2)查看数据的属性(列名):columns
(3)查看数据类型:info
(4)查看前5列:head()
(1)查看数据的缺失值情况
explore=data.describe(percentiles=[],include=’all’).T
explore[‘null’]=len(data)-explore[‘count’]
explore=explore[[‘null’,’min’,’max’]]
(2)缺失值的处理
1.插补法:
用该属性的平均值/中位数/众数进行插补data[1].fillna(data[1].mean())
用固定值data.fillna(value=0)
最近邻插补法 data[1].fillna(method=”ffill|bfill”)
2.直接删除data.dropna() #将函数有缺失值的一行记录删除
3.保留缺失值不处理
(1)describe()函数进行简单查看,比如:最大值、最下值等
(2)boxplot()函数绘制箱线图
(3)异常值处理
删除:将函数异常值的记录删除
视为缺失值来处理
平均值修正:可用前后两个观测值的平均值修正
保留不处理
(1)结合业务先删除那些和分析无关的指标
(2)corr()函数计算数据样本的相关系数矩阵
(3)删除重复值
#查看c1和c2列重复数据和非重复数据的计数分布
df.duplicated(subset=[‘c1’,’c2’],keep=”first”).value_counts()
#删除后面重复值,默认保留第一个
df.drop_duplicates(subset=[“c1”,”c2”],keep=”first”,inplace=True)
(4)将数据转换成适当的格式,以适应数据挖掘任务及算法
(5)将数据标准化
注:不同评价指标往往有不同的量纲,数值间的差异可能很大,不进行处理可能会影响到数据分析的结果。
最小——最大规范化 (data-data.min())/ (data.max()-data.min())
零——均值规范化 (data-data.mean()) /data.std()
(1)混淆矩阵
查准率/准确率 = (挑出的西瓜有多少比例是好瓜)
查全率/召回率 = (好瓜中有多少比例被挑选出来)
(2)ROC曲线
真正率 = (查全率)——> 纵坐标
假正率 = (1-真反率)——>横坐标
(3)AUC值
被定义为ROC曲线下的面积,这个值不会大于1,AUC作为数值可以直观评价分类器的好坏,值越大越好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。