数据采集与清洗:FDC/SPC/EES数据源介绍、数据清洗方法论、缺失值处理与异常值检测
各位工程师同仁,大家好。今天我们来聊聊良率爬坡阶段最基础、也最容易被忽视的一环——数据采集与清洗。
说实话,我见过太多团队,模型建得花里胡哨,结果一查数据源,全是脏数据。嗯,那感觉就像盖楼打歪了地基,后面再怎么折腾也白搭。所以这一章,咱们把数据源头和清洗方法彻底捋清楚。
三大数据源:FDC、SPC、EES
在半导体制造里,数据不是凭空来的。我习惯把数据源分成三类,你想想看,它们分别对应着设备、工艺和产品三个维度。
FDC(故障检测与分类)数据
FDC 说白了就是设备的“心电图”。它实时监控机台的各项参数,比如腔体温度、气体流量、射频功率等等。我在项目中遇到过,有一次刻蚀机台的 RF 功率出现微小漂移,SPC 图上看不出来,但 FDC 数据已经报警了。这就是 FDC 的价值——捕捉设备层面的异常。
SPC(统计过程控制)数据
SPC 大家应该很熟了。它关注的是工艺参数和量测结果,比如膜厚、线宽、电阻率等。我个人习惯把 SPC 看作是“工艺健康度”的晴雨表。
SPC 数据的特点是:采样频率低(每批或每片),但每个数据点的信息密度高。为什么?因为它直接反映了工艺是否受控。
| 数据源 | 采集频率 | 典型参数 | 主要用途 |
|---|---|---|---|
| FDC | 高(秒级) | 温度、压力、流量 | 设备故障预警 |
| SPC | 低(批次级) | 膜厚、CD、电阻 | 工艺稳定性监控 |
| EES | 中(片级) | 缺陷坐标、良率数据 | 产品良率分析 |
EES(设备工程系统)数据
EES 数据,我把它叫做“中间层”。它既包含设备运行状态,也包含产品加工信息。比如某片晶圆在哪个腔室加工、加工了多久、当时的 recipe 是什么。这些信息对于追溯良率问题至关重要。
数据清洗方法论
数据源讲完了,接下来是重头戏——清洗。为什么清洗这么重要?因为半导体数据太“脏”了。传感器漂移、通讯中断、人为误操作……各种情况都有。
我总结了一套清洗流程,你照着做基本不会出大问题:
- 格式统一——不同机台、不同系统的数据格式千差万别。先把时间戳、单位、命名规则统一了。
- 去重——有时候同一个数据会被重复记录。我记得有一次,MES 系统和 EES 系统同时采集了同一批数据,导致后续分析结果翻倍。
- 范围校验——每个参数都有物理极限。比如温度不可能为负,压力不可能超过大气压。超出范围的直接标记或剔除。
- 逻辑校验——比如“加工时间”和“开始/结束时间”要能对应上。我曾经发现一批数据,结束时间比开始时间还早,明显是时钟同步出了问题。
缺失值处理
缺失值在半导体数据里太常见了。传感器偶尔掉线、量测机台维护、数据传输丢包……都会导致缺失。
怎么处理?我一般分三种情况:
- 缺失率 < 5%:直接删除该样本。影响不大,省事。
- 缺失率 5%-20%:用插值法填充。对于连续型参数(如温度),我习惯用线性插值或前向填充。对于离散型参数(如 recipe ID),用众数填充。
- 缺失率 > 20%:这个参数基本废了。我会考虑删除这个特征,或者用更复杂的模型(如 KNN 或随机森林)来预测缺失值。
# 一个简单的缺失值处理示例(Python)
import pandas as pd
# 前向填充
df['temperature'].fillna(method='ffill', inplace=True)
# 线性插值
df['pressure'].interpolate(method='linear', inplace=True)
# 众数填充(离散型)
df['recipe_id'].fillna(df['recipe_id'].mode()[0], inplace=True)
异常值检测
异常值检测,说白了就是找出那些“不对劲”的数据点。在良率爬坡阶段,异常值往往意味着设备异常或工艺偏移。
我常用的方法有三种:
1. 3σ 原则
最简单粗暴的方法。假设数据服从正态分布,超出均值 ±3σ 的视为异常。但要注意,半导体数据很多并不服从正态分布。比如缺陷数,通常是泊松分布。
2. IQR 方法
四分位距法,对非正态分布更鲁棒。Q1 - 1.5*IQR 以下,或 Q3 + 1.5*IQR 以上的,视为异常。我在 FDC 数据清洗中经常用这个方法。
3. 孤立森林(Isolation Forest)
对于高维数据,孤立森林效果不错。它不假设数据分布,通过随机切割来隔离异常点。嗯,这个方法计算量稍大,但准确率高。
# 孤立森林示例
from sklearn.ensemble import IsolationForest
model = IsolationForest(contamination=0.05) # 假设5%的异常率
outliers = model.fit_predict(df[['temperature', 'pressure', 'flow']])
好了,这一章的内容就到这里。数据采集和清洗是数据驱动决策的基石。你想想看,如果数据本身不可靠,后面再高级的模型也是空中楼阁。下一章,我们会讲特征工程,看看如何从清洗后的数据中提取真正有用的信息。
公众号:蓝海资料掘金营,微信deep3321