04 帕累托图 Pareto:10 个案例说明它能展示什么
这类图能直观展示什么
帕累托图是“降序柱状图 + 累计占比曲线”的组合:柱按贡献从大到小排列,右轴曲线是逐项累加后的百分比。它回答的是“哪些因素值得先动手”。
它能直观展示四件事:① 主次排序(最左边几根就是关键少数);② 累计到 80% 需要几项(二八法则验证);③ 曲线由陡变缓的拐点在哪(关键与次要的分界);④ 达标需要做到第几项(与目标线求交)。注意:排序结果对“分类口径”极敏感,换一种归类方式可能得出另一套主次。
- 柱为降序排列的单项值(左轴),折线为累计占比(右轴),二者的组合才是帕累托图。
10 个案例
04-1 线损因素:主次一眼排出,不必逐项算
柱按贡献降序排列,最左侧三根就占了总损耗的大半。这张图的核心作用是把"六个因素"压缩成"前三个值得投入、后三个可以先放"的判断,排序本身就是结论。

04-2 二八法则验证:80% 线交叉处在第几项
累计曲线与 80% 水平线的交点落在第 4 项附近,说明"20% 的因素造成 80% 的问题"这条经验在这批数据上基本成立。参考线一画出来,验证就变成读交点,不必逐项累加。

04-3 累计拐点:曲线由陡变缓处即分界
累计曲线在前三项近乎竖直上升,第四项起明显变平——这个"折膝点"就是关键少数与次要多数的分界。拐点位置比 80% 线更稳健,因为它不依赖固定阈值。

04-4 改进优先级:用阴影圈定要处理的范围
把累计到 80% 的那几项用底色标出来,等于直接给出"这一轮改造做这几项"的清单。帕累托图的实用价值往往就在这一层:不是描述现状,而是划定行动边界。

04-5 双场景对比:排序一致才说明是共性规律
城网与农网两个场景的因素排序几乎重合(前三项相同),说明这三项是普遍矛盾;若排序差别很大,就该按场景分别制定措施,而不是套用同一套方案。

04-6 两年排序变化:措施见效的表现是排序重排
与上年相比,"设备老化"从第一降到第三、"外力破坏"升到首位,说明老化治理已经见效、矛盾转移到外部因素上。只看总量的下降看不出这种结构性变化。

04-7 长尾合并:把"其他"压成一项才看得清主线
二十余项细碎原因如果全部列出,柱子会碎成一片、看不出主次。按贡献合并尾部后,前五项占据了绝大部分,"其他"只占很小一格——这也是画帕累托前的必备整理步骤。

04-8 目标线交叉:要达到目标需处理到第几项
把"目标降损量"画成水平线,柱顶累积到这条线所需的项数就是最少工作量。这里需处理前 4 项才能达标,若只做前 2 项则差 0.3 个百分点——这张图把"做多少才够"变成了可读的几何问题。

04-9 次数与损失两个口径:排序可能完全不同
按"故障次数"排,外力破坏第一;按"停电损失"排,设备老化反而第一。同一批事件的两种计量口径给出两个不同的"首要矛盾",这说明选口径本身就是决策的一部分,只画一张帕累托容易得出片面结论。

04-10 分类维度切换:同批数据按设备看与按原因看
同一批停电事件,按设备归并时"电缆"最突出,按原因归并时"老化"最突出。帕累托图的分类维度决定了结论指向"换哪台设备"还是"改哪类工艺",画之前先想清楚要回答哪个问题。

