iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用

pandas groupby + sum 畫各平台全球銷售總額長條圖

原題 45

為了觀察各遊戲平台的市場表現,分析師想要統計每個平台的全球銷售總額,並以長條圖呈現。請選出最能正確實現此分析的程式碼。

白話

遊戲銷售資料集有 Platform 欄和 Global_Sales 欄,分析師要把相同平台的所有遊戲銷售額加總,然後畫成長條圖,讓每個平台佔一根柱子,柱子高度代表該平台的全球銷售總額(加總)。

問你:哪一行程式碼能正確計算每個平台的全球銷售總額(不是數量、不是平均)並以長條圖呈現?

點選你的答案。

01 總結

一句話總結

要統計每個平台的全球銷售「總額」並畫長條圖,正確寫法是 data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar"):groupby 按平台分組,sum() 加總每組的銷售額,plot(kind="bar") 畫長條圖

02 情境

先感受問題:同一平台的遊戲銷售要加起來

遊戲研究公司分析師小凱要做各平台市場表現比較圖。資料集有 2000 行,每行是一款遊戲,Wii 平台有 300 款,PS4 有 200 款。

她要的結果是:

Platform Global_Sales(總額)
PS4 237.4 百萬份
Wii 928.1 百萬份
X360 491.2 百萬份
...

這需要三個步驟:按 Platform 分組(groupby)→ 對每組的 Global_Sales 加總(sum)→ 畫長條圖(plot bar)。三步合在一行就是選項 A。

核心陷阱在於「總額」vs「數量」vs「平均」:count 算的是每個平台有幾款遊戲(數量),value_counts 也是數量,mean 是平均銷售額。只有 sum 才是題目要的「銷售總額」。

03 對照

四種聚合方式各算什麼

  1. sum():加總。把同一平台所有遊戲的 Global_Sales 加在一起,得到該平台的累積銷售量。這是題目要的「銷售總額」。Wii 有 300 款遊戲,把所有款銷售額加總 = Wii 的市場貢獻。
  2. count():計數。算每個平台有幾筆資料(幾款遊戲),不考慮銷售額的數值。Wii 有 300 款 → count = 300,但這是「遊戲數量」不是「銷售額」。
  3. value_counts():計數(另一種寫法)。直接對 Platform 欄做值計數,同樣算「每個平台出現幾次(幾款遊戲)」,結果和 groupby + count 類似,但更簡潔,也不是「銷售額」。
  4. mean():平均。算每個平台所有遊戲的平均銷售額,反映的是「平均一款遊戲賣多少」,而非總市場規模。Wii 平均銷售額高,不代表 Wii 的市場份額大(可能只有少數暢銷遊戲拉高均值)。
  5. 混淆「排行榜順序」和「銷售總額」:資料集本身已按 Global_Sales 降序排列,但前幾名的平台不一定是總銷售額最高的,需要 groupby + sum 才能算出真正的平台累積表現。
04 解法

groupby + sum + plot 三步連鎖

小凱的一行程式碼:

data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar")

分解來看:
data.groupby("Platform") → 把資料按 Platform 分成若干群組
["Global_Sales"] → 鎖定要聚合的欄位
.sum() → 對每個群組的 Global_Sales 做加總
.plot(kind="bar") → 把 Series(平台名→銷售總額)畫成長條圖

結果是一張 x 軸為各平台名稱、y 軸為全球銷售總額(百萬份)的長條圖,直觀呈現哪個平台累積銷售量最高。這就是選項 A 講的:data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar")

技術版:groupby-aggregate-plot 流程精讀

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

Step 1 純故事版

想像有一大袋混在一起的紙鈔,每張紙鈔上面寫了平台名稱(Wii/PS4/X360)和面額(銷售額)。groupby 是把它們分成幾堆(一堆 Wii、一堆 PS4...),sum 是算每堆的總金額,plot 是把每堆的金額畫成柱子。count 是算每堆有幾張紙鈔(不管面額多少),mean 是算每堆的平均面額。

Step 2 中文 ↔ 程式碼對照
白話步驟程式碼
按平台分組data.groupby("Platform")
取出 Global_Sales 欄["Global_Sales"]
每組加總.sum()
畫長條圖.plot(kind="bar")
完整一行data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar")
Step 3 符號角色表
groupby(col)
按指定欄位的值把資料分成若干群組,返回 GroupBy 物件,後面接聚合函式才能得到結果。
[col](方括號選欄)
從 GroupBy 物件中選出要聚合的欄位,返回 SeriesGroupBy 物件。
.sum()
加總每個群組中選定欄位的值,返回一個 Series(索引為分組鍵,值為加總結果)。
.count()
計算每個群組中非缺失值的個數(筆數),不是數值加總。
.plot(kind="bar")
pandas Series 的快速繪圖方法,kind="bar" 畫直立長條圖,kind="barh" 畫水平長條圖。
Step 4 完整公式對應

