4. 数据预处理

量产测试数据从 ATE、探针台、分选机、MES、WAT/CP/FT 数据库汇聚而来,天然带有“脏”的特征:某颗芯片的测试项漏测、某台机台的温度单位混用、同一批次数据被重复上传、时间戳跨时区错位。若不做预处理,后续良率计算、SPC 控制图、Cpk 分析都会失真。本节围绕六类核心操作展开:缺失值、异常值、重复数据、单位统一、时间对齐,以及数据清洗与特征工程的基本方法。

一、核心原理:预处理是“让数据可被信任”

预处理的本质不是“美化数据”,而是保证后续统计推断的可比性、一致性与可追溯性。可比性要求同一测试项在不同机台、不同时间、不同产品间可比较;一致性要求单位、量纲、编码规则统一;可追溯性要求每一步清洗都可回放、可审计。因此,预处理必须遵循三条原则:

  • 先诊断后处理:先统计缺失率、异常比例、重复率,再决定策略,避免“一刀切”。
  • 保留原始字段:清洗结果写入新列或新表,原始数据不可覆盖,便于回溯。
  • 规则可配置:阈值、单位映射、时间窗口应参数化,随产品/机台版本迭代。
预处理的目标不是让数据“好看”,而是让良率、Cpk、SPC 的结论在工程上站得住脚。

二、方法流程:六步预处理流水线

下图给出量产测试数据预处理的典型流水线,从原始数据到可分析数据集,每一步都对应明确的工程动作与判定条件。

量产测试数据预处理流水线 ① 缺失值处理 缺失率统计 删除 / 插补 / 标记 ② 异常值识别 3σ / IQR / 规格限 剔除或隔离复核 ③ 重复数据 主键去重 保留最新/最全记录 ④ 单位统一 mV/V、℃/℉ 量纲映射表 ⑤ 时间对齐 时区/采样频率 批次时间窗对齐 ⑥ 清洗与特征工程 标准化 / 分箱 / 派生特征 输出可分析数据集 可分析数据集 良率 / Cpk / SPC 输入 关键判定条件 • 缺失率 > 30%:整列弃用或专项补测 • 异常值:先判“真异常”还是“真失效” • 重复:按 (Lot, Wafer, Die, TestItem) 去重 • 单位:建立机台-单位映射表 • 时间:统一 UTC 后再转本地批次时区 • 特征:保留原始值 + 派生特征双列

三、关键操作与代码示例

以 Python/Pandas 为例,量产测试数据通常以 DataFrame 形式加载,主键为 lot_id + wafer_id + die_x + die_y + test_item。下面给出缺失值、异常值、重复数据、单位统一与时间对齐的典型处理片段。

import pandas as pd
import numpy as np

# 1. 缺失值:统计缺失率,按阈值决策
miss_rate = df.isnull().mean()
drop_cols = miss_rate[miss_rate > 0.30].index.tolist()
df = df.drop(columns=drop_cols)
# 对关键测试项用中位数插补,并新增标记列
df['vth_missing'] = df['vth'].isnull().astype(int)
df['vth'] = df['vth'].fillna(df['vth'].median())

# 2. 异常值:IQR 法识别,隔离而非直接删除
q1, q3 = df['idsat'].quantile([0.25, 0.75])
iqr = q3 - q1
low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
df['idsat_outlier'] = ~df['idsat'].between(low, high)

# 3. 重复数据:按主键去重,保留最新记录
key = ['lot_id','wafer_id','die_x','die_y','test_item']
df = df.sort_values('test_time').drop_duplicates(subset=key, keep='last')

# 4. 单位统一:机台单位映射
unit_map = {'mV': 1e-3, 'V': 1.0, 'uA': 1e-6, 'mA': 1e-3}
df['vth_V'] = df.apply(lambda r: r['vth'] * unit_map[r['vth_unit']], axis=1)

# 5. 时间对齐:统一 UTC,再转批次时区
df['test_time_utc'] = pd.to_datetime(df['test_time'], utc=True)
df['test_time_local'] = df['test_time_utc'].dt.tz_convert('Asia/Shanghai')

# 6. 特征工程:派生良率相关特征
df['vth_norm'] = (df['vth_V'] - df['vth_V'].mean()) / df['vth_V'].std()
df['vth_bin'] = pd.cut(df['vth_V'], bins=10, labels=False)

四、案例场景:某批次 FT 数据清洗

某批次 FT 数据共 12 万行,涉及 3 台测试机、2 个温度条件。初步诊断发现:vth 缺失率 8%,idsat 异常值比例 2.3%,重复记录 1.1%,且 2 号机台温度单位误用华氏度。处理策略如下:

  • 缺失值:vth 缺失率低于 30%,采用中位数插补并保留缺失标记;leakage 缺失率 45%,整列弃用并触发补测工单。
  • 异常值:idsat 超出 IQR 上下界的记录不直接删除,而是标记为 outlier_flag,交由 PE 复核是否为真实失效。
  • 重复数据:按主键去重后保留最新 test_time 记录,重复率从 1.1% 降至 0。
  • 单位统一:2 号机台温度由 ℉ 转 ℃,公式为 C = (F - 32) * 5 / 9,并写入机台映射表。
  • 时间对齐:三台机台时间戳统一为 UTC,再按批次时区对齐到同一时间窗,避免 SPC 控制图出现“时间错位”导致的假报警。
异常值处理要区分“测量异常”与“真实失效”。前者应剔除或修正,后者应保留并进入失效分析流程,否则会掩盖真实良率损失。

五、常见误区与复盘

误区 后果 正确做法
缺失值一律删除整行 样本量骤减,良率被高估 按缺失率分级:低缺失插补,高缺失弃列并补测
异常值直接删除 真实失效被掩盖,Cpk 虚高 先标记、复核,再决定剔除或保留
去重时保留第一条 可能保留旧数据,丢失最新复测结果 按时间排序,保留最新或最完整记录
单位不统一直接计算 量纲错误,均值/方差无意义 建立机台-单位映射表,统一到 SI 单位
时间戳不统一时区 SPC 控制图时间错位,误报警 统一 UTC 存储,展示时再转本地时区
特征工程覆盖原始列 无法回溯,审计困难 原始列保留,派生特征新增列

复盘时建议建立“预处理日志表”,记录每一步的操作类型、影响行数、阈值参数与操作人。这样当良率或 SPC 结果出现异常时,可以快速定位是数据问题还是工艺问题。预处理不是一次性任务,而应随产品、机台、测试程序版本持续迭代,最终形成可复用、可审计、可追溯的数据清洗流水线。