代码
以下 10 个函数取自 code/帕累托图案例261107.py。版式(宋体 + Times、10 磅、刻度朝内四边、图内无标题、留白自检)由 code/公共配置261107.py 的 setup_cn_style() 与 save() 统一提供,箱线与小提琴的样式另由其中的 box()、violin() 封装。
# 摘自 code/帕累托图案例261107.py
def pa_01():
"""线损因素:主次一眼排出,不必逐项算。
柱按贡献降序排列,最左侧三根就占了总损耗的大半。这张图的核心作用是把"六个因素"压缩成
"前三个值得投入、后三个可以先放"的判断,排序本身就是结论。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["三相不平衡", "无功不足", "导线截面小", "接户线过长", "表计误差", "其他"]
vals = [186, 142, 108, 74, 42, 28]
_pareto(fig, ax, items, vals, "损耗 " + IT["P"] + " / kW", ylim_top=210)
save(fig, "04_帕累托图", "04_帕累托图_线损因素排序")
def pa_02():
"""二八法则验证:80% 线交叉处在第几项。
累计曲线与 80% 水平线的交点落在第 4 项附近,说明"20% 的因素造成 80% 的问题"这条经验
在这批数据上基本成立。参考线一画出来,验证就变成读交点,不必逐项累加。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["外力破坏", "设备老化", "雷击", "过负荷", "施工质量", "其他"]
vals = [126, 98, 64, 38, 26, 14]
names, v, cum, ax2 = _pareto(fig, ax, items, vals, "故障次数", ylim_top=142)
ax2.axhline(80, color=C4, lw=0.7, ls=":")
k = int(np.argmax(cum >= 80))
ax2.axvline(k, color=C2, lw=0.7, ls="--")
text_in(ax2, len(v) - 0.55, 82, "80% 参考线", color=C4, ha="right")
save(fig, "04_帕累托图", "04_帕累托图_二八法则验证")
def pa_03():
"""累计拐点:曲线由陡变缓处即分界。
累计曲线在前三项近乎竖直上升,第四项起明显变平——这个"折膝点"就是关键少数与次要多数
的分界。拐点位置比 80% 线更稳健,因为它不依赖固定阈值。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["变频器", "整流装置", "UPS", "电弧炉", "荧光灯", "其他"]
vals = [34, 28, 16, 14, 8, 5]
_pareto(fig, ax, items, vals, "贡献占比 / %", ylim_top=38, marker="s")
save(fig, "04_帕累托图", "04_帕累托图_累计拐点")
def pa_04():
"""改进优先级:用阴影圈定要处理的范围。
把累计到 80% 的那几项用底色标出来,等于直接给出"这一轮改造做这几项"的清单。
帕累托图的实用价值往往就在这一层:不是描述现状,而是划定行动边界。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["导线更换", "无功补偿", "配变增容", "负荷转移", "计量改造", "其他"]
vals = [1.42, 0.96, 0.74, 0.52, 0.31, 0.18]
names, v, cum, ax2 = _pareto(fig, ax, items, vals,
"可降损量 / %", ylim_top=1.75, marker="^")
k = int(np.argmax(cum >= 80))
ax.axvspan(-0.5, k + 0.5, color=C3, alpha=0.12, linewidth=0)
save(fig, "04_帕累托图", "04_帕累托图_改进优先级圈定")
def pa_05():
"""双场景对比:排序一致才说明是共性规律。
城网与农网两个场景的因素排序几乎重合(前三项相同),说明这三项是普遍矛盾;
若排序差别很大,就该按场景分别制定措施,而不是套用同一套方案。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["三相不平衡", "无功不足", "导线细", "接户线长", "表计误差", "其他"]
urban = np.array([186, 142, 108, 74, 42, 28])
rural = np.array([210, 128, 132, 96, 36, 22])
x = np.arange(len(items))
ax.bar(x - 0.19, urban, width=0.36, color=C5, edgecolor="0.35",
linewidth=0.5, label="城网")
ax.bar(x + 0.19, rural, width=0.36, color=C1, edgecolor="0.35",
linewidth=0.5, label="农网")
ax.set_xticks(x)
ax.set_xticklabels(items, rotation=20, ha="right", rotation_mode="anchor")
ax.set_xlabel("因素")
ax.set_ylabel("损耗 " + IT["P"] + " / kW")
ax.set_ylim(0, 250)
legend(ax, "upper right", ncol=2)
save(fig, "04_帕累托图", "04_帕累托图_双场景排序对比")
def pa_06():
"""两年排序变化:措施见效的表现是排序重排。
与上年相比,"设备老化"从第一降到第三、"外力破坏"升到首位,说明老化治理已经见效、
矛盾转移到外部因素上。只看总量的下降看不出这种结构性变化。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["外力破坏", "设备老化", "雷击", "过负荷", "施工质量"]
last = np.array([92, 128, 58, 34, 22])
this = np.array([126, 98, 62, 38, 26])
x = np.arange(len(items))
ax.bar(x - 0.19, last, width=0.36, color=C6, edgecolor="0.35",
linewidth=0.5, label="上年")
ax.bar(x + 0.19, this, width=0.36, color=C1, edgecolor="0.35",
linewidth=0.5, label="本年")
ax.set_xticks(x)
ax.set_xticklabels(items, rotation=20, ha="right", rotation_mode="anchor")
ax.set_xlabel("故障原因")
ax.set_ylabel("故障次数")
ax.set_ylim(0, 148)
legend(ax, "upper right", ncol=2)
save(fig, "04_帕累托图", "04_帕累托图_两年排序变化")
def pa_07():
"""长尾合并:把"其他"压成一项才看得清主线。
二十余项细碎原因如果全部列出,柱子会碎成一片、看不出主次。按贡献合并尾部后,
前五项占据了绝大部分,"其他"只占很小一格——这也是画帕累托前的必备整理步骤。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["接触不良", "绝缘老化", "机械卡涩", "二次回路", "电源模块",
"软件死机", "通信中断", "其他"]
vals = [86, 68, 44, 31, 19, 9, 6, 8]
_pareto(fig, ax, items, vals, "缺陷次数", ylim_top=100, marker="D")
save(fig, "04_帕累托图", "04_帕累托图_长尾合并")
def pa_08():
"""目标线交叉:要达到目标需处理到第几项。
把"目标降损量"画成水平线,柱顶累积到这条线所需的项数就是最少工作量。
这里需处理前 4 项才能达标,若只做前 2 项则差 0.3 个百分点——
这张图把"做多少才够"变成了可读的几何问题。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["导线更换", "无功补偿", "配变增容", "负荷转移", "计量改造"]
vals = [1.42, 0.96, 0.74, 0.52, 0.31]
names, v, cum, ax2 = _pareto(fig, ax, items, vals, "可降损量 / %",
ylim_top=1.75, marker="o")
target = 3.0 / v.sum() * 100
ax2.axhline(target, color=C2, lw=0.9, ls="--")
k = int(np.argmax(cum >= target))
ax2.axvline(k, color=C2, lw=0.7, ls="--")
text_in(ax2, len(v) - 0.55, target + 3, "目标累计 3.0%", color=C2, ha="right")
save(fig, "04_帕累托图", "04_帕累托图_目标线交叉")
def pa_09():
"""次数与损失两个口径:排序可能完全不同。
按"故障次数"排,外力破坏第一;按"停电损失"排,设备老化反而第一。
同一批事件的两种计量口径给出两个不同的"首要矛盾",这说明选口径本身就是决策的一部分,
只画一张帕累托容易得出片面结论。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["外力破坏", "设备老化", "雷击", "过负荷", "施工质量"]
cnt = np.array([126, 98, 64, 38, 26])
loss = np.array([142, 218, 96, 52, 34])
x = np.arange(len(items))
ax.bar(x - 0.19, cnt, width=0.36, color=C5, edgecolor="0.35",
linewidth=0.5, label="按次数")
ax.bar(x + 0.19, loss, width=0.36, color=C3, edgecolor="0.35",
linewidth=0.5, label="按停电损失")
ax.set_xticks(x)
ax.set_xticklabels(items, rotation=20, ha="right", rotation_mode="anchor")
ax.set_xlabel("故障原因")
ax.set_ylabel("归一化占比 / %")
ax.set_ylim(0, 250)
legend(ax, "upper right", ncol=2)
save(fig, "04_帕累托图", "04_帕累托图_双口径排序差异")
def pa_10():
"""分类维度切换:同批数据按设备看与按原因看。
同一批停电事件,按设备归并时"电缆"最突出,按原因归并时"老化"最突出。
帕累托图的分类维度决定了结论指向"换哪台设备"还是"改哪类工艺",
画之前先想清楚要回答哪个问题。
"""
fig, ax = new_fig(left=0.19, bottom=0.26, right=0.87)
items = ["电缆", "开关柜", "变压器", "架空线", "避雷器"]
bydev = np.array([128, 96, 72, 58, 24])
bycause = np.array([112, 88, 96, 52, 30])
x = np.arange(len(items))
ax.bar(x - 0.19, bydev, width=0.36, color=C1, edgecolor="0.35",
linewidth=0.5, label="按设备分类")
ax.bar(x + 0.19, bycause, width=0.36, color=C6, edgecolor="0.35",
linewidth=0.5, label="按原因分类")
ax.set_xticks(x)
ax.set_xticklabels(items, rotation=20, ha="right", rotation_mode="anchor")
ax.set_xlabel("分类项")
ax.set_ylabel("停电时户数 / (户·h)")
ax.set_ylim(0, 152)
legend(ax, "upper right", ncol=2)
save(fig, "04_帕累托图", "04_帕累托图_分类维度切换")
浙公网安备 33010602011771号