3. 数据采集与ETL:从MES/SECS/GEM协议获取数据、数据清洗、数据转换与标准化

各位工程师朋友,大家好。这一章我们聊聊数据从哪里来,又怎么变成能用的样子。

我在FAB里摸爬滚打这些年,最深的体会就是:数据采集和ETL,占了整个数据分析工作量的60%以上。你想想看,模型再漂亮,算法再高级,数据源头是脏的、乱的,那后面全是白费功夫。

说白了,晶圆制造的数据采集,核心就是三个系统:MES、SECS、GEM。咱们一个一个说。

3.1 数据源:MES、SECS、GEM

MES(制造执行系统),这是FAB的大脑。它管着lot的流转、工单的派发、工艺参数的设定。MES里存的是结构化数据,比如批次号、设备ID、工艺步骤、测量值。我个人习惯,先从MES拉取lot的履历数据,这是最基础的。

SECS/GEM,这是设备和主机之间的通信协议。SECS是底层协议,定义怎么传数据。GEM是上层标准,定义传什么数据。设备每跑完一片wafer,会通过GEM上报一堆参数:温度、压力、RF功率、时间……这些是实时数据,频率很高。

我在项目中遇到过一个问题:某台刻蚀机,GEM上报的RF功率偶尔会跳变到0,持续几秒钟又恢复。如果不做清洗,这个异常值会直接拉低整个批次的良率预测。所以,数据采集只是第一步,清洗才是关键。

核心要点:

  • MES数据:批次、工单、工艺步骤、测量值(低频、结构化)
  • SECS/GEM数据:设备实时参数(高频、时序性)
  • 两者需要按lot ID或wafer ID关联起来

下面这张图,是我自己画的ETL流程框架,你看一眼就明白了。

MES系统 批次/工单/测量值 SECS/GEM 设备实时参数 数据采集层:API / 数据库直连 / 日志文件 定时拉取 + 实时流式接收 数据清洗:缺失值 / 异常值 / 重复值 规则过滤 + 统计方法 + 业务逻辑 数据转换与标准化 格式统一 / 单位转换 / 归一化 清洗后的标准数据集 → 分析/建模 ETL 核心逻辑 1. 多源数据汇聚 2. 按lot/wafer ID关联 3. 缺失值:均值/中位数填充 4. 异常值:3σ / IQR 规则 5. 重复值:去重保留最新 6. 单位统一:nm→μm等 7. 标准化:Z-score / Min-Max 8. 输出Parquet/CSV

3.2 数据清洗:缺失值、异常值、重复值

数据采集上来,第一件事不是分析,是清洗。我见过太多人,数据拉下来直接跑模型,结果一塌糊涂。为什么?因为数据里有坑。

3.2.1 缺失值处理

晶圆制造中,缺失值很常见。比如某台设备在维护期间没上报数据,或者某个测量站点跳过了。处理方式有三种:

  • 删除:如果缺失比例小于5%,直接删掉该行。我一般用这个。
  • 填充:用均值、中位数、或者前向填充(forward fill)。对于时序数据,前向填充更合理。
  • 插值:线性插值或样条插值,适合连续变化的参数,比如温度曲线。

我的经验:对于刻蚀速率这种参数,如果缺失值出现在工艺稳定期,用中位数填充没问题。但如果出现在工艺切换点,千万别填充,直接标记为缺失,让模型自己处理。

3.2.2 异常值检测

异常值,说白了就是那些明显不合理的数据点。比如RF功率突然变成0,或者温度飙到1000°C(正常只有400°C)。

常用的方法:

  • 3σ原则:数据在均值±3个标准差之外,视为异常。适合正态分布的数据。
  • IQR方法:四分位距法。Q1-1.5*IQR 到 Q3+1.5*IQR 之外,视为异常。更稳健,不受极端值影响。
  • 业务规则:比如压力不能为负,温度不能超过设备上限。这个最直接。

注意:我曾经遇到过一个case,某台CMP设备的抛光压力数据,用3σ方法检测出大量异常值。后来发现,是因为工艺配方切换导致压力正常波动。所以,异常值检测一定要结合工艺知识,不能纯靠统计。

3.2.3 重复值处理

重复值通常是因为数据采集程序bug,或者网络重传导致的。处理很简单:按时间戳去重,保留第一条或最后一条。

我建议保留最后一条,因为那可能是重传后的正确数据。

3.3 数据转换与标准化

清洗完了,数据还不能直接用。为什么?因为不同设备、不同参数的单位和量纲不一样。比如温度是°C,压力是Torr,RF功率是W。如果不做转换,模型会偏向数值大的特征。

3.3.1 数据转换

常见的转换包括:

  • 单位统一:比如所有长度单位统一为μm,所有压力单位统一为Torr。
  • 格式转换:时间戳统一为Unix时间戳或ISO 8601格式。
  • 类型转换:把字符串类型的设备ID转为category类型,节省内存。

3.3.2 标准化

标准化有两种主流方法:

方法 公式 适用场景 我的建议
Z-score标准化 (x - μ) / σ 数据近似正态分布,有异常值 推荐用于回归模型
Min-Max标准化 (x - min) / (max - min) 数据有明确边界,如温度范围 推荐用于神经网络

嗯,这里要注意:标准化一定要在训练集上计算参数(均值和标准差),然后用同样的参数去转换测试集。千万别把测试集的数据混进来算,否则会造成数据泄露。

实战代码片段(Python):

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 假设 df 是清洗后的数据,features 是特征列
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[features])

# 保存scaler参数,用于后续新数据
import joblib
joblib.dump(scaler, 'scaler_params.pkl')

我个人习惯,对于晶圆制造数据,优先用Z-score标准化。因为设备参数往往有异常值,Min-Max会被极端值拉偏。Z-score对异常值更鲁棒一些。

3.4 避坑指南

最后,分享几个我踩过的坑:

  • 时间对齐问题:MES数据是分钟级的,GEM数据是秒级的。关联时一定要先按lot ID分组,再按时间戳对齐。我曾经直接用时间戳join,结果数据全乱了。
  • 设备ID不一致:MES里叫"ETCH-01",GEM里叫"ETCH01"。这种小问题,清洗时一定要统一。
  • 缺失值不要全删:如果某个参数缺失率超过50%,我建议直接丢弃该特征。但如果缺失率在10%-30%,可以尝试用模型预测填充。
  • 标准化后检查分布:标准化完,记得画个直方图看看。如果数据还是偏态,考虑做log变换。

好了,这一章的内容就到这里。数据采集和ETL,看似基础,但做扎实了,后面的分析会顺畅很多。记住一句话:垃圾进,垃圾出。数据质量决定了分析的天花板。

专注资料整理