高校自主招生数据分析项目
本项目针对高校自主招生过程中的报名、考试和录取三个阶段进行数据分析,通过数据挖掘和机器学习方法探索招生过程中的关键因素和规律,为招生决策提供数据支持。
项目概述
项目分为四个主要阶段:
- 数据收集与预处理:生成合成数据并进行清洗、转换和规范化
- 数据分析与可视化:进行描述性统计分析并创建可视化图表
- 模型构建与优化:使用机器学习方法构建预测模型
- 结果展示与报告撰写:生成分析报告和交互式仪表盘
目录结构
高校招生数据分析/
├── data/ # 数据目录
│ ├── raw/ # 原始数据
│ └── processed/ # 处理后的数据
│ ├── analysis_results/ # 分析结果
│ ├── models/ # 模型文件
│ └── visualizations/ # 可视化图表
├── notebooks/ # Jupyter笔记本(可选)
├── reports/ # 生成的报告
├── src/ # 源代码
│ ├── data_collection/ # 数据收集脚本
│ ├── preprocessing/ # 数据预处理脚本
│ ├── analysis/ # 数据分析脚本
│ ├── visualization/ # 数据可视化脚本
│ ├── models/ # 模型训练脚本
│ ├── reports/ # 报告生成脚本
│ └── main.py # 主程序
└── README.md # 项目说明
核心功能
- 数据生成:创建包含学生信息、报名信息、考试成绩和录取结果的合成数据
- 数据预处理:处理缺失值、异常值检测和数据清洗
- 数据分析:描述性统计分析,包括录取率、成绩分布、专业偏好等分析
- 统计分析:相关性分析、假设检验(t检验、卡方检验、方差分析)和生存分析
- 数据可视化:使用Matplotlib、Seaborn和Plotly生成静态和交互式图表
- 模型训练:实现逻辑回归、决策树和随机森林模型,进行模型评估和超参数优化
- 报告生成:自动生成分析报告
- 交互式仪表盘:使用Dash和Plotly创建交互式数据可视化仪表盘
技术栈
- 编程语言:Python 3.8+
- 数据处理:Pandas, NumPy
- 数据库:SQLite
- 数据可视化:Matplotlib, Seaborn, Plotly
- 统计分析:SciPy, StatsModels, Lifelines
- 机器学习:Scikit-learn
- Web应用:Dash
使用说明
环境设置
- 克隆项目
- 安装依赖包
pip install -r requirements.txt
运行项目
运行主程序以执行整个工作流程:
python src/main.py
或者单独运行各个模块:
# 生成合成数据
python src/data_collection/generate_synthetic_data.py
# 数据预处理
python src/preprocessing/data_preprocessing.py
# 数据分析
python src/analysis/data_analysis.py
# 统计分析
python src/analysis/statistical_analysis.py
# 数据可视化
python src/visualization/data_visualization.py
# 模型训练
python src/models/model_training.py
# 生成报告
python src/reports/report_generator.py
启动交互式仪表盘
python src/visualization/dashboard.py
启动后,在浏览器中访问 http://127.0.0.1:8050/ 查看仪表盘。
分析结果
分析结果包括:
- 招生概况:申请人数、录取人数、整体录取率等基本统计信息
- 人口统计分析:按性别、省份、学校类型等维度的分布和录取率分析
- 学术表现分析:各科目成绩分布、成绩与录取结果的关系
- 专业偏好分析:热门专业排名、各专业录取率
- 录取因素分析:影响录取结果的关键因素及其重要性
- 统计分析结果:
- 相关性分析:确定影响录取结果的关键特征
- 假设检验:验证不同群体在成绩和录取率方面的显著性差异
- 生存分析:分析从申请到录取过程中的时间因素影响
- 预测模型:基于历史数据构建的录取结果预测模型及其性能评估
仪表盘功能
交互式仪表盘包含两个主要选项卡:
- 总体概览:显示招生总体数据、录取率分析、成绩分布、录取因素和专业偏好
- 统计分析:提供相关性矩阵、关键特征与录取结果的相关性、假设检验结果和生存分析
依赖包
项目依赖以下Python包:
pandas>=1.3.0
numpy>=1.20.0
matplotlib>=3.4.0
seaborn>=0.11.0
plotly>=5.0.0
scikit-learn>=1.0.0
dash>=2.0.0
dash-bootstrap-components>=1.0.0
tabulate>=0.8.0
markdown>=3.3.0
joblib>=1.0.0
scipy>=1.7.0
ipykernel>=6.0.0
jupyter>=1.0.0
statsmodels>=0.13.0
lifelines>=0.27.0
更新日志
2025-05-7
- 完成项目基础框架
- 实现数据生成、预处理、分析和可视化
- 开发模型训练和报告生成功能
- 创建交互式仪表盘
2025-05-7
- 添加统计分析模块,实现相关性分析、假设检验和生存分析
- 扩展交互式仪表盘,增加统计分析选项卡
- 改进报告生成器,集成统计分析结果
- 更新主程序工作流,集成新模块
2025-05-7
- 修复统计分析模块中的路径问题,将相对路径"…/…/data/“修改为项目内的正确相对路径"data/”
- 修复报告生成器中的图像路径问题,将"images/images/“修改为正确的"images/”
- 更新仪表盘启动命令,从app.run_server(debug=True)修改为app.run(debug=True)
- 添加缺失的lifelines库到项目依赖
- 优化文件保存方式,使用os.path.join替代字符串拼接,提高跨平台兼容性
2025-05-7:修正高考分数设置
会话主要目的
修正高校自主招生数据分析项目中的高考分数设置,使其符合实际高考情况。
完成的主要任务
- 修正高考总分:将原来的三科总分450分(语数外各150分)修改为更符合实际的高考总分750分(语数外各150分,加选考科目总分300分)。
- 增加选考科目:添加了物理、化学、生物、历史、地理、政治等选考科目,每科满分100分。
- 添加文理分科:根据实际高考情况,添加了文理分科设置,约55%的学生选择理科,45%的学生选择文科。
- 更新相关评分机制:调整了录取算法中的分数权重和评分标准,使其适应新的分数设置。
- 更新数据验证工具:修改数据验证逻辑,增加了对新增选考科目和文理分科的验证。
关键决策和解决方案
- 模拟文理分科:虽然部分省份已经实行新高考改革,但为了系统性,仍保留了传统的文理分科模式。
- 性别特征与学科表现:根据实际情况,在不同学科中设置了性别偏好系数,如男生在数学和物理上略有优势,女生在语文、英语和文科科目上略有优势。
- 使用实际分值区间:选考科目设置为满分100分,主科保持150分,使总分符合750分的实际情况。
- 保持数据一致性:确保所有依赖分数的计算逻辑(如录取概率、专业志愿录取等)都使用新的分数体系。
使用的技术栈
- Python
- Pandas
- NumPy
- Matplotlib
- Seaborn
- SQLite
- SciPy(概率分布)
修改的文件
- 修改
src/data_collection/improved_synthetic_data.py
- 更新高考分数生成逻辑 - 修改
src/data_collection/data_validator.py
- 更新数据验证逻辑 - 运行更新
data/raw/
和data/processed/
目录下的数据文件 - 更新
README.md
- 添加本次会话总结
验证结果
- 高考总分平均分从290分左右提高到488分左右,符合实际高考750分满分的平均水平
- 文理科分布比例为57.7%理科、42.3%文科,符合预期设置
- 各科目分数分布呈正态分布,符合实际高考成绩分布特征
- 总体录取率为47.7%,与预期相符
- 不同特征与录取结果的相关性更加符合直觉,总分、政治成绩和竞赛获奖成为最相关的三个因素
项目会话总结
2025-05-7:改进数据生成模块
会话主要目的
改进高校自主招生数据分析项目的数据生成模块,使生成的合成数据更符合实际情况。
完成的主要任务
- 创建改进版数据生成模块:开发了更真实的数据生成脚本,考虑了多种现实因素,如省份人口分布、专业热度、性别偏好等。
- 开发数据验证工具:创建了专门的数据验证脚本,用于评估生成数据的真实性和合理性。
- 数据特征修正:调整了省份录取偏好、专业难度系数、学校类型影响等参数,使数据更符合现实。
- 数据分布优化:添加了更真实的分布模式,如使用Beta分布模拟报名时间集中在开始和截止日期前。
- 全流程验证:生成数据后,依次运行了预处理、分析、统计分析、模型训练和报告生成等模块进行全流程验证。
关键决策和解决方案
- 省份分布优化:根据实际人口比例和高考生源分布设置各省份权重。
- 专业选择性别偏好:为不同专业设置男女生偏好系数,使专业选择更符合现实。
- 录取算法改进:综合考虑总分(55%)、GPA(15%)、竞赛获奖(10%)、社会实践(5%)等因素,以及省份和专业难度系数。
- 异常值合理控制:在生成数据时设置合理的上下限,避免极端异常值。
- 真实性验证:开发专门验证工具,通过多维度分析评估数据真实性。
使用的技术栈
- Python
- Pandas
- NumPy
- Matplotlib
- Seaborn
- SQLite
- SciPy (概率分布)
- Scikit-learn (模型训练)
- Lifelines (生存分析)
- Dash (交互式仪表盘)
修改的文件
- 新增
src/data_collection/improved_synthetic_data.py
- 改进的数据生成脚本 - 新增
src/data_collection/data_validator.py
- 数据验证工具 - 运行更新
data/raw/
和data/processed/
目录下的所有数据文件 - 更新
README.md
- 添加项目会话总结
2025-05-7:优化高考分数与专业选择关系
会话主要目的
优化高校自主招生数据分析项目中高考分数与专业选择之间的关系,提高数据真实性和合理性。
完成的主要任务
- 完善文理分科与性别关联:添加了性别与文理分科的关联性,使得男生理科比例更高(65%),女生文科比例更高(55%)。
- 建立专业分类体系:将专业分为理工类、文商类和医学类,用于分析文理分科对专业选择的影响。
- 增加学科专业匹配度:在录取算法中引入学科专业匹配度因子,使文理分科与专业选择之间建立合理联系。
- 差异化录取概率:根据学生文理分科背景和所选专业类型,设置差异化的录取概率调整因子。
- 全流程验证:重新生成数据并运行完整的分析流程,验证修改的合理性。
关键决策和解决方案
- 学科专业匹配系数:理科学生选择理工类专业时录取概率增加8-10%,文科学生选择文商类专业录取概率增加6-10%。
- 跨学科报考惩罚:文科学生选择理工类专业录取概率降低8-10%,理科学生选择文商类专业录取概率降低5%。
- 医学专业特殊处理:对于医学类专业,理科学生有5-8%的优势,反映医学对理科背景的偏好。
- 建立专业分类:创建全局专业分类变量(TECH_MAJORS, ARTS_MAJORS, MEDICAL_MAJORS),便于代码维护和逻辑一致性。
- 保持数据一致性:确保录取逻辑中考虑学科专业匹配度的地方都使用相同的匹配系数。
使用的技术栈
- Python
- Pandas
- NumPy
- Matplotlib
- Seaborn
- SQLite
- Scikit-learn (模型训练)
- Dash (交互式仪表盘)
修改的文件
- 修改
src/data_collection/improved_synthetic_data.py
- 添加文理分科与专业选择的关联 - 运行更新
data/raw/
和data/processed/
目录下的数据文件 - 运行预处理、分析、统计分析、模型训练和报告生成等模块进行全流程验证
- 更新
README.md
- 添加本次会话总结
验证结果
- 文理分科分布更合理:文理分科比例从之前的约58%:42%变为56%:44%,更符合实际
- 专业选择模式更贴近现实:理科学生更倾向于选择理工类专业,文科学生更倾向于选择文商类专业
- 模型预测性能提升:优化后的随机森林模型准确率达到57%,高于之前的结果
- 统计分析结果更显著:学校类型与录取结果的关联性从"不显著"变为"显著"(p = 0.0426)
- 竞赛获奖影响增强:竞赛获奖成为与录取结果相关性第二高的特征(0.1473),仅次于录取概率本身