【毕业设计】大数据分析的航空公司客户价值分析 - python

news2025/8/12 10:15:23

文章目录

  • 0 前言
  • 1 数据分析背景
  • 2 分析策略
    • 2.1 航空公司客户价值分析的LRFMC模型
    • 2.2 数据
    • 2.3 分析模型
  • 3 开始分析
    • 3.1 数据预处理
      • 3.1.1 数据预览
      • 3.1.2 数据清洗
    • 3.2 变量构建
    • 3.3 建模分析
  • 4 数据分析结论
    • 4.1 整体结论
    • 4.2 重要保持客户
    • 4.3 重要挽留客户
    • 4.4 一般客户与低价值客户
  • 5 最后


0 前言

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩 基于大数据分析的航空公司客户价值分析

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md


1 数据分析背景

面对激烈的市场竞争,各个航空公司相继推出了更优惠的营销方式来吸引更多的客户,国内某航空公司面临着常旅游客流失、竞争力下降和航空公司资源未充分利用等经营危机。

结合该航空公司已积累的大量的会员档案信息和其乘坐航班记录,实现以下目标:

  • 借助航空公司客户数据,对客户进行分类
  • 对不同的客户类别进行特征分析,比较不同类客户的客户价值
  • 对不同价值的客户类别提供个性化服务,制定相应的营销策略

2 分析策略

2.1 航空公司客户价值分析的LRFMC模型

在RFM模型中,消费金额表示在一段时间内客户购买该企业产品的金额的总和。由于航空票价受到运输距离、舱位等级等多种因素的影响,同样消费金额的不同旅客对航空公司的价值是不同的,例如,一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言更有价值。因此这个特征并不适用于航空公司的客户价值分析。

2.2 数据

本案例选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。

2.3 分析模型

本案例将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C这5个特征作为航空公司识别客户价值的特征,记为LRFMC模型。其特征含义如下:

L:会员入会时间距观测窗口结束的月数
R:客户最近一次乘坐公司飞机距观测窗口结束的月数
F:客户在观测窗口内乘坐公司飞机的次数
M:客户在观测窗口内累计的飞行里程
C:客户在观测窗口内乘坐舱位所对于的折扣系数的平均值

在这里插入图片描述

3 开始分析

3.1 数据预处理

3.1.1 数据预览

略(需要完整代码联系学长获取)

3.1.2 数据清洗

#剔除票价为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] #该规则是“或”

3.2 变量构建

需要构造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()

3.3 建模分析

客户价值分析模型构建主要分为二个部分:

  • 1.利用K-Means算法进行聚类分析,得到细分的客户群
  • 2.对细分的客户数进行特征分析,得到客户价值分析模型
#找到最好的聚类簇
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()

在这里插入图片描述

4 数据分析结论

4.1 整体结论

结合业务分析,通过比较各个特征在群间的大小来对某一个群的特征进行评价分析

客户群1在特征C处的值最大,在特征F、M处的值较小,说明客户群2是偏好乘坐高级舱位的客户群;
客户群2在所有特征上的值都较小,且特征L处的值最小,说明客户群1属于新入会员较多的客户群;
客户群3在特征R处值最大,在其他特征处的值都较小,说明客户群5已经很久没有乘坐飞机,是入会时间短的低价值的客
客户群4特征F和M上的值最大,且在特征R上的值最小,说明客户群3的会员频繁乘机且最近都有乘机记录;
客户群5在特征L处的值最大,在特征R处的值最小,其他都比较适中,说明客户群4入会时间长,飞行频率也较高,是有较高价值的客户。
基于以上特征描述,本案例定义4个等级的客户类别

4.2 重要保持客户

这类客户的平均折扣系数(C)较高(一般所乘航班的舱位等级较高),最近乘机距今的时间长度(R)低,飞行次数(F)或总飞行里程(M)较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销,提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。
重要发展客户
这类客户的平均折扣系数(C)较高,最近乘机距今的时间长度(R)低,且飞行次数(F)或总飞行里程(M)较低。这类客户入会时间(L)短,他们是航空公司的潜在价值客户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力。航空公司要努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,也就是增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐成为公司的忠诚客户。

4.3 重要挽留客户

这类客户过去所乘航班的平均折扣系数(C)、飞行次数(F)或者总飞行里程(M)较高,但是最近乘机距今的时间长度(R)高或者说乘坐频率变小,客户价值变化的不确定性很高。由于这些客户价值衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该根据这些客户的最近消费时间以及消费次数的变化情况推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期。

4.4 一般客户与低价值客户

这类客户所乘航班的平均折扣系数(C)很低,最近乘机距今的时间长度(R)高,飞行次数(F)或总飞行里程(M)较低,入会时间(L)短。他们是航空公司的一般客户与低价值客户,可能是在航空公司机票打折促销时,才会乘坐本公司航班。
根据每种客户类型的特征,对各类客户群进行客户价值排名.在这里插入图片描述

5 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cadence Allegro PCB设计88问解析(十七) 之 Allegro中焊盘的全连接和花焊盘

一个学习信号完整性仿真的layout工程师 上一篇文章和大家分享了关于铜皮shape的一些基本操作。我们进行铺铜是为了连接网络(焊盘、过孔等),一般都是GND或者电源网络。Shape和走线还是不一样的,走线直接从焊盘或者过孔等直接拉出一根layout,但…

