feat: 将数据集从国外员工缺勤数据替换为中国企业缺勤模拟数据

- 新增中国企业员工缺勤模拟数据集生成脚本(generate_dataset.py),覆盖7个行业、180家企业、2600名员工
  - 重构 config.py,更新特征字段为中文名称,调整目标列、员工ID、行业类型等配置
  - 重构 clustering.py,简化聚类逻辑,更新聚类特征和群体命名(高压通勤型、健康波动型等)
  - 重构 feature_mining.py,更新相关性分析和群体比较维度(按行业、班次、婚姻状态等)
  - 新增 model_features.py 定义模型训练特征
  - 更新 preprocessing.py 和 train_model.py 适配新数据结构
  - 更新各 API 路由默认参数(model: random_forest, dimension: industry)
  - 前端更新主题样式和各视图组件适配中文字段
  - 更新系统名称为 China Enterprise Absence Analysis System
This commit is contained in:
2026-03-11 10:46:58 +08:00
parent a39d8b2fd2
commit e63267cef6
39 changed files with 15731 additions and 5648 deletions

View File

@@ -1,426 +1,150 @@
# 数据设计文档
## 基于多维特征挖掘的员工缺勤分析与预测系统
**文档版本**V1.0
**编写日期**2026年3月
**编写人**:张硕
---
## 1. 数据集概述
### 1.1 数据来源
| 项目 | 内容 |
|------|------|
| 数据集名称 | Absenteeism at work |
| 数据来源 | UCI Machine Learning Repository |
| 原始提供方 | 巴西某快递公司 (2007-2010年) |
| 数据提供者 | Andrea Martiniano, Ricardo Pinto Ferreira, Renato Jose Sassi |
| 所属机构 | Universidade Nove de Julho, Brazil |
### 1.2 数据规模
| 项目 | 数值 |
|------|------|
| 记录总数 | 740条 |
| 特征数量 | 21个字段 |
| 员工数量 | 36人 |
| 时间跨度 | 2007年7月 - 2010年7月 |
### 1.3 数据质量
| 检查项 | 结果 | 说明 |
|--------|------|------|
| 缺失值 | 无 | 数据完整无缺失 |
| 重复记录 | 无 | 无重复数据 |
| 异常值 | 需检查 | 部分字段可能存在异常值 |
| 数据一致性 | 良好 | 字段格式一致 |
---
## 2. 字段说明
### 2.1 字段完整列表
| 序号 | 字段名 | 中文名称 | 数据类型 | 取值范围 | 说明 |
|------|--------|----------|----------|----------|------|
| 1 | ID | 员工标识 | int | 1-36 | 唯一标识员工 |
| 2 | Reason for absence | 缺勤原因 | int | 0-28 | ICD代码或非疾病原因 |
| 3 | Month of absence | 缺勤月份 | int | 1-12 | 月份 |
| 4 | Day of the week | 星期几 | int | 2-6 | 2=周一, 6=周五 |
| 5 | Seasons | 季节 | int | 1-4 | 1=夏, 4=春 |
| 6 | Transportation expense | 交通费用 | int | 118-388 | 月交通费用(雷亚尔) |
| 7 | Distance from Residence to Work | 通勤距离 | int | 5-52 | 公里数 |
| 8 | Service time | 工龄 | int | 1-29 | 年数 |
| 9 | Age | 年龄 | int | 27-58 | 周岁 |
| 10 | Work load Average/day | 日均工作负荷 | float | 205-350 | 目标达成量/天 |
| 11 | Hit target | 达标率 | int | 81-100 | 百分比 |
| 12 | Disciplinary failure | 违纪记录 | int | 0-1 | 0=否, 1=是 |
| 13 | Education | 学历 | int | 1-4 | 1=高中, 4=博士 |
| 14 | Son | 子女数量 | int | 0-4 | 子女人数 |
| 15 | Social drinker | 饮酒习惯 | int | 0-1 | 0=否, 1=是 |
| 16 | Social smoker | 吸烟习惯 | int | 0-1 | 0=否, 1=是 |
| 17 | Pet | 宠物数量 | int | 0-8 | 宠物数量 |
| 18 | Weight | 体重 | int | 56-108 | 公斤 |
| 19 | Height | 身高 | int | 163-196 | 厘米 |
| 20 | Body mass index | BMI指数 | float | 19-38 | 体重/身高² |
| 21 | Absenteeism time in hours | 缺勤时长 | int | 0-120 | 目标变量(小时) |
### 2.2 特征分类
#### 2.2.1 类别型特征
| 字段名 | 类别数 | 类别说明 |
|--------|--------|----------|
| Reason for absence | 29 | 0-28ICD疾病代码或非疾病原因 |
| Month of absence | 12 | 1-12月 |
| Day of the week | 5 | 周一至周五 |
| Seasons | 4 | 夏秋冬春 |
| Disciplinary failure | 2 | 是/否 |
| Education | 4 | 高中/本科/研究生/博士 |
| Social drinker | 2 | 是/否 |
| Social smoker | 2 | 是/否 |
#### 2.2.2 数值型特征
| 字段名 | 类型 | 范围 | 均值 | 标准差 |
|--------|------|------|------|--------|
| Transportation expense | 连续 | 118-388 | 221.3 | 69.1 |
| Distance from Residence to Work | 连续 | 5-52 | 29.6 | 14.8 |
| Service time | 连续 | 1-29 | 12.0 | 5.7 |
| Age | 连续 | 27-58 | 36.9 | 6.5 |
| Work load Average/day | 连续 | 205-350 | 270.7 | 37.1 |
| Hit target | 连续 | 81-100 | 94.6 | 4.0 |
| Son | 离散 | 0-4 | 1.0 | 1.1 |
| Pet | 离散 | 0-8 | 0.8 | 1.5 |
| Weight | 连续 | 56-108 | 79.0 | 12.4 |
| Height | 连续 | 163-196 | 172.9 | 6.0 |
| Body mass index | 连续 | 19-38 | 26.7 | 4.3 |
| Absenteeism time in hours | 连续 | 0-120 | 6.9 | 13.3 |
### 2.3 缺勤原因详细说明
#### 2.3.1 ICD疾病分类代码1-21
| 代码 | ICD分类 | 疾病类型 |
|------|---------|----------|
| 1 | I | 传染病和寄生虫病 |
| 2 | II | 肿瘤 |
| 3 | III | 血液及造血器官疾病 |
| 4 | IV | 内分泌、营养和代谢疾病 |
| 5 | V | 精神和行为障碍 |
| 6 | VI | 神经系统疾病 |
| 7 | VII | 眼及其附属器疾病 |
| 8 | VIII | 耳及乳突疾病 |
| 9 | IX | 循环系统疾病 |
| 10 | X | 呼吸系统疾病 |
| 11 | XI | 消化系统疾病 |
| 12 | XII | 皮肤和皮下组织疾病 |
| 13 | XIII | 肌肉骨骼系统和结缔组织疾病 |
| 14 | XIV | 泌尿生殖系统疾病 |
| 15 | XV | 妊娠、分娩和产褥期 |
| 16 | XVI | 围产期疾病 |
| 17 | XVII | 先天性畸形 |
| 18 | XVIII | 症状、体征异常发现 |
| 19 | XIX | 损伤、中毒 |
| 20 | XX | 外部原因导致的发病和死亡 |
| 21 | XXI | 影响健康状态的因素 |
#### 2.3.2 非疾病原因代码22-28
| 代码 | 名称 | 说明 |
|------|------|------|
| 22 | 医疗随访 | 患者定期随访复查 |
| 23 | 医疗咨询 | 门诊就医咨询 |
| 24 | 献血 | 无偿献血活动 |
| 25 | 实验室检查 | 医学检验检查 |
| 26 | 无故缺勤 | 未经批准的缺勤 |
| 27 | 理疗 | 物理治疗康复 |
| 28 | 牙科咨询 | 口腔科就诊 |
#### 2.3.3 特殊值
| 代码 | 说明 |
|------|------|
| 0 | 未知原因(数据中存在) |
### 2.4 季节编码说明
| 代码 | 季节 | 月份范围(巴西) |
|------|------|------------------|
| 1 | 夏季 | 12月-2月 |
| 2 | 秋季 | 3月-5月 |
| 3 | 冬季 | 6月-8月 |
| 4 | 春季 | 9月-11月 |
### 2.5 学历编码说明
| 代码 | 学历 | 说明 |
|------|------|------|
| 1 | 高中 | 高中及以下学历 |
| 2 | 本科 | 大学本科学历 |
| 3 | 研究生 | 硕士研究生 |
| 4 | 博士 | 博士研究生 |
---
## 3. 数据预处理
### 3.1 数据清洗
#### 3.1.1 缺失值处理
数据集本身无缺失值,但在预处理过程中需确保:
```
检查步骤:
1. 统计每个字段的缺失值数量
2. 如发现缺失值,数值型用中位数填充,类别型用众数填充
```
#### 3.1.2 异常值处理
| 字段 | 异常值判定标准 | 处理方式 |
|------|----------------|----------|
| Absenteeism time in hours | > 24小时超过一天 | 保留,但做标记 |
| Work load Average/day | < 100 或 > 500 | 检查后决定保留或剔除 |
| Age | < 18 或 > 65 | 检查数据有效性 |
#### 3.1.3 数据类型转换
| 字段 | 原始类型 | 转换后类型 | 说明 |
|------|----------|------------|------|
| ID | int | int | 保持不变 |
| Reason for absence | int | category | 转为类别型 |
| Month of absence | int | category | 转为类别型 |
| Day of the week | int | category | 转为类别型 |
| Seasons | int | category | 转为类别型 |
| Education | int | category | 转为类别型 |
| Disciplinary failure | int | category | 转为类别型 |
| Social drinker | int | category | 转为类别型 |
| Social smoker | int | category | 转为类别型 |
### 3.2 特征编码
#### 3.2.1 独热编码 (One-Hot Encoding)
对以下类别型特征进行独热编码:
| 字段 | 编码后特征数 | 说明 |
|------|--------------|------|
| Reason for absence | 29 | 每个原因一个二进制特征 |
| Month of absence | 12 | 每个月份一个二进制特征 |
| Day of the week | 5 | 每个星期一个二进制特征 |
| Seasons | 4 | 每个季节一个二进制特征 |
| Education | 4 | 每个学历一个二进制特征 |
| Disciplinary failure | 2 | 是/否两个特征 |
| Social drinker | 2 | 是/否两个特征 |
| Social smoker | 2 | 是/否两个特征 |
**编码示例**
```
原始数据Reason for absence = 23
编码后:
Reason_0: 0
Reason_1: 0
...
Reason_23: 1
...
Reason_28: 0
```
#### 3.2.2 标准化处理 (StandardScaler)
对以下数值型特征进行标准化处理均值为0标准差为1
| 字段 | 标准化公式 |
|------|------------|
| Transportation expense | (x - μ) / σ |
| Distance from Residence to Work | (x - μ) / σ |
| Service time | (x - μ) / σ |
| Age | (x - μ) / σ |
| Work load Average/day | (x - μ) / σ |
| Hit target | (x - μ) / σ |
| Son | (x - μ) / σ |
| Pet | (x - μ) / σ |
| Weight | (x - μ) / σ |
| Height | (x - μ) / σ |
| Body mass index | (x - μ) / σ |
### 3.3 特征工程
#### 3.3.1 派生特征
可考虑创建以下派生特征:
| 派生特征 | 计算方式 | 说明 |
|----------|----------|------|
| has_children | Son > 0 | 是否有子女(二分类) |
| has_pet | Pet > 0 | 是否有宠物(二分类) |
| age_group | 年龄分组 | 青年/中年/老年 |
| service_category | 工龄分组 | 新员工/老员工 |
| bmi_category | BMI分组 | 正常/超重/肥胖 |
| workload_level | 负荷等级 | 低/中/高 |
#### 3.3.2 特征选择
基于特征重要性分析,选择对预测最有价值的特征:
| 优先级 | 特征 | 选择依据 |
|--------|------|----------|
| 高 | Reason for absence | 业务含义明确,影响直接 |
| 高 | Transportation expense | 特征重要性高 |
| 高 | Distance from Residence to Work | 特征重要性高 |
| 高 | Service time | 特征重要性高 |
| 高 | Age | 特征重要性高 |
| 中 | Work load Average/day | 有一定影响 |
| 中 | Body mass index | 有一定影响 |
| 中 | Social drinker | 群体差异明显 |
| 低 | Pet | 影响较小 |
| 低 | Height | 信息可由BMI代替 |
### 3.4 数据划分
#### 3.4.1 训练集/测试集划分
| 数据集 | 比例 | 记录数 | 用途 |
|--------|------|--------|------|
| 训练集 | 80% | 592条 | 模型训练 |
| 测试集 | 20% | 148条 | 模型评估 |
#### 3.4.2 划分方式
- 使用分层抽样,确保各缺勤原因在训练集和测试集中比例一致
- 随机种子固定random_state=42保证结果可复现
---
## 4. 数据存储方案
### 4.1 目录结构
```
backend/data/
├── raw/ # 原始数据
│ └── Absenteeism_at_work.csv # UCI原始数据集
├── processed/ # 处理后数据
│ ├── clean_data.csv # 清洗后的数据
│ ├── encoded_data.csv # 编码后的数据
│ ├── train_data.csv # 训练数据
│ └── test_data.csv # 测试数据
└── analysis/ # 分析结果数据
├── statistics.json # 统计结果
├── correlation.json # 相关性矩阵
└── feature_importance.json # 特征重要性
```
### 4.2 模型存储
```
backend/models/
├── rf_model.pkl # 随机森林模型
├── xgb_model.pkl # XGBoost模型
├── kmeans_model.pkl # K-Means模型
├── scaler.pkl # StandardScaler对象
├── encoder.pkl # OneHotEncoder对象
└── model_info.json # 模型元信息
```
### 4.3 数据文件格式
#### 4.3.1 CSV文件格式
```
分隔符:分号 (;)
编码UTF-8
表头:第一行为字段名
```
#### 4.3.2 JSON文件格式
```json
{
"created_at": "2026-03-01T10:00:00",
"version": "1.0",
"data": {
// 具体数据内容
}
}
```
---
## 5. 数据字典
### 5.1 原始数据字典
| 字段名 | 数据类型 | 是否为空 | 默认值 | 说明 |
|--------|----------|----------|--------|------|
| ID | INTEGER | NOT NULL | - | 员工唯一标识 |
| Reason for absence | INTEGER | NOT NULL | - | 缺勤原因代码 |
| Month of absence | INTEGER | NOT NULL | - | 月份(1-12) |
| Day of the week | INTEGER | NOT NULL | - | 星期(2-6) |
| Seasons | INTEGER | NOT NULL | - | 季节(1-4) |
| Transportation expense | INTEGER | NOT NULL | - | 交通费用 |
| Distance from Residence to Work | INTEGER | NOT NULL | - | 通勤距离(km) |
| Service time | INTEGER | NOT NULL | - | 工龄(年) |
| Age | INTEGER | NOT NULL | - | 年龄 |
| Work load Average/day | REAL | NOT NULL | - | 日均工作负荷 |
| Hit target | INTEGER | NOT NULL | - | 达标率(%) |
| Disciplinary failure | INTEGER | NOT NULL | 0 | 违纪记录(0/1) |
| Education | INTEGER | NOT NULL | - | 学历(1-4) |
| Son | INTEGER | NOT NULL | 0 | 子女数量 |
| Social drinker | INTEGER | NOT NULL | 0 | 饮酒习惯(0/1) |
| Social smoker | INTEGER | NOT NULL | 0 | 吸烟习惯(0/1) |
| Pet | INTEGER | NOT NULL | 0 | 宠物数量 |
| Weight | INTEGER | NOT NULL | - | 体重(kg) |
| Height | INTEGER | NOT NULL | - | 身高(cm) |
| Body mass index | REAL | NOT NULL | - | BMI指数 |
| Absenteeism time in hours | INTEGER | NOT NULL | - | 缺勤时长(目标变量) |
---
## 6. 附录
### 6.1 数据统计摘要
```
数据集基本信息:
- 记录数740
- 特征数21
- 员工数36
- 缺勤总时长5028小时
- 平均缺勤时长6.9小时
缺勤原因TOP5
1. 医疗咨询(23)149次 (20.1%)
2. 牙科咨询(28)112次 (15.1%)
3. 理疗(27)94次 (12.7%)
4. 疾病咨询(22)74次 (10.0%)
5. 消化系统疾病(11)59次 (8.0%)
学历分布:
- 高中633人 (85.5%)
- 本科79人 (10.7%)
- 研究生及以上28人 (3.8%)
生活习惯:
- 饮酒者340人 (45.9%)
- 吸烟者90人 (12.2%)
```
### 6.2 文档修改历史
| 版本 | 日期 | 修改人 | 修改内容 |
|------|------|--------|----------|
| V1.0 | 2026-03 | 张硕 | 初始版本 |
---
**文档结束**
## 1. 数据集说明
本系统数据集为中国企业员工缺勤事件数据集。每条记录表示一次员工缺勤事件,预测目标为缺勤时长(小时)。
数据文件:
- `backend/data/raw/china_enterprise_absence_events.csv`
## 2. 数据粒度
- 记录粒度:单次缺勤事件
- 员工粒度:同一员工可对应多条缺勤记录
- 企业粒度:多个企业组成整体样本池
## 3. 字段分类
### 3.1 企业与组织字段
- 企业编号
- 所属行业
- 企业规模
- 所在城市等级
- 用工类型
- 部门条线
- 岗位序列
- 岗位级别
### 3.2 员工基础字段
- 员工编号
- 性别
- 年龄
- 司龄年数
- 最高学历
- 婚姻状态
- 是否本地户籍
- 子女数量
- 是否独生子女家庭负担
- 居住类型
### 3.3 工作负荷字段
- 班次类型
- 是否夜班岗位
- 月均加班时长
- 近30天出勤天数
- 近90天缺勤次数
- 近180天请假总时长
- 通勤时长分钟
- 通勤距离公里
- 是否跨城通勤
- 绩效等级
- 近12月违纪次数
- 团队人数
- 直属上级管理跨度
### 3.4 健康与生活方式字段
- BMI
- 是否慢性病史
- 年度体检异常标记
- 近30天睡眠时长均值
- 每周运动频次
- 是否吸烟
- 是否饮酒
- 心理压力等级
- 是否长期久坐岗位
### 3.5 缺勤事件字段
- 缺勤月份
- 星期几
- 是否节假日前后
- 季节
- 请假申请渠道
- 请假类型
- 请假原因大类
- 是否提供医院证明
- 是否临时请假
- 是否连续缺勤
- 前一工作日是否加班
- 缺勤时长(小时)
## 4. 目标变量设计
目标变量:
- `缺勤时长(小时)`
风险等级映射:
- 小于 4 小时:低风险
- 4 至 8 小时:中风险
- 大于 8 小时:高风险
## 5. 特征工程设计
系统在原始字段基础上构建以下衍生特征:
- 加班通勤压力指数
- 家庭负担指数
- 健康风险指数
- 岗位稳定性指数
- 节假日风险标记
- 排班压力标记
- 缺勤历史强度
- 生活规律指数
- 管理负荷指数
- 工龄分层
- 年龄分层
- 通勤分层
- 加班分层
## 6. 数据生成逻辑
### 6.1 生成原则
- 结合中国企业实际管理场景设计字段
- 保证类别分布与数值范围具有合理性
- 让关键特征和目标变量之间保持稳定、可学习关系
### 6.2 影响关系示例
- 请假类型对缺勤时长有显著影响
- 医院证明通常对应更高缺勤时长
- 夜班、长通勤和高加班会提升缺勤风险
- 慢性病史和健康异常会提升缺勤时长
- 年假和调休通常对应较短缺勤时长
## 7. 数据质量要求
- 无大量缺失值
- 类别字段取值可控
- 数值字段范围合理
- 高风险比例处于可接受范围
- 关键变量与目标方向关系合理
## 8. 当前数据集统计
- 样本量12000
- 员工覆盖数2575
- 企业覆盖数180
- 行业数7
- 字段总数52
详细统计可参考:
- [中国企业缺勤模拟数据集说明.md](D:/VScodeProject/forsetsystem/中国企业缺勤模拟数据集说明.md)