熱線電話:13121318867

登錄
首頁大數據時代【干貨】Pyecharts的帕累托分析技術實現,3步學會
【干貨】Pyecharts的帕累托分析技術實現,3步學會
2025-02-28
收藏

以下的文章內容來源于張彥存老師的專欄,如果您想閱讀專欄《Python 數據可視化 18 講(PyEcharts、Matplotlib、Seaborn)》,點擊下方鏈接

https://edu.cda.cn/goods/show/3842?targetId=6751&preview=0

一、帕累托分析原理與應用

1.1 核心原理

帕累托分析(Pareto Analysis)源于經濟學家維爾弗雷多·帕累托提出的"二八法則",其核心原理是通過識別導致80%結果的20%關鍵因素,幫助決策者聚焦資源解決主要矛盾。

具體實施步驟包含:

  • 數據收集與分類
  • 按影響程度降序排列
  • 計算累計百分比
  • 識別關鍵因素(通常為累計占比70-80%的前端因素)

1.2 典型應用場景

在管理和質量控制領域,帕累托分析(Pareto Analysis)是一種決策工具,用于識別少數重要因素對總體影響的程度。除此之外還可以有如下應用:

  • 供應鏈管理:分析庫存積壓主因
  • 客戶投訴分析:定位核心服務問題
  • 銷售優化:聚焦高貢獻產品線
  • 故障排查:鎖定高頻故障點 今天我們基于簡單的實驗數據,使用Python中的Pyecharts庫來開發一個帕累托分析圖

二、基于Pyecharts的技術實現

使用前需安裝,代碼運行的pyecharts版本是2.0.5

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts==2.0.5

2.1 環境配置與數據準備

首先,我們需要導入Pyecharts中的Bar和Line圖表類,以及options類,用于實現對各個圖標的配置,此外如果代碼需要在jupyter notebook中展示圖形還需要從globals中導入CurrentConfig, NotebookType做執行環境的配置,對于新版本的jupyter notebook統一設置為NotebookType.JUPYTER_LAB。

from pyecharts.charts import Bar, Line
from pyecharts import options as opts

# from pyecharts.globals import CurrentConfig, NotebookType
# CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB

# 定義原始數據
categories = ["產品質量問題""送貨延遲""客戶服務不滿""價格不公""其他"]
counts = [40, 30, 20, 5, 5]

技術細節說明:

  • 需確保數據已按降序排列(本示例已預處理)
  • 累計百分比計算需基于有序數據

2.2 核心計算邏輯

total_counts = sum(counts)  # 計算總量
cumulative_percents = [sum(counts[:i+1])/total_counts for i in range(len(counts))]  # 累進計算

計算過程解析:

  • sum(counts)獲取總投訴量100次
  • 列表推導式逐項累加:40/100=0.4 → (40+30)/100=0.7 → ... → 1.0
  • 輸出結果:[0.4, 0.7, 0.9, 0.95, 1.0]

2.3 可視化組件構建

(1) 柱狀圖初始化

bar = (
    Bar()
    .add_xaxis(categories)
    .add_yaxis("投訴次數", counts)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="帕累托分析圖"),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross")
    )
)
bar.render_notebook()

關鍵技術點:

  • 交互式提示工具配置增強數據可讀性

(2) 折線圖構建

line = (
    Line()
    .add_xaxis(categories)
    .add_yaxis(
        "累計百分比"
        cumulative_percents, 
        linestyle_opts=opts.LineStyleOpts(color="red", width=4),
        label_opts=opts.LabelOpts(is_show=True, color="red")
    )
)
line.render_notebook()

視覺優化設計:

  • 紅色粗線(width=4)提升視覺優先級
  • 顯示數值標簽輔助精確讀數

2.4 圖表合成與優化

帕累托圖需將以上兩張圖組合在一起,可以使用overlap實現

bar.overlap(line) # 圖層疊加
bar.render_notebook()

可以看到圖形很奇怪,因為折線圖對應的數據與柱形圖對應的數據量綱相差很大。那如何優化?

bar = (
    Bar()
    .add_xaxis(categories)
    .add_yaxis("投訴次數", counts, yaxis_index=0) # 設置使用哪個y軸左邊的是第一個0  右邊的是第二個1
    # 優化點1 添加副y軸
    .extend_axis(
        yaxis=opts.AxisOpts(
            type_="value"
            name="累計百分比",
            min_=0.3, 
            max_=1.1,
            interval=0.2
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="帕累托分析圖"),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross")
    )
)

