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

seaborn barplot + nlargest 找北美銷售前五名

原題 47

研究團隊想要知道在北美地區(NA)銷售成績最好的遊戲前五名,並希望以 seaborn 的條狀圖呈現結果。請選出能正確完成這項分析的程式碼。

白話

要從遊戲資料集中找出北美銷售量前五名的遊戲,然後用 seaborn 的長條圖呈現,x 軸是遊戲名稱(Name),y 軸是北美銷售量(NA_Sales)。四個選項各有不同的選資料和繪圖方式,需要找出能正確「先取前五名、再用 barplot 呈現」的那一個。

問你:哪一行程式碼能正確選出北美銷售前五名並用 seaborn barplot 呈現?

點選你的答案。

01 總結

一句話總結

要取北美銷售前五名並畫 barplot,正確寫法是 sns.barplot(x="Name", y="NA_Sales", data=data.nlargest(5, "NA_Sales")):nlargest(5, "NA_Sales") 取出 NA_Sales 最大的 5 筆,x 是遊戲名稱,y 是銷售量。head(5) 只取前五行不是前五名,lineplot 畫折線,countplot 不支援 y 參數。

02 情境

先感受問題:head(5) 和 nlargest(5) 不一樣

遊戲研究公司的分析師小凱要找北美前五名。資料集本身已按 Global_Sales 全球銷售額降序排列,但「全球前五」不等於「北美前五」——例如日本本土大賣但北美銷量普通的遊戲,可能在全球排名很高,但北美銷售不在前五。

head(5):取資料集的前 5 行,按原有排序(Global_Sales 降序)
→ 得到的是全球銷售前五,不是北美銷售前五

nlargest(5, "NA_Sales"):找 NA_Sales 最大的 5 筆資料
→ 正確取出北美銷售前五名

取出前五名後,用 sns.barplot 畫圖:x 軸是遊戲名稱(Name),y 軸是北美銷售量(NA_Sales),這樣每根柱子代表一款遊戲的北美銷售量,直觀呈現排名。

03 對照

四個選項各哪裡出了問題

  1. 選項 A 用了 head(5) 而非 nlargest:head(5) 取資料集前 5 行,是依照原始排序(全球銷售 Global_Sales 降序)的前 5 款遊戲,不是北美銷售前 5 名。而且 x 和 y 的欄位放反了(x="NA_Sales" 把數值欄當 x 軸),雖然不報錯但習慣上應該是 x=類別欄(Name)、y=數值欄(NA_Sales)。
  2. 選項 B 正確:nlargest(5, "NA_Sales") 正確取北美前五,x="Name"(類別)、y="NA_Sales"(數值),barplot 畫長條圖,三個部分都對。
  3. 選項 C 用了 lineplot:lineplot 畫折線圖,適合時間序列,不適合比較各個遊戲的銷售量,視覺上折線連接離散遊戲沒有意義。
  4. 選項 D 用了 countplot 並且語法錯誤:countplot 不支援 y 參數(它只統計類別的頻率,不接受數值欄作為 y 軸),而且 countplot 計算「Name 出現幾次」,不是「NA_Sales 的值」。
  5. nlargest 和 sort_values + head 的差異:data.sort_values("NA_Sales", ascending=False).head(5) 和 data.nlargest(5, "NA_Sales") 結果相同,但 nlargest 語法更簡潔。sort_values 是先排序整個 DataFrame,nlargest 是直接找出前 N 大值,大資料量時 nlargest 效率更高。
04 解法

nlargest 取前五 + barplot 畫圖

小凱的正確程式碼:

sns.barplot(x="Name", y="NA_Sales", data=data.nlargest(5, "NA_Sales"))

分解來看:
data.nlargest(5, "NA_Sales") → 從 data 取出 NA_Sales 最大的 5 行
x="Name" → x 軸是遊戲名稱(類別)
y="NA_Sales" → y 軸是北美銷售量(數值)
sns.barplot(...) → 畫長條圖,5 根柱子代表 5 款遊戲

