第4章 数据清洗与预处理:异常值、缺失值、时间对齐

测量阶段耗时原始数据通常包含错误、空值和时间戳偏差。数据清洗与预处理的目标是生成高质量、可对比的“干净数据集”,为后续耗时分析看板提供可靠输入。本章围绕以下三个核心任务展开:异常值检测与处理、缺失值填充、时间对齐,并定义对应的清洗指标、业务动作与复盘方法。

4.1 指标定义与数据口径

指标名称 定义 数据口径
异常值比例 超出理论区间 [Q1‑1.5IQR, Q3+1.5IQR] 或工艺阈值的记录占比 以单次测量记录为粒度,按设备/工序维度汇总
缺失率 关键字段(耗时值、时间戳、设备ID)为空的记录数 ÷ 总记录数 分字段统计,允许字段级缺失处理
时间戳对齐偏差 同一批次内,首条与末条记录的时间戳差值与理论测量间隔之差 按批次号分组,偏差允许范围 ±500ms(可配置)
清洗通过率 最终保留的有效记录数 ÷ 原始采集记录数 全量统计,用于看板顶部的总览卡片
💡 工程建议: 将异常值处理与缺失值填充的阈值参数(如 IQR 倍数、窗口大小)作为看板“清洗配置”模块的可调节项,便于快速回测不同清洗策略对耗时指标的影响。

4.2 维度拆解与看板结构

看板将清洗结果按以下维度拆解,形成下钻路径:

  • 按设备类型:对比不同机台的数据健康状况,发现“脏数据重灾区”。
  • 按工序阶段:识别哪个阶段容易出现异常值(如调试阶段常有初值跳变)。
  • 按时间窗口:以小时/班次为单位观察清洗通过率波动,配合生产节拍排查原因。
  • 按异常类型:异常值(IQR超标)、缺失值(字段空)、时间戳乱序(偏移超限)各自占比。
看板布局建议: 顶部放置清洗通过率KPI卡片;中部左侧为异常拆解环形图(分异常类型),中部右侧为缺失热力图(行=设备,列=字段);下方为时间对齐偏差散点图,x轴为批次号,y轴为偏差值,标记超限点。

4.3 异常值处理

采用 IQR 规则 + 工艺阈值 双层判断。先计算耗时字段的 Q1、Q3、IQR,标记超出 [Q1-1.5IQR, Q3+1.5IQR] 的记录;再结合工艺上下限(如某工序标定 ≤ 300ms)做二次过滤。对异常的记录,根据业务场景选择:

  • 剔除:连续异常或单点极端值(如耗时 0 或 99999ms)。
  • 修正:用相邻正常样本中位数替换(如传感器偶发毛刺)。
  • 标记保留:添加异常标签,供后续分析决策。
-- 伪SQL:标记耗时异常值
SELECT *,
  CASE
    WHEN duration_ms < (Q1 - 1.5*IQR) OR duration_ms > (Q3 + 1.5*IQR)
    THEN 'IQR异常'
    WHEN duration_ms < 10 OR duration_ms > 5000
    THEN '工艺阈值异常'
    ELSE '正常'
  END AS anomaly_flag
FROM (
  SELECT *,
    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY duration_ms) OVER() AS Q1,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY duration_ms) OVER() AS Q3
  FROM raw_measurements
) sub
⚠ 避坑提醒: 使用 IQR 规则前,先排除明显不合理的伪数(如负数、零值、时间戳早于 1970),否则 IQR 会被严重拉偏,导致正常值被误判为异常。

4.4 缺失值填充

主要缺失场景:

  • 耗时字段缺失:使用该设备/工序历史中位数填充,并新增字段 is_filled_duration 标记。
  • 时间戳缺失:按批次内记录顺序线性插值(仅当缺失比例 ≤5% 时执行)。
  • 设备 ID 缺失:直接剔除(因无法溯源,且比例一般<0.1%)。
字段 填充策略 适用条件 标记方式
duration_ms 中位数填充(按设备+工序分组) 缺失率 ≤20% is_filled_duration = 1
measurement_ts 线性插值(同一批次内) 缺失率 ≤5% is_interpolated_time = 1
device_id 剔除 任意 标记后过滤

4.5 时间对齐(统一时间基准)

多设备采集的时间戳可能因系统时钟偏差、NTP漂移或采集延迟导致错位。时间对齐步骤:

  1. 时钟校准:以 MES/SCADA 主时钟为基准,计算每台设备的偏移量(取近 100 条记录的中位偏差)。
  2. 重采样:将离散记录对齐到标准时间网格(如 100ms 间隔),使用前向填充(forward fill)补偿空位。
  3. 偏差监控:记录每次对齐的偏移值,生成“对齐偏差”看板指标。
# Python 伪代码:时间对齐核心逻辑
def align_timestamps(df, base_clock='MES', interval_ms=100):
    # 计算设备偏移
    device_offset = df.groupby('device_id').apply(
        lambda x: np.median((x['ts_raw'] - x['ts_mes']).dt.total_seconds())
    )
    df['ts_corrected'] = df['ts_raw'] - device_offset[df['device_id']].values
    # 构建标准时间网格
    grid = pd.date_range(start=df['ts_corrected'].min(),
                         end=df['ts_corrected'].max(),
                         freq=f'{interval_ms}ms')
    # 前向填充
    aligned = df.set_index('ts_corrected').resample(f'{interval_ms}ms').ffill()
    return aligned

4.6 异常解释与业务动作

当清洗通过率低于 85%(阈值可调)时,看板自动推送预警并引导操作:

  • 异常解释:拆解高异常设备或工序的原始数据片段,判断是传感器故障、人为操作不规范还是采集程序采集中断。
  • 业务动作:
    — 传感器故障 → 通知设备维护部门校准/更换。
    — 人为不规范 → 发布操作规范提醒。
    — 采集中断 → 检查网络/采集卡,重启采集服务。

4.7 复盘分析

每周复盘,固定生成《数据清洗健康报告》,包含:

  • 清洗通过率变化趋势(折线图)
  • 各设备异常类型分布(堆叠柱状图)
  • 缺失值填充效果对比(填充前后耗时分布差异)
  • 时间对齐前后批次间偏差统计(箱线图)

复盘会议中,由数据工程师与工艺工程师共同确认是否需要调整清洗阈值或填充策略,更新看板配置并记录版本。

复盘检查清单:
☑ 异常值剔除后,样本量是否仍满足统计需求?
☑ 缺失填充引入的偏差是否被标记,能否解释?
☑ 时间对齐新产生的空窗期(无记录时段)是否合理?
☑ 清洗规则变更是否经过A/B测试或回测验证?
数据清洗与预处理流程(测量阶段耗时) 原始采集数据 异常值检测(IQR+阈值) 缺失值识别 时间戳乱序检测 异常值处理(剔除/修正/标记) 缺失值填充(中位数/插值) 时间对齐(时钟校准+重采样) 统一清洗规则执行 干净数据集 推送到耗时分析看板 异常解释、业务动作、复盘分析