基于数据挖掘的航空客户满意度分析预测系统

news2024/11/17 16:54:18

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        航空公司致力于提供多样化的服务以满足乘客需求,包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等,并希望以此提升乘客满意程度;此外,乘客满意度还受到乘客自身因素的影响。本系统利用数据挖掘、机器学习算法挖掘影响客户满意度的重要因素,最优模型的测试集预测准确率达到99.5%,同时构建可视化交互平台,方便对航空公司乘客满意度的在线评估预测,可给航空公司提供定制化策略,为每名乘客提供专属化服务,从而极大程度上提高乘客满意度。

        B站系统演示视频:基于数据挖掘的航空客户满意度分析预测系统_哔哩哔哩_bilibili

2. 读取数据与数据预处理

train_df = pd.read_csv("./train.csv")
test_df = pd.read_csv("./test.csv")

train_df = train_df.drop(['Unnamed: 0', 'id'], axis=1)
test_df = test_df.drop(['Unnamed: 0', 'id'], axis=1)

train_df.info()

可以看出:

  • 对应于“到达延误分钟数”特征的列有310个缺失值。
  • 前两个特征没有用处,不会影响分类,因此你应该去掉它们。
  • 许多列包含类别值,但其类型是'object'或'int64'。让我们将这些类型替换为专为存储类别值设计的特殊类型。

3. 数据探索式可视化分析

3.1 客户满意度样本占比

fig = plt.figure(figsize=(6,6))

wedges,texts=plt.pie(values,wedgeprops={"width": 0.4, 'edgecolor': '#000', 'linewidth': 3})
 
kw = dict(arrowprops=dict(arrowstyle="-"), zorder=0, va="center")
 
for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1) / 1.8 + p.theta1
    
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
 
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})

    plt.annotate(
        labels[i]+"\n"+str(percent[i])+"%",
        xy=(x, y),
        xytext=(1.35 * np.sign(x), 1.4 * y),
        horizontalalignment=horizontalalignment,
        fontsize=12,
        **kw
    )
plt.title("航空客户满意度情况占比", fontsize=16)
plt.show()

3.2 不同性别客户的满意度占比分布 

 

3.3 不同类型客户的满意度分析

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 6))

sns.countplot(train_df, x="Customer Type", ax=axes[0])
axes[0].tick_params(axis='x', rotation=0)
axes[0].set_ylabel('客户类型')
axes[0].set_title('不同类型客户的样本数量分布', fontsize=16)

customer_type.plot(kind='bar' , stacked=True, ax=axes[1], fontsize=12)
axes[1].tick_params(axis='x', rotation=0)
axes[1].set_ylabel('客户类型')
axes[1].set_title('不同类型客户的满意度分析', fontsize=16)

plt.show()

3.4 不同年龄客户的满意度分布 

        可以看出,年级越大,满意的比率越大,越年轻,可能由于心气高,容易对航空公司的种种服务不满意,符合预期。

3.5 不同乘机目的满意度分析

3.6 不同航程距离对满意度影响

plt.figure(figsize=(10, 6))
sns.distplot(train_df[train_df['satisfaction'] == 'neutral or dissatisfied']['Flight Distance'], label='neutral or dissatisfied', bins=50)
sns.distplot(train_df[train_df['satisfaction'] == 'satisfied']['Flight Distance'], label='satisfied', bins=50)
plt.title('不同航程距离对满意度影响分布', fontsize=16)
plt.legend()
plt.show()

3.7 不同航班舱位、旅行类型和航程距离对满意度影响

sns.catplot(
    x="Flight Distance", 
    y="Type of Travel", 
    hue="satisfaction", 
    col="Class", 
    data=train_df, 
    kind="bar", 
    height=4.5, 
    aspect=.8
)
plt.title('不同航班舱位、旅行类型和航程距离对满意度影响', fontsize=16)
plt.show()

        可以看出,对于商务舱类别的商务旅行,飞行距离越长,满意的乘客数量就越高。对于其他组合,满意和不满意乘客的分布几乎相等。

3.8 不同类型乘客的年龄的联合分布

