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

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

1. 项目简介

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

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

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

python 复制代码
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 客户满意度样本占比

python 复制代码
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 不同类型客户的满意度分析

python 复制代码
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 不同航程距离对满意度影响

python 复制代码
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 不同航班舱位、旅行类型和航程距离对满意度影响

python 复制代码
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 不同类型乘客的年龄的联合分布

python 复制代码
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 飞行娱乐活动、飞行距离的相关性分析

python 复制代码
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. 特征工程与数据集切分

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

python 复制代码
# 缺失值填充
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个模型进行初步试验:

python 复制代码
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 训练的各项参数进行优化:

python 复制代码
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

特征重要程度分布

模型性能评估

python 复制代码
# 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-管理系统实战案例

相关推荐
淘晶驰AK14 分钟前
嵌入式算吃青春饭么?
人工智能
打码人的日常分享27 分钟前
【软件建设方案】设备管理系统建设方案(Doc原件参考)
大数据·人工智能·系统安全·需求分析·设计规范
新智元43 分钟前
突破数据墙!27 岁华裔 MIT 辍学创业 8 年,年化收入逼近 10 亿
前端·人工智能
AI大模型_学习君1 小时前
什么是 GPT?通过图形化的方式来理解 Transformer 架构
人工智能·gpt·深度学习·自然语言处理·大模型·llm·transformer
AiBoxss1 小时前
阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4
人工智能
水木流年追梦1 小时前
【shell脚本5】Shell脚本学习--条件控制
人工智能·python·深度学习·学习·算法·机器学习
jndingxin2 小时前
OpenCV特征检测(7)角点检测函数goodFeaturesToTrack()的使用
人工智能·opencv·计算机视觉
bryant_meng2 小时前
【BoF】《Bag of Freebies for Training Object Detection Neural Networks》
人工智能·目标检测·计算机视觉·bof
华为云PaaS服务小智3 小时前
华为云发布全栈可观测平台AOM,以AI赋能应用运维可观测
运维·人工智能·华为云