返回作品

基于 Spark 的交通事故分析与预测

创建于 2026 年 2 月 24 日

标签
  • PySpark 3.5
  • Spark MLlib
  • Flask
  • ECharts
  • Pandas
  • JDK 17

项目介绍

交通事故数据量大、字段杂、时空关联强,单机工具难以胜任全量分析。本项目基于 Apache Spark 构建完整的数据分析链路,以 Kaggle 公开数据集 US Accidents(2023 年 3 月版)为研究对象——该数据集包含约 770 万条美国交通事故记录、46 个特征字段,覆盖时间、地理位置、天气、道路设施等信息。系统面向”事故严重程度预测”这一核心问题,用 Spark 的分布式能力完成清洗、分析、建模的全流程。

项目采用分步执行的工程组织方式:数据加载与清洗、探索性分析、特征工程与模型训练、Web 可视化四步各自独立成脚本,可逐步运行、随时检查中间产物。开发阶段通过 10% 采样(固定随机种子)快速验证流程,清洗后参与分析的记录数为 774,102 条,生产环境将采样比例调整为 1.0 即可全量跑通。

项目架构

系统整体分为四层,核心代码按职责拆分为 spark/app/ 两个模块:

  • 数据层:原始 CSV(data/raw/)经清洗后落盘为 Parquet(data/processed/),EDA 结果与模型指标分别输出为 JSON(data/generated/models/metrics.json),模型以 Spark ML 标准格式保存于 models/
  • Spark 处理层spark/):data_loader.py 负责创建 SparkSession 与 CSV 加载采样;data_cleaner.py 完成去重、缺失值填充、时间解析等清洗;eda.py 输出六大类统计分析;feature_engineering.py 做类别编码与衍生特征;ml_models.py 封装模型训练、评估、交叉验证与存取。
  • Web 层app/):Flask 提供 /api/analysis/results/api/model/results/api/stats/basic/api/stats/time/api/stats/geo/api/stats/weather 六类接口,前端单页 index.html 通过 fetch 读取 JSON 结果。
  • 配置层config.py 统一管理 JDK 路径、Spark 内存(driver/executor 各 4G)、采样比例与 Flask 监听地址(默认 0.0.0.0:5001)。

技术栈上,PySpark 3.5.0 承担分布式计算,Spark MLlib 提供 StringIndexer、VectorAssembler 与分类模型,Flask 3.0 承载 Web 服务,前端图表使用 ECharts 5.4.3,分析阶段辅以 pandas、matplotlib、seaborn。运行环境要求 Python 3.8+ 与 JDK 17。

核心功能

  • 数据清洗:按事故 ID 去重;温度、湿度、气压、能见度、风速、降水量等数值字段用分位数近似中位数填充,天气、风向等类别字段用众数填充;解析 Start_Time 并提取年、月、日、小时、星期几与是否周末等时间特征;将 13 个布尔型道路字段(如 Traffic_Signal、Crossing)转为 0/1。
  • 探索性分析:输出事故总数与严重程度分布(清洗后数据中 Severity 2 级占绝对多数:617,025 条)、按小时/月/星期的时序分布、Top 10 州与城市分布(加利福尼亚最多,174,906 条)、天气条件分布(Fair 天气 274,303 条居首)以及道路特征频次统计,并交叉分析光照条件、周末与否对严重程度的影响。
  • 特征工程:对 Sunrise_SunsetWeather_Condition 做 StringIndexer 编码,衍生 is_rush_hour(7–9 点与 17–19 点)、is_night(22 点–次日 6 点)、温度五档分级与能见度四档分级,最终经 VectorAssembler 组装 27 维特征向量,标签为 Severity 减一(0–3)。
  • 模型训练与评估:按 8:2 划分训练/测试集,训练决策树(maxDepth=10)与随机森林(50 棵树、maxDepth=10)两个分类器,输出准确率、F1、加权精确率、加权召回率与混淆矩阵;决策树准确率 0.7993、F1 0.7275,随机森林准确率 0.7979、F1 0.7082。随机森林特征重要性显示天气条件(0.3705)、Crossing(0.1442)、风速(0.1263)、交通信号灯(0.1197)是影响预测的最关键因素。另提供 3 折交叉验证(numTrees 与 maxDepth 参数网格搜索)寻找更优超参。
  • 可视化界面:单页应用包含”数据分析”与”预测模型”两个 Tab,共 8 个 ECharts 图表(严重程度分布、24 小时分布、月度趋势、各州 Top 10、天气分析、道路特征、特征重要性、混淆矩阵),顶部另设事故总数、平均严重程度、事故最多州、高峰时段 4 张统计卡片。

功能截图

暂无运行截图。

快速上手

环境准备:安装 Python 3.8+ 与 JDK 17,将 config.py 中的 JAVA_HOME 改为本机 JDK 路径,并把数据集 US_Accidents_March23.csv 放入 data/raw/(开发调试可保持 SAMPLE_RATIO = 0.1 以 10% 数据快速验证)。安装依赖:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

按顺序执行四个步骤,前一步的输出是后一步的输入:

# 步骤1:数据加载与清洗(输出 data/processed/cleaned_data.parquet)
python scripts/step1_data_loader.py

# 步骤2:探索性数据分析(输出 data/generated/eda_results.json)
python scripts/step2_eda.py

# 步骤3:特征工程与模型训练(输出 models/ 与 models/metrics.json)
python scripts/step3_model_training.py

# 步骤4:启动 Flask 可视化界面(默认 http://localhost:5001)
python scripts/step4_web_server.py

浏览器打开 http://localhost:5001 即可查看分析图表与模型指标;如果接口返回”请先运行 step2/step3”的提示,说明对应中间产物尚未生成。

总结

这个项目把”大数据处理 → 统计分析 → 机器学习建模 → Web 可视化”串成一条完整链路,用 Spark 解决了千万级事故数据单机难以处理的瓶颈,是 Spark MLlib 分类建模与 Flask 数据应用结合的典型实践。从结果看,天气条件、道路设施(信号灯、人行横道)与风速对事故严重程度的贡献度最高,这类特征重要性结论对交通管理部门排查高风险点位具有直接参考价值。若继续演进,可在全量数据上重训模型、引入更细粒度的事故时间窗口或地理位置聚类特征,并将特征重要性结论沉淀为可解释的治理建议。