f, ax = plt.subplots(1, 2, figsize = (15,5))
sns.boxplot(x = "Customer Type", y = "Age", palette = "YlOrBr", data = train_df, ax = ax[0])
ax[0].set_title('不同类型乘客的年龄分布箱线图', fontsize=16)

sns.histplot(train_df, x = "Age", hue = "Customer Type", multiple = "stack", palette = "YlOrBr", edgecolor = ".3", linewidth = .5, ax = ax[1])
ax[1].set_title('不同类型乘客的年龄分布密度直方图', fontsize=16)
plt.show()

        可以看出:该航空公司的大多数老客户年龄在30到50岁之间(他们的平均年龄略高于40岁)。非固定客户的年龄范围稍小(平均为25至40岁,略低于30岁)。 

3.9 Wi-Fi服务、便利性、餐饮、座椅舒适度等维度与整体客户满意度的相关性

        

        可以看出,Online boarding、Inflight entertainment、Seat comfort、On-board service 等几个特征,与整体满意度相关性很高,表明客户比较在意在线登机、机上娱乐、座椅舒适度、机上服务。

3.10 飞行娱乐活动、飞行距离的相关性分析 

f, ax = plt.subplots(2, 2, figsize = (15,8))
sns.boxplot(x = "Inflight entertainment", y = "Flight Distance", palette = "YlOrBr", data = train_df, ax = ax[0, 0])
sns.histplot(train_df, x = "Flight Distance", hue = "Inflight entertainment", multiple = "stack", palette = "YlOrBr", edgecolor = ".3", linewidth = .5, ax = ax[0, 1])
sns.boxplot(x = "Leg room service", y = "Flight Distance", palette = "YlOrBr", data = train_df, ax = ax[1, 0])
sns.histplot(train_df, x = "Flight Distance", hue = "Leg room service", multiple = "stack", palette = "YlOrBr", edgecolor = ".3", linewidth = .5, ax = ax[1, 1])
plt.show()

        可以看出:飞机乘客旅行的距离越远(分别是飞行时间越长),他们对飞行中的娱乐和额外的腿部空间(平均而言)就越满意。

4. 特征工程与数据集切分

        数据集存在一定的缺失值,需要进行缺失值的填充,同时对于类别类型的特征需要进行类别编码,最后进行训练集、验证集和测试集的切分:

# 缺失值填充
train_df['Arrival Delay in Minutes'].fillna(train_df['Arrival Delay in Minutes'].median(axis = 0), inplace = True)

# 类别编码
from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()

category_features = ['Gender', 'Customer Type', 'Type of Travel', 'Class']

for col in category_features:
    train_df[col] = encoder.fit_transform(train_df[col])

# 数据集切分
y_train_all = train_df['satisfaction']
X_train_all = train_df.drop(columns=['satisfaction'])

X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, test_size=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.1, random_state=42)

print('train: {}, valid: {}, test: {}'.format(X_train.shape[0], X_valid.shape[0], X_test.shape[0]))

5. 基于机器学习算法的航空客户满意度建模 

5.1 多模型预测性能对比初探

        利用构建的数据集,对Ada Boost、Gradient Boosting、Logistic Regression、Support Vector Machine和XGBoost这5个模型进行初步试验:

dd = pd.DataFrame({"scores": scores}, index=names)
dd = dd.sort_values("scores", ascending=False)
dd["scores"] = round(dd["scores"], 2)

fig, axes = plt.subplots(1,1,figsize=(12, 6))

sns.barplot(x=dd.index, y=dd.iloc[:, 0], ax=axes)
for container in axes.containers:
    axes.bar_label(container)
axes.set_yticklabels(())
axes.set_xticklabels(axes.get_xticklabels(), rotation=0, fontsize=12)
axes.set_ylabel("AUC得分", fontsize=12)
axes.set_xlabel("模型", fontsize=12)
plt.title("多模型预测性能对比初探", fontsize=20)
plt.show()

        可以看出,XGBoost 模型的性能最好,预测AUC达到了 96.69%,下面针对  XGBoost 模型进行进一步的优化。

5.2 Xgboost 模型继续优化

        通过对 XGBoost 训练的各项参数进行优化:

