3. 数据清洗与预处理实战

在半导体制造中,原始数据往往包含传感器漂移、传输错误、设备状态标记异常等问题。数据清洗与预处理是良率分析的基石,直接影响后续SPC监控和缺陷归因的准确性。本章将围绕缺失值处理、异常值检测、数据标准化以及晶圆图(Wafer Map)数据对齐四个核心环节展开实战讲解。

核心原则:清洗策略必须与工艺物理意义结合,避免“为清洗而清洗”。例如,CMP(化学机械抛光)厚度数据的缺失可能源于测量跳过,而刻蚀速率异常可能源于腔室未稳定。

3.1 缺失值处理:识别、分类与填充策略

半导体数据中的缺失值通常分为三类:完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)。在Fab数据中,MNAR最常见,例如当测量值超出量测机台量程时,系统自动记录为“NULL”。

缺失类型 半导体场景举例 推荐处理方式
MCAR 传感器偶发通信超时 直接删除(若缺失率<5%)或均值填充
MAR 高缺陷密度区域测量跳过 多重插补(MICE)或KNN填充
MNAR 超出量程的膜厚记录 边界值填充(如+3σ)或物理模型外推

以下是一个基于Python的缺失值处理代码示例,展示如何对Fab中的关键参数(如膜厚、线宽)进行条件填充:

import pandas as pd
import numpy as np

# 示例数据:包含膜厚(Thickness)和线宽(CD)的DataFrame
df = pd.DataFrame({
    'WaferID': [1, 2, 3, 4, 5],
    'Thickness': [5000, np.nan, 4980, 5020, np.nan],
    'CD': [130, 132, np.nan, 129, 131]
})

# 策略1:若缺失率低于5%,直接删除
if df.isnull().sum().sum() / df.shape[0] < 0.05:
    df_clean = df.dropna()
else:
    # 策略2:按工艺层分组填充中位数
    df['Thickness'] = df['Thickness'].fillna(df['Thickness'].median())
    df['CD'] = df['CD'].fillna(df['CD'].median())

print(df_clean)
实战提示:对于晶圆边缘区域(Edge Exclusion Zone)的缺失数据,建议使用相邻die的测量值进行空间插值,而非全局均值填充。

3.2 异常值检测:IQR法与3σ法则

异常值检测是SPC的前置步骤。在半导体制造中,异常值可能代表设备故障、工艺偏移或测量错误。常用的统计方法包括IQR(四分位距)法和3σ法则。

3.2.1 IQR法

IQR法基于数据分布的分位数,适用于非正态分布数据。定义:

  • Q1:第一四分位数(25%分位)
  • Q3:第三四分位数(75%分位)
  • IQR = Q3 - Q1
  • 异常值阈值:下限 = Q1 - 1.5×IQR,上限 = Q3 + 1.5×IQR

3.2.2 3σ法则

3σ法则假设数据服从正态分布,超出均值±3σ范围的点被视为异常。在SPC控制图中,这对应A区以外的点。

方法 适用场景 优点 缺点
IQR法 非正态、厚尾分布(如缺陷数) 不受极端值影响 对样本量敏感(n<10时不稳定)
3σ法 正态分布参数(如膜厚、CD) 计算简单,与SPC控制限一致 对异常值本身敏感(掩蔽效应)

以下代码展示如何对刻蚀速率数据进行异常值检测:

import numpy as np

etch_rate = np.array([150, 152, 148, 151, 149, 200, 153, 147, 151, 150])

# 3σ法
mean = np.mean(etch_rate)
std = np.std(etch_rate)
outliers_3sigma = etch_rate[(etch_rate < mean - 3*std) | (etch_rate > mean + 3*std)]
print("3σ异常值:", outliers_3sigma)

