第 15 章 資料分析:平均數、變異數與標準差¶
(適用:台灣高中~大一;目標:用 SageMath/Python 做描述統計、理解樣本與母體差異,並用視覺化建立直覺)
15.1 本章主旨:把「統計量」變成可計算、可檢查的流程¶
你在高中到大一最常接觸的資料分析(描述統計)包括:
- 平均數(mean)
- 變異數(variance)與標準差(standard deviation)
- 中位數、眾數、四分位數(延伸)
- 離群值(outliers)與標準化(z-score)
本章會用 SageMath 的計算能力 + Python 的資料處理方式:
- 用程式正確計算統計量(避免手算錯)
- 用小例子理解公式(尤其母體 vs. 樣本)
- 用圖形(直方圖、箱型圖)建立直覺
統計的重點不是「算很快」,而是「知道你算的是什麼」與「解釋得出來」。
15.2 一組資料的基本輸入:list¶
先建立一個示例資料(例如某班 10 位同學的測驗分數):
data = [58, 62, 70, 70, 75, 80, 83, 90, 92, 100]
data
n = len(data)
mean = sum(data)/n
mean
scores = [78, 85, 92] # 平時、期中、期末
weights = [0.4, 0.3, 0.3]
weighted_mean = sum(s*w for s, w in zip(scores, weights))/sum(weights)
weighted_mean
data = [58, 62, 70, 70, 75, 80, 83, 90, 92, 100]
n = len(data)
mean = sum(data)/n
# 母體變異數
var_pop = sum((x-mean)^2 for x in data)/n
# 樣本變異數
var_samp = sum((x-mean)^2 for x in data)/(n-1)
std_pop = sqrt(var_pop)
std_samp = sqrt(var_samp)
mean, var_pop, std_pop.n(), var_samp, std_samp.n()
重要:標準差是「變異數開根號」,單位會回到原本資料的因次單位。
15.5 用 Sage 的統計函數(依環境)¶
在許多 Sage 環境可以用:
mean(data)、variance(data)、std(data)
如果你的環境沒有這些函數,前一節的「自己寫」永遠可用。
我們試著呼叫看看:
reset() #清除之前變數
data = [58, 62, 70, 70, 75, 80, 83, 90, 92, 100]
m2 = mean(data)
v1 = variance(data, bias=False) #樣本變異數
sd1 = std(data, bias=False) #樣本標準差
v2 = variance(data, bias=True) #母體變異數
sd2 = std(data, bias=True) #母體標準差
m2, v1, sd1, v2, sd2
這裡算出的是平均值,樣本變異數,和樣本標準差。
因為各環境對「母體/樣本」定義可能不同,建議使用指令時先確認,避免誤用。
data_sorted = sorted(data)
data_sorted
def median(xs):
xs = sorted(xs)
n = len(xs)
if n % 2 == 1:
return xs[n//2]
else:
return (xs[n//2 - 1] + xs[n//2]) / 2
median(data_sorted)
統計圖¶
Sage 可以用 list_plot、histogram 等畫圖(不同環境可能略差)。
# 直方圖(若你的環境支援 histogram)
try:
histogram(data, bins=6).show()
except Exception as e:
e
若某些繪圖函數在你的環境不可用,替代的方法是:
- 先用
list_plot畫排序後的點 - 或把資料丟到你熟悉的 Python 套件(例如 matplotlib)做直方圖
下面用 list_plot 畫排序後的分布:
points = [(i+1, x) for i, x in enumerate(sorted(data))]
list_plot(points)
# 箱形圖 boxplot
import matplotlib.pyplot as plt
plt.boxplot(data)
plt.title("Boxplot example")
plt.show()
15.7 離群值與 z-score(標準化)¶
z-score(標準分數): $$ z=\frac{x-\mu}{\sigma} $$ 表示距離平均數多少個標準差。
例:100 分在這組資料的 z-score(用母體標準差)。
x = 100
z = (x - mean(data))/std(data, bias=True)
N(z)
z-score 的用途:
- 不同量尺資料的比較(例如不同考試)
- 判斷離群值(例如 |z|>3 常被視為非常極端)
15.8 兩組資料比較:平均數相同但標準差不同¶
這是統計最重要的觀念之一:
兩組資料平均數一樣,分散程度仍可能完全不同。
我們做兩組資料:
- A:集中在平均附近
- B:同樣平均但更分散
A = [70, 72, 73, 74, 75, 76, 77, 78, 79, 80]
B = [50, 55, 60, 65, 70, 80, 85, 90, 95, 100]
def pop_stats(xs):
n = len(xs)
m = sum(xs)/n
v = sum((x-m)^2 for x in xs)/n
return m, v, sqrt(v)
pop_stats(A), pop_stats(B)
# 用點圖快速看差異
pA = list_plot([(i+1, x) for i, x in enumerate(sorted(A))])
pB = list_plot([(i+1, x) for i, x in enumerate(sorted(B))])
pA + pB
15.9(進階)從資料到機率:期望與變異數的連結(連回第 14 章)¶
若 X 是隨機變數: $$ \mathrm{Var}(X)=E[(X-E[X])^2]=E[X^2]-E[X]^2 $$
用一個離散分佈例子驗算: 公平骰子 X:1~6,各 1/6。
# 骰子:Var(X) = E[X^2] - E[X]^2
E1 = sum(k*(1/6) for k in range(1,7))
E2 = sum(k^2*(1/6) for k in range(1,7))
Var = E2 - E1^2
E1, E2, Var, N(Var)
15.10 本章小結:資料分析的可靠工作流¶
你現在應該能:
- 用 list 輸入資料並計算平均數(含加權平均)
- 正確區分母體/樣本變異數,並計算標準差
- 用排序、點圖、直方圖/箱型圖(若支援)理解分布
- 用 z-score 做標準化並初步判斷離群值
- 透過兩組資料比較理解「平均一樣不代表分布一樣」
- 理解 Var 與期望的關係$E[X^2]-E[X]^2$
練習題(附提示)¶
計算:資料 [2,4,4,4,5,5,7,9] 的平均數、母體變異數、母體標準差。
提示:照 15.4 的公式寫。同一組資料,算樣本變異數與樣本標準差,並比較與母體版本差異。
提示:分母用 n-1。加權平均:某科目平時 30%、期中 30%、期末 40%,分數分別 70、80、90,求總成績。
z-score:對題目 1 的資料,計算 x=9 的 z-score(用母體標準差),並解釋它代表什麼。
5.(挑戰)資料清理:
若資料中有一筆輸入錯誤(例如 700),請示範如何用程式找出異常值:
提示:用 z-score 或用「與中位數差距」的方式。
下一章(第 16 章)我們會整理「電腦代數系統的應用策略」:
你會學到如何在解題時正確使用 CAS:何時信、何時檢查、如何避免誤用與增根。