iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用・114 年第二次・L22・第 46 題

seaborn barplot + pd.melt 比較四地區銷售比例

原題

團隊希望比較北美、歐洲、日本及其他地區的整體銷售比例,並使用 seaborn 套件以長條圖的形式進行可視化分析。請選出能正確顯示這些地區銷售總額比例的程式碼。

白話

資料集有四個地區銷售欄位(NA_Sales、EU_Sales、JP_Sales、Other_Sales),現在要用 seaborn 畫一張長條圖,x 軸是各地區名稱,y 軸是該地區的銷售總額,讓各地區的整體銷售量一目了然。

問你:哪一行程式碼能正確用 seaborn 長條圖呈現四個地區的銷售總額?

一句話總結

要用 seaborn 的 barplot 比較四個地區的銷售總額,必須先用 pd.melt 把四個寬欄轉換成長格式,再傳給 sns.barplot 並用 estimator=sum 指定聚合為加總。countplot、lineplot、histplot 都不是正確的工具。

情境

先感受問題:seaborn 需要「長格式」資料

遊戲研究公司的分析師小凱要比較四個地區的銷售量。資料集目前是「寬格式」:

寬格式(原始):

Name NA_Sales EU_Sales JP_Sales Other_Sales

Wii Sports 41.49 29.02 3.77 8.46

Mario Kart 15.85 12.88 3.79 3.31

問題:seaborn 的 barplot 需要「長格式」資料,也就是 x 欄是地區名稱(variable),y 欄是銷售數值(value)。寬格式四個地區欄位無法直接傳給 seaborn。

解法:用 pd.melt 把寬格式轉成長格式,再傳給 sns.barplot 並用 estimator=sum 把同一地區的所有值加總成一根柱子。

長格式(melt 後):

variable value

NA_Sales 41.49

NA_Sales 15.85

...

EU_Sales 29.02

EU_Sales 12.88

...

舊方法

為什麼其他三種寫法都行不通

  1. countplot 不算數值加總:sns.countplot 計算「每個類別出現幾次」(計數),不計算銷售額數值的加總。即使能傳入欄位名稱,它也只計算頻率,不是銷售總額。而且 x=["NA_Sales",..] 傳入 Python 列表而非欄位名稱的用法本身就不符合 seaborn API。
  2. lineplot 是折線圖,y 不能是多欄列表:sns.lineplot 畫的是折線,適合時間序列,不是地區比較的柱狀圖。而且 y=["NA_Sales","EU_Sales",..] 傳入列表也不符合 seaborn 的 API(y 只接受單一欄位名稱)。
  3. histplot 是直方圖,顯示分佈而非總額:sns.histplot 畫的是「數值分佈的頻率」(例如各遊戲的 NA_Sales 分佈長什麼樣),不是四個地區的銷售總額比較。x 軸是銷售額的值域,不是地區名稱。
  4. seaborn 的 barplot 預設是 estimator=mean:不加 estimator=sum 時,barplot 預設顯示每個地區的「平均值」(每款遊戲平均賣多少),而非「總額」(所有遊戲加起來)。要顯示總額必須明確指定 estimator=sum。
  5. 寬格式不能直接用於多欄比較:seaborn 的設計哲學是長格式(tidy data):每行是一個觀察值,每欄是一個變數。要比較多個欄位,必須先 melt 成長格式再畫圖。

新方法

melt 轉長格式,barplot + estimator=sum 搞定

小凱的正確程式碼:

melted = pd.melt(data, value_vars=["NA_Sales","EU_Sales","JP_Sales","Other_Sales"])

# melted 有兩欄:variable(地區名稱)和 value(銷售額)

sns.barplot(x="variable", y="value", data=melted, estimator=sum)

# x 軸:地區名稱(NA_Sales/EU_Sales/...)

# y 軸:每個地區的銷售額加總

# estimator=sum:指定柱子高度為加總而非預設的平均值

結果:四根柱子,x 軸是地區名稱,y 軸是全球各地區的銷售總額(百萬份),可直接比較各地區市場規模。這就是選項 C 講的:sns.barplot(x="variable", y="value", data=pd.melt(...), estimator=sum)。

錯選項

為什麼其他選項是錯的

Asns.countplot

字面在說什麼

用 countplot 傳入四個欄位名稱,比較各地區。

為什麼不對

countplot 計算的是「某個類別欄位中每個值出現幾次」,不計算數值加總。而且 x=["NA_Sales","EU_Sales",..] 傳入 Python 列表根本不符合 seaborn API(x 要接受欄位名稱字串,不是欄位名稱的列表)。執行會報錯,完全不能用。

誰會選錯

把 countplot 和 barplot 搞混,以為兩個都能畫「各類別的數量/總額」長條圖的人。

Bsns.lineplot

字面在說什麼

用 lineplot 以平台為 x 軸,畫四個地區的銷售折線圖。

為什麼不對

lineplot 畫折線,不是長條圖。y=["NA_Sales","EU_Sales",..] 傳入列表也不符合 seaborn 的標準 API(seaborn 的 y 參數只接受單一欄位名稱字串)。而且題目要的是各地區整體銷售比較(4 根柱子),不是按 Platform 分組的折線趨勢。

誰會選錯

看到「視覺化」就想到折線圖,或不熟悉 seaborn API 規範的人。

Dsns.histplot

字面在說什麼

用 histplot 傳入四個地區欄位的 DataFrame,畫分佈圖。

為什麼不對

histplot 畫的是「數值分佈的直方圖」,x 軸是銷售額的值(0~50 百萬份等),y 軸是該值範圍內的遊戲數量。題目要的是每個地區的銷售總額比較(4 根柱子,x 軸是地區名稱),histplot 完全是不同的圖表類型,回答不同的問題。

誰會選錯

只要「能傳入多欄 DataFrame」就選的人,沒有判斷 histplot 回答的問題(分佈)和題目要求的問題(各地區總銷售比較)不同。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

出處:iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用 第 46 題

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。