04 帕累托图 Pareto:10 个案例说明它能展示什么

这类图能直观展示什么

帕累托图是“降序柱状图 + 累计占比曲线”的组合:柱按贡献从大到小排列,右轴曲线是逐项累加后的百分比。它回答的是“哪些因素值得先动手”。

它能直观展示四件事:① 主次排序(最左边几根就是关键少数);② 累计到 80% 需要几项(二八法则验证);③ 曲线由陡变缓的拐点在哪(关键与次要的分界);④ 达标需要做到第几项(与目标线求交)。注意:排序结果对“分类口径”极敏感,换一种归类方式可能得出另一套主次。

  • 柱为降序排列的单项值(左轴),折线为累计占比(右轴),二者的组合才是帕累托图。

10 个案例

04-1 线损因素:主次一眼排出,不必逐项算

柱按贡献降序排列,最左侧三根就占了总损耗的大半。这张图的核心作用是把"六个因素"压缩成"前三个值得投入、后三个可以先放"的判断,排序本身就是结论。

线损因素:主次一眼排出,不必逐项算

04-2 二八法则验证:80% 线交叉处在第几项

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

二八法则验证: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_帕累托图_分类维度切换")
posted on 2026-11-08 00:12  小青蛙电气  阅读(0)  评论(0)    收藏  举报