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 款。
她要的結果是:
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") → 把資料按 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 流程精讀
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像有一大袋混在一起的紙鈔,每張紙鈔上面寫了平台名稱(Wii/PS4/X360)和面額(銷售額)。groupby 是把它們分成幾堆(一堆 Wii、一堆 PS4...),sum 是算每堆的總金額,plot 是把每堆的金額畫成柱子。count 是算每堆有幾張紙鈔(不管面額多少),mean 是算每堆的平均面額。
| 白話步驟 | 程式碼 |
|---|---|
| 按平台分組 | data.groupby("Platform") |
| 取出 Global_Sales 欄 | ["Global_Sales"] |
| 每組加總 | .sum() |
| 畫長條圖 | .plot(kind="bar") |
| 完整一行 | data.groupby("Platform")["Global_Sales"].sum().plot(kind="bar") |
- groupby(col)
- 按指定欄位的值把資料分成若干群組,返回 GroupBy 物件,後面接聚合函式才能得到結果。
- [col](方括號選欄)
- 從 GroupBy 物件中選出要聚合的欄位,返回 SeriesGroupBy 物件。
- .sum()
- 加總每個群組中選定欄位的值,返回一個 Series(索引為分組鍵,值為加總結果)。
- .count()
- 計算每個群組中非缺失值的個數(筆數),不是數值加總。
- .plot(kind="bar")
- pandas Series 的快速繪圖方法,kind="bar" 畫直立長條圖,kind="barh" 畫水平長條圖。
本題沒有數學公式,核心是聚合操作的語意:
- sum():Σ Global_Sales,對每個 Platform 的所有遊戲銷售額加總
- mean():(Σ Global_Sales) / n,每個 Platform 的平均銷售額
- count():n,每個 Platform 有幾筆資料(幾款遊戲)
- groupby() 後必須接什麼才能得到結果?直接 print(data.groupby("Platform")) 會得到什麼?
- sum() 和 count() 的根本差別是什麼?分別回答哪種商業問題?
- value_counts() 和 groupby().count() 算出來的結果一樣嗎?
- 如果要同時算每個平台的總銷售額和遊戲數量,怎麼用 agg() 一次做到?
- plot(kind="bar") 和 plot(kind="barh") 有什麼差?什麼時候用水平長條圖?
為什麼其他選項是錯的
字面在說什麼:按平台分組後,計算每個平台的 Global_Sales 筆數,畫長條圖。
為什麼不對:count() 算的是「這個平台有幾款遊戲(幾筆資料)」,不是「銷售額加總」。題目要的是銷售總額(Sales amount),不是遊戲數量(Game count)。一個平台可能遊戲數很多但都賣得不好,count 高不代表銷售總額高。
誰會選錯:不確定 count 和 sum 差別的人,看到「統計每個平台」就選了 count,混淆了「統計數量」和「加總數值」。
字面在說什麼:對 Platform 欄做值計數,把每個平台出現的次數畫成長條圖。
為什麼不對:value_counts() 直接對 Platform 欄操作,算的是每個平台名稱出現幾次(有幾款遊戲),同樣是「數量」而非「銷售額」。而且 value_counts() 的語法根本沒有涉及 Global_Sales 欄,完全沒有計算銷售額的部分。
誰會選錯:只想簡化程式碼,用 value_counts() 代替 groupby,但沒有意識到這兩種操作的語意完全不同。
字面在說什麼:按平台分組後,計算每個平台的平均銷售額,畫長條圖。
為什麼不對: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,兩欄畫在同一張圖上)。
直覺:如果想找「銷售總額最高的前 5 個平台」,只用 groupby + sum 夠嗎?
答案:不夠,需要加 .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 重量)。所有「按某個類別維度,聚合計算某個數值的總量」的場景,都是 groupby + sum 的標準應用。
直覺:除了長條圖(bar),還有哪些 kind 參數可以用,適合什麼場景?
答案: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 統計的歷史銷售總額和趨勢,是建立遊戲銷售預測模型時的重要特徵來源。