基于LRFMC模型的航空公司价值客户数据分析实战
本项目背景是航空公司为了拓展新用户,保持VIP客户,挽留潜在客户来进行价值客户的区分,从6万条样本记录中,分别进行了数据抽取,数据清洗,探索性分析,指标计算和机器学习算法建模及应用;依据LRFMC模型用pandas,numpy技术进行数据抽取,实现数据清洗(数据异常值缺失值处理,属性规约,数据转换),应用kde算法对数据特征分布进行观测,采用聚类算法Kmeans进行建模和样本训练,并使用PCA算法进行降维可视化,matplotlib,pycharts进行数据特征项的可视化;通过本项目,达成了客户的分类,针对公司的业务属性制定了相关策略;
关键技术:结合公司所属的行业及业务类型对传统的RFM模型参数进行优化,确定了LRFMC模型作为价值客户区分的依据;遵从数据挖掘和数据分析的一般流程,灵活运用机器学习算法对数据集进行降维处理,在建立模型之前,用kde分布识别具有相关性的特征列。
一、LRFMC模型简介
RFM模型是衡量客户价值和客户潜在价值的重要工具和手段,RFM是国际上最成熟的,最为容易的客户价值分析方法;3个指标
R:最近消费时间间隔(Recency)
F:消费频率(Frequency)
M:消费金额(Monetary)
R的含义是消费时间间隔,表示了客户发生最近一次消费时间的间隔;数值大小反映了客户的流失率;F的含义是消费频率,表示了客户交易的累计次数,体现了客户的活跃度和忠诚度,M的含义是消费金额,可以是一次消费金额或平均消费金额,体现了客户的购买能力和消费潜力;在航空公司的价值用户分析中,依据航空公司的业务特点和客户行为习惯,我们将传统的RFM模型转换为了LRFMC模型;其中,R依然代表最近一次乘坐飞机的截止时间,F代码消费次数,M消费金额指标拆分成为了三个指标,M 指标拆分为三个指标LMC,L代表会员入会时间,M代表客户的飞行里程,C代表平均消费的折扣系数;从这三个指标综合评估乘客的消费能力;

图1 RFM模型到LRFMC模型的转换
二、项目的处理流程业务图

图2 航空客运信息挖掘的主要步骤
从航空公司的数据源中进行选择性抽取与新增数据抽取分别形成历史数据和增量数据。
对步骤1中形成的两个数据集进行数据探索分析与预处理,包括数据缺失值与异常值的探索分析,数据的属性规约、清洗和变换。
利用步骤2中形成的已完成数据预处理的建模数据,基于旅客价值LRFMC模型进行客户分群,对各个客户群进行特征分析,识别出有价值的客户。
针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务;

图3 航空客运数据挖掘建模总体流程
三、样本集数据分类和属性说明
根据表1中的数据,对客户进行分类;对不同的客户类别进行特征分析,比较不同类客户的客户价值对不同价值的客户类别提供个性化服务,制定相应营销策略;

