pandas groupby + sum 畫各平台全球銷售總額長條圖
原題
為了觀察各遊戲平台的市場表現,分析師想要統計每個平台的全球銷售總額,並以長條圖呈現。請選出最能正確實現此分析的程式碼。
白話
遊戲銷售資料集有 Platform 欄和 Global_Sales 欄,分析師要把相同平台的所有遊戲銷售額加總,然後畫成長條圖,讓每個平台佔一根柱子,柱子高度代表該平台的全球銷售總額(加總)。
問你:哪一行程式碼能正確計算每個平台的全球銷售總額(不是數量、不是平均)並以長條圖呈現?
先自己選一個答案,再看完整解析。
一句話總結
要統計每個平台的全球銷售「總額」並畫長條圖,正確寫法是 data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar"):groupby 按平台分組,sum() 加總每組的銷售額,plot(kind="bar") 畫長條圖。
情境
先感受問題:同一平台的遊戲銷售要加起來
遊戲研究公司分析師小凱要做各平台市場表現比較圖。資料集有 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 才是題目要的「銷售總額」。
舊方法
四種聚合方式各算什麼
- sum():加總。把同一平台所有遊戲的 Global_Sales 加在一起,得到該平台的累積銷售量。這是題目要的「銷售總額」。Wii 有 300 款遊戲,把所有款銷售額加總 = Wii 的市場貢獻。
- count():計數。算每個平台有幾筆資料(幾款遊戲),不考慮銷售額的數值。Wii 有 300 款 → count = 300,但這是「遊戲數量」不是「銷售額」。
- value_counts():計數(另一種寫法)。直接對 Platform 欄做值計數,同樣算「每個平台出現幾次(幾款遊戲)」,結果和 groupby + count 類似,但更簡潔,也不是「銷售額」。
- mean():平均。算每個平台所有遊戲的平均銷售額,反映的是「平均一款遊戲賣多少」,而非總市場規模。Wii 平均銷售額高,不代表 Wii 的市場份額大(可能只有少數暢銷遊戲拉高均值)。
- 混淆「排行榜順序」和「銷售總額」:資料集本身已按 Global_Sales 降序排列,但前幾名的平台不一定是總銷售額最高的,需要 groupby + sum 才能算出真正的平台累積表現。
新方法
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")。
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
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 自我複述
- groupby() 後必須接什麼才能得到結果?直接 print(data.groupby("Platform")) 會得到什麼?
- sum() 和 count() 的根本差別是什麼?分別回答哪種商業問題?
- value_counts() 和 groupby().count() 算出來的結果一樣嗎?
- 如果要同時算每個平台的總銷售額和遊戲數量,怎麼用 agg() 一次做到?
- plot(kind="bar") 和 plot(kind="barh") 有什麼差?什麼時候用水平長條圖?
錯選項
為什麼其他選項是錯的
Bgroupby + count()
字面在說什麼
按平台分組後,計算每個平台的 Global_Sales 筆數,畫長條圖。
為什麼不對
count() 算的是「這個平台有幾款遊戲(幾筆資料)」,不是「銷售額加總」。題目要的是銷售總額(Sales amount),不是遊戲數量(Game count)。一個平台可能遊戲數很多但都賣得不好,count 高不代表銷售總額高。
誰會選錯
不確定 count 和 sum 差別的人,看到「統計每個平台」就選了 count,混淆了「統計數量」和「加總數值」。
Cvalue_counts()
字面在說什麼
對 Platform 欄做值計數,把每個平台出現的次數畫成長條圖。
為什麼不對
value_counts() 直接對 Platform 欄操作,算的是每個平台名稱出現幾次(有幾款遊戲),同樣是「數量」而非「銷售額」。而且 value_counts() 的語法根本沒有涉及 Global_Sales 欄,完全沒有計算銷售額的部分。
誰會選錯
只想簡化程式碼,用 value_counts() 代替 groupby,但沒有意識到這兩種操作的語意完全不同。
Dgroupby + mean()
字面在說什麼
按平台分組後,計算每個平台的平均銷售額,畫長條圖。
為什麼不對
mean() 算的是「每款遊戲的平均銷售額」,反映的是每個平台的典型遊戲銷售表現,而不是整個平台的市場規模。Wii Sports 等超大暢銷款會拉高 Wii 的平均值,讓平均看起來比實際累積銷售更高。題目要的是「市場表現(市場規模)」,應該用加總(sum)而非平均(mean)。
誰會選錯
把「市場表現」理解成「平均表現」的人,或者不清楚 sum 和 mean 在分析意義上的差別。
變形題
同個考點下次怎麼變形
答案
可以用 agg():data.groupby("Platform")["Global_Sales"].agg(['sum', 'count'])。回傳一個 DataFrame,有兩欄分別是 sum 和 count,可以直接 .plot(kind="bar") 畫並列長條圖(預設 subplots=False,兩欄畫在同一張圖上)。
答案
不夠,需要加 .nlargest(5):data.groupby("Platform")["Global_Sales"].sum().nlargest(5).plot(kind="bar")。nlargest(5) 從 Series 中取出值最大的前 5 個,讓長條圖只顯示最重要的平台,不被幾十個小平台淹沒。
答案
加 .sort_values(ascending=False):data.groupby("Platform")["Global_Sales"].sum().sort_values(ascending=False).plot(kind="bar")。預設 ascending=True(從小到大),加 ascending=False 讓長條圖從左到右是銷售額由高到低,視覺上更容易比較。
答案
電商:按商品類別統計總銷售額(groupby 類別 + sum 銷售額)。金融:按月份統計總交易金額(groupby 年月 + sum 交易額)。人資:按部門統計薪資總支出(groupby 部門 + sum 薪資)。物流:按地區統計出貨總重量(groupby 地區 + sum 重量)。所有「按某個類別維度,聚合計算某個數值的總量」的場景,都是 groupby + sum 的標準應用。
答案
pandas plot 常用的 kind 值:bar(直立長條,比較類別)、barh(水平長條,類別名稱較長時可讀性更好)、line(折線圖,時間序列趨勢)、pie(圓餅圖,各類別佔比)、hist(直方圖,數值分佈)、scatter(散點圖,兩個數值變數的相關性)。年份趨勢分析通常用 line,類別比較用 bar/barh,比例分析用 pie。
延伸
想再往下看,這 5 個
- 資料視覺化(Data Visualization)
長條圖是最基本的資料視覺化形式,groupby + aggregate + plot 是探索性分析的核心三件套。 - 描述性統計(Descriptive Statistics)
sum、mean、count 都是描述性統計的聚合方式,選對聚合函式才能回答正確的商業問題。 - 資料前處理(Data Preprocessing)
groupby 之前通常需要確認分組欄位(Platform)的資料品質,例如是否有多餘空格或大小寫不一致。 - 特徵工程(Feature Engineering)
groupby 的結果可以作為新特徵,例如「每個平台的歷史平均銷售額」可以作為預測新遊戲表現的特徵。 - 預測性分析(Predictive Analytics)
groupby 統計的歷史銷售總額和趨勢,是建立遊戲銷售預測模型時的重要特徵來源。