步骤二:计算偏差率与偏差分布
本章进入偏差率计算、分布检验与异常值剔除的核心流程,从统计层面确认 Effort 偏差是否符合正态假设,并清理干扰数据。
适用场景
- 已完成步骤一的数据采集,获得了 Effort 计划值与实绩值对应记录。
- 数据量 ≥ 15 条(小样本建议使用 Shapiro-Wilk 检验,大样本可用 K-S 检验)。
- 偏差率中可能混入因任务中断、范围变更或记录错误导致的极端值。
前置条件
- 原始数据表已清理:无空行、重复记录、非数字字段。
- 已确认每一条记录均有
planned_hours且actual_hours > 0。 - 团队规模(人数)作为分类标签已写入数据集(用于后续章节分组分析)。
操作步骤
- 计算偏差率 — 对每条记录执行:
deviation_rate = (actual_hours - planned_hours) / planned_hours * 100% - 绘制偏差率直方图与 Q-Q 图 — 目视检查分布形态。若直方图明显偏态或 Q-Q 点严重偏离对角线,提示非正态。
- 执行正态性检验 — 推荐 Shapiro-Wilk(样本量 < 5000)或 Anderson-Darling。原假设 H₀ 为数据服从正态分布。
# Python 示例(scipy) from scipy import stats stat, p = stats.shapiro(deviation_rate_array) print(f"W={stat:.4f}, p-value={p:.4f}") if p > 0.05: print("不能拒绝正态性假设") else: print("数据不服从正态分布") - 标记异常值 — 若正态假设成立,使用 Z-score 法(|Z| > 3 视为异常);若非正态,使用 IQR 法(超出 Q1 - 1.5·IQR 或 Q3 + 1.5·IQR 视为异常)。
- 剔除异常值并记录 — 将标记的记录从主数据集中移除,移入《异常值记录表》。剔除后重新检验一次,确保剔除后分布趋于正态或稳定。
- 输出偏差率分布摘要 — 包括样本量、均值、标准差、偏度、峰度、Q1/Q3 及异常值数量。
输入 / 输出物
| 类别 | 名称 | 格式 / 示例 |
|---|---|---|
| 输入 | Effort 原始数据集(清洗后) | CSV: task_id, team_size, planned_hours, actual_hours |
| 输出 | 偏差率列(新增字段) | deviation_rate 浮点数,单位 % |
| 输出 | 正态性检验结果 | JSON: {"test":"Shapiro","statistic":0.987,"p_value":0.34,"conclusion":"normal"} |
| 输出 | 异常值剔除后数据集 | CSV: 同输入结构,仅保留有效记录 |
| 输出 | 异常值记录表 | CSV: 含原始索引、偏差率、异常原因 |
责任边界
- 数据工程师:实现步骤中的计算与检验脚本,确保可复现;生成输出文件。
- 项目经理 / 分析员:确认剔除规则是否合理(如团队规模较小时是否放宽 Z-score 阈值);复核异常值记录表。
- 质量保证:检查正态性检验的 P 值计算是否正确,验证 IQR 区间无编码错误。
记录材料
- 正态性检验报告:包含检验方法、W 统计量、P 值、结论。
- 异常值剔除日志:记录剔除的记录数、剔除前后的样本量及关键统计量变化。
- 偏差率分布图表:直方图 + 正态拟合曲线、Q-Q 图(存档为 PNG/SVG)。
异常处理
常见异常及应对:
- 全部偏差率均为 0: 检查数据是否误采集合约值,需返回步骤一重新确认记录粒度。
- Shapiro-Wilk 报错(样本量过大): 自动切换为 Anderson-Darling 检验。
- 剔除异常值后数据量 < 10: 停止本次分析,标记为“数据不足”,返回数据采集阶段补充样本。
- 检验结果前后矛盾(剔除后仍非正态): 采用非参数方法(如 Median Absolute Deviation)替代,并在报告中注明。
验收标准
- 偏差率列计算正确,无缺失值,无除零错误(
planned_hours为 0 的记录应预先剔除)。 - 正态性检验输出可通过单元测试用例验证(如输入标准正态随机数应返回 P > 0.05)。
- 异常值剔除后数据集与异常记录表均以标准 CSV 格式输出,字段完整。
- 所有剔除过程记录可追溯,剔除原因清晰(Z-score 超限 / IQR 超限)。
- 偏差率分布摘要数据与原始数据一一对应,无人工篡改痕迹。