4、可视化分析入门:使用Matplotlib/Plotly绘制良率趋势图、帕累托图、箱线图
数据可视化,说白了就是把枯燥的数字变成一眼就能看懂的图形。我刚开始做测试分析那会儿,面对几十万行的测试数据,光靠Excel表格硬看,眼睛都快瞎了。后来学会了用Python画图,效率直接翻倍。
今天咱们就聊聊三种最常用的量产分析图:良率趋势图、帕累托图和箱线图。我会用Matplotlib和Plotly两种库来演示,你想想看,一个适合静态报告,一个适合交互探索,各有各的妙处。
核心观点:可视化不是为了好看,是为了快速定位问题。一张好图,胜过千行数据。
4.1 良率趋势图:监控产线波动
良率趋势图,是量产测试最基础的图。每天看一眼,心里就有底。我习惯把良率按批次或按时间画成折线图,再叠加一个移动平均线,这样能过滤掉单批次的随机波动。
为什么会这样?因为单批良率可能受来料、设备状态、操作员等因素影响,上下跳动很正常。但如果你看到连续3-5个批次都在下降,那就得拉警报了。
4.1.1 用Matplotlib画静态趋势图
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 模拟数据:50个批次的良率
np.random.seed(42)
batches = list(range(1, 51))
yield_rate = np.random.normal(loc=0.97, scale=0.015, size=50)
# 人为加入一个下降趋势
yield_rate[30:35] -= 0.04
df = pd.DataFrame({'批次': batches, '良率': yield_rate})
df['移动平均'] = df['良率'].rolling(window=5).mean()
plt.figure(figsize=(12, 5))
plt.plot(df['批次'], df['良率'], 'o-', label='单批良率', alpha=0.6)
plt.plot(df['批次'], df['移动平均'], 'r-', linewidth=2, label='5批移动平均')
plt.axhline(y=0.95, color='gray', linestyle='--', label='良率下限')
plt.xlabel('批次')
plt.ylabel('良率')
plt.title('量产良率趋势图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
我的小技巧:移动平均的窗口大小很关键。窗口太小,平滑效果差;窗口太大,反应迟钝。我一般用5批或10批,具体看你的产线节奏。
4.1.2 用Plotly画交互式趋势图
如果你要给团队看,或者需要放大查看某个异常点,Plotly就派上用场了。鼠标悬停能看到具体数值,还能拖拽缩放。
import plotly.express as px
fig = px.line(df, x='批次', y=['良率', '移动平均'],
title='量产良率趋势图(交互版)',
labels={'value': '良率', 'variable': '指标'})
fig.add_hline(y=0.95, line_dash='dash', line_color='red',
annotation_text='良率下限')
fig.show()
嗯,这里要注意:Plotly生成的图是HTML文件,可以直接嵌入到你的测试报告中。我曾经把这种交互图发给产线经理,他直接在图上圈出异常点,沟通效率高了很多。
4.2 帕累托图:抓住主要矛盾
帕累托图,就是二八法则的图形化。80%的良率损失,往往来自20%的测试项。你想想看,与其眉毛胡子一把抓,不如集中精力解决那少数几个关键问题。
帕累托图由两部分组成:柱状图(各测试项的失效数量)和折线图(累计百分比)。
4.2.1 数据准备与绘图
# 模拟失效数据
fail_items = ['开路测试', '短路测试', '漏电流', '功能测试', '频率测试',
'温度测试', '电压测试', '其他']
fail_counts = [320, 210, 85, 45, 30, 18, 12, 8]
df_fail = pd.DataFrame({'测试项': fail_items, '失效数': fail_counts})
df_fail = df_fail.sort_values('失效数', ascending=False)
df_fail['累计百分比'] = df_fail['失效数'].cumsum() / df_fail['失效数'].sum() * 100
fig, ax1 = plt.subplots(figsize=(10, 5))
# 柱状图
ax1.bar(df_fail['测试项'], df_fail['失效数'], color='steelblue')
ax1.set_ylabel('失效数')
# 折线图
ax2 = ax1.twinx()
ax2.plot(df_fail['测试项'], df_fail['累计百分比'], 'ro-', linewidth=2)
ax2.set_ylabel('累计百分比 (%)')
ax2.axhline(y=80, color='gray', linestyle='--', label='80%线')
plt.title('失效帕累托图')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
避坑指南:我曾经犯过一个错误——直接用原始失效数画帕累托图,没按降序排列。结果累计折线乱跳,根本看不出二八原则。记住:一定要先排序,再画累计线。
4.3 箱线图:洞察数据分布
箱线图,是我个人非常喜欢的一种图。它能告诉你数据的中位数、四分位距、异常值。在量产测试中,我常用它来对比不同批次、不同机台、不同操作员的测试结果分布。
举个例子:你发现某个测试项良率偏低,但不知道是系统偏差还是随机波动。箱线图一看,如果两个批次的箱体完全不重叠,那就是有显著差异。
4.3.1 用Matplotlib画箱线图
# 模拟三个机台的测试数据
np.random.seed(10)
tester_a = np.random.normal(loc=1.0, scale=0.1, size=100)
tester_b = np.random.normal(loc=1.05, scale=0.12, size=100)
tester_c = np.random.normal(loc=0.98, scale=0.15, size=100)
data = [tester_a, tester_b, tester_c]
labels = ['机台A', '机台B', '机台C']
plt.figure(figsize=(8, 5))
bp = plt.boxplot(data, labels=labels, patch_artist=True,
showmeans=True, meanprops={'marker': 'D', 'markerfacecolor': 'red'})
# 给箱体上色
colors = ['#3498db', '#e74c3c', '#2ecc71']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
plt.title('不同机台测试值分布对比')
plt.ylabel('测试值 (V)')
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
解读技巧:箱线图的「须」代表1.5倍四分位距以外的数据。超出这个范围的点,我会标记为异常值,需要单独调查。但别急着剔除,有时候异常值恰恰暴露了设备故障。
4.3.2 用Plotly画交互式箱线图
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Box(y=tester_a, name='机台A', marker_color='#3498db'))
fig.add_trace(go.Box(y=tester_b, name='机台B', marker_color='#e74c3c'))
fig.add_trace(go.Box(y=tester_c, name='机台C', marker_color='#2ecc71'))
fig.update_layout(title='不同机台测试值分布对比(交互版)',
yaxis_title='测试值 (V)')
fig.show()
Plotly的箱线图有个好处:鼠标悬停能看到具体的四分位数、中位数、异常值个数。我在做机台比对报告时,经常用这个功能直接截图,省去了手动标注的麻烦。
4.4 三种图的适用场景对比
| 图表类型 | 核心用途 | X轴 | Y轴 | 我常用的场景 |
|---|---|---|---|---|
| 良率趋势图 | 监控良率随时间/批次的变化 | 时间/批次 | 良率 | 每日晨会看产线健康度 |
| 帕累托图 | 识别主要失效原因 | 测试项 | 失效数/累计% | 周度失效分析会议 |
| 箱线图 | 对比多组数据的分布差异 | 分组标签 | 测试值 | 机台比对、批次比对 |
4.5 本章知识体系
下面这张图,帮你理清三种可视化工具在量产测试分析中的定位和关系。
我的建议:刚开始学的时候,别贪多。先把Matplotlib的这三种图画熟练,再切换到Plotly做交互。一口吃不成胖子,但每天画一张图,一个月后你就是团队里的可视化高手。