2. 历史项目数据收集:确定数据源与字段定义

成本估算参数调优的起点,是系统性地收集历史项目数据。数据的质量直接决定了后续特征工程与模型调优的上限。本节将指导你如何确定数据源、定义核心字段,并建立可复用的数据采集规范。

2.1 常见数据源对比与选型

不同团队使用的项目管理工具各异,常见的数据源包括 Jira、Redmine、Excel 以及自研系统。下表从数据完整性、可扩展性和采集成本三个维度进行对比:

数据源 数据完整性 可扩展性 采集成本 适用场景
Jira 高(字段丰富,支持自定义) 高(REST API,插件生态) 中(需 API 开发) 中大型团队,敏捷开发
Redmine 中(基础字段齐全) 中(REST API,插件有限) 低(开源,可直连数据库) 中小团队,预算有限
Excel / CSV 低(依赖人工维护) 低(手动合并,易出错) 低(无需开发) 初创团队,历史遗留数据
自研系统 高(按需设计) 高(完全可控) 高(需定制开发) 大型企业,长期积累
选型建议: 优先选择支持 API 的数据源(如 Jira),以便实现自动化采集与增量更新。对于 Excel 数据,建议在采集后立即转换为结构化存储(如 SQLite 或 CSV),避免后续版本混乱。

2.2 核心数据字段定义

为了支撑成本估算参数调优,每个历史项目记录至少需要包含以下五个核心字段。字段定义必须清晰、无歧义,并统一度量单位。

  • 项目ID:唯一标识符,用于关联不同数据源中的同一项目。建议使用字符串类型,如“PROJ-2024-001”。
  • 规模:衡量项目工作量的量化指标。常用单位包括:功能点(FP)、代码行数(LOC)、故事点(Story Points)。必须明确记录单位。
  • 复杂度:描述项目技术难度与业务逻辑的复杂程度。建议采用等级制:低(1)、中(2)、高(3)、极高(4)。
  • 工期:项目从启动到交付的实际日历天数。注意排除非工作日(如周末、法定假日),或单独记录“人天”与“日历天”两个字段。
  • 成本:项目实际总投入,通常以货币单位(如人民币元)记录。应包含人力成本、外包成本、工具与基础设施成本。
字段定义示例(JSON Schema):
{
  "project_id": "string",
  "scale": {
    "value": "number",
    "unit": "string"  // "FP" | "LOC" | "StoryPoints"
  },
  "complexity": {
    "level": "integer",  // 1-4
    "description": "string"
  },
  "duration_days": "integer",
  "cost_cny": "number"
}

2.3 数据采集流程与质量检查

确定数据源和字段定义后,需要建立标准化的采集流程。下图展示了从原始数据到可用数据集的完整链路:

历史项目数据采集与清洗流程 数据源 Jira / Redmine / Excel 字段映射 统一字段名与单位 数据清洗 去重 / 补缺 / 纠错 质量检查 完整性 / 一致性 / 异常值 可用数据集 CSV / 数据库 / Parquet ⚠ 关键检查项 缺失率 < 5% | 无重复ID

2.4 数据质量检查清单

在将数据送入特征工程管线之前,必须执行以下质量检查。建议将检查结果记录在数据字典中,作为元数据的一部分。

  1. 完整性检查:核心字段(项目ID、规模、成本)不允许为空。缺失率超过 5% 的字段需标记并评估是否可用。
  2. 一致性检查:同一项目的规模单位必须统一;复杂度等级必须在 1-4 范围内;成本不能为负数。
  3. 异常值检测:使用箱线图或 Z-score 识别极端值。例如,工期超过均值 3 个标准差的项目需人工复核。
  4. 重复记录检查:按项目ID去重。若存在重复,保留最近更新的一条记录,并记录重复次数。
常见陷阱: 不要直接使用 Excel 中的“工期”字段,它可能包含非工作日。建议在采集时同步获取项目的“开始日期”和“结束日期”,由程序计算实际日历天数,避免人工统计误差。

2.5 数据存储与版本管理

历史数据是不断增长的资产。建议采用以下存储策略:

  • 原始层(Raw):保留从数据源采集的原始数据,不做任何修改。用于追溯和重新清洗。
  • 清洗层(Cleaned):经过字段映射、去重、补缺后的标准数据集。这是特征工程的主要输入。
  • 特征层(Feature):经过特征工程处理后的数据,直接用于模型训练。

每次数据更新时,使用时间戳或版本号(如 v2024-12-01)标记数据集,确保实验可复现。