feat: 初始化员工缺勤分析系统项目

搭建完整的前后端分离架构,实现数据概览、预测分析、聚类分析等核心功能模块

  详细版:
  feat: 初始化员工缺勤分析系统项目

  - 后端:基于 Flask 搭建 RESTful API,包含数据概览、特征分析、预测模型、聚类分析四大模块
  - 前端:基于 Vue.js 构建单页应用,实现 Dashboard、预测、聚类、因子分析等页面
  - 模型:集成随机森林、XGBoost、LightGBM、Stacking 等多种机器学习模型
  - 文档:完成需求规格说明、系统架构设计、接口设计、数据设计、UI原型设计等文档
This commit is contained in:
2026-03-08 14:48:26 +08:00
commit a39d8b2fd2
48 changed files with 9546 additions and 0 deletions

View File

@@ -0,0 +1,613 @@
# 系统架构设计文档
## 基于多维特征挖掘的员工缺勤分析与预测系统
**文档版本**V1.0
**编写日期**2026年3月
**编写人**:张硕
---
## 1. 概述
### 1.1 设计目标
本系统架构设计旨在实现以下目标:
1. **高可用性**:系统稳定可靠,能够持续提供服务
2. **可扩展性**:便于后续功能扩展和算法升级
3. **可维护性**:代码结构清晰,便于理解和维护
4. **高性能**:快速响应前端请求,提供流畅的用户体验
### 1.2 设计原则
| 原则 | 说明 |
|------|------|
| 分层设计 | 前后端分离,后端采用三层架构 |
| 模块化 | 功能模块独立,高内聚低耦合 |
| 单一职责 | 每个模块只负责一个特定功能 |
| 开闭原则 | 对扩展开放,对修改关闭 |
| 接口隔离 | 接口设计精简,避免冗余 |
---
## 2. 系统架构
### 2.1 整体架构图
```
┌─────────────────────────────────────────────────────────────────────┐
│ 用户层 (User Layer) │
│ 浏览器 (Chrome/Firefox/Edge) │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 前端层 (Frontend Layer) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Dashboard │ │ FactorAnalysis│ │ Prediction │ │ Clustering │ │
│ │ 数据概览 │ │ 影响因素 │ │ 缺勤预测 │ │ 员工画像 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 公共组件 (ChartComponent, ResultCard) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Vue 3 + Element Plus + ECharts + Axios + Vue Router │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│ HTTP/REST API
┌─────────────────────────────────────────────────────────────────────┐
│ 后端层 (Backend Layer) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ API Layer (api/) │ │
│ │ overview_routes │ analysis_routes │ predict_routes │ │
│ │ cluster_routes │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Service Layer (services/) │ │
│ │ data_service │ analysis_service │ predict_service │ │
│ │ cluster_service │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Core Layer (core/) │ │
│ │ preprocessing │ feature_mining │ train_model │ │
│ │ clustering │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Flask + scikit-learn + XGBoost + pandas │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 数据层 (Data Layer) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ data/raw/ │ │ data/processed/ │ │ models/ │ │
│ │ 原始CSV数据 │ │ 处理后数据 │ │ 模型文件.pkl │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
```
### 2.2 技术架构
```
┌────────────────────────────────────────────────────────────────┐
│ 技术栈总览 │
├────────────────────────────────────────────────────────────────┤
│ │
│ 前端技术栈 后端技术栈 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Vue 3 │ │ Python 3.8+ │ │
│ │ Element Plus │ │ Flask │ │
│ │ ECharts 5 │ ◄─────► │ scikit-learn │ │
│ │ Axios │ HTTP │ XGBoost │ │
│ │ Vue Router │ REST │ pandas │ │
│ │ Vite │ │ numpy │ │
│ └──────────────────┘ │ joblib │ │
│ └──────────────────┘ │
│ │
│ 算法技术 数据存储 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 随机森林 (RF) │ │ CSV文件 │ │
│ │ XGBoost │ │ PKL模型文件 │ │
│ │ K-Means │ │ JSON响应 │ │
│ │ StandardScaler │ │ │ │
│ │ OneHotEncoder │ │ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
```
### 2.3 部署架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 单机部署架构 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 服务器 │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ Flask Server │ │ Vite Dev │ │ │
│ │ │ Port: 5000 │ │ Port: 5173 │ │ │
│ │ │ │ │ │ │ │
│ │ │ - REST API │ │ - Vue App │ │ │
│ │ │ - ML Models │ │ - Static │ │ │
│ │ │ - Data Files │ │ │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ 文件系统 │ │ │
│ │ │ /backend/data/ - 数据文件 │ │ │
│ │ │ /backend/models/ - 模型文件 │ │ │
│ │ │ /frontend/dist/ - 前端构建产物 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 3. 后端架构设计
### 3.1 分层设计
后端采用经典的三层架构,各层职责明确:
| 层级 | 目录 | 职责 | 依赖关系 |
|------|------|------|----------|
| API层 | api/ | 接收HTTP请求参数校验调用服务层返回响应 | 依赖Service层 |
| Service层 | services/ | 业务逻辑处理协调Core层和Data层 | 依赖Core层 |
| Core层 | core/ | 核心算法实现,数据处理,模型训练 | 无依赖 |
### 3.2 模块划分
```
backend/
├── app.py # 应用入口Flask实例配置
├── config.py # 配置文件(路径、参数等)
├── requirements.txt # Python依赖清单
├── api/ # API接口层
│ ├── __init__.py
│ ├── overview_routes.py # 数据概览接口
│ ├── analysis_routes.py # 影响因素分析接口
│ ├── predict_routes.py # 预测接口
│ └── cluster_routes.py # 聚类接口
├── services/ # 业务逻辑层
│ ├── __init__.py
│ ├── data_service.py # 数据服务
│ ├── analysis_service.py # 分析服务
│ ├── predict_service.py # 预测服务
│ └── cluster_service.py # 聚类服务
├── core/ # 核心算法层
│ ├── __init__.py
│ ├── preprocessing.py # 数据预处理
│ ├── feature_mining.py # 特征挖掘
│ ├── train_model.py # 模型训练
│ └── clustering.py # 聚类分析
├── data/ # 数据存储
│ ├── raw/ # 原始数据
│ │ └── Absenteeism_at_work.csv
│ └── processed/ # 处理后数据
│ └── clean_data.csv
├── models/ # 模型存储
│ ├── rf_model.pkl # 随机森林模型
│ ├── xgb_model.pkl # XGBoost模型
│ ├── kmeans_model.pkl # K-Means模型
│ ├── scaler.pkl # 标准化器
│ └── encoder.pkl # 编码器
└── utils/ # 工具函数
├── __init__.py
└── common.py # 通用工具函数
```
### 3.3 各模块职责详解
#### 3.3.1 API层 (api/)
| 文件 | 职责 | 主要接口 |
|------|------|----------|
| overview_routes.py | 数据概览相关接口 | /api/overview/stats, /api/overview/trend |
| analysis_routes.py | 影响因素分析接口 | /api/analysis/importance, /api/analysis/correlation |
| predict_routes.py | 缺勤预测接口 | /api/predict/single, /api/predict/model-info |
| cluster_routes.py | 聚类分析接口 | /api/cluster/result, /api/cluster/profile |
#### 3.3.2 Service层 (services/)
| 文件 | 职责 | 核心方法 |
|------|------|----------|
| data_service.py | 数据读取与基础统计 | get_raw_data(), get_statistics() |
| analysis_service.py | 特征分析业务逻辑 | get_importance(), get_correlation() |
| predict_service.py | 预测业务逻辑 | predict_single(), load_model() |
| cluster_service.py | 聚类业务逻辑 | get_clusters(), get_profile() |
#### 3.3.3 Core层 (core/)
| 文件 | 职责 | 核心类/方法 |
|------|------|-------------|
| preprocessing.py | 数据预处理 | DataPreprocessor类 |
| feature_mining.py | 特征挖掘 | calculate_importance(), calculate_correlation() |
| train_model.py | 模型训练 | train_rf(), train_xgboost() |
| clustering.py | 聚类分析 | KMeansAnalyzer类 |
---
## 4. 前端架构设计
### 4.1 组件化设计
```
frontend/src/
├── components/ # 公共组件
│ ├── ChartComponent.vue # ECharts图表封装组件
│ ├── ResultCard.vue # 预测结果展示卡片
│ ├── KPICard.vue # KPI指标卡片
│ └── LoadingSpinner.vue # 加载动画组件
├── views/ # 页面组件
│ ├── Dashboard.vue # 数据概览页
│ ├── FactorAnalysis.vue # 影响因素分析页
│ ├── Prediction.vue # 缺勤预测页
│ └── Clustering.vue # 员工画像页
├── api/ # API调用
│ ├── request.js # Axios封装
│ ├── overview.js # 概览API
│ ├── analysis.js # 分析API
│ ├── predict.js # 预测API
│ └── cluster.js # 聚类API
├── router/ # 路由配置
│ └── index.js
├── assets/ # 静态资源
│ └── styles/
│ └── main.css
├── App.vue # 根组件
└── main.js # 入口文件
```
### 4.2 状态管理
由于本项目状态较为简单不引入Vuex/Pinia使用以下方式管理状态
- **组件内部状态**使用Vue 3的ref/reactive
- **跨组件通信**使用props和emit
- **API状态**在API层统一管理
### 4.3 路由设计
```javascript
const routes = [
{
path: '/',
redirect: '/dashboard'
},
{
path: '/dashboard',
name: 'Dashboard',
component: () => import('@/views/Dashboard.vue'),
meta: { title: '数据概览' }
},
{
path: '/analysis',
name: 'FactorAnalysis',
component: () => import('@/views/FactorAnalysis.vue'),
meta: { title: '影响因素分析' }
},
{
path: '/prediction',
name: 'Prediction',
component: () => import('@/views/Prediction.vue'),
meta: { title: '缺勤预测' }
},
{
path: '/clustering',
name: 'Clustering',
component: () => import('@/views/Clustering.vue'),
meta: { title: '员工画像' }
}
]
```
---
## 5. 算法架构设计
### 5.1 数据预处理流程
```
┌─────────────────────────────────────────────────────────────────┐
│ 数据预处理流程 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 原始CSV数据 │───►│ 数据清洗 │───►│ 特征分离 │ │
│ │ │ │ (缺失值处理) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 处理后数据 │◄───│ 特征合并 │◄───│ 特征编码 │ │
│ │ clean_data │ │ │ │ + 标准化 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ 特征处理方式: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 类别型特征 → OneHotEncoder │ │
│ │ - Reason for absence │ │
│ │ - Month, Day, Seasons │ │
│ │ - Education, Disciplinary failure │ │
│ │ - Social drinker, Social smoker │ │
│ ├────────────────────────────────────────────────────────┤ │
│ │ 数值型特征 → StandardScaler │ │
│ │ - Transportation expense │ │
│ │ - Distance, Service time, Age │ │
│ │ - Work load, Hit target │ │
│ │ - Son, Pet, BMI │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 5.2 特征挖掘流程
```
┌─────────────────────────────────────────────────────────────────┐
│ 特征挖掘流程 │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 特征重要性计算 │ │
│ │ │ │
│ │ 训练数据 ──► 随机森林模型 ──► feature_importances_ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 特征重要性排序结果 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 相关性分析 │ │
│ │ │ │
│ │ 数据矩阵 ──► pandas.DataFrame.corr() ──► 相关系数矩阵 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 热力图数据 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 5.3 预测模型流程
```
┌─────────────────────────────────────────────────────────────────┐
│ 预测模型流程 │
│ │
│ 训练阶段: │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 处理后数据 │───►│ 划分数据集 │───►│ 模型训练 │ │
│ │ │ │ Train/Test │ │ RF + XGBoost │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 模型评估 │ │
│ │ - R² (决定系数) │ │
│ │ - MSE (均方误差) │ │
│ │ - RMSE (均方根误差) │ │
│ └──────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 保存模型 (.pkl文件) │ │
│ └──────────────────────────────────┘ │
│ │
│ 预测阶段: │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 用户输入 │───►│ 特征预处理 │───►│ 加载模型 │ │
│ │ (表单数据) │ │ (编码+标准化)│ │ 预测推理 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 返回预测结果 │ │
│ │ - 预测时长 │ │
│ │ - 风险等级 │ │
│ │ - 置信度 │ │
│ └──────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 5.4 聚类分析流程
```
┌─────────────────────────────────────────────────────────────────┐
│ 聚类分析流程 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 处理后数据 │───►│ 特征选择 │───►│ K-Means │ │
│ │ │ │ (关键维度) │ │ 聚类 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 聚类结果 │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ 聚类标签 │ │ 聚类中心 │ │ │
│ │ │ (每条记录所属簇) │ │ (每个簇的中心点) │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 可视化输出 │ │
│ │ │ │
│ │ - 雷达图:展示各聚类群体的特征分布 │ │
│ │ - 散点图:展示员工在聚类空间的分布 │ │
│ │ - 统计表:各聚类的成员数量、特征均值 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 6. 技术选型
### 6.1 后端技术栈
| 技术 | 版本 | 用途 | 选择理由 |
|------|------|------|----------|
| Python | 3.8+ | 开发语言 | 丰富的数据科学和机器学习库 |
| Flask | 2.x | Web框架 | 轻量级,易于上手,适合中小项目 |
| scikit-learn | 1.x | 机器学习 | 提供完整的机器学习工具链 |
| XGBoost | 1.x | 梯度提升 | 高性能,适合结构化数据预测 |
| pandas | 1.x | 数据处理 | 强大的数据分析和处理能力 |
| numpy | 1.x | 数值计算 | 高效的数组操作 |
| joblib | 1.x | 模型持久化 | 高效的模型序列化 |
### 6.2 前端技术栈
| 技术 | 版本 | 用途 | 选择理由 |
|------|------|------|----------|
| Vue | 3.x | 前端框架 | 组合式API性能优秀生态完善 |
| Element Plus | 2.x | UI组件库 | 组件丰富,文档完善,适合管理后台 |
| ECharts | 5.x | 图表库 | 功能强大,图表类型丰富,国内主流 |
| Axios | 1.x | HTTP客户端 | Promise支持拦截器功能完善 |
| Vue Router | 4.x | 路由管理 | Vue官方路由解决方案 |
| Vite | 4.x | 构建工具 | 开发体验好,构建速度快 |
### 6.3 算法选型
| 算法 | 用途 | 选择理由 |
|------|------|----------|
| 随机森林 | 特征重要性计算、预测 | 可解释性强,能输出特征重要性 |
| XGBoost | 预测模型 | 性能优异,适合回归任务 |
| K-Means | 员工聚类 | 简单高效,适合无监督聚类 |
| StandardScaler | 数值标准化 | 消除量纲影响,提高模型效果 |
| OneHotEncoder | 类别编码 | 处理类别型特征的标准方法 |
---
## 7. 附录
### 7.1 目录结构完整版
```
Absenteeism_Analysis_System/
├── backend/ # 后端项目
│ ├── app.py # 应用入口
│ ├── config.py # 配置文件
│ ├── requirements.txt # 依赖清单
│ │
│ ├── api/ # API接口层
│ │ ├── __init__.py
│ │ ├── overview_routes.py
│ │ ├── analysis_routes.py
│ │ ├── predict_routes.py
│ │ └── cluster_routes.py
│ │
│ ├── services/ # 业务逻辑层
│ │ ├── __init__.py
│ │ ├── data_service.py
│ │ ├── analysis_service.py
│ │ ├── predict_service.py
│ │ └── cluster_service.py
│ │
│ ├── core/ # 核心算法层
│ │ ├── __init__.py
│ │ ├── preprocessing.py
│ │ ├── feature_mining.py
│ │ ├── train_model.py
│ │ └── clustering.py
│ │
│ ├── data/ # 数据目录
│ │ ├── raw/
│ │ │ └── Absenteeism_at_work.csv
│ │ └── processed/
│ │ └── clean_data.csv
│ │
│ ├── models/ # 模型目录
│ │ ├── rf_model.pkl
│ │ ├── xgb_model.pkl
│ │ ├── kmeans_model.pkl
│ │ ├── scaler.pkl
│ │ └── encoder.pkl
│ │
│ └── utils/ # 工具函数
│ ├── __init__.py
│ └── common.py
├── frontend/ # 前端项目
│ ├── public/
│ ├── src/
│ │ ├── api/
│ │ │ ├── request.js
│ │ │ ├── overview.js
│ │ │ ├── analysis.js
│ │ │ ├── predict.js
│ │ │ └── cluster.js
│ │ ├── assets/
│ │ │ └── styles/
│ │ │ └── main.css
│ │ ├── components/
│ │ │ ├── ChartComponent.vue
│ │ │ ├── ResultCard.vue
│ │ │ ├── KPICard.vue
│ │ │ └── LoadingSpinner.vue
│ │ ├── router/
│ │ │ └── index.js
│ │ ├── views/
│ │ │ ├── Dashboard.vue
│ │ │ ├── FactorAnalysis.vue
│ │ │ ├── Prediction.vue
│ │ │ └── Clustering.vue
│ │ ├── App.vue
│ │ └── main.js
│ ├── index.html
│ ├── package.json
│ ├── pnpm-lock.yaml
│ └── vite.config.js
├── docs/ # 文档目录
│ ├── 00_需求规格说明书.md
│ ├── 01_系统架构设计.md
│ ├── 02_接口设计文档.md
│ ├── 03_数据设计文档.md
│ ├── 04_UI原型设计.md
│ └── ...
├── data/ # 原始数据(项目根目录)
│ └── Absenteeism_at_work.csv
└── README.md # 项目说明
```
### 7.2 文档修改历史
| 版本 | 日期 | 修改人 | 修改内容 |
|------|------|--------|----------|
| V1.0 | 2026-03 | 张硕 | 初始版本 |
---
**文档结束**