半导体良率工程师核心技能:数据分析与SPC实战 - 第4节
4. 描述性统计分析:均值、中位数、众数、方差、标准差、偏度与峰度
描述性统计是良率工程师分析数据的起点。面对成千上万的晶圆测试数据(如CP、WAT参数),我们首先需要通过几个关键统计量快速把握数据的“中心位置”、“离散程度”和“分布形状”。本章将结合半导体制造场景,逐一讲解这些核心指标,并演示如何用Pandas高效计算。
4.1 集中趋势度量:均值、中位数、众数
集中趋势描述数据向某个中心值聚集的程度。在良率分析中,不同指标适用于不同场景:
| 统计量 | 定义 | 半导体应用场景 | 注意事项 |
|---|---|---|---|
| 均值(Mean) | 所有数据之和除以数据个数 | 计算一批晶圆的平均良率、平均阈值电压 | 易受异常值(如测试机台故障数据)影响 |
| 中位数(Median) | 排序后位于中间位置的值 | 评估良率分布的典型水平,尤其当数据存在离群点时 | 对异常值不敏感,更能代表“典型”晶圆 |
| 众数(Mode) | 出现频率最高的值 | 识别最常见的缺陷类型、最常见的Bin码 | 可能不存在或多个众数;对连续数据需分组后计算 |
实战提示: 在良率报告中,建议同时报告均值和中位数。若两者差异较大(如均值明显低于中位数),通常暗示数据中存在低良率离群点,需要排查具体批次或机台。
4.2 离散程度度量:方差与标准差
离散程度衡量数据的波动大小。在半导体制造中,工艺参数的稳定性与离散程度直接相关。
- 方差(Variance, σ²):各数据点与均值之差的平方的平均值。单位是原始数据的平方,解释性较差。
- 标准差(Standard Deviation, σ):方差的平方根,与原始数据单位一致,更直观。
工程意义: 在光刻工艺中,CD(关键尺寸)的标准差越小,说明线宽控制越稳定,良率越高。通常用“均值 ± 3σ”作为工艺控制限。
计算公式:
总体方差:σ² = Σ(xᵢ - μ)² / N
样本方差:s² = Σ(xᵢ - x̄)² / (n-1)
标准差:σ = √σ²
注意: 使用Pandas的
.std()方法时,默认计算的是样本标准差(分母为n-1)。若数据代表总体,需设置ddof=0。
4.3 分布形状度量:偏度与峰度
偏度和峰度帮助工程师判断数据是否服从正态分布,这对后续SPC控制图的选择至关重要。
| 指标 | 定义 | 取值范围与解释 | 半导体应用 |
|---|---|---|---|
| 偏度(Skewness) | 衡量分布不对称的程度和方向 | =0 对称;>0 右偏(正偏);<0 左偏(负偏) | WAT参数偏度大,可能暗示工艺偏移或测试异常 |
| 峰度(Kurtosis) | 衡量分布尾部的厚度和峰部的尖锐程度 | =3 正态分布(超值峰度=0);>3 尖峰厚尾;<3 平峰薄尾 | 峰度过高说明异常值较多,需关注缺陷分布 |
使用Pandas进行分组聚合统计(GroupBy)
在实际良率分析中,我们经常需要按不同维度(如产品型号、机台ID、批次、操作员)分组计算描述性统计量。Pandas的groupby功能是完成这项任务的核心工具。
4.4 GroupBy基础流程
GroupBy操作遵循“拆分-应用-合并”(Split-Apply-Combine)范式:
- 拆分(Split):根据一个或多个键将DataFrame分成若干组。
- 应用(Apply):对每组独立应用一个函数(如均值、标准差、自定义函数)。
- 合并(Combine):将各组结果合并成一个新的DataFrame或Series。
4.5 实战代码:按机台分组计算良率统计量
假设我们有一份晶圆测试数据,包含字段:LotID(批次)、ToolID(机台)、Yield(良率)、DefectDensity(缺陷密度)。我们需要按机台分组,计算各机台的良率均值、标准差、偏度和峰度。
import pandas as pd
import numpy as np
# 示例数据
data = {
'LotID': ['L1','L1','L2','L2','L3','L3','L4','L4'],
'ToolID': ['T1','T2','T1','T2','T1','T2','T1','T2'],
'Yield': [85.2, 92.1, 88.5, 91.3, 82.7, 93.5, 87.0, 90.8],
'DefectDensity': [0.12, 0.05, 0.09, 0.06, 0.15, 0.04, 0.10, 0.07]
}
df = pd.DataFrame(data)
# 按机台分组,计算多个统计量
result = df.groupby('ToolID')['Yield'].agg([
('Mean', 'mean'),
('Median', 'median'),
('Std', 'std'),
('Var', 'var'),
('Skew', lambda x: x.skew()),
('Kurt', lambda x: x.kurtosis())
]).round(2)
print(result)
输出结果:
Mean Median Std Var Skew Kurt
ToolID
T1 85.85 86.25 2.42 5.86 -0.81 -1.50
T2 91.93 92.05 1.18 1.39 -0.12 -1.82
工程解读: T2机台的良率均值(91.93%)明显高于T1(85.85%),且标准差更小(1.18 vs 2.42),说明T2机台不仅良率高,而且工艺更稳定。偏度均为负值,说明两个机台的良率分布都略微左偏(低良率尾部稍长)。
4.6 多级分组与多个聚合函数
实际分析中常需要按多个维度分组,并同时计算多个字段的统计量:
# 按批次和机台分组,同时计算良率和缺陷密度的统计量
multi_result = df.groupby(['LotID', 'ToolID']).agg({
'Yield': ['mean', 'std', 'min', 'max'],
'DefectDensity': ['mean', 'std', 'max']
}).round(3)
print(multi_result)
效率技巧: 使用
.describe()方法可以快速获得分组数据的常用描述性统计量(count, mean, std, min, 25%, 50%, 75%, max),适合初步探索。
# 快速描述性统计
desc = df.groupby('ToolID')['Yield'].describe().round(2)
print(desc)
4.7 常见陷阱与避坑指南
| 陷阱 | 说明 | 正确做法 |
|---|---|---|
| 忽略缺失值 | groupby默认会丢弃分组键中的NaN | 使用dropna=False保留NaN分组 |
| 混淆样本与总体标准差 | .std()默认ddof=1(样本标准差) |
总体数据设置ddof=0 |
| 分组键类型错误 | 数值型分组键可能被误当作聚合列 | 确保分组键是分类变量或转换为字符串 |
| 聚合结果索引混乱 | 多级分组后索引层级过多 | 使用reset_index()重置索引 |
关键提醒: 描述性统计只是数据分析的第一步。在良率工程中,发现均值或标准差异常后,必须结合SPC控制图、假设检验和工程知识进行根因分析,切勿仅凭统计量下结论。