seaborn barplot + nlargest 找北美銷售前五名
研究團隊想要知道在北美地區(NA)銷售成績最好的遊戲前五名,並希望以 seaborn 的條狀圖呈現結果。請選出能正確完成這項分析的程式碼。
要從遊戲資料集中找出北美銷售量前五名的遊戲,然後用 seaborn 的長條圖呈現,x 軸是遊戲名稱(Name),y 軸是北美銷售量(NA_Sales)。四個選項各有不同的選資料和繪圖方式,需要找出能正確「先取前五名、再用 barplot 呈現」的那一個。
問你:哪一行程式碼能正確選出北美銷售前五名並用 seaborn barplot 呈現?
一句話總結
要取北美銷售前五名並畫 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 參數。
先感受問題:head(5) 和 nlargest(5) 不一樣
遊戲研究公司的分析師小凱要找北美前五名。資料集本身已按 Global_Sales 全球銷售額降序排列,但「全球前五」不等於「北美前五」——例如日本本土大賣但北美銷量普通的遊戲,可能在全球排名很高,但北美銷售不在前五。
→ 得到的是全球銷售前五,不是北美銷售前五
nlargest(5, "NA_Sales"):找 NA_Sales 最大的 5 筆資料
→ 正確取出北美銷售前五名
取出前五名後,用 sns.barplot 畫圖:x 軸是遊戲名稱(Name),y 軸是北美銷售量(NA_Sales),這樣每根柱子代表一款遊戲的北美銷售量,直觀呈現排名。
四個選項各哪裡出了問題
- 選項 A 用了 head(5) 而非 nlargest:head(5) 取資料集前 5 行,是依照原始排序(全球銷售 Global_Sales 降序)的前 5 款遊戲,不是北美銷售前 5 名。而且 x 和 y 的欄位放反了(x="NA_Sales" 把數值欄當 x 軸),雖然不報錯但習慣上應該是 x=類別欄(Name)、y=數值欄(NA_Sales)。
- 選項 B 正確:nlargest(5, "NA_Sales") 正確取北美前五,x="Name"(類別)、y="NA_Sales"(數值),barplot 畫長條圖,三個部分都對。
- 選項 C 用了 lineplot:lineplot 畫折線圖,適合時間序列,不適合比較各個遊戲的銷售量,視覺上折線連接離散遊戲沒有意義。
- 選項 D 用了 countplot 並且語法錯誤:countplot 不支援 y 參數(它只統計類別的頻率,不接受數值欄作為 y 軸),而且 countplot 計算「Name 出現幾次」,不是「NA_Sales 的值」。
- 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 效率更高。
nlargest 取前五 + barplot 畫圖
小凱的正確程式碼:
分解來看:
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 軸設定精讀
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像你有一疊按總分排好的成績單,但你要找「數學最高分前五名」,不能直接拿最上面五張(那是總分前五)。nlargest 是「告訴我數學分數最高的五個人」。找到後用 barplot 畫圖,每個人一根柱子,柱子高低代表數學分數,x 軸是人名,y 軸是分數。
| 白話步驟 | 程式碼 |
|---|---|
| 取 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) |
- 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 為數值欄位。
本題沒有數學公式,核心是資料篩選和圖表類型的對應:
- nlargest(5, col) = argmax 的前 5 個:找出 col 值最大的 5 行
- barplot:適合類別 vs 數值的比較(x = 類別,y = 數值)
- lineplot:適合連續 x 軸(時間序列)vs 數值的趨勢
- countplot:只適合純類別頻率計算,不支援 y 為數值
- nlargest 和 head 的根本差別是什麼?什麼情況下兩者結果相同?
- sns.barplot 的 x 和 y 參數各應該是什麼類型的欄位?反過來放有什麼影響?
- countplot 和 barplot 最關鍵的差別是什麼?分別適合什麼問題?
- 如果想找「北美銷售後五名(最低的 5 款)」,應該用什麼方法?
- barplot 的柱子如果太多(100 個遊戲),x 軸名稱會重疊,有什麼解決方案?
為什麼其他選項是錯的
字面在說什麼:取資料的前 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 的人。
字面在說什麼:用 lineplot 以遊戲名稱為 x 軸,NA_Sales 為 y 軸,取北美前五名畫折線圖。
為什麼不對:lineplot 畫折線圖,適合 x 軸是連續數值(如時間)的趨勢分析。遊戲名稱是離散的類別,用折線連接各遊戲沒有任何意義(「Wii Sports 到 Super Mario Bros. 之間的趨勢」是什麼?)。視覺化效果也差,無法直觀看出各遊戲的銷售量差異。
誰會選錯:知道 nlargest 正確,但把 barplot 和 lineplot 搞混,誤以為 lineplot 也能做同樣的事。
字面在說什麼:用 countplot 以 Name 為 x 軸,NA_Sales 為 y 軸,畫全部資料的圖。
為什麼不對:countplot 的語法不支援 y 參數同時接受數值欄位,它只計算 x 欄中每個類別出現的次數(頻率),不接受「y 是數值欄」的用法。而且沒有用 nlargest 篩選前五名,是對全部資料(2000 款遊戲)做圖,x 軸會擠滿 2000 個遊戲名稱,完全不可用。執行這行通常會直接報錯。
誰會選錯:看到「countplot」就以為能計算任何統計量,或不熟悉 countplot 和 barplot 各自 API 差異的人。
同個考點下次怎麼變形
直覺:如果想讓長條圖從高到低排列(銷售量最高在左邊),nlargest 的結果需要再排序嗎?
答案:nlargest 本身就已按從大到小排序回傳,所以 barplot 接到的資料已是降序,柱子從左到右就是銷售量遞減的順序,不需要額外 sort_values。但要注意 seaborn 的 barplot 會依照傳入資料的行順序排列,不會自動重排,所以 nlargest 的排序會直接反映在圖上。
直覺:如果資料集本身就已按 NA_Sales 降序排列,用 head(5) 和 nlargest(5, "NA_Sales") 結果一樣嗎?
答案:這種情況下結果相同,但這是巧合。vgsales.csv 是按 Global_Sales 降序排列,不是按 NA_Sales。全球銷量第一的遊戲(Wii Sports)在北美銷量確實也第一,但後面排名就會有差異。依賴排序巧合寫程式是危險的習慣,明確用 nlargest 才是正確做法。
直覺:如果要同時畫北美、歐洲、日本前五名(每個地區各五款遊戲),怎麼做?
答案:可以用三個 subplot:fig, axes = plt.subplots(1, 3, figsize=(18,5)),然後對三個地區各自 nlargest + barplot,每個圖傳入對應的 ax 參數。或者用 pd.melt 轉長格式後 groupby + nlargest 取每個地區前五,再用 FacetGrid 分格顯示。後者更 seaborn 風格,但前者更直觀易懂。
直覺:Top N 分析(找前 N 名)在商業分析中有哪些常見應用?
答案:電商:每週銷售前十名商品監控(nlargest(10, "weekly_sales"))。金融:投資組合中報酬率最高的五支股票。客服:投訴量最多的前五個問題類別。廣告:點擊率最高的十個廣告素材。所有需要「聚焦資源在最重要的 N 個對象」的決策場景,都是 nlargest 的應用。配合 barplot 可以快速視覺化。
直覺: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)。
想再往下看,這 5 個
- 資料視覺化(Data Visualization)seaborn barplot 是最常用的比較型圖表,x/y 軸對應類別和數值的設計是正確使用的基礎。
- 描述性統計(Descriptive Statistics)Top N 分析是描述性統計的基本技巧,找出最大/最小值是了解資料分佈的第一步。
- 資料前處理(Data Preprocessing)nlargest 之前通常需要確認資料品質,例如是否有異常大值污染前五名的結果。
- 預測性分析(Predictive Analytics)North America 銷售前五名可以作為建立遊戲銷售預測模型的目標標籤之一,分析暢銷遊戲特徵是預測的基礎。
- 特徵工程(Feature Engineering)「是否為北美前五名」可以轉化為二元特徵(1/0),用於訓練分類模型識別潛在暢銷遊戲。