WIP数据,有bad wafer/lot,追踪设备/机台问题
在半导体制造过程中,WIP(Work In Process)数据用于追踪晶圆或批次(wafer/lot)在工艺流程中的状态。当出现 bad wafer/lot(缺陷晶圆或批次)时,需要进行根因分析(Root Cause Analysis, RCA),以识别可能存在问题的设备或机台(tool/chamber)。
下面是一个完整的 追踪设备/机台问题的步骤方法,并附带 Python 分析示例代码。
一、分析流程(概览)
1. 明确异常标记
- Bad lot/wafer 的判定标准(如测试失败、良率下降、缺陷数升高等)
2. 数据准备与关联
- 获取 WIP 流程数据:包含 lot_id, wafer_id, step_id, tool_id, chamber_id, process_time
- 获取测试数据:如 E-Test、CP Test、Final Test 的良率结果或 defect 分类
- 获取设备运行日志(可选)
3. 前后工序数据对比
- 正常 vs 异常 wafer 的流片路径(Route)分析
- 工艺段、设备分布、运行时间等信息比较
4. 统计分析
- 对每个设备/tool,统计其处理 bad lot/wafer 的频率
- 计算设备与异常的相关性(如异常率)
5. 时序分析
- 分析异常 wafer 前后处理的 wafer/lot 是否也异常(串扰)
6. 输出疑似问题设备/工艺段
- 可结合热力图、流向图等可视化工具
二、数据结构定义(样例)
# WIP 工艺流转数据(每行代表一次加工记录)
# step_id: 工艺步骤,tool_id: 机台,chamber_id: 腔室
import pandas as pdwip_df = pd.DataFrame([{"lot_id": "L001", "wafer_id": "W001", "step_id": "Etch01", "tool_id": "ToolA", "chamber_id": "C1", "process_time": "2024-06-01 10:00"},{"lot_id": "L001", "wafer_id": "W001", "step_id": "Etch02", "tool_id": "ToolB", "chamber_id": "C3", "process_time": "2024-06-01 12:00"},...
])# 测试结果数据(例:CP/FT)
test_df = pd.DataFrame([{"wafer_id": "W001", "lot_id": "L001", "test_type": "FT", "yield": 85, "defect_type": "Bridge"},{"wafer_id": "W002", "lot_id": "L001", "test_type": "FT", "yield": 95, "defect_type": "None"},...
])
三、Python 分析步骤
1. 识别 Bad Wafer
bad_threshold = 90 # 设置良率阈值
bad_wafers = test_df[test_df['yield'] < bad_threshold]
bad_wafer_ids = bad_wafers['wafer_id'].unique()
2. 关联工艺流程记录
# 获取 bad wafer 的流转记录
bad_routes = wip_df[wip_df['wafer_id'].isin(bad_wafer_ids)]# 获取 normal wafer 的流转记录
normal_wafer_ids = test_df[test_df['yield'] >= bad_threshold]['wafer_id'].unique()
normal_routes = wip_df[wip_df['wafer_id'].isin(normal_wafer_ids)]
3. 分设备分析异常比率
# 每台设备处理的 wafer 数 & 异常 wafer 数
bad_tool_stats = bad_routes.groupby('tool_id')['wafer_id'].nunique().rename("bad_count")
total_tool_stats = wip_df.groupby('tool_id')['wafer_id'].nunique().rename("total_count")tool_stats = pd.concat([bad_tool_stats, total_tool_stats], axis=1).fillna(0)
tool_stats['bad_ratio'] = tool_stats['bad_count'] / tool_stats['total_count']# 排序
tool_stats = tool_stats.sort_values('bad_ratio', ascending=False)
print(tool_stats)
4. 分工艺步骤识别问题段
bad_step_stats = bad_routes.groupby('step_id')['wafer_id'].nunique().rename("bad_count")
total_step_stats = wip_df.groupby('step_id')['wafer_id'].nunique().rename("total_count")step_stats = pd.concat([bad_step_stats, total_step_stats], axis=1).fillna(0)
step_stats['bad_ratio'] = step_stats['bad_count'] / step_stats['total_count']
step_stats = step_stats.sort_values('bad_ratio', ascending=False)
5. 可选:时间串扰分析
# 假设 bad wafer 是在某 tool 上 10:00 处理的,我们看看它之前或之后处理的 wafers
from datetime import timedeltabad_wafers_time = bad_routes.copy()
bad_wafers_time['process_time'] = pd.to_datetime(bad_wafers_time['process_time'])suspicious_wafers = []for _, row in bad_wafers_time.iterrows():time_window_start = row['process_time'] - timedelta(minutes=30)time_window_end = row['process_time'] + timedelta(minutes=30)candidates = wip_df[(wip_df['tool_id'] == row['tool_id']) &(pd.to_datetime(wip_df['process_time']) >= time_window_start) &(pd.to_datetime(wip_df['process_time']) <= time_window_end)]suspicious_wafers.extend(candidates['wafer_id'].unique())suspicious_wafers = list(set(suspicious_wafers))
print("潜在受影响 wafers:", suspicious_wafers)
四、可视化建议(可选)
import seaborn as sns
import matplotlib.pyplot as pltplt.figure(figsize=(10,6))
sns.barplot(x=tool_stats.index, y=tool_stats['bad_ratio'])
plt.xticks(rotation=45)
plt.title("每台设备异常比率")
plt.show()
五、结论输出
结合:
- 哪些设备(tool_id)对应较高的异常比例
- 哪些工艺步骤(step_id)容易产出 bad wafer
- 是否存在工艺串扰或批次传播风险
补充建议
- 融合设备运行日志(如报警、停机、温度波动)
- 进行相关性分析(如工艺参数 vs 良率)
- 用 ML 建模预测(如 XGBoost 预测 bad wafer 风险)