df_columns = X_train.columns.values
print('===> feature count: {}'.format(len(df_columns)))

xgb_params = {
    'eta': 0.1,
    'colsample_bytree': 0.4,
    'max_depth': 8,
    'lambda': 2.0,
    'eval_metric': 'auc',
    'objective': 'binary:logistic',
    'nthread': -1,
    'silent': 1,
    'booster': 'gbtree'
}

dtrain = xgb.DMatrix(X_train, y_train, feature_names=df_columns)
dvalid = xgb.DMatrix(X_valid, y_valid, feature_names=df_columns)

watchlist = [(dtrain, 'train'), (dvalid, 'valid')]

model = xgb.train(dict(xgb_params),
                      dtrain,
                      evals=watchlist,
                      verbose_eval=50,
                      early_stopping_rounds=100,
                      num_boost_round=4000)
[0]	train-auc:0.95911	valid-auc:0.95926
[50]	train-auc:0.99313	valid-auc:0.99157
[100]	train-auc:0.99624	valid-auc:0.99377
[150]	train-auc:0.99766	valid-auc:0.99459
[200]	train-auc:0.99836	valid-auc:0.99488
[250]	train-auc:0.99881	valid-auc:0.99507
[300]	train-auc:0.99915	valid-auc:0.99507
[350]	train-auc:0.99934	valid-auc:0.99512
[400]	train-auc:0.99950	valid-auc:0.99506
[450]	train-auc:0.99964	valid-auc:0.99511

特征重要程度分布

模型性能评估

# predict train
predict_train = model.predict(dtrain)
train_auc = evaluate_score(predict_train, y_train)

# predict validate
predict_valid = model.predict(dvalid)
valid_auc = evaluate_score(predict_valid, y_valid)

# predict test
dtest = xgb.DMatrix(X_test, feature_names=df_columns)
predict_test = model.predict(dtest)
test_auc = evaluate_score(predict_test, y_test)

print('训练集 auc = {:.7f} , 验证集 auc = {:.7f} , 测试集 auc = {:.7f}\n'.format(train_auc, valid_auc, test_auc))
训练集 auc = 0.9996361 , 验证集 auc = 0.9951094 , 测试集 auc = 0.9954333

测试集预测 ROC 曲线

        可以看出,测试集的预测 AUC 提高到了 99.54%!

6. 航空客户满意度分析预测系统

        利用 Flask + Bootstrap 框架搭建响应式布局的交互分析 web 系统,提供标准化 rest api,提供航空客户满意度的在线分析预测功能。

6.1 系统首页

6.2 航空客户满意度在线检测

7. 总结

        本系统利用数据挖掘、机器学习算法挖掘影响客户满意度的重要因素,最优模型的测试集预测准确率达到 99.5%,同时构建可视化交互平台,方便对航空公司乘客满意度的在线评估预测,可给航空公司提供定制化策略,为每名乘客提供专属化服务,从而极大程度上提高乘客满意度。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python-数据挖掘实战案例

2. Python-深度学习实战案例

3. Python-管理系统实战案例

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

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

相关文章

Linux系统CentOS下挂载磁盘

1. 挂载磁盘步骤总结如下 1. 对磁盘进行分区 2. 对磁盘进行格式化 3. 将磁盘挂载到对应目录 4. 设置开机自动挂载磁盘 2. 对磁盘进行分区 2.1 查看系统设备信息 lsblk指令显示所有块设备信息:显示系统中所有的块设备信息,包括磁盘和分区 lsblk 2…

Mapbox封装图形绘制工具 线,圆,polygon,删除,点 mapbox-gl-draw-circle mapbox-gl-draw

使用插件,安装 npm install mapbox-gl-draw-circle //绘制圆 npm install mapbox/mapbox-gl-draw //绘制点线面删除相关API地址:https://github.com/mohong/mapbox-gl-draw-circle https://github.com/mapbox/mapbox-gl-draw/blob/main/docs/API.md…

Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包

四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件,这俩个就是用于资源对比

dotnet4.0编译问题