結果:5 根柱子的長條圖,x 軸是北美前五名的遊戲名稱,y 軸是各遊戲的北美銷售量(百萬份),直觀呈現排名和差距。這就是選項 B 講的:sns.barplot(x="Name", y="NA_Sales", data=data.nlargest(5, "NA_Sales"))

技術版:nlargest/nsmallest 與 seaborn barplot x/y 軸設定精讀

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

Step 1 純故事版

想像你有一疊按總分排好的成績單,但你要找「數學最高分前五名」,不能直接拿最上面五張(那是總分前五)。nlargest 是「告訴我數學分數最高的五個人」。找到後用 barplot 畫圖,每個人一根柱子,柱子高低代表數學分數,x 軸是人名,y 軸是分數。

Step 2 中文 ↔ 程式碼對照
白話步驟程式碼
取 NA_Sales 最大的 5 行data.nlargest(5, "NA_Sales")
x 軸用遊戲名稱(類別欄)x="Name"
y 軸用銷售量(數值欄)y="NA_Sales"
畫長條圖sns.barplot(...)
等效寫法(先排序再取)data.sort_values("NA_Sales", ascending=False).head(5)
Step 3 符號角色表
nlargest(n, col)
返回 col 欄值最大的前 n 行,等效於 sort_values(col, ascending=False).head(n),但更語意清晰。
nsmallest(n, col)
nlargest 的反向操作,返回 col 欄值最小的前 n 行,用於找「最差表現」。
head(n)
取 DataFrame 的前 n 行(依照現有排序),不考慮某欄的值,只看位置順序。
sns.barplot(x, y, data)
x 接受類別欄位名稱(字串),y 接受數值欄位名稱(字串),data 是 DataFrame。
countplot(x)
只接受 x 參數(類別欄),統計每個類別的頻率,不支援 y 為數值欄位。
Step 4 完整公式對應

本題沒有數學公式,核心是資料篩選和圖表類型的對應:

  • nlargest(5, col) = argmax 的前 5 個:找出 col 值最大的 5 行
  • barplot:適合類別 vs 數值的比較(x = 類別,y = 數值)
  • lineplot:適合連續 x 軸(時間序列)vs 數值的趨勢
  • countplot:只適合純類別頻率計算,不支援 y 為數值
Step 5 自我複述
  1. nlargest 和 head 的根本差別是什麼?什麼情況下兩者結果相同?
  2. sns.barplot 的 x 和 y 參數各應該是什麼類型的欄位?反過來放有什麼影響?
  3. countplot 和 barplot 最關鍵的差別是什麼?分別適合什麼問題?
  4. 如果想找「北美銷售後五名(最低的 5 款)」,應該用什麼方法?
  5. barplot 的柱子如果太多(100 個遊戲),x 軸名稱會重疊,有什麼解決方案?
05 陷阱

為什麼其他選項是錯的

選項 A head(5) + x/y 對調

字面在說什麼:取資料的前 5 行,x 軸是 NA_Sales(數值),y 軸是 Name(遊戲名稱)。

為什麼不對:head(5) 取的是資料集按原排序(Global_Sales 降序)的前 5 行,不是 NA_Sales 最大的 5 行。全球前五不等於北美前五。而且通常 x 軸放類別(Name),y 軸放數值(NA_Sales)更符合長條圖的慣例,雖然 x 和 y 對調不會報錯,但選 A 還有選錯資料(用 head 而非 nlargest)的根本問題。

誰會選錯:以為資料集已按 NA_Sales 排序(其實是按 Global_Sales)的人,或者不知道 nlargest 方法只用過 head 的人。

選項 C lineplot

字面在說什麼:用 lineplot 以遊戲名稱為 x 軸,NA_Sales 為 y 軸,取北美前五名畫折線圖。

