4. 良率数据可视化:使用Python/Pandas进行良率趋势图、Pareto图、箱线图绘制

数据可视化是良率改善中沟通分析结果、发现异常模式、驱动决策的核心手段。本章聚焦于三种最常用的良率分析图表:趋势图(监控良率随时间的变化)、Pareto图(识别关键缺陷类型)和箱线图(比较不同批次/机台的良率分布)。我们将使用Python的Pandas和Matplotlib/Seaborn库,结合实战案例进行绘制与解读。

核心工具链: 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()
关键解读: 若良率连续7点落在均值同侧,或出现明显的上升/下降趋势,应触发工程调查。上图中红色虚线为整体均值,用于快速判断偏移。

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()
注意: 控制限不是规格限。控制限基于过程自身变异计算,用于判断过程是否受控;规格限由客户或设计决定。切勿混淆两者。
良率SPC趋势图结构示意 UCL CL LCL 异常点 时间 / 批次顺序 良率 (%) 良率数据 控制限

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()
实战要点: 通常前3-5种缺陷类型会贡献80%以上的不良。将改善资源集中在这几类缺陷上,可以最快提升整体良率。注意:Pareto图应定期更新,因为改善行动会改变缺陷分布。
Pareto图结构示意 180 150 110 80 50 30 80% 缺陷类型(按频次降序) 缺陷数量 前3类缺陷贡献 约80%不良

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差异显著,说明机台间存在系统性差异。
箱线图结构示意(组间比较) 机台A 机台B 机台C 机台编号 良率 (%) IQR区间 中位数 异常点

4.4 综合实战案例:多维度良率分析

以下是一个综合案例,结合趋势图、Pareto图和箱线图,对一个月的生产数据进行全面分析。

分析维度 图表类型 发现的问题 改善行动
时间趋势 SPC趋势图 第3周良率连续下降,超出下控制限 调查该周工艺参数变更记录
缺陷分布 Pareto图 “划伤”和“颗粒污染”占不良的72% 成立专项小组,优化清洗工艺
机台差异 箱线图 机台#05的中位数显著低于其他机台 对机台#05进行预防性维护
分析流程总结:
  1. 先看趋势:确认过程是否稳定,是否存在时间相关的异常。
  2. 再看分布:用Pareto图找出主要矛盾,确定改善优先级。
  3. 最后比较:用箱线图对比不同分组(机台/班次/产品),定位变异来源。

三种图表互为补充,形成完整的良率数据分析闭环。

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图和箱线图的绘制与解读。这些可视化工具是良率改善工程师日常分析中不可或缺的技能,能够帮助您快速从数据中发现模式、定位问题、验证改善效果。