4、良率数据可视化:数据清洗与预处理、良率趋势图、帕累托图、良率地图
各位工程师,大家好。今天我们来聊聊良率数据的可视化。说实话,很多团队花了大价钱买了测试机台,数据也存了一大堆,但最后就卡在「怎么看」这一步上。
我个人习惯是:拿到原始数据后,先别急着画图。你想想看,如果数据本身是脏的,画出来的图再漂亮也是误导。所以,咱们先从数据清洗与预处理说起。
4.1 数据清洗与预处理
我在项目中遇到过最典型的情况——一批晶圆测试完,Bin 数据里居然混着「NULL」和「-9999」。这种数据如果不处理,趋势图直接给你来个断崖式下跌,吓得你以为是产线出大事了。
数据清洗的核心就三件事:
- 去重:同一颗 Die 被测试了两次?保留最后一次的结果。
- 补缺:缺失的 Bin 值,我一般用相邻晶圆的均值填充。别用 0 填充,那会拉低良率。
- 过滤异常:比如 Bin 编号超出定义范围的数据,直接剔除。
重要原则:清洗过程必须记录日志。哪天老板问「为什么这批良率高了 2%」,你得能追溯到是数据变了,还是工艺真改善了。
下面是我常用的一个 Python 清洗脚本片段:
import pandas as pd
import numpy as np
# 读取原始数据
df = pd.read_csv('wafer_test_raw.csv')
# 去重:按 Die 坐标去重,保留最后一条
df = df.drop_duplicates(subset=['WaferID', 'DieX', 'DieY'], keep='last')
# 补缺:用该晶圆的中位数填充
df['BinCode'] = df.groupby('WaferID')['BinCode'].transform(
lambda x: x.fillna(x.median())
)
# 过滤:只保留有效 Bin 范围 (1-10)
df = df[(df['BinCode'] >= 1) & (df['BinCode'] <= 10)]
print(f"清洗后数据量: {len(df)} 条")
我的小技巧:清洗完的数据,我会额外生成一列「清洗标记」。哪天发现异常,可以快速切回原始数据对比。
4.2 良率趋势图(Yield Trend Chart)
趋势图,说白了就是看良率随时间怎么变的。我见过很多新手直接拿日良率画折线图,结果波动大得根本看不出趋势。
为什么会这样?因为日产量可能只有几十颗,统计波动太大。我建议至少按周或按批次聚合。
画趋势图时,我习惯叠加两条线:
- 日良率:用散点或细线表示,看波动范围。
- 移动平均线:用粗线表示,看长期趋势。窗口期我一般选 5 或 7。
举个例子,某产品连续 30 天的良率数据:
| 批次 | 测试数 | 良品数 | 良率 | 移动平均(5批) |
|---|---|---|---|---|
| W01 | 500 | 475 | 95.0% | - |
| W02 | 520 | 488 | 93.8% | - |
| W03 | 480 | 460 | 95.8% | - |
| W04 | 510 | 475 | 93.1% | - |
| W05 | 490 | 465 | 94.9% | 94.5% |
注意:如果某批次测试数突然变少(比如只有 50 颗),那它的良率参考价值很低。我一般会设置一个最低样本量阈值,低于阈值的批次不参与趋势计算。
4.3 帕累托图(Pareto Chart)
帕累托图,就是那个「二八原则」的图。80% 的失效是由 20% 的缺陷类型造成的。做失效分析时,我第一件事就是画这个图。
画法其实很简单:
- 统计每种 Bin 码的失效数量。
- 按失效数从大到小排序。
- 画柱状图(失效数)+ 折线图(累计百分比)。
我曾经遇到过一个案例:某产品良率突然掉了 5%,团队所有人都在查最复杂的时序问题。结果我画了个帕累托图,发现 60% 的失效都来自一个简单的「电压测试项」——探针卡接触不良。嗯,有时候问题就是这么朴实无华。
我的建议:帕累托图不要只看一次。每周更新一次,看看 Top 失效项有没有变化。如果某个低排名缺陷突然上升,那可能是新问题冒头了。
4.4 良率地图(Bin Map)
良率地图,就是把晶圆上每颗 Die 的测试结果用颜色标出来。我个人觉得这是最直观的工具——一眼就能看出失效是随机分布还是集中在某个区域。
常见的失效模式:
- 边缘失效:晶圆边缘一圈全是坏 Die。这通常是光刻或刻蚀工艺不均匀导致的。
- 中心团簇:晶圆中心一片坏 Die。可能是 CMP 平坦化问题。
- 划痕:一条直线上的 Die 全坏。这大概率是机械损伤。
- 随机点:零星几个坏 Die。一般是颗粒污染。
下面是一个用 Matplotlib 绘制 Bin Map 的示例:
import matplotlib.pyplot as plt
import numpy as np
# 模拟晶圆数据 (10x10 网格)
wafer = np.random.choice([1, 2, 3, 4], size=(10, 10), p=[0.85, 0.05, 0.05, 0.05])
# 1=良品, 2=失效A, 3=失效B, 4=失效C
plt.figure(figsize=(6, 6))
plt.imshow(wafer, cmap='RdYlGn', interpolation='nearest')
plt.colorbar(label='Bin Code')
plt.title('Wafer Bin Map - 示例')
plt.xlabel('Die X')
plt.ylabel('Die Y')
# 添加网格线
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
避坑指南:我曾经因为颜色映射没调好,把良品和失效品画成了相近的颜色,差点误导了整个分析团队。后来我固定用「绿色=良品,红色=失效,黄色=参数异常」这个配色方案,再也没出过问题。
好了,以上就是良率数据可视化的四个核心环节。数据清洗是地基,趋势图看宏观,帕累托图找重点,良率地图定位置。把这四样工具用好,大部分良率问题都能快速定位。