航空旅客满意度数据可视化分析系统(Airline Passenger Satisfaction Visualization & Analysis System)
本系统是一个基于 Python Flask 框架的 Web 数据可视化分析平台,针对航空旅客满意度调查数据(约 13 万条记录)进行多维度分析与可视化展示。系统涵盖数据概览、满意度分析、旅客画像、航班特征、服务评分卡、深度洞察、预测分析、数据查询共 8 大功能模块,提供 28 个交互式图表和 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数据处理) │ │ ││ │ └──────────────┘ └──────────────────────────┘ │ ││ └─────────────────────────────────────────────────┘ │└───────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 浏览器 (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数据处理) │ │ │
│ │ └──────────────┘ └──────────────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘
flask==3.1.1pandas==2.2.3scikit-learn==1.3.2numpy
flask==3.1.1
pandas==2.2.3
scikit-learn==1.3.2
numpy
airline_passenger_satisfaction.csv
airline2024
数据来源:airline_passenger_satisfaction.csv
┌──────────┐ 1:N ┌───────────────┐│ users │ ─────────────── │ data_records ││ │ │ ││ id (PK) │◄───────────────│ user_id (FK) ││ username │ │ id (PK) ││ password │ │ action ││ nickname │ │ detail ││ avatar │ │ created_at ││ created_at│ └───────────────┘└──────────┘
┌──────────┐ 1:N ┌───────────────┐
│ users │ ─────────────── │ data_records │
│ id (PK) │◄───────────────│ user_id (FK) │
│ username │ │ id (PK) │
│ password │ │ action │
│ nickname │ │ detail │
│ avatar │ │ created_at │
│ created_at│ └───────────────┘
└──────────┘
login.html
GET/POST /login
register.html
GET/POST /register
profile.html
GET/POST /profile
GET /api/admin/users
POST /api/admin/delete_user
dashboard.js
GET /api/overview
satisfaction.js
/api/satisfaction/radar
/api/satisfaction/factors
/api/satisfaction/by_class
/api/satisfaction/by_customer_type
/api/satisfaction/by_travel_type
/api/satisfaction/rating_by_class
population.js
/api/population/age_vs_satisfaction
/api/population/gender_vs_satisfaction
/api/population/age
/api/population/gender
年龄分段规则:<18、18-25、26-35、36-45、46-55、56-65、65+
flight.js
/api/flight/delay_gauge
/api/flight/distance_vs_satisfaction
/api/flight/delay_vs_satisfaction
/api/flight/delay_distribution
/api/analysis/scatter
/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+(分钟)
service.js
/api/service/scorecard
/api/analysis/funnel
insights.js
/api/satisfaction/correlation
/api/flight/distance_heatmap
/api/analysis/segments
prediction.js
/api/prediction/model
initDataTable
GET /api/data/table
输入特征(18 个):
fillna(0)
StandardScaler
random_state=42
LogisticRegression(max_iter=1000, random_state=42)
/
/login
/register
/logout
/profile
/api/profile
/api/change_password
/api/change_username
/api/logs
/api/admin/users
/api/admin/delete_user
所有分析 API 均为 GET 请求,返回 JSON 格式数据。
GET /api/overview返回:{ total: 总旅客数, satisfied: 满意人数, dissatisfied: 不满意人数, satisfaction_rate: 满意度率(%), avg_age: 平均年龄, avg_distance: 平均飞行距离, avg_departure_delay: 平均出发延误, avg_arrival_delay: 平均到达延误}
返回:{
total: 总旅客数,
satisfied: 满意人数,
dissatisfied: 不满意人数,
satisfaction_rate: 满意度率(%),
avg_age: 平均年龄,
avg_distance: 平均飞行距离,
avg_departure_delay: 平均出发延误,
avg_arrival_delay: 平均到达延误
}
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 相关系数矩阵
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 相关系数矩阵
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 → 舱位分布
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 → 舱位分布
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 → 分页数据表(支持筛选)
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 → 分页数据表(支持筛选)
GET /api/service/scorecard → 14 维度评分统计
GET /api/analysis/scatter → 散点图数据GET /api/analysis/boxplot → 箱线图数据GET /api/analysis/funnel → 漏斗图数据GET /api/analysis/segments → 客户细分数据
GET /api/analysis/scatter → 散点图数据
GET /api/analysis/boxplot → 箱线图数据
GET /api/analysis/funnel → 漏斗图数据
GET /api/analysis/segments → 客户细分数据
GET /api/prediction/model → 模型训练结果
系统采用 SPA(单页应用)架构,通过侧边栏导航在 8 个虚拟页面间切换:
┌──────────────────────────────────────────────────────┐│ index.html ││ ┌────────────┐ ┌────────────────────────────────┐ ││ │ │ │ │ ││ │ 侧边栏 │ │ 内容区域 │ ││ │ 导航菜单 │ │ ┌──────────────────────────┐ │ ││ │ │ │ │ dashboard / satisfaction │ │ ││ │ · 数据概览│ │ │ / population / flight │ │ ││ │ · 满意度 │ │ │ / service / insights │ │ ││ │ · 旅客画像│ │ │ / prediction / datatable │ │ ││ │ · 航班特征│ │ └──────────────────────────┘ │ ││ │ · 服务评分│ │ │ ││ │ · 深度洞察│ │ │ ││ │ · 预测分析│ │ │ ││ │ · 数据查询│ │ │ ││ └────────────┘ └────────────────────────────────┘ │└──────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────┐
│ index.html │
│ ┌────────────┐ ┌────────────────────────────────┐ │
│ │ 侧边栏 │ │ 内容区域 │ │
│ │ 导航菜单 │ │ ┌──────────────────────────┐ │ │
│ │ │ │ │ dashboard / satisfaction │ │ │
│ │ · 数据概览│ │ │ / population / flight │ │ │
│ │ · 满意度 │ │ │ / service / insights │ │ │
│ │ · 旅客画像│ │ │ / prediction / datatable │ │ │
│ │ · 航班特征│ │ └──────────────────────────┘ │ │
│ │ · 服务评分│ │ │ │
│ │ · 深度洞察│ │ │ │
│ │ · 预测分析│ │ │ │
│ │ · 数据查询│ │ │ │
│ └────────────┘ └────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
共使用 28 个 ECharts 实例,涵盖以下图表类型:
main.js
style.css
os.urandom(24)
# 1. 进入项目目录cd fly# 2. 安装依赖pip install -r requirements.txt# 3. 启动服务python app.py
# 1. 进入项目目录
cd fly
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务
python app.py
http://localhost:5080
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 # 个人资料页
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 # 个人资料页
用户操作 → 浏览器 JS → fetch API 请求 → Flask 路由匹配 → 页面路由:渲染 Jinja2 模板返回 HTML → API 路由:调用 data_analysis.py 分析函数 → Pandas 读取/处理 CSV 数据 → 返回 JSON 数据 → 前端 JS 解析 JSON → ECharts 渲染图表
用户操作 → 浏览器 JS → fetch API 请求
→ Flask 路由匹配
→ 页面路由:渲染 Jinja2 模板返回 HTML
→ API 路由:调用 data_analysis.py 分析函数
→ Pandas 读取/处理 CSV 数据
→ 返回 JSON 数据
→ 前端 JS 解析 JSON → ECharts 渲染图表
get_df()
_df
API 请求 → 加载 DataFrame → 特征提取 (18 维) → 缺失值填充 (fillna(0)) → StandardScaler 标准化 → 训练集/测试集划分 (70/30) → LogisticRegression 训练 → 预测 + 评估 → 返回指标 + 特征重要性 + 混淆矩阵 + 概率分布
API 请求 → 加载 DataFrame → 特征提取 (18 维)
→ 缺失值填充 (fillna(0))
→ StandardScaler 标准化
→ 训练集/测试集划分 (70/30)
→ LogisticRegression 训练
→ 预测 + 评估
→ 返回指标 + 特征重要性 + 混淆矩阵 + 概率分布