航空旅客满意度数据可视化分析系统 - 技术文档
1. 项目概述
1.1 项目名称
航空旅客满意度数据可视化分析系统(Airline Passenger Satisfaction Visualization & Analysis System)
1.2 项目简介
本系统是一个基于 Python Flask 框架的 Web 数据可视化分析平台,针对航空旅客满意度调查数据(约 13 万条记录)进行多维度分析与可视化展示。系统涵盖数据概览、满意度分析、旅客画像、航班特征、服务评分卡、深度洞察、预测分析、数据查询共 8 大功能模块,提供 28 个交互式图表和 1 个可筛选分页数据表。
1.3 项目目标
对航空旅客满意度数据进行全面的多维分析
通过可视化图表直观呈现数据规律和趋势
利用机器学习模型识别影响满意度的关键因素
提供可交互的数据查询功能,支持按条件筛选
2. 系统架构
2.1 整体架构
复制代码
┌─────────────────────────────────────────────────────┐
│ 浏览器 (Browser) │
│ ┌───────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ HTML/CSS │ │ JS │ │ ECharts 5.5 │ │
│ │ (Jinja2) │ │ (原生) │ │ (图表渲染) │ │
│ └─────┬─────┘ └────┬─────┘ └──────────────────┘ │
│ │ │ │
│ └──────────────┘ │
│ │ AJAX (fetch API) │
└─────────────────┼─────────────────────────────────────┘
│
┌─────────────────┼─────────────────────────────────────┐
│ Flask Server (port 5080) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ app.py │ │
│ │ ┌──────────┐ ┌──────────────┐ ┌───────────┐ │ │
│ │ │ 路由控制 │ │ Session认证 │ │ API接口层 │ │ │
│ │ └──────────┘ └──────────────┘ └───────────┘ │ │
│ └────────────────────┬────────────────────────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌──────────────┐ ┌──────────────────────────┐ │ │
│ │ │ models.py │ │ data_analysis.py │ │ │
│ │ │ (用户管理) │ │ (数据分析引擎) │ │ │
│ │ └──────┬───────┘ └────────────┬─────────────┘ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌──────────────┐ ┌──────────────────────────┐ │ │
│ │ │ SQLite DB │ │ Pandas + scikit-learn │ │ │
│ │ │ (users.db) │ │ (CSV数据处理) │ │ │
│ │ └──────────────┘ └──────────────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘
2.2 架构风格
前后端半分离架构 :后端通过 Flask 路由提供页面和 JSON API,前端为单页应用(SPA)模式
数据驱动 :分析数据来源于 CSV 文件,通过 Pandas 在内存中加载和处理
懒加载模式 :CSV 数据在首次请求时加载到内存,后续请求复用缓存的 DataFrame
3. 技术栈
3.1 后端技术
技术
版本
用途
Python
3.x
主要开发语言
Flask
3.1.1
Web 框架,提供路由、模板渲染、Session 管理
Pandas
2.2.3
数据加载、清洗、统计分析
NumPy
-
数值计算支持
scikit-learn
1.3.2
机器学习(逻辑回归分类模型)
SQLite3
内置
用户数据存储
hashlib
内置
密码 SHA-256 加密
3.2 前端技术
技术
版本
用途
HTML5
-
页面结构
CSS3
-
样式(暗色科技主题、CSS 变量、动画)
JavaScript
ES6+
交互逻辑(原生,无框架)
ECharts
5.5.1 (CDN)
数据可视化图表库
Jinja2
Flask 内置
服务端模板引擎
Fetch API
-
前后端数据交互
3.3 开发工具
工具
用途
pip
Python 包管理
CDN
ECharts 前端资源加载
3.4 依赖清单 (requirements.txt)
复制代码
flask==3.1.1
pandas==2.2.3
scikit-learn==1.3.2
numpy
4. 数据库设计
4.1 数据库类型
SQLite3 :用于存储用户账户和操作日志
CSV 文件 :作为分析数据源(airline_passenger_satisfaction.csv,约 129,880 条记录)
4.2 数据库表结构
4.2.1 用户表 (users)
字段
类型
约束
说明
id
INTEGER
PRIMARY KEY AUTOINCREMENT
用户唯一标识
username
TEXT
UNIQUE NOT NULL
用户名
password
TEXT
NOT NULL
密码(SHA-256 加盐哈希,盐值:airline2024)
nickname
TEXT
DEFAULT ''
用户昵称
avatar
TEXT
DEFAULT ''
头像(Base64 Data URI 格式存储)
created_at
REAL
NOT NULL
注册时间(Unix 时间戳)
4.2.2 操作日志表 (data_records)
字段
类型
约束
说明
id
INTEGER
PRIMARY KEY AUTOINCREMENT
记录唯一标识
user_id
INTEGER
NOT NULL (FK → users.id )
关联用户 ID
action
TEXT
NOT NULL
操作类型(如 login、logout)
detail
TEXT
DEFAULT ''
操作详情
created_at
REAL
NOT NULL
操作时间(Unix 时间戳)
4.2.3 CSV 数据字段说明
数据来源:airline_passenger_satisfaction.csv
字段名
类型
取值范围
说明
ID
整数
唯一标识
旅客编号
Gender
分类
Male / Female
性别
Age
整数
7-85
年龄
Customer Type
分类
First-time / Returning
客户类型
Type of Travel
分类
Business / Personal
出行目的
Class
分类
Business / Economy / Economy Plus
舱位等级
Flight Distance
整数
31-4983
飞行距离(km)
Departure Delay
整数
0-1592
出发延误(分钟)
Arrival Delay
浮点数
0-1584(含缺失值)
到达延误(分钟)
Departure and Arrival Time Convenience
整数
1-5
出入港时间便利性评分
Ease of Online Booking
整数
1-5
在线预订便捷性评分
Check-in Service
整数
1-5
值机服务评分
Online Boarding
整数
1-5
在线登机评分
Gate Location
整数
1-5
登机口位置评分
On-board Service
整数
1-5
机上服务评分
Seat Comfort
整数
1-5
座椅舒适度评分
Leg Room Service
整数
1-5
腿部空间评分
Cleanliness
整数
1-5
清洁度评分
Food and Drink
整数
1-5
餐饮评分
In-flight Service
整数
1-5
机上服务评分
In-flight Wifi Service
整数
1-5
机上 WiFi 评分
In-flight Entertainment
整数
1-5
机上娱乐评分
Baggage Handling
整数
1-5
行李处理评分
Satisfaction
分类
Satisfied / Neutral or Dissatisfied
总体满意度
4.3 E-R 关系图
复制代码
┌──────────┐ 1:N ┌───────────────┐
│ users │ ─────────────── │ data_records │
│ │ │ │
│ id (PK) │◄───────────────│ user_id (FK) │
│ username │ │ id (PK) │
│ password │ │ action │
│ nickname │ │ detail │
│ avatar │ │ created_at │
│ created_at│ └───────────────┘
└──────────┘
5. 功能模块详细说明
5.1 用户认证模块
5.1.1 登录功能
页面 :login.html
路由 :GET/POST /login
认证方式 :Session-based Authentication
密码加密 :SHA-256 加盐哈希(盐值:airline2024)
特性 :粒子动画背景、表单验证、错误提示
5.1.2 注册功能
页面 :register.html
路由 :GET/POST /register
验证规则 :用户名唯一性检查、密码强度校验
注册成功后 :自动跳转登录页
5.1.3 用户资料管理
页面 :profile.html
路由 :GET/POST /profile
功能 :
修改昵称
上传头像(Base64 编码存储)
修改用户名
修改密码
5.1.4 管理员功能
GET /api/admin/users:查看所有用户列表
POST /api/admin/delete_user:删除指定用户
5.2 数据概览模块 (Dashboard)
前端文件 :dashboard.js
API :GET /api/overview
功能 :
8 个 KPI 指标卡片:总旅客数、满意/不满意人数、满意度率、平均年龄、平均飞行距离、平均出发延误、平均到达延误
3 个环形饼图:满意度分布、舱位分布、性别分布
1 个柱状图:年龄段分布
5.3 满意度分析模块
前端文件 :satisfaction.js
图表数量 :6 个
功能 :
图表
API
说明
雷达图
/api/satisfaction/radar
14 个服务维度的平均评分对比
水平条形图
/api/satisfaction/factors
影响满意度的关键因素排名(满意与不满意群体的均值差异)
堆叠柱状图(按舱位)
/api/satisfaction/by_class
不同舱位的满意度分布
堆叠柱状图(按客户类型)
/api/satisfaction/by_customer_type
首次/回头客的满意度对比
堆叠柱状图(按出行目的)
/api/satisfaction/by_travel_type
商务/个人出行的满意度对比
分组柱状图
/api/satisfaction/rating_by_class
各服务维度按舱位分组的评分对比
5.4 旅客画像模块 (Population)
前端文件 :population.js
图表数量 :4 个
功能 :
图表
API
说明
堆叠柱状图
/api/population/age_vs_satisfaction
各年龄段的满意度分布
堆叠柱状图
/api/population/gender_vs_satisfaction
不同性别的满意度对比
柱状图
/api/population/age
旅客年龄分布(7 个分段)
饼图
/api/population/gender
性别比例
年龄分段规则 :<18、18-25、26-35、36-45、46-55、56-65、65+
5.5 航班特征模块 (Flight)
前端文件 :flight.js
图表数量 :6 个图表 + 1 个数据表
功能 :
图表
API
说明
4 个延误 KPI 卡片
/api/flight/delay_gauge
平均延误时间、准点率、严重延误率等
柱状图
/api/flight/distance_vs_satisfaction
飞行距离与满意度的关系(6 个距离段)
柱状图
/api/flight/delay_vs_satisfaction
延误时间与满意度的关系(7 个时间段)
分组柱状图
/api/flight/delay_distribution
出发/到达延误分布对比
仪表盘
/api/flight/delay_gauge
准点率仪表盘
散点图
/api/analysis/scatter
年龄与延误的散点关系(随机抽样 2000 条)
箱线图
/api/analysis/boxplot
各舱位的飞行距离分布(含异常值检测)
距离分段规则 :0-500、501-1000、1001-1500、1501-2000、2001-3000、3000+
延误分段规则 :0(准时)、1-15、16-30、31-60、61-120、121-240、240+(分钟)
5.6 服务评分卡模块 (Service)
前端文件 :service.js
图表数量 :4 个
功能 :
图表
API
说明
水平条形图(带合格线)
/api/service/scorecard
14 个服务维度的平均评分(含 3.5 分合格线)
分组柱状图
/api/service/scorecard
各维度的高分(≥4)/低分(≤2)占比
柱状图
/api/service/scorecard
各维度评分标准差(波动程度)
漏斗图
/api/analysis/funnel
旅客漏斗:全部→无延误→短途→中途→长途
5.7 深度洞察模块 (Insights)
前端文件 :insights.js
图表数量 :4 个
功能 :
图表
API
说明
双向条形图
/api/satisfaction/factors
满意/不满意群体各维度评分对比
热力图
/api/satisfaction/correlation
14×14 服务维度皮尔逊相关系数矩阵
热力图
/api/flight/distance_heatmap
年龄×飞行距离的满意度率矩阵
矩形树图
/api/analysis/segments
客户细分(客户类型×舱位×出行目的三维交叉分析)
5.8 预测分析模块 (Prediction)
前端文件 :prediction.js
图表数量 :4 个
功能 :
图表
API
说明
4 个模型指标 KPI
/api/prediction/model
准确率、精确率、召回率、F1 分数
水平条形图
/api/prediction/model
特征重要性排名(逻辑回归系数绝对值)
直方图
/api/prediction/model
预测概率分布(5% 步长分箱)
热力图
/api/prediction/model
混淆矩阵(2×2)
5.9 数据查询模块 (DataTable)
前端文件 :flight.js(initDataTable 函数)
API :GET /api/data/table
筛选条件 :性别、年龄范围、客户类型、舱位等级、满意度
功能 :服务端分页、条件筛选、HTML 表格展示
6. 机器学习模型
6.1 模型概述
项目
说明
算法
逻辑回归(Logistic Regression)
库
scikit-learn 1.3.2
目标
二分类(Satisfied = 1,其余 = 0)
训练方式
每次 API 调用时实时训练(不持久化模型)
6.2 特征工程
输入特征(18 个) :
类型
特征
数值型
Age、Flight Distance、Departure Delay、Arrival Delay
评分型 (1-5)
Departure and Arrival Time Convenience、Ease of Online Booking、Check-in Service、Online Boarding、Gate Location、On-board Service、Seat Comfort、Leg Room Service、Cleanliness、Food and Drink、In-flight Service、In-flight Wifi Service、In-flight Entertainment、Baggage Handling
6.3 数据预处理
缺失值填充:fillna(0)
特征标准化:StandardScaler(零均值单位方差)
数据集划分:训练集 70% / 测试集 30%(random_state=42)
6.4 模型参数
python
复制代码
LogisticRegression(max_iter=1000, random_state=42)
6.5 评估指标
准确率 (Accuracy) :整体预测正确率
精确率 (Precision) :预测为满意中实际满意的比例
召回率 (Recall) :实际满意中被正确预测的比例
F1 分数 :精确率和召回率的调和平均
混淆矩阵 :TP、TN、FP、FN
特征重要性 :逻辑回归系数绝对值排序
预测概率分布 :以 5% 为步长的直方图
6.6 统计分析方法
方法
应用场景
皮尔逊相关系数
14 个服务维度的相关性矩阵
均值差异分析
满意/不满意群体各维度评分差异
四分位数分析
箱线图(Q1、中位数、Q3、IQR 异常值检测)
标准差
服务评分波动程度
交叉分析
年龄×距离满意度率、客户细分三维交叉
7. API 接口文档
7.1 页面路由
方法
路径
说明
认证要求
GET
/
主仪表盘页面
需登录
GET/POST
/login
登录页面
无
GET/POST
/register
注册页面
无
GET
/logout
退出登录
无
GET/POST
/profile
个人资料页面
需登录
7.2 用户管理 API
方法
路径
说明
请求参数
返回格式
GET
/api/profile
获取当前用户信息
-
JSON
POST
/api/change_password
修改密码
old_pwd, new_pwd
JSON
POST
/api/change_username
修改用户名
new_username
JSON
GET
/api/logs
获取操作日志
-
JSON
GET
/api/admin/users
获取所有用户列表
-
JSON
POST
/api/admin/delete_user
删除用户
user_id
JSON
7.3 数据分析 API
所有分析 API 均为 GET 请求,返回 JSON 格式数据。
7.3.1 数据概览
复制代码
GET /api/overview
返回:{
total: 总旅客数,
satisfied: 满意人数,
dissatisfied: 不满意人数,
satisfaction_rate: 满意度率(%),
avg_age: 平均年龄,
avg_distance: 平均飞行距离,
avg_departure_delay: 平均出发延误,
avg_arrival_delay: 平均到达延误
}
7.3.2 满意度分析
复制代码
GET /api/satisfaction/distribution → 满意/不满意人数分布
GET /api/satisfaction/radar → 14 维度平均评分
GET /api/satisfaction/by_class → 按舱位统计满意度
GET /api/satisfaction/by_customer_type → 按客户类型统计满意度
GET /api/satisfaction/by_travel_type → 按出行目的统计满意度
GET /api/satisfaction/rating_by_class → 各维度按舱位分组评分
GET /api/satisfaction/factors → 影响因素排名
GET /api/satisfaction/correlation → 14×14 相关系数矩阵
7.3.3 旅客画像
复制代码
GET /api/population/age → 年龄分布
GET /api/population/gender → 性别分布
GET /api/population/age_vs_satisfaction → 年龄×满意度
GET /api/population/gender_vs_satisfaction → 性别×满意度
GET /api/population/class_distribution → 舱位分布
7.3.4 航班特征
复制代码
GET /api/flight/distance_vs_satisfaction → 距离×满意度
GET /api/flight/delay_distribution → 延误分布
GET /api/flight/delay_vs_satisfaction → 延误×满意度
GET /api/flight/delay_gauge → 准点率/延误指标
GET /api/flight/distance_heatmap → 年龄×距离满意度热力图
GET /api/data/table → 分页数据表(支持筛选)
7.3.5 服务评分卡
复制代码
GET /api/service/scorecard → 14 维度评分统计
7.3.6 深度洞察
复制代码
GET /api/analysis/scatter → 散点图数据
GET /api/analysis/boxplot → 箱线图数据
GET /api/analysis/funnel → 漏斗图数据
GET /api/analysis/segments → 客户细分数据
7.3.7 预测分析
复制代码
GET /api/prediction/model → 模型训练结果
8. 前端页面设计
8.1 页面结构
系统采用 SPA(单页应用)架构,通过侧边栏导航在 8 个虚拟页面间切换:
复制代码
┌──────────────────────────────────────────────────────┐
│ index.html │
│ ┌────────────┐ ┌────────────────────────────────┐ │
│ │ │ │ │ │
│ │ 侧边栏 │ │ 内容区域 │ │
│ │ 导航菜单 │ │ ┌──────────────────────────┐ │ │
│ │ │ │ │ dashboard / satisfaction │ │ │
│ │ · 数据概览│ │ │ / population / flight │ │ │
│ │ · 满意度 │ │ │ / service / insights │ │ │
│ │ · 旅客画像│ │ │ / prediction / datatable │ │ │
│ │ · 航班特征│ │ └──────────────────────────┘ │ │
│ │ · 服务评分│ │ │ │
│ │ · 深度洞察│ │ │ │
│ │ · 预测分析│ │ │ │
│ │ · 数据查询│ │ │ │
│ └────────────┘ └────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
8.2 UI 设计风格
主题 :暗色科技风格(Dark Sci-Fi Theme)
主色调 :青色 (#00b4ff)
背景 :深色网格背景 + 扫描线动画
面板 :毛玻璃效果(Glassmorphism)
字体 :等宽字体
动画 :CSS 过渡动画、粒子效果(登录/注册页)
8.3 图表统计
共使用 28 个 ECharts 实例 ,涵盖以下图表类型:
图表类型
数量
使用页面
环形饼图 (Donut Pie)
3
Dashboard
柱状图 (Bar)
5
Dashboard、Population、Flight
雷达图 (Radar)
1
Satisfaction
水平条形图 (Horizontal Bar)
4
Satisfaction、Service、Insights、Prediction
堆叠柱状图 (Stacked Bar)
4
Satisfaction、Population
分组柱状图 (Grouped Bar)
3
Satisfaction、Service、Prediction
仪表盘 (Gauge)
1
Flight
散点图 (Scatter)
1
Flight
箱线图 (Boxplot)
1
Flight
热力图 (Heatmap)
3
Insights、Prediction
矩形树图 (Treemap)
1
Insights
漏斗图 (Funnel)
1
Service
8.4 文件清单
文件
职责
main.js
导航切换、ECharts 主题注册、页面初始化调度
dashboard.js
数据概览页:KPI 卡片 + 饼图 + 柱状图
satisfaction.js
满意度分析页:雷达图 + 条形图 + 堆叠柱状图
population.js
旅客画像页:年龄/性别分布与满意度交叉
flight.js
航班特征页:延误分析 + 距离分析 + 数据表
service.js
服务评分卡页:评分排名 + 高低分占比 + 漏斗图
insights.js
深度洞察页:因素对比 + 相关矩阵 + 热力图 + 树图
prediction.js
预测分析页:模型指标 + 特征重要性 + 混淆矩阵
style.css
主仪表盘全局样式(暗色主题)
9. 安全设计
9.1 认证安全
密码使用 SHA-256 加盐哈希存储(盐值:airline2024)
基于 Flask Session 的会话管理
Secret Key 每次服务启动随机生成(os.urandom(24))
9.2 接口安全
所有 API 接口检查登录状态,未登录返回 401
管理员接口需要额外权限验证
密码修改需验证旧密码
9.3 数据安全
密码不明文存储
头像以 Base64 编码存储在数据库中
SQL 查询使用参数化查询防止 SQL 注入
10. 部署与运行
10.1 环境要求
10.2 安装步骤
bash
复制代码
# 1. 进入项目目录
cd fly
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务
python app.py
10.3 访问地址
服务启动后监听端口 5080
浏览器访问:http://localhost:5080
10.4 文件结构说明
复制代码
fly/
├── airline_passenger_satisfaction.csv # 分析数据源(约 12.3MB)
├── app.py # Flask 主应用(路由、API)
├── data_analysis.py # 数据分析引擎(Pandas 处理)
├── models.py # 数据库模型(用户、日志)
├── requirements.txt # Python 依赖清单
├── users.db # SQLite 数据库文件
├── static/
│ ├── css/
│ │ └── style.css # 仪表盘样式
│ └── js/
│ ├── main.js # 主控制脚本
│ ├── dashboard.js # 数据概览
│ ├── satisfaction.js # 满意度分析
│ ├── population.js # 旅客画像
│ ├── flight.js # 航班特征 + 数据表
│ ├── service.js # 服务评分卡
│ ├── insights.js # 深度洞察
│ └── prediction.js # 预测分析
└── templates/
├── index.html # 主 SPA 页面
├── login.html # 登录页
├── register.html # 注册页
└── profile.html # 个人资料页
11. 数据流说明
11.1 请求处理流程
复制代码
用户操作 → 浏览器 JS → fetch API 请求
→ Flask 路由匹配
→ 页面路由:渲染 Jinja2 模板返回 HTML
→ API 路由:调用 data_analysis.py 分析函数
→ Pandas 读取/处理 CSV 数据
→ 返回 JSON 数据
→ 前端 JS 解析 JSON → ECharts 渲染图表
11.2 数据加载策略
CSV 数据采用懒加载模式:首次请求时通过 get_df() 加载到全局变量 _df
后续请求直接使用内存中的 DataFrame,避免重复 I/O
每次 API 调用基于完整 DataFrame 进行实时计算
11.3 机器学习流程
复制代码
API 请求 → 加载 DataFrame → 特征提取 (18 维)
→ 缺失值填充 (fillna(0))
→ StandardScaler 标准化
→ 训练集/测试集划分 (70/30)
→ LogisticRegression 训练
→ 预测 + 评估
→ 返回指标 + 特征重要性 + 混淆矩阵 + 概率分布
12. 局限性与改进方向
12.1 当前局限
方面
说明
数据存储
分析数据存储在 CSV 文件中,未导入数据库,不适合大数据量场景
模型持久化
机器学习模型每次请求重新训练,未做缓存或持久化
并发性能
Pandas 单线程处理,高并发场景下性能受限
认证机制
Session-based 认证不支持分布式部署
前端框架
使用原生 JS,组件化程度低
配置管理
数据库路径、端口等硬编码,无配置文件
12.2 可改进方向
将 CSV 数据导入关系型数据库(如 MySQL/PostgreSQL),提升查询性能
引入模型缓存机制,避免重复训练
前端引入 Vue.js / React 提升组件化和可维护性
增加更多机器学习算法(随机森林、XGBoost 等)进行对比
添加数据导出功能(Excel、PDF 报告)
支持数据定时更新和增量分析
容器化部署(Docker)