99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代【干貨】Pyecharts的帕累托分析技術(shù)實現(xiàn),3步學(xué)會
【干貨】Pyecharts的帕累托分析技術(shù)實現(xiàn),3步學(xué)會
2025-02-28
收藏

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

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

一、帕累托分析原理與應(yīng)用

1.1 核心原理

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

具體實施步驟包含:

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

1.2 典型應(yīng)用場景

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

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

二、基于Pyecharts的技術(shù)實現(xiàn)

使用前需安裝,代碼運(yùn)行的pyecharts版本是2.0.5

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

2.1 環(huán)境配置與數(shù)據(jù)準(zhǔn)備

首先,我們需要導(dǎo)入Pyecharts中的Bar和Line圖表類,以及options類,用于實現(xiàn)對各個圖標(biāo)的配置,此外如果代碼需要在jupyter notebook中展示圖形還需要從globals中導(dǎo)入CurrentConfig, NotebookType做執(zhí)行環(huán)境的配置,對于新版本的jupyter notebook統(tǒng)一設(shè)置為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

# 定義原始數(shù)據(jù)
categories = ["產(chǎn)品質(zhì)量問題""送貨延遲""客戶服務(wù)不滿""價格不公""其他"]
counts = [40, 30, 20, 5, 5]

技術(shù)細(xì)節(jié)說明:

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

2.2 核心計算邏輯

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

計算過程解析:

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

2.3 可視化組件構(gòu)建

(1) 柱狀圖初始化

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

關(guān)鍵技術(shù)點:

  • 交互式提示工具配置增強(qiáng)數(shù)據(jù)可讀性

(2) 折線圖構(gòu)建

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()

視覺優(yōu)化設(shè)計:

  • 紅色粗線(width=4)提升視覺優(yōu)先級
  • 顯示數(shù)值標(biāo)簽輔助精確讀數(shù)

2.4 圖表合成與優(yōu)化

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

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

可以看到圖形很奇怪,因為折線圖對應(yīng)的數(shù)據(jù)與柱形圖對應(yīng)的數(shù)據(jù)量綱相差很大。那如何優(yōu)化?

bar = (
    Bar()
    .add_xaxis(categories)
    .add_yaxis("投訴次數(shù)", counts, yaxis_index=0) # 設(shè)置使用哪個y軸左邊的是第一個0  右邊的是第二個1
    # 優(yōu)化點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, # 設(shè)置使用哪個y軸左邊的是第一個0  右邊的是第二個1
        linestyle_opts=opts.LineStyleOpts(color="red", width=4),
        label_opts=opts.LabelOpts(is_show=True, color="red")
    )
)

bar.overlap(line)  

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

深度優(yōu)化說明:

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

2.5 輸出與展示

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

多環(huán)境支持:

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

三、實現(xiàn)效果與業(yè)務(wù)解讀

3.1 生成圖表分析

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

3.2 生產(chǎn)環(huán)境擴(kuò)展建議

  • 動態(tài)數(shù)據(jù)綁定:對接數(shù)據(jù)庫實時更新
  • 自動化排序:添加數(shù)據(jù)預(yù)處理模塊
  • 閾值標(biāo)注:添加80%參考線
  • 導(dǎo)出功能:集成報告生成模塊

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

四、完整代碼匯總

本實現(xiàn)方案通過Pyecharts高效構(gòu)建了交互式帕累托分析圖表,將技術(shù)實現(xiàn)與業(yè)務(wù)分析有機(jī)結(jié)合,為決策者提供直觀的數(shù)據(jù)支持。開發(fā)者可根據(jù)具體業(yè)務(wù)需求擴(kuò)展功能模塊,構(gòu)建完整的決策分析系統(tǒng)。繪制帕累托的流程相對固定,因此這些代碼也可以封裝為函數(shù)方便后續(xù)的復(fù)用。

# 完整實現(xiàn)代碼
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("投訴次數(shù)", counts, yaxis_index=0) # 設(shè)置使用哪個y軸左邊的是第一個0  右邊的是第二個1
        # 優(yōu)化點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, # 設(shè)置使用哪個y軸左邊的是第一個0  右邊的是第二個1
            linestyle_opts=opts.LineStyleOpts(color="red", width=4),
            label_opts=opts.LabelOpts(is_show=True, color="red")
        )
    )

    bar.overlap(line)  

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

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

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

數(shù)據(jù)分析咨詢請掃描二維碼

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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }