Hi,大家好,这里是丹成学长的毕设系列文章!
对毕设有任何疑问都可以问学长哦!
这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是
基于大数据分析的航空公司客户价值分析
学长这里给一个题目综合评分(每项满分5分)
选题指导, 项目分享:
https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md
面对激烈的市场竞争,各个航空公司相继推出了更优惠的营销方式来吸引更多的客户,国内某航空公司面临着常旅游客流失、竞争力下降和航空公司资源未充分利用等经营危机。
结合该航空公司已积累的大量的会员档案信息和其乘坐航班记录,实现以下目标:
在RFM模型中,消费金额表示在一段时间内客户购买该企业产品的金额的总和。由于航空票价受到运输距离、舱位等级等多种因素的影响,同样消费金额的不同旅客对航空公司的价值是不同的,例如,一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言更有价值。因此这个特征并不适用于航空公司的客户价值分析。
本案例选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。
本案例将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C这5个特征作为航空公司识别客户价值的特征,记为LRFMC模型。其特征含义如下:
L:会员入会时间距观测窗口结束的月数
R:客户最近一次乘坐公司飞机距观测窗口结束的月数
F:客户在观测窗口内乘坐公司飞机的次数
M:客户在观测窗口内累计的飞行里程
C:客户在观测窗口内乘坐舱位所对于的折扣系数的平均值
略(需要完整代码联系学长获取)
#剔除票价为0,平均折扣率不为0,总飞行公里大于0的记录
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] #票价非空值才保留
#只保留票价非零的,或者平均折扣率与总飞行公里数同时为0的记录。
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0)
data = data[index1 | index2 | index3] #该规则是“或”
需要构造LRFMC的五个指标的新数据表,并对应属性定义表,得到LRFMC模型的五项指标的计算公式:
L=LOAD_TIME-FFP_DATE(会员入会时间距观测窗口结束的月数=观测窗口的结束时间-入会时间(单位:月))
R=LAST_TO_END(客户最近一次乘坐公司距观测窗口结束的月数=最后一次。。。)
F=FLIGHT_COUNT(观测窗口内的飞行次数)
M=SEG_KM_SUM(观测窗口的总飞行里程)
C=AVG_DISCOUNT(评价折扣率)
# dataTransformed = pd.DataFrame(columns=['L','R','F','M','C'])
tmp = {
'L':pd.to_datetime(data['LOAD_TIME']) - pd.to_datetime(data['FFP_DATE']), #需要先转化datatime格式,再进行相减
'R':data['LAST_TO_END'],
'F':data['FLIGHT_COUNT'],
'M':data['SEG_KM_SUM'],
'C':data['avg_discount'],
}
dataTransformed = pd.DataFrame(data=tmp,columns=['L','R','F','M','C'])
#将timedelta转换成int类型
dataTransformed['L'] = (dataTransformed['L']/np.timedelta64(1,'D')).astype(int)
dataTransformed.head()
客户价值分析模型构建主要分为二个部分:
#找到最好的聚类簇
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 从sklearn导入聚类算法函数
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
random_state = 5
score = []
inertia = []
nums=range(2,10)
# 遍历多个可能的候选簇数量
for n_clusters in range(2,10):
kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
kmeans.fit(dataZscore)
inertia.append(kmeans.inertia_)#衡量模型性能
score.append(silhouette_score(dataZscore, kmeans.labels_,sample_size=128, metric='euclidean')) #衡量聚类算法的指标
plt.figure(figsize=(10, 6))
# 使用ggplot的绘图风格
plt.style.use('seaborn-darkgrid')
plt.subplot(121)
plt.plot(nums,score)
plt.grid(linestyle=':')
plt.xlabel('K')
plt.ylabel('Score')
plt.title('Performance of K-means')
plt.subplot(122)
plt.plot(nums,inertia)
plt.grid(linestyle=':')
plt.xlabel('K')
plt.ylabel('Inertia')
plt.title('Inertia of K-means')
plt.show()
客户价值分析
#客户价值雷达图
radar = Radar(init_opts=opts.InitOpts(theme='dark', bg_color='#161627', height='800px', width='1000px'))
radar.add_schema(shape='circle',
textstyle_opts=opts.TextStyleOpts(color='rgb(238, 197, 102)'),
axisline_opt=opts.LineStyleOpts(is_show=True, color='rgba(238, 197, 102, 1)'),
splitline_opt=opts.SplitLineOpts(is_show=True, linestyle_opts=split_line_style),
schema=[opts.RadarIndicatorItem(name='ZL',min_=min-0.1, max_=max+0.1),
opts.RadarIndicatorItem(name='ZR',min_=min-0.1, max_=max+0.1),
opts.RadarIndicatorItem(name='ZF',min_=min-0.1, max_=max+0.1),
opts.RadarIndicatorItem(name="ZM",min_=min-0.1, max_=max+0.1),
opts.RadarIndicatorItem(name="ZC",min_=min-0.1, max_=max+0.1),
])
radar.add('群体一', customer1, symbol='none',
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(color='#9b47b0', width=1, opacity=0.6),
areastyle_opts=opts.AreaStyleOpts(color='#9b47b0', opacity=0.1))
radar.add('群体二', customer2, symbol='none',
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(color='#5cb047', width=1, opacity=0.6),
areastyle_opts=opts.AreaStyleOpts(color='#5cb047', opacity=0.05))
radar.add('群体三', customer3, symbol='none',
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(color='#e1306c', width=1, opacity=0.6),
areastyle_opts=opts.AreaStyleOpts(color='#e1306c',opacity=0.05))
radar.add('群体四', customer4, symbol='none',
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(color='#f77737', width=1, opacity=0.6),
areastyle_opts=opts.AreaStyleOpts(color='#f77737',opacity=0.05))
radar.add('群体五', customer5, symbol='none',
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(color='#4285f4', width=1, opacity=0.6),
areastyle_opts=opts.AreaStyleOpts(color='#4285f4',opacity=0.05))
radar.set_global_opts(legend_opts=opts.LegendOpts(is_show=True, selected_mode='flase', pos_bottom=5),
title_opts=opts.TitleOpts(title="客户价值雷达图", pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(font_size=20)))
radar.render_notebook()
结合业务分析,通过比较各个特征在群间的大小来对某一个群的特征进行评价分析
客户群1在特征C处的值最大,在特征F、M处的值较小,说明客户群2是偏好乘坐高级舱位的客户群;
客户群2在所有特征上的值都较小,且特征L处的值最小,说明客户群1属于新入会员较多的客户群;
客户群3在特征R处值最大,在其他特征处的值都较小,说明客户群5已经很久没有乘坐飞机,是入会时间短的低价值的客
客户群4特征F和M上的值最大,且在特征R上的值最小,说明客户群3的会员频繁乘机且最近都有乘机记录;
客户群5在特征L处的值最大,在特征R处的值最小,其他都比较适中,说明客户群4入会时间长,飞行频率也较高,是有较高价值的客户。
基于以上特征描述,本案例定义4个等级的客户类别
这类客户的平均折扣系数(C)较高(一般所乘航班的舱位等级较高),最近乘机距今的时间长度(R)低,飞行次数(F)或总飞行里程(M)较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销,提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。
重要发展客户
这类客户的平均折扣系数(C)较高,最近乘机距今的时间长度(R)低,且飞行次数(F)或总飞行里程(M)较低。这类客户入会时间(L)短,他们是航空公司的潜在价值客户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力。航空公司要努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,也就是增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐成为公司的忠诚客户。
这类客户过去所乘航班的平均折扣系数(C)、飞行次数(F)或者总飞行里程(M)较高,但是最近乘机距今的时间长度(R)高或者说乘坐频率变小,客户价值变化的不确定性很高。由于这些客户价值衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该根据这些客户的最近消费时间以及消费次数的变化情况推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期。
这类客户所乘航班的平均折扣系数(C)很低,最近乘机距今的时间长度(R)高,飞行次数(F)或总飞行里程(M)较低,入会时间(L)短。他们是航空公司的一般客户与低价值客户,可能是在航空公司机票打折促销时,才会乘坐本公司航班。
根据每种客户类型的特征,对各类客户群进行客户价值排名.