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 数据清洗与预处理

原始修复时间数据通常包含缺失值、重复记录、格式不一致等问题。标准预处理流程包含以下步骤:

  1. 缺失值处理:删除关键字段(如开始/结束时间)缺失的记录;对于非关键字段缺失,可采用中位数填充。
  2. 重复记录去重:基于工单号、设备ID和时间戳组合去重,保留最早或最完整的记录。
  3. 时间格式统一:将所有时间戳转换为统一时区(如 UTC+8)和统一格式(如 YYYY-MM-DD HH:mm:ss)。
  4. 修复时长计算:计算 修复时长 = 修复完成时间 - 修复开始时间,并过滤掉负值或零值。
  5. 上下文标记:标记是否为计划维修、故障维修、等待备件等上下文信息,便于后续分层分析。
数据清洗示例(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 建模的必要前提。