本題沒有數學公式,核心是聚合操作的語意:

  • sum():Σ Global_Sales,對每個 Platform 的所有遊戲銷售額加總
  • mean():(Σ Global_Sales) / n,每個 Platform 的平均銷售額
  • count():n,每個 Platform 有幾筆資料(幾款遊戲)
Step 5 自我複述
  1. groupby() 後必須接什麼才能得到結果?直接 print(data.groupby("Platform")) 會得到什麼?
  2. sum() 和 count() 的根本差別是什麼?分別回答哪種商業問題?
  3. value_counts() 和 groupby().count() 算出來的結果一樣嗎?
  4. 如果要同時算每個平台的總銷售額和遊戲數量,怎麼用 agg() 一次做到?
  5. plot(kind="bar") 和 plot(kind="barh") 有什麼差?什麼時候用水平長條圖?
05 陷阱

為什麼其他選項是錯的

選項 B groupby + count()

字面在說什麼:按平台分組後,計算每個平台的 Global_Sales 筆數,畫長條圖。

為什麼不對:count() 算的是「這個平台有幾款遊戲(幾筆資料)」,不是「銷售額加總」。題目要的是銷售總額(Sales amount),不是遊戲數量(Game count)。一個平台可能遊戲數很多但都賣得不好,count 高不代表銷售總額高。

誰會選錯:不確定 count 和 sum 差別的人,看到「統計每個平台」就選了 count,混淆了「統計數量」和「加總數值」。

選項 C value_counts()

字面在說什麼:對 Platform 欄做值計數,把每個平台出現的次數畫成長條圖。

為什麼不對:value_counts() 直接對 Platform 欄操作,算的是每個平台名稱出現幾次(有幾款遊戲),同樣是「數量」而非「銷售額」。而且 value_counts() 的語法根本沒有涉及 Global_Sales 欄,完全沒有計算銷售額的部分。

誰會選錯:只想簡化程式碼,用 value_counts() 代替 groupby,但沒有意識到這兩種操作的語意完全不同。

選項 D groupby + mean()

字面在說什麼:按平台分組後,計算每個平台的平均銷售額,畫長條圖。

為什麼不對:mean() 算的是「每款遊戲的平均銷售額」,反映的是每個平台的典型遊戲銷售表現,而不是整個平台的市場規模。Wii Sports 等超大暢銷款會拉高 Wii 的平均值,讓平均看起來比實際累積銷售更高。題目要的是「市場表現(市場規模)」,應該用加總(sum)而非平均(mean)。

誰會選錯:把「市場表現」理解成「平均表現」的人,或者不清楚 sum 和 mean 在分析意義上的差別。

06 變形

同個考點下次怎麼變形

變形 1 邊界

直覺:如果想同時看每個平台的「總銷售額」和「遊戲數量」,一行能做到嗎?

答案:可以用 agg():data.groupby("Platform")["Global_Sales"].agg(['sum', 'count'])。回傳一個 DataFrame,有兩欄分別是 sum 和 count,可以直接 .plot(kind="bar") 畫並列長條圖(預設 subplots=False,兩欄畫在同一張圖上)。

變形 2 反例

直覺:如果想找「銷售總額最高的前 5 個平台」,只用 groupby + sum 夠嗎?

答案:不夠,需要加 .nlargest(5):data.groupby("Platform")["Global_Sales"].sum().nlargest(5).plot(kind="bar")。nlargest(5) 從 Series 中取出值最大的前 5 個,讓長條圖只顯示最重要的平台,不被幾十個小平台淹沒。

變形 3 升級版

直覺:想把各平台銷售總額從高到低排序後再畫圖,怎麼做?

答案:加 .sort_values(ascending=False):data.groupby("Platform")["Global_Sales"].sum().sort_values(ascending=False).plot(kind="bar")。預設 ascending=True(從小到大),加 ascending=False 讓長條圖從左到右是銷售額由高到低,視覺上更容易比較。

變形 4 跨領域

直覺:groupby + sum 在業務分析中有哪些常見的應用場景?

答案:電商:按商品類別統計總銷售額(groupby 類別 + sum 銷售額)。金融:按月份統計總交易金額(groupby 年月 + sum 交易額)。人資:按部門統計薪資總支出(groupby 部門 + sum 薪資)。物流:按地區統計出貨總重量(groupby 地區 + sum 重量)。所有「按某個類別維度,聚合計算某個數值的總量」的場景,都是 groupby + sum 的標準應用。

變形 5 評估指標

直覺:除了長條圖(bar),還有哪些 kind 參數可以用,適合什麼場景?

答案:pandas plot 常用的 kind 值:bar(直立長條,比較類別)、barh(水平長條,類別名稱較長時可讀性更好)、line(折線圖,時間序列趨勢)、pie(圓餅圖,各類別佔比)、hist(直方圖,數值分佈)、scatter(散點圖,兩個數值變數的相關性)。年份趨勢分析通常用 line,類別比較用 bar/barh,比例分析用 pie。

07 延伸

想再往下看,這 5 個

出處

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

查看官方原文 PDF