测试数据采集与清洗——良率分析的根基
大家好,我是老张,在ATE量产这行摸爬滚打十几年了。今天咱们聊聊数据采集与清洗。说实话,很多刚入行的朋友觉得跑测试、抓数据就完事了,直接丢进直方图、SPC里看。但我告诉你,数据采集和清洗没做好,后面的良率分析全是扯淡。
我自己就吃过亏。有一款HS400的案子,良率一直波动,我反复查测试程序、查硬件都没问题。最后才发现,是探针台的接触电阻数据没对齐时间戳,导致一批假fail记录混了进来。从那以后,我养成了一个习惯:拿到数据先花半小时做清洗,再谈分析。
数据采集的源头与规范
ATE测试的数据源其实不少,主要有三类:
- 测试机台日志(比如Teradyne、Advantest):记录每个DUT的测试项、bin位、测试时间、温度等。
- Handler/Prober数据:包括站点号、接触次数、气压、温度等环境参数。
- 探针卡/插座状态:比如针痕偏移、针尖污染等级。
你想想看,如果这些数据的时间戳不对齐,或者字段名称混乱,后面怎么归因?所以我建议,采集阶段就要统一规范。下面是我在项目中常用的字段定义表:
| 字段名 | 类型 | 说明 | 必须性 |
|---|---|---|---|
| Lot_ID | 字符串 | 批号 | 必填 |
| Wafer_ID | 字符串 | 晶圆编号 | 必填 |
| Test_Time | Datetime | 测试完成时间戳 | 必填 |
| Bin_Code | 整数 | 最终测试bin,例如1为pass,2~9为fail | 必填 |
| Param_XXX | 浮点 | 具体测试参数值(如Vth、Idsat) | 按需 |
| Site_ID | 整数 | 并行测试的站点号 | 推荐 |
| Probe_Contact_Res | 浮点 | 探针接触电阻(Ω) | 可选 |
嗯,这里要注意:时间戳一定要精确到毫秒级,而且最好是UTC时间,不然跨班次合数据时会疯掉。
数据清洗的常见坑
清洗说白了就是四个字:去伪存真。但实际做起来,坑可不少。
- 缺失值处理:有些测试项可能因为机台超时或通讯中断而没采到值。我见过有人直接删掉整行,结果把一些正常Die的pass记录也删了。更好的做法是标记后单独分析。
- 异常值剔除:比如Vth测出负值,明显是探针接触不良导致的。我会用3σ规则或者规格限直接过滤。
- 重复记录:多站点并行测试时,偶尔会重复上传。需要按Lot_ID + Wafer_ID + Die坐标 + Test_Time去重。
- 时间戳漂移:不同机台的时间可能差几秒,导致同一Die的不同参数采样时间错位。我习惯先对每个Lot做时间对齐,统一参考时钟。
我曾经踩过的坑: 有一批数据清洗后良率突然降低2%。查了半天,发现是去重时把同一Die的retest记录全部删除了,但retest本身也算一次正常测试。从那以后,我保留了retest标记,先分析retest原因再决定是否剔除。
清洗流程与方法
我的清洗流程一般分为四步,下面这张图能帮你看清全貌:
具体到代码层面,我一般用Python的pandas来处理。举个例子,去重和异常值过滤:
import pandas as pd
import numpy as np
df = pd.read_csv('ate_data.csv')
# 按Lot+Wafer+Die坐标去重,保留最后一次测试记录(retest)
df.drop_duplicates(subset=['Lot_ID','Wafer_ID','Die_Coord'], keep='last', inplace=True)
# 异常值剔除:只保留规格限内的IDD
idd_mean = df['IDD'].mean()
idd_std = df['IDD'].std()
df = df[(df['IDD'] >= idd_mean - 3*idd_std) & (df['IDD'] <= idd_mean + 3*idd_std)]
# 缺失值处理:标记后单独保存
missing = df[df['Vth'].isnull()]
df_clean = df.dropna(subset=['Vth'])
print(f"清洗前记录数: {len(df)+len(missing)},清洗后: {len(df_clean)}")
小技巧: 我习惯在清洗脚本里生成一份清洗日志,记录删除了多少条、标记了多少缺失值。这样后面查问题时,不用再重新跑一遍清洗。
数据质量评估与监控
清洗完后,得有个质量报告。不然别人问你这个数据能不能用,你拿什么回答?我通常关注这几个指标:
| 质量维度 | 评估方法 | 可接受阈值 |
|---|---|---|
| 数据完整率 | 缺失字段占总字段的比例 | > 98% |
| 异常占比 | 超出3σ或规格限的记录数/总数 | < 2% |
| 重复率 | 去重前后记录数之差/去重前 | < 0.5% |
| 时间一致性 | 同一Lot内最高与最低时间戳之差 | < 24小时 |
如果某个指标不达标,我建议先排查对应步骤,而不是强行分析。比如异常占比过高,先检查测试程序有没有设错上下限,而不是直接过滤掉。
核心原则: 数据清洗不是炫技,而是为了还原真实物理世界。宁可保留可疑数据打上标签,也不要盲目删除。你永远不知道那一条异常记录背后藏着一个良率杀手。
好了,数据采集与清洗这块儿,最重要的就是建立规范、流程化执行,并且每次清洗都留下痕迹。下一期我们聊聊良率统计的metric选择——但那是后话了,咱们先把数据基础打牢。我自己到现在,每次接手新项目,都会花至少一天梳理数据流,这时间花得值。