表1 样本集数据分类和属性说明
四、数据抽取
选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据。对于后续新增的客户详细信息,以后续新增数据中最新的时间点作为结束时间,采用上述同样的方法进行抽取,形成增量数据。62988条记录中包含了会员卡号、入会时间、性别、年龄、会员卡级别、工作地城市、工作地所在省份、工作地所在国家、观测窗口结束时间、观测窗口乘机积分、飞行公里数、飞行次数、飞行时间、乘机时间间隔和平均折扣率等44个属性;
五、数据探索性分析
探索分析是对数据进行缺失值分析与异常值分析,分析出数据的规律以及异常值。通过对数据观察发现原始数据中存在票价为空值,票价最小值为0、折扣率最小值为0,总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成,其他的数据可能是客户乘坐0折机票或者积分兑换产生的。关键代码示例:
data = pd.read_csv('air_data.csv',parse_dates=['FFP_DATE','LOAD_TIME','FIRST_FLIGHT_DATE','LAST_FLIGHT_DATE']) #读取CSV数据,指定日期时间段解析
data.info() # 快速查看缺失值,异常值,
explore = data.describe().T # 查看方差,平均值,最大值,最小值
explore['null']=data.shape[0]-explore['count'] # 计算空值
explore=explore[['null','max','min']] # 计算缺失值的个数
六、数据清洗和预处理
丢弃票价为空的记录,票价为空的记录会影响C指标的计算;属性SUM_YR_1和属性SUM_YR_2为空的数据删除,把不为空的数据;采用pandas.notnull函数实现筛选;
data = data[(data.SUM_YR_1.notnull())&((data.SUM_YR_2.notnull()))] #
保留票价不为0,或平均折扣率(data.SEG_KM_SUM)和总飞行公里数大于0的记录(data.avg_discount==0);
index1 = data.SUM_YR_1 !=0 # 保留第一年平均消费票价不为零的
index2 = data.SUM_YR_2 !=0 # 保留第二年平均消费票价不为零的
data = data[(data.SUM_YR_1.notnull())&((data.SUM_YR_2.notnull()))] # 第一年和第二年消费票价都不为零的
data1=data[index1|index2|index3] # 条件筛选
通过筛选发现数据集从原始的62998条记录中减少到62913条;

七、属性规约数据抽取
依据LRFMC模型的含义,选出与指标计算相关的6个属性如下所示:
入会时间:FFP_DATE 观测窗口的结束时间:LOAD_TIME
飞行次数:FLIGHT_COUNT 观测窗口总飞行公里数:SEG_KM_SUM
最后一次乘机时间至观察窗口末端时长:LAST_TO_END 平均折扣率:avg_discount

data2 = data1[['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','SEG_KM_SUM','LAST_TO_END','avg_discount']]
data3 = data2.rename(columns={'FLIGHT_COUNT':'F','avg_discount':'C','SEG_KM_SUM':'M','LAST_TO_END':'R'})#做对应特征列的名称替换
data3['L']=(data2.LOAD_TIME-data2.FFP_DATE).map(lambda x:x.days)#新增的L列,是日期相减,转换成日
data3=data3.drop(['FFP_DATE','LOAD_TIME'],axis=1)# 删除两列
data3 =data3.reindex(columns=['L','R','F','M','C'])

八、采用0-1标准化方法进行归一化处理
通过以上的数据分析,L,R,F,C,M五个特征列的取值范围差异较大;例如C特征列的取值范围是0.1~1.0之间,M特征列的取值范围是100-10000;这会影响机器学习训练的结果,导致模型预测和分类的准确率大大降低;归一化处理会提升模型的预测准确率,且数据集之间的相对差异保持不变;0-1标准化的方法的计算公式是:
Z-score =(X- X_mean)/X._std
定义:0-1标准化:(X-均值)/方差。数据符合平均值为0,标准差为1的正态分布
data4 = (data3 - data3.mean())/data3.std()#对data3数据集中的每一个元素求平均再除以方差
data4 #L,R,F,M,C分布服从0-1标准分布
九、数据归一化前后的数据分布特征
归一化前后的L和R的相关性数据分布,采用散点图描述;显示L和R的相对特征分布属性没有改变,知识坐标的取值范围发生了变化,归一化之后,X坐标范围均匀分布在-1.5到2.0之间;

图4 归一化前后的L和R的数据分布
L参数归一化前后的分布情况,采用直方图进行展示,直方图y轴反应了L特征项出现的次数;反应的频率的变化情况;在不同的X区间坐标范围内,数据集对应出现的次数;由此可见,L参数在归一化前后的分布特征也没有发生改变;
图5 归一化前后的L数据集分布
十、用直方图展示LRFMC指标的出现频数
直方图的横坐标和纵坐标是离散的,横坐标代表对应的分组区间,总坐标代表数据出现的次数;用柱状图展示直方图,重点展示了指标分布的高低情况;柱状图可以直观的展示相对高低的变化,LRFMC五个指标全部展示,能够清晰反应出每个指标分布频数最高的项;
参数选择stack模式是柱状图堆叠的展示,x轴坐标离散,y轴坐标连续;主要展示了参数的连续分布特性;此处的外围轮廓和后面应用KDE算法之后的连续函数相比,他们具备相似性;
plt.hist(x,n_bins,density = True,histtype = 'bar',color = colors,label = colors)
plt.legend(prop={'size':10})
plt.show()
plt.hist(x,n_bins,density = True,histtype = 'step',stacked = 'True',fill = False,color = colors,label = colors)
plt.legend(prop={'size':10})
plt.show()


