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% 的缺陷类型造成的。做失效分析时,我第一件事就是画这个图。

画法其实很简单:

  1. 统计每种 Bin 码的失效数量。
  2. 按失效数从大到小排序。
  3. 画柱状图(失效数)+ 折线图(累计百分比)。

我曾经遇到过一个案例:某产品良率突然掉了 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()

避坑指南:我曾经因为颜色映射没调好,把良品和失效品画成了相近的颜色,差点误导了整个分析团队。后来我固定用「绿色=良品,红色=失效,黄色=参数异常」这个配色方案,再也没出过问题。

好了,以上就是良率数据可视化的四个核心环节。数据清洗是地基,趋势图看宏观,帕累托图找重点,良率地图定位置。把这四样工具用好,大部分良率问题都能快速定位。

良率数据可视化核心流程 数据清洗与预处理 良率趋势图 帕累托图 良率地图 去重、补缺、过滤 时间维度看良率波动 二八原则找主要失效 空间维度定位失效分布 四步走:先清洗数据 → 看趋势 → 找主因 → 定位失效

专注资料整理