数据采集与清洗:FDC/SPC/EES数据源介绍、数据清洗方法论、缺失值处理与异常值检测

各位工程师同仁,大家好。今天我们来聊聊良率爬坡阶段最基础、也最容易被忽视的一环——数据采集与清洗。

说实话,我见过太多团队,模型建得花里胡哨,结果一查数据源,全是脏数据。嗯,那感觉就像盖楼打歪了地基,后面再怎么折腾也白搭。所以这一章,咱们把数据源头和清洗方法彻底捋清楚。

三大数据源:FDC、SPC、EES

在半导体制造里,数据不是凭空来的。我习惯把数据源分成三类,你想想看,它们分别对应着设备、工艺和产品三个维度。

FDC(故障检测与分类)数据

FDC 说白了就是设备的“心电图”。它实时监控机台的各项参数,比如腔体温度、气体流量、射频功率等等。我在项目中遇到过,有一次刻蚀机台的 RF 功率出现微小漂移,SPC 图上看不出来,但 FDC 数据已经报警了。这就是 FDC 的价值——捕捉设备层面的异常。

关键点: FDC 数据通常是高频采集,每秒甚至毫秒级。数据量大,但噪声也多。

SPC(统计过程控制)数据

SPC 大家应该很熟了。它关注的是工艺参数和量测结果,比如膜厚、线宽、电阻率等。我个人习惯把 SPC 看作是“工艺健康度”的晴雨表。

SPC 数据的特点是:采样频率低(每批或每片),但每个数据点的信息密度高。为什么?因为它直接反映了工艺是否受控。

数据源 采集频率 典型参数 主要用途
FDC 高(秒级) 温度、压力、流量 设备故障预警
SPC 低(批次级) 膜厚、CD、电阻 工艺稳定性监控
EES 中(片级) 缺陷坐标、良率数据 产品良率分析

EES(设备工程系统)数据

EES 数据,我把它叫做“中间层”。它既包含设备运行状态,也包含产品加工信息。比如某片晶圆在哪个腔室加工、加工了多久、当时的 recipe 是什么。这些信息对于追溯良率问题至关重要。

我的经验: 很多团队只盯着 SPC 和 FDC,忽略了 EES 数据。其实,EES 数据是连接设备和产品的桥梁。我曾经靠 EES 数据定位到一个“腔室匹配”问题,硬是把某个产品的良率从 82% 拉到了 95%。

数据清洗方法论

数据源讲完了,接下来是重头戏——清洗。为什么清洗这么重要?因为半导体数据太“脏”了。传感器漂移、通讯中断、人为误操作……各种情况都有。

我总结了一套清洗流程,你照着做基本不会出大问题:

  1. 格式统一——不同机台、不同系统的数据格式千差万别。先把时间戳、单位、命名规则统一了。
  2. 去重——有时候同一个数据会被重复记录。我记得有一次,MES 系统和 EES 系统同时采集了同一批数据,导致后续分析结果翻倍。
  3. 范围校验——每个参数都有物理极限。比如温度不可能为负,压力不可能超过大气压。超出范围的直接标记或剔除。
  4. 逻辑校验——比如“加工时间”和“开始/结束时间”要能对应上。我曾经发现一批数据,结束时间比开始时间还早,明显是时钟同步出了问题。
注意: 清洗不是“一刀切”。有些看似异常的数据,可能恰恰反映了设备故障的前兆。所以,清洗时要保留原始数据,清洗后的数据另存一份。

缺失值处理

缺失值在半导体数据里太常见了。传感器偶尔掉线、量测机台维护、数据传输丢包……都会导致缺失。

怎么处理?我一般分三种情况:

  • 缺失率 < 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)
避坑指南: 我曾经在处理一批刻蚀数据时,用了全局均值填充缺失的温度值。结果模型训练出来一塌糊涂。后来才发现,不同腔室的温度基线根本不一样。所以,填充时一定要按分组(比如按腔室、按 recipe)来操作。

异常值检测

异常值检测,说白了就是找出那些“不对劲”的数据点。在良率爬坡阶段,异常值往往意味着设备异常或工艺偏移。

我常用的方法有三种:

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