十一、采用核密度函数表示LRFMC的特征分布情况
核密度估计:一种用于估计概率函数的非参数方法,将直方图进行平滑的处理;直方图存在图形不光滑,端点不连续,且对于异常的小频率单元无法观测的情况,所以我们引入核密度函数,采用核密度函数,能够真实展示概率分布情况。且对异常值能够进行敏感检测;

图7 核密度函数数学原理
data4.plot.kde(figsize = (18,20))
plt.xlim([-2,3])

十二、采用seaborn展示LRFMC两两特征相关性
由图可知,F和M两列的特征分布是高度重合的,没有区分度;C的区分度是最高的,L和R特征分布较好;
import seaborn as sns
sns.pairplot(data4)
import seaborn as sns
sns.pairplot(data4,kind = 'reg',diag_kind = 'hist')

十三、采用机器学习算法实现客户分类
非监督学习:一组样本集的内在规律对于训练者来说是不可知的,需要机器学习算法自动寻找内在规律,也就是数据集样本中不包含答案,样本集中没有标签。
from sklearn.cluster import KMeans
kmodel = KMeans(n_clusters = 5)
kmodel.fit(data4
for i in kmodel.cluster_centers_:
print("聚类类别")
for k,v in zip(['L','R','F','M','C'],i):
print(k,'---',v)

from pyecharts import options as opts
from pyecharts.charts import Page, Radar
def radar_base() -> Radar:
c = (
Radar()
.add_schema(
schema=[
opts.RadarIndicatorItem(name="L:会员时长", min_=-2, max_=1.5),
opts.RadarIndicatorItem(name="R:消费间隔", min_=-2, max_=2),
opts.RadarIndicatorItem(name="F:消费频率", min_=-2, max_=3),
opts.RadarIndicatorItem(name="M:飞行里程", min_=-2, max_=3),
opts.RadarIndicatorItem(name="C:折扣系数", min_=-2, max_=2.5),
]
)
.add("客户群1", [X.loc[0].tolist()], color='#ff0000')
.add("客户群2", [X.loc[1].tolist()], color='#00ff00')
.add("客户群3", [X.loc[2].tolist()], color='#0000ff')
.add("客户群4", [X.loc[3].tolist()], color='#ffff00')
.add("客户群5", [X.loc[4].tolist()], color='#ff00ff')
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="客户价值 - 雷达图"))
)
return c
radar_base().render_notebook()