【MySQL数据库笔记 - 进阶篇】(三)SQL优化

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:暂定 📝视频地址:黑马程序员 MySQL数据库入门到精通 📣专栏定位:这个专栏我将会整理 B 站黑马程序员的 MySQL…

LeetCode[剑指Offer54]二叉搜索树的第K大节点

难度:简单 题目: 给定一棵二叉搜索树,请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4 示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4 限制: …

[附源码]java毕业设计旅游网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Nodejs编写接口

编写接口 1.自定义路由模块 const expressrequire(express) const routerexpress.Router()// 挂载对应的路由 router.get(/get,(req,res)>{// 通过req.query获取客户端通过查询字符串,发送到服务器的数据const queryreq.query// 调用res.send()方法&#xff0c…

集成学习-Bagging和Boosting算法

文章目录集成学习Bagging随机森林BostingAdaboostGBDTXGBoost集成学习 集成学习(ensemble learning)博采众家之长,通过构建并结合多个学习器来完成学习任务。“三个臭皮匠顶个诸葛亮”,一个学习器(分类器、回归器&…

【微服务】SpringCloud微服务续约源码解析

目录 一、前言 二、客户端续约 1、入口 1.1、构造初始化 1.2、initScheduledTasks() 调度执行心跳任务 2、TimedSupervisorTask组件 2.1、构造初始化 2.2、TimedSupervisorTask#run()任务逻辑 3、心跳任务 3.1、HeartbeatThread私有内部类 3.2、发送心跳 3、发送心…

使用OpenAPI提升网关安全的开源软件,诚邀小伙伴参与

看过我博客的人都知道,我们是一家推广OpenAPI的企业。 OpenAPI是一种用于定义API结构的规范,在Java里我们可以使用swagger进行自动生成。其他语言也可以(Golang等)。通过这种对开发人员零成本的工具,我们可以高效的获…

典型的偏微分方程数值解法

马上要参加亚太杯啦,听说今年亚太杯有经典的物理题,没什么好说的,盘它! 偏微分方程的数值解十分重要 椭圆型偏微分方程(不含时) 数值解法 二维拉普拉斯方程 例 边界条件 import numpy as np import mat…

教你如何使用云服务器搭建我的世界Minecraft服务器(超级简单-10分钟完成)

一个人玩游戏没啥意思,和朋友一块联机呢,距离太远,家庭局域网宽带又没有公网ip,你的朋友没办法与你联机,然而你只需要一台服务器即可搞定了;但是很多用户没没接触过相关的内容,具体的该怎么操作…

怎样做音乐相册怎样制作?手把手教你制作

大家平时出门游玩的时候,会拍摄一些好看的照片吗?那你们会将这些照片分享在社交平台上吗?普通的照片分享,有时会显得比较枯燥单调,其实我们可以将这些照片制作成音乐相册,这样就可以丰富照片的内容&#xf…

传输层-用户数据报协议(UDP)

UDP协议概述 用户数据报协议 UDP 是 Internet 传输层协议,提供无连接、不可靠、数据报尽力传输服务。 无连接:因此在支持两个进程间通信时,没有握手过程。不可靠:当应用进程将一个报文发送近 UDP 套接字时,UDP 并不能…

python+vue+elementui固定资产管理系统django mysql

目 录 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 前端技术:nodejsvueelementui 我们最初的项目结构由五个文件组成: manage.py:使用…

为什么管理类硕士(MBA/MEM/MPA)报考会成为职场人的香饽饽?

没个硕士学位,将来出门可能真的都不好意思打招呼了。近些天传言2023年考研人数达到接近550万的信息满天飞,无论真假,从目前已公布报考人数的院校来看,在去年的457万基础上再涨一波的几率是很大的。这其中,报考管理类、…

电科大离散数学-2-命题逻辑-1

目录 2.1 什么是命题 2.1.1 命题的定义 2.1.2 复合命题 2.2 命题联结词 2.2.1 否定联结词 2.2.2 合取联结词 2.2.3 析取联结词 2.2.4 蕴涵联结词 2.2.5 等价联结词 2.3 命题符号化及应用 2.3.1 命题连接词总结 2.3.2 命题联结词的优先级 2.3.3 命题联接词与开关电…

scala

Scala 概述 Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c等,动态语言如:js)。 Scala是一…

4-20mA转RS-485,Modbus数据采集模块 YL121

特点: ● 模拟信号采集,隔离转换 RS-485输出 ● 采用12位AD转换器,测量精度优于0.1% ● 通过RS-485接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压1000VDC ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高,…

equals与==判断相等

一、 判断相等,判断的是物理地址相等。 二、equals 判断相等 equals 与hashCode 都是Object的方法。 所有的类都继承于Object,如果不重写equals。equals判断相等,底层也是使用来判断物理地址相等。 public boolean equals(Object obj) {re…

影响MySQL索引B+树高度的是什么?

提到MySQL,想必大多后端同学都不会陌生,提到B树,想必还是有很大部分都知道InnoDB引擎的索引实现,利用了B树的数据结构。 那InnoDB 的一棵B树可以存放多少行数据?它又有多高呢? 到底是哪些因素会对此造成影…

【软件测试】测试人的职责,我就是不当背锅侠......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试的目的&#xf…