pandas 怎麼計算敘述性統計量?
使用 Python 的 pandas 套件處理各商品銷售數據(變數為 df)時,若需計算「總銷售額」欄位的敘述性統計量(如平均值、標準差等),應使用下列哪一種語法?
有一個名叫 df 的 pandas DataFrame,裡面有一欄叫「總銷售額」,存放各商品的銷售數字。現在想一口氣看這欄的平均值、標準差、最大值、最小值這些統計摘要。
問你:用 pandas 對某欄位計算敘述性統計量(平均、標準差等),應該用哪一行語法?
一句話總結
要一次看某欄的平均、標準差、最大最小值等統計摘要,用 df['欄位名'].describe()。這是 pandas 內建的敘述性統計方法,一行搞定。
先感受問題:拿到一批銷售數據,第一件事是什麼
嘉誠電商的數據分析師阿雯,剛從資料庫拉出一個 DataFrame,長這樣:
商品名稱 總銷售額
藍牙耳機 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()。
技術版:實際怎麼跑這段程式碼
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
- 有一張叫做 df 的「試算表」,裡面有很多欄
- 我們挑出「總銷售額」這一欄
- 叫這欄「幫我做個快速健康檢查」
- 它就把所有重要數字一次列出來
| 故事 | 程式碼 |
|---|---|
| 那張「試算表」 | df |
| 挑出「總銷售額」這一欄 | df['總銷售額'] |
| 做快速健康檢查 | .describe() |
| 印出結果 | print(df['總銷售額'].describe()) |
- df
- pandas DataFrame,像一張有行列的試算表,存放所有商品資料。
- df['總銷售額']
- 從 df 裡取出「總銷售額」這一欄,得到一個 pandas Series(一維資料結構)。
- .describe()
- pandas Series 的方法,自動計算 count、mean、std、min、25%、50%、75%、max 八個統計量,一次回傳。
- count
- 非空值(非 NaN)的資料筆數,用來確認這欄有沒有缺失值。
- std
- 標準差(Standard Deviation),衡量數值分散程度,值越大表示銷售額差異越大。
本題考的是語法選擇,沒有需要推導的數學公式。describe() 內部使用的統計公式:
- mean = Σ(x) / n
- std = √(Σ(x - mean)² / (n-1))(樣本標準差,pandas 預設 ddof=1)
這兩個公式不需要背,記住「describe() 會幫你算」就夠了。
蓋住程式碼,用自己的話說出這 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()。
同個考點下次怎麼變形
如果想一次看整個 DataFrame 所有數值欄位的統計摘要,怎麼做?
不只看一欄,要看全部欄位,每欄都要平均、標準差。
直接用 df.describe()(不加欄位名稱),pandas 會自動對所有數值欄位(numeric columns)做統計摘要,輸出是一個矩陣,行是統計量名稱,列是各欄位。
describe() 預設不包含類別欄位,怎麼讓它也分析字串欄位?
「商品名稱」是字串,describe() 預設只看數字,要怎麼看字串欄的統計?
加上 include='all' 參數:df.describe(include='all')。這樣字串欄會顯示 count、unique(獨特值個數)、top(最常出現的值)、freq(最常出現的次數)。
只想看平均值和標準差,不要其他統計量,怎麼做?
describe() 輸出太多了,只要兩個數字。
分別呼叫 df['總銷售額'].mean() 和 df['總銷售額'].std()。或者呼叫 df['總銷售額'].agg(['mean', 'std']),用 agg() 方法指定要計算的統計量清單。
describe() 輸出的「50%」是什麼?
看到「50%」這個奇怪的標籤,不確定是什麼意思。
50% 就是中位數(Median),也是第二個四分位數(Q2)。describe() 用百分位數的格式表示:25% = Q1(下四分位數)、50% = Q2(中位數)、75% = Q3(上四分位數)。看 25% 跟 75% 的差距(IQR),可以判斷資料分佈是否偏斜。
計算 DataFrame 中某欄的中位數,應該用什麼語法?
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() 通常是資料管線品質檢查步驟的一部分。