4. 良率数据可视化:使用Python/Pandas进行良率趋势图、Pareto图、箱线图绘制
数据可视化是良率改善中沟通分析结果、发现异常模式、驱动决策的核心手段。本章聚焦于三种最常用的良率分析图表:趋势图(监控良率随时间的变化)、Pareto图(识别关键缺陷类型)和箱线图(比较不同批次/机台的良率分布)。我们将使用Python的Pandas和Matplotlib/Seaborn库,结合实战案例进行绘制与解读。
pip install pandas matplotlib seaborn。
4.1 良率趋势图:监控过程稳定性
趋势图(Run Chart)将良率按时间顺序(如批次号、日期)绘制,用于识别长期趋势、周期性波动或突发偏移。它是过程控制的基础。
4.1.1 数据准备与基础折线图
假设我们有一个包含每日良率的数据集 daily_yield.csv,包含列:date、lot_id、yield_rate。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体(避免乱码)
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('daily_yield.csv')
df['date'] = pd.to_datetime(df['date'])
# 按日期聚合,计算每日平均良率
daily_avg = df.groupby('date')['yield_rate'].mean().reset_index()
# 绘制趋势图
plt.figure(figsize=(12, 5))
plt.plot(daily_avg['date'], daily_avg['yield_rate'],
marker='o', linestyle='-', color='#3498db', linewidth=2, markersize=4)
plt.axhline(y=daily_avg['yield_rate'].mean(), color='#e74c3c',
linestyle='--', linewidth=1.5, label=f'均值: {daily_avg["yield_rate"].mean():.2f}%')
plt.title('每日良率趋势图', fontsize=14, fontweight='bold')
plt.xlabel('日期')
plt.ylabel('良率 (%)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
4.1.2 添加控制限:SPC趋势图
在良率管理中,更常用的是包含控制限(Upper/Lower Control Limit)的SPC图。控制限通常基于均值 ± 3σ 计算。
# 计算控制限
mean_yield = daily_avg['yield_rate'].mean()
std_yield = daily_avg['yield_rate'].std()
ucl = mean_yield + 3 * std_yield
lcl = mean_yield - 3 * std_yield
plt.figure(figsize=(12, 5))
plt.plot(daily_avg['date'], daily_avg['yield_rate'],
marker='s', linestyle='-', color='#2ecc71', linewidth=2, markersize=4)
plt.axhline(y=mean_yield, color='#2c3e50', linestyle='-', linewidth=1.5, label=f'CL: {mean_yield:.2f}%')
plt.axhline(y=ucl, color='#e74c3c', linestyle='--', linewidth=1.5, label=f'UCL: {ucl:.2f}%')
plt.axhline(y=lcl, color='#e74c3c', linestyle='--', linewidth=1.5, label=f'LCL: {lcl:.2f}%')
plt.fill_between(daily_avg['date'], lcl, ucl, alpha=0.1, color='#3498db')
plt.title('良率SPC控制图(均值±3σ)', fontsize=14, fontweight='bold')
plt.xlabel('日期')
plt.ylabel('良率 (%)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
4.2 Pareto图:聚焦关键少数缺陷
Pareto图基于“80/20法则”,将缺陷类型按频次从高到低排列,并叠加累积百分比曲线,帮助团队优先解决贡献最大的少数缺陷。
4.2.1 数据聚合与排序
假设缺陷数据 defect_data.csv 包含列:defect_type、count。
# 读取缺陷数据
df_defect = pd.read_csv('defect_data.csv')
# 按缺陷数量降序排列
df_defect_sorted = df_defect.sort_values('count', ascending=False).reset_index(drop=True)
# 计算累积百分比
df_defect_sorted['cumulative_pct'] = df_defect_sorted['count'].cumsum() / df_defect_sorted['count'].sum() * 100
print(df_defect_sorted.head(10))
4.2.2 绘制Pareto图
fig, ax1 = plt.subplots(figsize=(12, 6))
# 柱状图(主坐标轴)
bars = ax1.bar(df_defect_sorted['defect_type'], df_defect_sorted['count'],
color='#3498db', edgecolor='#2980b9', linewidth=0.8)
ax1.set_xlabel('缺陷类型')
ax1.set_ylabel('缺陷数量', color='#3498db')
ax1.tick_params(axis='y', labelcolor='#3498db')
ax1.set_xticklabels(df_defect_sorted['defect_type'], rotation=45, ha='right')
# 累积百分比曲线(次坐标轴)
ax2 = ax1.twinx()
ax2.plot(df_defect_sorted['defect_type'], df_defect_sorted['cumulative_pct'],
marker='D', color='#e74c3c', linewidth=2.5, markersize=6)
ax2.axhline(y=80, color='#f39c12', linestyle='--', linewidth=1.5, label='80% 线')
ax2.set_ylabel('累积百分比 (%)', color='#e74c3c')
ax2.tick_params(axis='y', labelcolor='#e74c3c')
ax2.legend(loc='lower right')
plt.title('缺陷类型Pareto分析', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
4.3 箱线图:比较组间良率分布
箱线图(Box Plot)用于展示数据分布的五数概括(最小值、Q1、中位数、Q3、最大值),特别适合比较不同机台、不同产品型号或不同班次的良率分布差异。
4.3.1 数据准备与分组
假设数据 equipment_yield.csv 包含列:equipment_id、yield_rate。
# 读取数据
df_eq = pd.read_csv('equipment_yield.csv')
# 查看各机台数据量
print(df_eq.groupby('equipment_id')['yield_rate'].describe())
4.3.2 绘制箱线图
plt.figure(figsize=(10, 6))
# 使用Seaborn绘制箱线图
sns.boxplot(x='equipment_id', y='yield_rate', data=df_eq,
palette='Set2', linewidth=1.5, fliersize=5)
# 叠加散点图(显示所有数据点)
sns.stripplot(x='equipment_id', y='yield_rate', data=df_eq,
color='#2c3e50', alpha=0.4, size=4, jitter=True)
plt.title('不同机台良率分布箱线图', fontsize=14, fontweight='bold')
plt.xlabel('机台编号')
plt.ylabel('良率 (%)')
plt.grid(True, axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
- 中位数线:若偏离箱体中心,表示分布偏斜。
- 箱体高度(IQR):高度越大,数据越分散,过程一致性差。
- 异常点(离群值):超出1.5倍IQR的点,需重点关注。
- 组间比较:若不同机台的中位数和IQR差异显著,说明机台间存在系统性差异。
4.4 综合实战案例:多维度良率分析
以下是一个综合案例,结合趋势图、Pareto图和箱线图,对一个月的生产数据进行全面分析。
| 分析维度 | 图表类型 | 发现的问题 | 改善行动 |
|---|---|---|---|
| 时间趋势 | SPC趋势图 | 第3周良率连续下降,超出下控制限 | 调查该周工艺参数变更记录 |
| 缺陷分布 | Pareto图 | “划伤”和“颗粒污染”占不良的72% | 成立专项小组,优化清洗工艺 |
| 机台差异 | 箱线图 | 机台#05的中位数显著低于其他机台 | 对机台#05进行预防性维护 |
- 先看趋势:确认过程是否稳定,是否存在时间相关的异常。
- 再看分布:用Pareto图找出主要矛盾,确定改善优先级。
- 最后比较:用箱线图对比不同分组(机台/班次/产品),定位变异来源。
三种图表互为补充,形成完整的良率数据分析闭环。
4.5 图表美化与输出规范
在工程报告中,图表的美观度和可读性直接影响沟通效果。以下是一些实用建议:
- 颜色使用:主色不超过3种,使用公司或行业标准色系。
- 字体大小:标题14-16pt,轴标签12pt,图例10pt。
- 网格线:使用浅灰色(alpha=0.3),避免干扰数据。
- 输出格式:保存为高分辨率PNG(300dpi)或矢量PDF,便于插入报告。
# 保存高质量图表
plt.savefig('yield_trend.png', dpi=300, bbox_inches='tight')
plt.savefig('yield_trend.pdf', format='pdf', bbox_inches='tight')
- 在Pareto图上使用过多颜色,导致视觉混乱。
- 箱线图中未标注异常点,遗漏关键信息。
- 趋势图纵坐标不从0开始,放大微小波动造成误导。
通过本章的学习,您应能独立使用Python/Pandas完成良率趋势图、Pareto图和箱线图的绘制与解读。这些可视化工具是良率改善工程师日常分析中不可或缺的技能,能够帮助您快速从数据中发现模式、定位问题、验证改善效果。