為什麼不對:lineplot 畫折線圖,適合 x 軸是連續數值(如時間)的趨勢分析。遊戲名稱是離散的類別,用折線連接各遊戲沒有任何意義(「Wii Sports 到 Super Mario Bros. 之間的趨勢」是什麼?)。視覺化效果也差,無法直觀看出各遊戲的銷售量差異。

誰會選錯:知道 nlargest 正確,但把 barplot 和 lineplot 搞混,誤以為 lineplot 也能做同樣的事。

選項 D countplot(語法錯誤)

字面在說什麼:用 countplot 以 Name 為 x 軸,NA_Sales 為 y 軸,畫全部資料的圖。

為什麼不對:countplot 的語法不支援 y 參數同時接受數值欄位,它只計算 x 欄中每個類別出現的次數(頻率),不接受「y 是數值欄」的用法。而且沒有用 nlargest 篩選前五名,是對全部資料(2000 款遊戲)做圖,x 軸會擠滿 2000 個遊戲名稱,完全不可用。執行這行通常會直接報錯。

誰會選錯:看到「countplot」就以為能計算任何統計量,或不熟悉 countplot 和 barplot 各自 API 差異的人。

06 變形

同個考點下次怎麼變形

變形 1 邊界

直覺:如果想讓長條圖從高到低排列(銷售量最高在左邊),nlargest 的結果需要再排序嗎?

答案:nlargest 本身就已按從大到小排序回傳,所以 barplot 接到的資料已是降序,柱子從左到右就是銷售量遞減的順序,不需要額外 sort_values。但要注意 seaborn 的 barplot 會依照傳入資料的行順序排列,不會自動重排,所以 nlargest 的排序會直接反映在圖上。

變形 2 反例

直覺:如果資料集本身就已按 NA_Sales 降序排列,用 head(5) 和 nlargest(5, "NA_Sales") 結果一樣嗎?

答案:這種情況下結果相同,但這是巧合。vgsales.csv 是按 Global_Sales 降序排列,不是按 NA_Sales。全球銷量第一的遊戲(Wii Sports)在北美銷量確實也第一,但後面排名就會有差異。依賴排序巧合寫程式是危險的習慣,明確用 nlargest 才是正確做法。

變形 3 升級版

直覺:如果要同時畫北美、歐洲、日本前五名(每個地區各五款遊戲),怎麼做?

答案:可以用三個 subplot:fig, axes = plt.subplots(1, 3, figsize=(18,5)),然後對三個地區各自 nlargest + barplot,每個圖傳入對應的 ax 參數。或者用 pd.melt 轉長格式後 groupby + nlargest 取每個地區前五,再用 FacetGrid 分格顯示。後者更 seaborn 風格,但前者更直觀易懂。

變形 4 跨領域

直覺:Top N 分析(找前 N 名)在商業分析中有哪些常見應用?

答案:電商:每週銷售前十名商品監控(nlargest(10, "weekly_sales"))。金融:投資組合中報酬率最高的五支股票。客服:投訴量最多的前五個問題類別。廣告:點擊率最高的十個廣告素材。所有需要「聚焦資源在最重要的 N 個對象」的決策場景,都是 nlargest 的應用。配合 barplot 可以快速視覺化。

變形 5 評估指標

直覺:barplot 的 x 軸遊戲名稱很長,標籤互相重疊,有什麼解決方案?

答案:三個方法:(1) 旋轉標籤:plt.xticks(rotation=45, ha="right"),把 x 軸標籤旋轉 45 度,讓長名稱不重疊。(2) 水平長條圖:改用 barh 或 sns.barplot(x="NA_Sales", y="Name", ...,把遊戲名稱放在 y 軸,水平延伸更易讀長名稱。(3) 縮短名稱:先對遊戲名稱做截斷 data["ShortName"] = data["Name"].str[:15],再畫圖。長遊戲名稱時通常推薦用水平長條圖(barh)。

07 延伸

想再往下看,這 5 個

出處

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

查看官方原文 PDF