温馨提示:文末有 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-管理系统实战案例