# IQR法
Q1 = np.percentile(etch_rate, 25)
Q3 = np.percentile(etch_rate, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers_iqr = etch_rate[(etch_rate < lower_bound) | (etch_rate > upper_bound)]
print("IQR异常值:", outliers_iqr)
注意:在良率分析中,不要轻易删除异常值。应先结合设备日志(如RF反射功率、腔室压力)判断是否为真实工艺事件。例如,刻蚀速率突然升高可能源于气体流量控制器(MFC)故障,这是需要报警的信号,而非数据噪声。
异常值检测方法对比流程 原始工艺数据 IQR法 Q1 - 1.5×IQR / Q3 + 1.5×IQR 3σ法则 均值 ± 3×标准差 异常值标记 + 设备日志交叉验证 异常值标记 + SPC控制限比对 保留/剔除/修正决策

3.3 数据标准化与归一化

在良率建模和多参数SPC中,不同参数的量纲差异巨大(如膜厚单位Å,缺陷密度单位#/cm²)。标准化和归一化可以消除量纲影响,使数据具有可比性。

3.3.1 Z-score标准化

将数据转换为均值为0、标准差为1的分布。公式:z = (x - μ) / σ。适用于数据近似正态分布的场景,如CD-SEM测量值。

3.3.2 Min-Max归一化

将数据线性映射到[0,1]区间。公式:x' = (x - min) / (max - min)。适用于有明确上下限的参数,如温度设定值。

方法 输出范围 对异常值敏感度 半导体典型应用
Z-score标准化 无界(通常[-3,3]) 高(异常值会拉偏μ和σ) 刻蚀速率、膜厚均匀性
Min-Max归一化 [0, 1] 极高(异常值决定min/max) 温度、压力、气体流量
Robust标准化 无界 低(使用中位数和IQR) 缺陷数、颗粒污染数据
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
import numpy as np

data = np.array([[5000, 130], [4980, 132], [5020, 129], [4950, 131]])

# Z-score标准化
scaler_std = StandardScaler()
data_std = scaler_std.fit_transform(data)
print("Z-score标准化:\n", data_std)

# Min-Max归一化
scaler_mm = MinMaxScaler()
data_mm = scaler_mm.fit_transform(data)
print("Min-Max归一化:\n", data_mm)

# Robust标准化(适合含异常值的数据)
scaler_robust = RobustScaler()
data_robust = scaler_robust.fit_transform(data)
print("Robust标准化:\n", data_robust)
选择建议:如果后续使用PCA或聚类算法,优先使用Z-score标准化;如果使用神经网络或距离度量模型(如KNN),Min-Max归一化更合适。对于缺陷数据,Robust标准化是安全选择。

3.4 晶圆图(Wafer Map)数据对齐

晶圆图数据对齐是良率分析中的特有挑战。不同量测设备(如KLA缺陷扫描仪、RS200电阻率测试仪)输出的晶圆图坐标系统可能不同:有的使用笛卡尔坐标(x, y),有的使用极坐标(r, θ),还有的使用die索引(Row, Col)。对齐的目的是将多源数据映射到统一的晶圆坐标系上。

3.4.1 坐标系统转换

常见的转换包括:

  • 极坐标 → 笛卡尔坐标:x = r × cos(θ),y = r × sin(θ)
  • Die索引 → 物理坐标:x = (Col - Col_center) × DieSize_X,y = (Row - Row_center) × DieSize_Y

3.4.2 对齐流程

  1. 数据加载:读取不同来源的晶圆图文件(如KLARF、CSV、OASIS)。
  2. 坐标归一化:将所有坐标转换为以晶圆中心为原点的毫米单位笛卡尔坐标。
  3. 网格化插值:对于缺失die位置,使用最近邻或双线性插值填充。
  4. 掩膜对齐:应用统一的晶圆边缘排除区(Edge Exclusion)掩膜。
晶圆图数据对齐流程 步骤1:多源数据加载 KLARF / CSV / OASIS 步骤2:坐标系统转换 极坐标→笛卡尔/Die→mm 步骤3:网格化插值 最近邻 / 双线性插值 步骤4:掩膜对齐 Edge Exclusion 输出:统一坐标系下的晶圆图数据矩阵(Row×Col)

3.4.3 实战代码:Die索引对齐

import pandas as pd
import numpy as np

# 假设两个数据源:缺陷数据(缺陷坐标)和电性测试数据(Die索引)
defect_data = pd.DataFrame({
    'DieRow': [5, 6, 7],
    'DieCol': [10, 11, 12],
    'DefectCount': [3, 1, 5]
})

electrical_data = pd.DataFrame({
    'Row': [5, 6, 7],
    'Col': [10, 11, 12],
    'Resistance': [120, 115, 130]
})

# 对齐:以Die索引为键进行合并
aligned_data = pd.merge(defect_data, electrical_data,
                        left_on=['DieRow', 'DieCol'],
                        right_on=['Row', 'Col'],
                        how='outer')

# 填充缺失值(未匹配的位置用NaN表示)
aligned_data = aligned_data.drop(columns=['Row', 'Col'])
print("对齐后的晶圆图数据:\n", aligned_data)
关键点:晶圆图对齐的精度直接影响空间相关性分析(如缺陷聚类与电性失效的对应关系)。建议在完成对齐后,可视化检查晶圆边缘的die是否匹配,避免因坐标系旋转或镜像导致错位。