Learning Objectives
- 用平均數與中位數描述資料的中心,說出極端值對兩者的影響
- 用標準差、四分位數與 IQR 描述資料的分散程度,並說出 pandas 與 numpy 的 std 為什麼不同
- 用 1.5×IQR 規則找出可能的極端值,並說明找到之後該怎麼處理
- 依分布的形狀選擇要報告哪些統計量
把 200 個數字說成幾個數字
200 位學生的每週讀書時數,一個一個念出來沒有人記得住。敘述統計用少數幾個數字摘要一組資料,回答兩個問題:
| 問題 | 常用的統計量 |
|---|---|
| 中心在哪裡?(典型的值大約是多少) | 平均數、中位數 |
| 分得多散?(每個值離中心多遠) | 標準差、四分位數與 IQR、全距 |
這一課也會看到:同樣是「中心」,平均數和中位數可能差很多;一個極端值就能讓平均數和標準差大幅改變,中位數和 IQR 卻幾乎不動。
資料是 students.csv 與 grades.csv,都是程式產生的模擬資料,不是任何學校的真實資料。
平均數與中位數
- 平均數(mean):全部加起來除以筆數。每一個值都會影響它。
- 中位數(median):由小排到大,排在正中間的值;筆數是偶數時,取中間兩個的平均。它只看「排在中間的是誰」。
pandas 的 Series 用 s.mean()、s.median(),會自動略過缺值;numpy 用 np.mean(a)、np.median(a),遇到 nan 結果也是 nan(要略過缺值改用 np.nanmean)。
逐步看:加入一個極端值
先看 5 個數的平均數與中位數,再加入一個 60,比較兩者各變了多少。
分散程度:標準差、四分位數與 IQR
標準差(standard deviation)大致是「每個值離平均數多遠」的典型距離。樣本標準差的公式:
s = √( Σ(x − 平均數)² ÷(n − 1))
除以 n − 1 而不是 n,是因為用樣本推估母體時,除以 n 會系統性地偏小。這個「減掉的 1」在程式裡叫 ddof:
| 寫法 | 除以 | 用在 |
|---|---|---|
pandas s.std() |
n − 1(ddof=1,預設) |
把資料當成樣本 |
numpy np.std(a) |
n(ddof=0,預設) |
把資料當成整個母體 |
numpy np.std(a, ddof=1) |
n − 1 | 和 pandas 相同 |
同一份資料,pandas 和 numpy 算出來的標準差不一樣,原因就在這裡。報告時寫清楚你用的是哪一種。
四分位數把排好的資料切成四等分:Q1(第 1 四分位數,25%)、Q2(就是中位數)、Q3(75%)。IQR=Q3 − Q1,是中間一半的資料占的範圍。
s.quantile([0.25, 0.75]) 算四分位數;s.describe() 一次列出筆數、平均數、標準差、最小、Q1、中位數、Q3、最大。
逐步看:標準差的兩種算法、四分位數與 describe
可能的極端值:1.5×IQR 規則
箱形圖由 John Tukey 在《Exploratory Data Analysis》(1977)推廣。常見的規則是:
小於 Q1 − 1.5×IQR,或大於 Q3 + 1.5×IQR 的值,標成可能的極端值(outlier)
matplotlib 的 boxplot 預設就用這個規則:鬚只延伸到界線以內最遠的點,界線外的點單獨畫成小圓圈。
標出來不等於刪掉。 極端值可能是輸入錯誤(第 8 課的 150 分),也可能是真實但少見的情況(真的有人每週讀 25 小時)。 找到之後先查它是怎麼來的:確定是錯誤才修正或排除;是真實的值就保留,必要時改用不受極端值影響的統計量,並在報告中說明你怎麼處理。
逐步看:找出極端值,比較平均數與中位數的位置
先用 1.5×IQR 規則找出極端值,再畫直方圖(標出平均數與中位數)和箱形圖。
要報告哪幾個數?
| 分布的樣子 | 中心 | 分散 |
|---|---|---|
| 大致對稱、沒有明顯的極端值 | 平均數 | 標準差 |
| 偏斜(例如收入、通勤時間、讀書時數)或有極端值 | 中位數 | IQR(或 Q1、Q3) |
不管用哪一種,都要寫出筆數 n,最好也附上圖(直方圖或箱形圖),讀者才知道分布長什麼樣子。 平均數 9.9、標準差 4.7 這兩個數,對稱的分布和右偏的分布都可能算得出來,只看數字會看不出差別。
實作:住宿與不住宿的通勤時間
讀入 students.csv,依是否住宿(dorm,Y 或 N)分組。對每一組的通勤時間(commute_min),
在同一行依序印出:組名、平均數(小數 1 位)、中位數、標準差(pandas 的 std,小數 1 位)、IQR(Q3 − Q1)。
小測驗:中心與分散
下面程式會印出什麼?
import numpy as np
x = [3, 4, 5, 6, 100]
print(np.mean(x), np.median(x))
下面程式會印出什麼?
import numpy as np
import pandas as pd
s = pd.Series([2, 4, 4, 4, 5, 5, 7, 9])
print(round(s.std(), 3), np.std(s.to_numpy()))
某校學生每月打工收入的分布右偏:大多數人幾千元,少數人好幾萬。平均數和中位數最可能是什麼關係?
小測驗:極端值
一組資料的 Q1 = 20、Q3 = 30。依 1.5×IQR 規則,下列哪一個值會被標成可能的極端值?
分析時發現一筆每週讀書時數 25.4 小時被標成極端值,最恰當的下一步是什麼?
重點整理
- 中心:平均數用到每一個值,會被極端值拉走;中位數只看排在中間的值,不受極端值影響。右偏分布的平均數通常大於中位數。
- 分散:標準差大約是每個值離平均數的典型距離;pandas 的
std除以 n − 1(ddof=1),numpy 的np.std預設除以 n(ddof=0)。 - 四分位數:Q1、中位數、Q3;IQR=Q3 − Q1 是中間一半資料的範圍,
describe()一次列出。 - 1.5×IQR 規則標出可能的極端值;標出來之後先查原因,不要直接刪掉。
- 對稱的資料報告平均數與標準差,偏斜的資料報告中位數與 IQR;都要寫出筆數,並附上圖。
- 下一課從「手上這一份資料」走向「母體」:常態分布、從母體抽樣,以及樣本平均數會怎麼變動(中央極限定理)。