十四、雷达图结论:
雷达图展示了LRFMC五个特征的相对优势和劣势;
客户群1:5个特征都较均匀(较小)
客户群2:L会员时长最大;其他特征较均匀(比较小)
客户群3:C折扣系数最大,其他特征较均匀
客户群4:F消费频率/M平均里程最大,C折扣系数/L会员时长第二大,R消费间隔最小
客户群5:R消费间隔最大,其他较均匀
从LRFMC模型定义的属性来分析,价值客户符合以下规律:
L:客户关系长度(航空公司会员入会时间长短)(老会员,越长越稳定)
R:最近消费时间(上次坐飞机的时间,越小越好)
F:消费频率(越大越好)
M:累积的飞行里程(越大越好)
C:乘坐仓位对应的折扣系数平均值(越大,意味着仓位档次越高)
十五、用户画像
客户群3:重要保持客户,C 折扣率最高,表明仓位等级最高,其他指标较平均
用户策略:这类客户是对航空公司最重要的VIP客户群,最理想的高价值客户类型,对公司贡献最大,所占比例最小航空公司应该将资源优先投放到它们身上,对它们进行差异化管理和一对一营销,设法提高客户的忠诚度和满意度,尽可能延长这类客户的高水平消费;
客户群4:重要发展客户,F消费频率和M飞行里程最高,C折扣系数/L会员时长,第二高
用户策略:这类客户是公司潜在高价值客户,虽然这类客户当前的价值并不是最高,但却有很大发展潜力,公式要努力促使这类客户通过增加在本公司的乘机消费和合作伙伴处的消费(增加客户的钱包份额)。通过客户价值的提升,加强客户满意度,提高他们转向竞争对手的转移成本,使他们逐渐转为公司的忠诚客户;
客户群2:重要挽留客户,L会员时长最长,老客户,其他特征一般,这类客户不确定性很高,这些客户衰退的原因不明,所以掌握客户最新信息、维持与客户的互动尤为重要。
用户策略:航空公司应该根据这些客户最近的消费时间、消费次数变化情况,推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期;
客户群1:一般客户,所有指标都很平均,表明用户对公司没有太大贡献,R较小,表面乘坐间隔短;用户策略:他们是航空公司的一般客户,没什么价值但经常乘坐,应设法吸引它们提升消费等级;
客户群5:低价值客户,各种指标全面低,注册时间短,里程少,消费频率低,打折比例低;唯独R高;用户策略:较长时间没做过本公司航班了,他们是航空公司低价值客户,对公司没有归属感,只有在公司机票打折促销时候才会乘坐本公司航班;
十六、建议
依据结论,采取下面营销手段和策略,为航空公司的价值客户群管理提供参考:
会员的升级与保级
航空公司会员可分为:白金卡会员、金卡会员、银卡会员、普通卡会员,其中非普通卡会员可以统称为航空公司精英会员,各个公司会员制管理方法大同小异。成为精英会员一般要求在一定时间内(如1年)积累一定飞行里程或航段,达到要求后就会在有效期内(一般2年)成为精英会员并享受相应服务,有效期快结束时,根据相关评价方法确定客户是否有资格继续作为精英会员,然后对客户进行升级或降级然而由于大部分客户没有意识到或根本不了解会员升级后保级的时间与要求(介绍文件往往复杂且不易理解),经常在评价期过后才发现自己只差一点就可以升级或保级,之前积累的里程白白损失,还会导致客户不满,干脆放弃在本公司的后续消费,因此公司可以在对会员升级或保级进行评价的时间点之前,对那些接近但尚未达到要求的较高消费客户进行适当提醒甚至采取一些促销活动,刺激消费,既可以获得收益,也能提高客户满意度,增加精英会员数量;
首次兑换
航空公司旅客计划中比较吸引客户的一点是客户可以通过消费累计的里程来兑换免票或免费升舱。大部分公司的里程积累会随着时间削减,如在年末对该年累计里程折半处理。这样会导致许多不了解情况的会员白白损失掉费力积累的里程,总是难以实现首次兑换。同样会引起客户的不满;解决:提取接近但尚未达到首次兑换标准的会员,对他们进行提醒或促销,使他们通过消费达到标准,一旦实现首次兑换,客户在本公司再次消费兑换就比在其他公司进行兑换要容易的多,等于提高了转移成本;
交叉销售
通过发现联名卡等与非航空类企业的合作,使客户在其他企业消费过程中获得本公司的积分,增强与公司的联系,提高忠诚度,例如可以查看重要客户在非航空类合作伙伴处的里程积累情况,找出他们习惯的里程积累方式(是否经常在合作伙伴处消费,更喜欢消费哪种类型合作伙伴的产品),对他们进行相应促销;客户识别期和发展期为客户关系打下基石,但这两个时期的客户关系是短暂的、不稳定的,企业要获取长期利润,必须有稳定的、高质量的客户。保持客户对企业是至关重要的。不仅因为争取一个新客户的成本远高于维持老客户还因为客户流失会造成公司收益的直接损失;因此,在这一时期,公司应该努力维系客户关系,使之处于较高水准,最大化生命周期内公司与客户的互动价值,并使这样的高水平关系尽可能延长。对这一阶段的客户,主要通过提供优质服务产品和提高服务水平来提高客户满意度。