2. SPC数据采集与预处理
在半导体制造中,良率预测的起点并非算法,而是数据。本章聚焦于如何从生产环境中获取原始SPC数据,并将其清洗、对齐为可供模型使用的标准数据集。数据质量直接决定模型上限,预处理环节通常占据整个项目60%以上的工作量。
2.1 数据采集系统:EDA与FDC
半导体产线中的过程数据主要来自两大系统:EDA (Equipment Data Acquisition) 和 FDC (Fault Detection & Classification)。两者采集维度不同,但共同构成良率分析的原始数据源。
| 系统 | 全称 | 采集对象 | 数据频率 | 典型参数 |
|---|---|---|---|---|
| EDA | Equipment Data Acquisition | 设备腔体传感器 | 高频率(1~100 Hz) | 温度、压力、RF功率、气体流量 |
| FDC | Fault Detection & Classification | 工艺过程统计量 | 按Lot/Wafer触发 | 均值、标准差、斜率、R2 |
实践建议:EDA数据用于捕捉腔体状态的瞬态变化(如射频反射功率尖峰),FDC数据用于监控工艺稳定性(如膜厚均值的长期漂移)。两者结合使用,可覆盖从秒级到批次级的全尺度监控。
下图展示了从产线设备到数据仓库的典型采集架构:
2.2 数据清洗:缺失值与异常值处理
原始SPC数据普遍存在质量问题。传感器漂移、通信中断、维护停机等都会导致数据缺失或异常。清洗策略需根据数据特征和业务场景选择。
2.2.1 缺失值处理
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除缺失行 | 缺失率 < 5%,且随机分布 | 简单、无偏差引入 | 样本量减少,可能丢失信息 |
| 前向填充 (ffill) | 传感器短暂中断,值缓慢变化 | 保持时序连续性 | 在跳变点引入滞后误差 |
| 线性插值 | 温度、压力等连续物理量 | 平滑过渡,符合物理规律 | 对突变区间估计不准 |
| 模型预测填充 | 缺失率较高,且存在相关特征 | 精度高,利用多变量信息 | 计算开销大,需避免过拟合 |
关键原则:在半导体良率场景中,不要对缺失率超过40%的参数进行填充。这类参数通常传感器已失效,填充会引入虚假模式,严重干扰模型训练。
2.2.2 异常值检测与处理
SPC数据中的异常值通常分为三类:全局异常点(超出3σ限)、上下文异常点(在特定工艺步骤中偏离正常模式)、集合异常点(单点正常但组合模式异常)。
常用检测方法包括:
- Z-Score 法:计算每个点与均值的标准差倍数,阈值通常设为3。
- IQR 法:四分位距法,超出 Q1-1.5×IQR 或 Q3+1.5×IQR 视为异常。
- 移动窗口法:在时序数据中,计算滑动窗口内的局部均值和标准差,检测局部离群点。
- 孤立森林:基于树模型的无监督异常检测,适合高维参数。
避坑提醒:不要将异常值直接删除。在良率预测中,异常值往往对应设备故障或工艺偏移,是预测模型需要学习的关键信号。建议先标记异常标签,保留原始值,在特征工程阶段再决定处理方式。
2.3 数据标准化与归一化
不同SPC参数的量纲和数值范围差异巨大(如温度800℃ vs 压力10mTorr)。标准化和归一化将各特征缩放到统一尺度,避免大数值特征主导模型训练。
| 方法 | 公式 | 输出范围 | 适用模型 |
|---|---|---|---|
| Z-Score 标准化 | \( x' = \frac{x - \mu}{\sigma} \) | 均值0,标准差1 | 线性回归、SVM、PCA |
| Min-Max 归一化 | \( x' = \frac{x - x_{min}}{x_{max} - x_{min}} \) | [0, 1] | 神经网络、KNN、梯度下降类 |
| Robust 缩放 | \( x' = \frac{x - median}{IQR} \) | 受异常值影响小 | 含较多异常点的SPC数据 |
以下代码展示了使用Python进行三种缩放的实际操作:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# 示例:SPC参数数据框
df_spc = pd.DataFrame({
'temperature': [780, 795, 810, 788, 802],
'pressure': [12.5, 11.8, 13.2, 12.0, 11.5],
'rf_power': [1500, 1520, 1480, 1510, 1495]
})
# 1. Z-Score 标准化
scaler_std = StandardScaler()
df_std = pd.DataFrame(
scaler_std.fit_transform(df_spc),
columns=df_spc.columns
)
# 2. Min-Max 归一化
scaler_mm = MinMaxScaler()
df_mm = pd.DataFrame(
scaler_mm.fit_transform(df_spc),
columns=df_spc.columns
)
# 3. Robust 缩放(推荐用于SPC数据)
scaler_rob = RobustScaler()
df_rob = pd.DataFrame(
scaler_rob.fit_transform(df_spc),
columns=df_spc.columns
)
print("Z-Score 标准化结果:\n", df_std)
print("\nMin-Max 归一化结果:\n", df_mm)
print("\nRobust 缩放结果:\n", df_rob)
推荐选择:对于半导体SPC数据,优先使用 Robust 缩放。因为SPC数据中常存在由设备维护或工艺切换引起的离群点,Robust缩放基于中位数和IQR,对这些离群点不敏感,能保持正常数据的分布结构。
2.4 时间序列对齐
良率预测面临的核心挑战之一是多源数据的时间对齐。EDA数据以秒级频率采集,FDC数据按Lot汇总,良率数据则在晶圆完成所有工艺步骤后才产生。三者时间粒度不同,必须对齐到统一的时间轴上。
2.4.1 对齐策略
- 降采样对齐:将高频EDA数据按Lot或时间段聚合为均值/中位数/标准差,与FDC和良率数据对齐。
- 时间窗口对齐:以良率测试时间为锚点,向前取固定时间窗口(如前24小时)内的所有SPC统计量。
- 事件对齐:以工艺步骤(如刻蚀开始/结束)为事件标记,对齐不同设备在同一工艺步骤的数据。
2.4.2 对齐实现示例
以下代码演示了将EDA高频数据降采样为Lot级别统计量,并与FDC和良率数据合并:
import pandas as pd
# 模拟EDA高频数据(秒级)
eda_data = pd.DataFrame({
'timestamp': pd.date_range('2024-01-01 08:00:00', periods=3600, freq='1s'),
'temperature': 780 + np.random.randn(3600) * 5,
'lot_id': ['Lot001']*1800 + ['Lot002']*1800
})
# 按Lot降采样为均值
eda_lot = eda_data.groupby('lot_id').agg({
'temperature': ['mean', 'std', 'min', 'max']
}).reset_index()
eda_lot.columns = ['lot_id', 'temp_mean', 'temp_std', 'temp_min', 'temp_max']
# 模拟FDC数据
fdc_data = pd.DataFrame({
'lot_id': ['Lot001', 'Lot002'],
'pressure_mean': [12.3, 11.9],
'rf_power_mean': [1505, 1498]
})
# 模拟良率数据
yield_data = pd.DataFrame({
'lot_id': ['Lot001', 'Lot002'],
'yield_pct': [92.5, 94.1]
})
# 合并对齐
merged_data = eda_lot.merge(fdc_data, on='lot_id').merge(yield_data, on='lot_id')
print("对齐后的数据集:\n", merged_data)
对齐质量检查:对齐完成后,务必检查时间戳的覆盖完整性。常见问题包括:EDA数据在良率测试时间点之后才采集(数据泄露)、FDC数据缺失导致Lot无法对齐、时区不一致导致时间偏移。建议在预处理流水线中加入时间戳校验步骤。
2.5 本章小结
SPC数据采集与预处理是良率预测模型的基石。本章覆盖了从EDA/FDC数据源识别、缺失值与异常值清洗、标准化/归一化方法选择,到多源时间序列对齐的完整流程。经过本章处理后的数据,将进入下一阶段的特征工程与模型构建环节。