当前位置: 首页 > article >正文

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

温馨提示:文末有 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.kler.cn/news/319493.html

相关文章:

  • 安卓系统常见问题如native crash,卡顿卡死定位工具命令技巧-android framework实战开发
  • Java_Day05学习
  • 搜维尔科技:通过xsens动作捕捉为影视角色注入生命
  • 前端框架的对比和选择
  • MySQL备份与恢复详解
  • Anaconda/Miniconda的删除和安装
  • rapidocr 提取汇总
  • 可以写自动化测试工具的AI工具
  • [笔记]交流接触器
  • UR机器人坐标系转化
  • C++系列-Stackqueue
  • Qt中多语言的操作(以QtCreator为例)
  • Android个性名片界面的设计——约束布局的应用
  • 「iOS」——单例模式
  • Angular面试题三
  • javascript的闭包学习
  • Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  • 电路板上电子元件检测系统源码分享
  • Spring Boot 配置全流程 总结
  • 视频转文字工具:开启视频内容深度挖掘的钥匙
  • centos7 docker部署nacos
  • HCIA--实验十七:EASY IP的NAT实现
  • 拒绝信息泄露!VMD滚动分解 + Informer-BiLSTM并行预测模型
  • PyFluent常用代码 1
  • QT开发模式(二):QML/JS/C++混合编程
  • 中国电子学会202312青少年软件编程(Python)等级考试试卷(四级)真题
  • 基于VUE的医院抗生素使用审核流程信息化管理系统
  • 前端如何实现截图?
  • webView2 隐藏滚动条
  • 【数据结构初阶】排序算法(上)插入排序与选择排序