因为最近在写cobaltstrike的execute-assembly内存加载的c#项目 用visual studio2022编译,最低net只能用6.0版本的,并且execute-assembly不支持 我想使用4.x版本进行编译,因为visual studio不支持,那么使用命令行进行编译 因为要用…

简单了解Redis(初识阶段)

1.认识Redis 对于Redis有一个很重要的点就是,它存储数据是在内存中存储的。 但是对于单机程序,直接通过变量存储数据的方式是更优的,在分布式系统下 Redis才能发挥威力 因为进程是有隔离性的,Redis可以基于网络,把进…

solidwork怎么隐藏实体再

在实际生产生活中,由于一些零件重叠或覆盖导致我们无法正确装配 我们就需要隐藏实体来看内部结构 假如不需要这个白色的大腿 先双击点他,然后右键 此时即可隐藏 同时右边零件会变白 想重新显示这样操作就可以了

Linux 常用命令(待更新)

1、pwd命令 2、cd命令 3、ls命令 4、locate命令 5、clear命令 6、cat命令 7、head命令 8、tail命令 9、grep命令 10、chmod命令 11、cp命令 12、mv命令 13、mkdir命令 14、rm命令 15、文件压缩和有关归档的命令 16、文件系统的命令 17、与系统管理相关的命令 …

2024 Snap 新款ar眼镜介绍

2024 snap 新款ar眼镜介绍 2024 Snap 新款ar眼镜介绍 助力快速掌握数据集的信息和使用方式。

【中台设计】数字中台,大数据中台解决方案,中台建设指南(资料Word分享)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集,结构化、半结构化、非结构化的数据采集,数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

煤矿井下钻场目标检测数据集 5类 voc格式

煤矿井下钻场目标检测数据集 本数据集包含了来自不同钻场和环境背景条件下的70948张图片,涵盖了夹持器、钻机卡盘、煤矿工人、矿井安全帽和钻杆等五类目标,并提供了PASCAL VOC格式的标注文件。 摘要 煤矿井下钻场打钻是解决瓦斯灾害、水害、隐蔽地质灾害…

点云与Open3D

点云数据介绍 点云与三维图像的关系:三维图像是一种特殊的信息表达形式,其特征是表达的空间中三个维度的数据,表现形式包括: 深度图(以灰度表达物体与相机的距离),几何模型(由CAD软…

Solidity语言:重点学习Solidity编程语言,这是EVM上最常用的智能合约语言。

Solidity是一种面向合约的编程语言,用于在以太坊虚拟机(EVM)上编写智能合约。它是Solidity开发者在以太坊平台上创建智能合约的主要选择之一。 学习Solidity的重点包括以下几方面: 语法和数据类型:学习Solidity的基本…

工业边缘计算网关和普通网关的区别-天拓四方

随着物联网(IoT)和工业4.0的快速发展,网关作为连接不同网络和设备的关键设备,其角色和功能日益凸显。在工业环境中,工业边缘计算网关和普通网关虽然都扮演着重要的角色,但它们在功能、应用场景和性能上存在…

算法:69.x的平方根

题目 链接:leetcode链接 思路分析(二分算法) 当然你可以使用暴力查找,但是二分算法的时间复杂度更好。 我们先用暴力查找找点灵感 x :1 2 3 4 5 6 7 8 x2:1 4 9 16 25 36 49 64 我们的目的是找到一个x…

【Java特性】多态详解——对象类型转换与 instanceof 关键字的运用

多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。多态不仅解决…

My_string 运算符重载,My_stack

思维导图 将My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) My_string my_string.h #ifndef MY_STRING_H #define MY_…

【论文】FunAudioLLM:一个旨在增强人类与大型语言模型(LLMs)之间自然语音交互的模型家族

研究背景 1.研究问题&#xff1a;这篇文章要解决的问题是如何增强人类与大型语言模型&#xff08;LLMs&#xff09;之间的自然语音交互。具体来说&#xff0c;研究集中在语音识别、情感识别和音频事件检测&#xff08;多语言&#xff09;以及语音生成&#xff08;多语言、零样…

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天&#xff0c;云原生 AI 20场主题分享&#xff0c;三展互动&#xff0c;为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…