pandas 怎麼計算敘述性統計量?
原題
使用 Python 的 pandas 套件處理各商品銷售數據(變數為 df)時,若需計算「總銷售額」欄位的敘述性統計量(如平均值、標準差等),應使用下列哪一種語法?
白話
有一個名叫 df 的 pandas DataFrame,裡面有一欄叫「總銷售額」,存放各商品的銷售數字。現在想一口氣看這欄的平均值、標準差、最大值、最小值這些統計摘要。
問你:用 pandas 對某欄位計算敘述性統計量(平均、標準差等),應該用哪一行語法?
先自己選一個答案,再看完整解析。
一句話總結
要一次看某欄的平均、標準差、最大最小值等統計摘要,用 df['欄位名'].describe()。這是 pandas 內建的敘述性統計方法,一行搞定。
情境
先感受問題:拿到一批銷售數據,第一件事是什麼
嘉誠電商的數據分析師阿雯,剛從資料庫拉出一個 DataFrame,長這樣:
df(部分):
商品名稱 總銷售額
藍牙耳機 58000
無線滑鼠 12000
機械鍵盤 145000
USB集線器 8500
... (共 500 筆)
阿雯想第一眼就知道:這個「總銷售額」欄位的資料分佈狀況怎麼樣?平均賣多少?最高最低差多少?有沒有極端值?
她不想一個一個算,要一行程式碼就看到所有統計摘要。
舊方法
分開算每個統計量有什麼問題
- 寫很多行:mean()、std()、min()、max() 各要一行,探索性分析時程式碼堆一堆。
- 容易漏看指標:只算平均和標準差,忘了看四分位數(Q1/Q3),資料的偏態就看不出來。
- 每換一個欄位就要重複貼:500 個欄位就要貼 500 組程式碼,沒效率。
- 沒有格式化輸出:單獨呼叫 mean() 只回傳一個數字,不方便直接對照比較多個指標。
- 容易拼錯方法名:每個統計量方法名都不同,初學者容易打錯。
新方法
describe() 一行看完所有統計摘要
阿雯只需要打一行:
df['總銷售額'].describe()
輸出結果長這樣:
count 500.000000 mean 42350.000000 std 33210.500000 min 1200.000000 25% 15000.000000 50% 38000.000000 75% 62000.000000 max 145000.000000 Name: 總銷售額, dtype: float64
一個輸出同時給你:
- count:非空值筆數
- mean:平均值
- std:標準差
- min / max:最小最大值
- 25% / 50% / 75%:四分位數(讓你看出資料分佈形狀)
這就是選項 B 講的:df['總銷售額'].describe()。
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
Step 1 純故事版
- 有一張叫做 df 的「試算表」,裡面有很多欄
- 我們挑出「總銷售額」這一欄
- 叫這欄「幫我做個快速健康檢查」
- 它就把所有重要數字一次列出來
Step 2 中文 ↔ 程式碼對照
| 故事 | 程式碼 |
|---|---|
| 那張「試算表」 | df |
| 挑出「總銷售額」這一欄 | df['總銷售額'] |
| 做快速健康檢查 | .describe() |
| 印出結果 | print(df['總銷售額'].describe()) |
Step 3 符號角色表
- df:pandas DataFrame,像一張有行列的試算表,存放所有商品資料。
- df['總銷售額']:從 df 裡取出「總銷售額」這一欄,得到一個 pandas Series(一維資料結構)。
- .describe():pandas Series 的方法,自動計算 count、mean、std、min、25%、50%、75%、max 八個統計量,一次回傳。
- count:非空值(非 NaN)的資料筆數,用來確認這欄有沒有缺失值。
- std:標準差(Standard Deviation),衡量數值分散程度,值越大表示銷售額差異越大。
Step 4 完整公式對應
本題考的是語法選擇,沒有需要推導的數學公式。describe() 內部使用的統計公式:
- mean = Σ(x) / n
- std = √(Σ(x - mean)² / (n-1))(樣本標準差,pandas 預設 ddof=1)
這兩個公式不需要背,記住「describe() 會幫你算」就夠了。
Step 5 自我複述
蓋住程式碼,用自己的話說出這 3 步:
- 用方括號加欄位名稱,從 df 取出那一欄
- 在後面接 .describe()
- 得到含有 8 個統計量的摘要
講得出來代表這段你會了。
錯選項
為什麼其他選項是錯的
Adf['總銷售額'].sum()
字面在說什麼
把「總銷售額」這欄所有數字加總,得到一個數字(全部商品銷售額的總和)。
為什麼不對
sum() 只算「加總」,回傳一個數字,不是統計摘要。題目要的是「平均值、標準差等」多個統計量,sum() 做不到。
誰會選錯
看到「銷售額」就聯想到「加總」的人。注意:題目說的是「敘述性統計量」,不是加總。
Cdf['總銷售額'].sort_values()
字面在說什麼
把「總銷售額」欄的數值從小到大排序。
為什麼不對
sort_values() 是「排序」方法,回傳的是排好順序的資料序列,不計算任何統計量。它改變的是資料的排列順序,跟敘述性統計完全不同用途。
誰會選錯
把「排序」跟「統計」搞混的人,或是想說「排完才能看分佈」的人。排序是資料整理,describe() 才是統計摘要。
Ddf['總銷售額'].stats()
字面在說什麼
用 stats() 方法計算統計量。
為什麼不對
pandas Series 根本沒有 stats() 這個方法。執行會直接拋出 AttributeError。這是個「看起來合理但其實不存在」的假方法,用來測試你是否真的記住正確的 API。
誰會選錯
猜測「stats 就是 statistics 的縮寫,應該是統計方法」的人。pandas 的統計摘要方法名叫 describe(),不叫 stats()。
變形題
同個考點下次怎麼變形
不只看一欄,要看全部欄位,每欄都要平均、標準差。
答案
直接用 df.describe()(不加欄位名稱),pandas 會自動對所有數值欄位(numeric columns)做統計摘要,輸出是一個矩陣,行是統計量名稱,列是各欄位。
「商品名稱」是字串,describe() 預設只看數字,要怎麼看字串欄的統計?
答案
加上 include='all' 參數:df.describe(include='all')。這樣字串欄會顯示 count、unique(獨特值個數)、top(最常出現的值)、freq(最常出現的次數)。
describe() 輸出太多了,只要兩個數字。
答案
分別呼叫 df['總銷售額'].mean() 和 df['總銷售額'].std()。或者呼叫 df['總銷售額'].agg(['mean', 'std']),用 agg() 方法指定要計算的統計量清單。
看到「50%」這個奇怪的標籤,不確定是什麼意思。
答案
50% 就是中位數(Median),也是第二個四分位數(Q2)。describe() 用百分位數的格式表示:25% = Q1(下四分位數)、50% = Q2(中位數)、75% = Q3(上四分位數)。看 25% 跟 75% 的差距(IQR),可以判斷資料分佈是否偏斜。
describe() 有中位數,但如果只要中位數這一個數字?
答案
df['總銷售額'].median()。pandas Series 有直接的 median() 方法,回傳單一數值。對應的方法還有 mean()、std()、var()、min()、max()、sum(),分別計算各統計量。
延伸
想再往下看,這 5 個
- 描述性統計(Descriptive Statistics)
describe() 輸出的就是描述性統計摘要,包含集中趨勢與分散程度的指標。 - 資料前處理(Data Preprocessing)
describe() 是探索性資料分析的第一步,幫助發現缺失值、離群值和分佈問題。 - 資料視覺化(Data Visualization)
看完 describe() 的數字後,通常會搭配直方圖、箱型圖視覺化確認分佈形狀。 - 特徵工程(Feature Engineering)
describe() 的結果直接影響特徵工程決策,例如決定是否需要縮放或處理離群值。 - 資料管線(Data Pipeline)
大規模資料分析中,describe() 通常是資料管線品質檢查步驟的一部分。