line = (
    Line()
    .add_xaxis(categories)
    .add_yaxis(
        "累計百分比"
        cumulative_percents, 
        yaxis_index=1, # 設置使用哪個y軸左邊的是第一個0  右邊的是第二個1
        linestyle_opts=opts.LineStyleOpts(color="red", width=4),
        label_opts=opts.LabelOpts(is_show=True, color="red")
    )
)

bar.overlap(line)  

# 調整圖層渲染順序不然折線圖被柱形圖遮擋
bar.options["series"][1]["z"] = 1  折線圖
bar.options["series"][0]["z"] = 0  柱狀圖
bar.render_notebook()

深度優化說明:

  • extend_axis創建次坐標軸,范圍設置為30%-110%以留出視覺緩沖
  • yaxis_index=0指定主坐標軸
  • yaxis_index=1綁定次坐標軸
  • overlap()實現雙坐標系疊加
  • z參數控制圖層層級(數值越大顯示越上層)
  • 默認柱狀圖在前會遮擋折線,故需調整層序

2.5 輸出與展示

# bar.load_javascript() # 最新版jupyter notebook需要這樣
bar.render_notebook()  # Jupyter內嵌展示
# bar.render("pareto.html")  # 生成獨立HTML文件

多環境支持:

  • Jupyter環境使用render_notebook()
  • 獨立運行環境建議輸出HTML文件
  • 可通過options繼續添加更多交互配置

三、實現效果與業務解讀

3.1 生成圖表分析

帕累托分析效果圖
帕累托分析效果圖
  • 前兩項(質量+送貨)占比70%,符合關鍵因素標準
  • 累計曲線斜率變化點指示改善閾值
  • 最后兩項僅占10%,可暫緩處理

3.2 生產環境擴展建議

  • 動態數據綁定:對接數據庫實時更新
  • 自動化排序:添加數據預處理模塊
  • 閾值標注:添加80%參考線
  • 導出功能:集成報告生成模塊

大家如果覺得自己的可視化技能訓練的不錯了,可以實操起來。

四、完整代碼匯總

本實現方案通過Pyecharts高效構建了交互式帕累托分析圖表,將技術實現與業務分析有機結合,為決策者提供直觀的數據支持。開發者可根據具體業務需求擴展功能模塊,構建完整的決策分析系統。繪制帕累托的流程相對固定,因此這些代碼也可以封裝為函數方便后續的復用。

# 完整實現代碼
def get_plt(categories,counts):
    import pandas as pd
    df = pd.DataFrame({"categories":categories,"counts":counts})
    categories = list(df.sort_values("counts")["categories"])
    counts = list(df.sort_values("counts")["counts"]) 
    from pyecharts.charts import Bar, Line
    from pyecharts import options as opts
    bar = (
        Bar()
        .add_xaxis(categories)
        .add_yaxis("投訴次數", counts, yaxis_index=0) # 設置使用哪個y軸左邊的是第一個0  右邊的是第二個1
        # 優化點1 添加副y軸
        .extend_axis(
            yaxis=opts.AxisOpts(
                type_="value"
                name="累計百分比",
                min_=0.3, 
                max_=1.1,
                interval=0.2
            )
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="帕累托分析圖"),
            tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross")
        )
    )

    line = (
        Line()
        .add_xaxis(categories)
        .add_yaxis(
            "累計百分比"
            cumulative_percents, 
            yaxis_index=1, # 設置使用哪個y軸左邊的是第一個0  右邊的是第二個1
            linestyle_opts=opts.LineStyleOpts(color="red", width=4),
            label_opts=opts.LabelOpts(is_show=True, color="red")
        )
    )

    bar.overlap(line)  

    # 調整圖層渲染順序不然折線圖被柱形圖遮擋
    bar.options["series"][1]["z"] = 1  折線圖
    bar.options["series"][0]["z"] = 0  柱狀圖
    return bar

以上的文章內容來源于張彥存老師的專欄,如果您想閱讀專欄《Python 數據可視化 18 講(PyEcharts、Matplotlib、Seaborn)》,點擊下方鏈接

https://edu.cda.cn/goods/show/3842?targetId=6751&preview=0

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