3. MTTR 计算基础:修复时间数据收集、清洗与异常值处理
MTTR(Mean Time To Repair,平均修复时间)是衡量维修性最核心的指标之一。其计算精度直接取决于底层修复时间数据的质量。本章将系统讲解从数据收集到预处理的全流程,确保后续建模的可靠性。
3.1 修复时间数据收集方法
修复时间数据通常来源于现场维修记录、维修工单系统(CMMS)或专用数据采集设备。根据数据来源和精度要求,主要收集方法如下表所示:
| 方法 | 数据粒度 | 适用场景 | 典型误差 |
|---|---|---|---|
| 维修工单时间戳 | 分钟级 | 日常计划维修、故障报修 | ±5~15 min(人为延迟) |
| 自动传感器/PLC 日志 | 秒级 | 关键设备、自动化产线 | ±1~5 s(时钟同步误差) |
| 现场秒表/视频回放 | 秒级 | 维修性验证试验、标准工时测定 | ±0.5~2 s(观测者反应) |
| 维修人员自报 | 分钟级 | 无自动记录、移动维修 | ±10~30 min(记忆偏差) |
实践建议:在维修性建模初期,优先使用自动传感器日志或工单时间戳数据。若必须使用自报数据,建议通过交叉验证(如与备件领用时间对比)进行校准。
3.2 数据清洗与预处理
原始修复时间数据通常包含缺失值、重复记录、格式不一致等问题。标准预处理流程包含以下步骤:
- 缺失值处理:删除关键字段(如开始/结束时间)缺失的记录;对于非关键字段缺失,可采用中位数填充。
- 重复记录去重:基于工单号、设备ID和时间戳组合去重,保留最早或最完整的记录。
- 时间格式统一:将所有时间戳转换为统一时区(如 UTC+8)和统一格式(如 YYYY-MM-DD HH:mm:ss)。
- 修复时长计算:计算
修复时长 = 修复完成时间 - 修复开始时间,并过滤掉负值或零值。 - 上下文标记:标记是否为计划维修、故障维修、等待备件等上下文信息,便于后续分层分析。
数据清洗示例(Python 伪代码):
import pandas as pd
df = pd.read_csv('repair_times_raw.csv')
# 1. 删除缺失关键字段
df = df.dropna(subset=['start_time', 'end_time'])
# 2. 去重
df = df.drop_duplicates(subset=['work_order_id'])
# 3. 统一时间格式
df['start_time'] = pd.to_datetime(df['start_time'], utc=True)
df['end_time'] = pd.to_datetime(df['end_time'], utc=True)
# 4. 计算修复时长(分钟)
df['repair_duration'] = (df['end_time'] - df['start_time']).dt.total_seconds() / 60
df = df[df['repair_duration'] > 0]
3.3 异常值处理原则
修复时间数据中常出现极端值(如维修耗时数天或仅几秒),这些异常值会严重扭曲 MTTR 计算结果。处理原则需结合统计方法与工程判断。
3.3.1 异常值识别方法
- 箱线图法(IQR):定义
Q1 - 1.5×IQR和Q3 + 1.5×IQR为异常值阈值,适用于偏态分布。 - Z-score 法:计算每个数据点的 Z 分数,通常以 |Z| > 3 为异常,适用于近似正态分布。
- 修正的 Z-score 法(MAD):使用中位数绝对偏差,对异常值更稳健,推荐用于维修时间数据。
- 工程阈值法:基于设备类型和维修经验设定上下限(如 5 min ~ 480 min),超出则标记为异常。
3.3.2 异常值处理策略
| 异常类型 | 可能原因 | 推荐处理方式 |
|---|---|---|
| 极小值(如 <1 min) | 误操作、传感器误触发、测试性复位 | 删除或替换为同类维修中位数 |
| 极大值(如 >24 h) | 等待备件、跨班次、复杂故障 | 保留并标记为“长尾修复”,单独建模 |
| 批量异常(同一设备) | 系统记录错误、时钟漂移 | 整批删除或重新采集 |
| 孤立异常 | 罕见故障模式、人为失误 | 保留并纳入分布拟合,评估影响 |
重要原则:不要机械地删除所有异常值。对于极大值,应首先确认是否为“真实长尾修复”(如等待备件导致的非维修时间),若是,则应在 MTTR 计算中单独处理或使用截尾均值。
3.4 修复时间数据清洗与异常值处理流程
下图总结了从原始数据到可用修复时间数据集的完整处理流程:
3.5 数据清洗前后对比案例
以下是一个实际案例,展示某工厂离心泵修复时间数据在清洗前后的变化:
| 指标 | 清洗前 | 清洗后 | 变化说明 |
|---|---|---|---|
| 样本量 | 120 条 | 108 条 | 删除 12 条缺失/重复记录 |
| 均值(min) | 87.3 | 64.2 | 受 3 条极大值(>300 min)影响 |
| 中位数(min) | 52.0 | 50.5 | 变化较小,中位数更稳健 |
| 标准差(min) | 78.1 | 32.4 | 异常值导致方差膨胀 |
| MTTR(min) | 87.3 | 64.2 | 清洗后 MTTR 下降 26.4% |
关键结论:未经清洗的原始数据可能导致 MTTR 被高估 20%~30%。数据清洗不是可选项,而是 MTTR 建模的必要前提。