正態分布 - 計算 Z-Score 的 無偏估計
flyfish
Z-Score公式與計算步驟
1 公式(樣本Z-Score)
實際應用中,我們幾乎不知道“總體均值/標準差”,所以常用樣本數據計算:
zi=xi?xˉsz_i = \frac{x_i - \bar{x}}{s}zi?=sxi??xˉ?
xix_ixi?:某個具體的數據點(如數學成績80分);
xˉ\bar{x}xˉ:樣本均值(如全班數學平均分70分);
sss:樣本標準差(如全班數學成績的標準差5分)。
2 標準差sss的補充公式
標準差衡量“數據的離散程度”,計算步驟:
- 算每個數據與均值的差:xi?xˉx_i - \bar{x}xi??xˉ;
- 差的平方:(xi?xˉ)2(x_i - \bar{x})^2(xi??xˉ)2;
- 平方和的均值(方差):1n?1∑i=1n(xi?xˉ)2\frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2n?11?∑i=1n?(xi??xˉ)2(分母用n?1n-1n?1是“無偏估計”);
- 方差開根號:s=方差s = \sqrt{\text{方差}}s=方差?。
3 計算步驟
上面的“數學考試”例子,假設全班5個同學的數學成績為:[65, 70, 75, 80, 85],計算80分對應的Z-Score:
- 算樣本均值xˉ\bar{x}xˉ:xˉ=(65+70+75+80+85)/5=75\bar{x} = (65+70+75+80+85)/5 = 75xˉ=(65+70+75+80+85)/5=75;
- 算樣本標準差sss:
- 差:65?75=?1065-75=-1065?75=?10,70?75=?570-75=-570?75=?5,75?75=075-75=075?75=0,80?75=580-75=580?75=5,85?75=1085-75=1085?75=10;
- 差的平方:100,25,0,25,100100, 25, 0, 25, 100100,25,0,25,100;
- 方差:(100+25+0+25+100)/(5?1)=250/4=62.5(100+25+0+25+100)/(5-1) = 250/4 = 62.5(100+25+0+25+100)/(5?1)=250/4=62.5;
- 標準差:s=62.5≈7.91s = \sqrt{62.5} ≈ 7.91s=62.5?≈7.91;
- 算Z-Score:z=(80?75)/7.91≈0.63z = (80-75)/7.91 ≈ 0.63z=(80?75)/7.91≈0.63。
數學成績比全班均值高0.63個標準差,處于中等偏上水平。
無偏估計:為什么樣本方差的分母用 n-1 而不是 n?
在計算Z-Score時,我們使用樣本數據來估計總體的情況,而樣本標準差 s 的公式中,方差的部分是 1n?1∑i=1n(xi?xˉ)2\frac{1}{n-1} \sum_{i=1}^n (x_i - \bar{x})^2n?11?∑i=1n?(xi??xˉ)2。這里的分母用 n-1(而不是 n)是為了實現“無偏估計”(unbiased estimation)。
1. 什么是“估計”?偏估計 vs. 無偏估計
首先,我們要明白:在現實中,我們很少能拿到“總體”(population)的所有數據。比如,全班數學成績的“總體”可能是全國所有學生的成績,但我們只能拿到一個“樣本”(sample),如你班上的5個同學的成績。我們用樣本數據來“估計”總體的均值、方差等參數。
- 估計器(estimator):就是一個公式或方法,用來從樣本推算總體參數。比如,樣本均值 xˉ\bar{x}xˉ 是總體均值 μ 的估計器;樣本方差是總體方差 σ2 的估計器。
- 偏估計(biased estimator):如果這個估計器在多次重復采樣后,平均值不等于真實的總體參數,就叫有偏(biased)。簡單說,它系統性地高估或低估了真實值。
- 無偏估計(unbiased estimator):多次重復采樣后,估計器的平均值等于真實的總體參數。它更“公平”、更可靠,尤其當樣本量小的時候。
在方差的計算中:
- 如果用分母 n,即樣本方差 = 1n∑i=1n(xi?xˉ)2\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2n1?∑i=1n?(xi??xˉ)2,這是一個有偏估計,它會低估總體方差(平均來說,算出來的方差比真實的小)。
- 如果用分母 n-1,即樣本方差 = 1n?1∑i=1n(xi?xˉ)2\frac{1}{n-1} \sum_{i=1}^n (x_i - \bar{x})^2n?11?∑i=1n?(xi??xˉ)2,這是一個無偏估計,它在平均意義上等于總體方差。
為什么會這樣?因為用樣本均值 xˉ\bar{x}xˉ(而不是真實的總體均值 μ)來計算偏差,會讓數據看起來“更集中”(離散度更小),從而低估方差。為了補償這個“收縮效應”,我們用 n-1 來“放大”一點分母,讓估計更接近真實。
2. 為什么用 n 會低估?直觀解釋和數學原因
直觀解釋:
想象一下:總體是一個大群體,數據很分散。但當你抽樣時,樣本數據往往更“像”樣本均值 xˉ\bar{x}xˉ,因為 xˉ\bar{x}xˉ 就是從這些數據算出來的。所以,計算 ∑(xi?xˉ)2\sum (x_i - \bar{x})^2∑(xi??xˉ)2 時,偏差平方和會比用真實 μ 小(數據顯得更緊湊)。這就好比用“自家尺子”量自家東西,總會量得偏小。
- 如果樣本量 n 很大(比如成千上萬),這個偏差很小,用 n 或 n-1 差不多。
- 但如果 n 小(比如例子 n=5),偏差明顯。用 n 會顯著低估方差。
為了修正,我們減掉1(n-1),相當于“損失了一個自由度”(degrees of freedom)。為什么是1?因為計算 xˉ\bar{x}xˉ 時,已經用掉了1個“信息”(均值固定了數據的平均位置),剩下 n-1 個獨立偏差。
數學原因(簡單證明):
總體方差 σ2 = 1N∑i=1N(xi?μ)2\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2N1?∑i=1N?(xi??μ)2(N 是總體大小,通常很大)。
現在,從總體中隨機抽取 n 個樣本,計算樣本方差。
-
如果用分母 n 的有偏方差,記為 s2_bias = 1n∑i=1n(xi?xˉ)2\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2n1?∑i=1n?(xi??xˉ)2。
-
數學上可以證明:期望值 E[s2_bias] = n?1nσ2\frac{n-1}{n} \sigma^2nn?1?σ2 < σ2(低估了 1n\frac{1}{n}n1? 的比例)。
-
如果用分母 n-1 的無偏方差,記為 s2_unbias = 1n?1∑i=1n(xi?xˉ)2\frac{1}{n-1} \sum_{i=1}^n (x_i - \bar{x})^2n?11?∑i=1n?(xi??xˉ)2 = nn?1sb2ias\frac{n}{n-1} s2_biasn?1n?sb2?ias。
-
期望值 E[s2_unbias] = nn?1×n?1nσ2=σ2\frac{n}{n-1} \times \frac{n-1}{n} \sigma^2 = \sigma^2n?1n?×nn?1?σ2=σ2(正好等于真實方差,無偏)。
這個證明基于統計學的“期望值”計算(涉及χ2分布等),但核心是:n-1 補償了使用 xˉ\bar{x}xˉ 代替 μ 帶來的偏差。歷史上,這是由德國數學家弗里德里希·貝塞爾(Friedrich Bessel)在19世紀提出的修正,因此也叫“Bessel’s correction”。
3. 比較:n vs. n-1 的區別
數學成績樣本:[65, 70, 75, 80, 85],n=5,均值 xˉ=75\bar{x}=75xˉ=75,偏差平方和 = 100 + 25 + 0 + 25 + 100 = 250。
-
用 n=5(有偏):
- 方差 = 250 / 5 = 50
- 標準差 s = √50 ≈ 7.07
- Z-Score for 80: (80 - 75) / 7.07 ≈ 0.71
-
用 n-1=4(無偏):
- 方差 = 250 / 4 = 62.5
- 標準差 s = √62.5 ≈ 7.91
- Z-Score for 80: (80 - 75) / 7.91 ≈ 0.63
區別:用 n 的Z-Score更大(0.71 vs. 0.63),因為標準差更小,顯得成績“更突出”。但這低估了真實的離散度。如果這個樣本代表一個更大的班級,用 n 會讓Z-Score“夸大”你的位置,而 n-1 更保守、更接近真實總體。
假設真實總體方差是62.5(只是假設),多次抽樣平均下來,用 n-1 的方差會接近62.5,而用 n 的會接近50(低估20%)。
4. 在Z-Score計算中的重要性和應用注意
Z-Score 的本質是“標準化”數據,讓不同分布的數據可比(比如比較數學和語文成績)。公式 z = (x - 均值) / 標準差,其中標準差是“尺度”,如果標準差低估了,Z-Score就會高估偏差,導致解讀錯誤。
為什么在Z-Score中必須用 n-1?
- 因為Z-Score通常用于推斷總體(如你的成績在全校/全國的位置),我們希望估計無偏。統計軟件(如Excel的STDEV.S、Python的numpy.std(ddof=1))默認用 n-1,就是這個原因。
- 如果知道總體均值 μ 和 σ(罕見),用總體公式:z = (x - μ) / σ,分母就是 N,無需修正。
- 但實際中,幾乎總是用樣本,所以 n-1 是標準實踐。
什么時候可以忽略?
- n 很大時(n > 30),n 和 n-1 區別小,可以近似用 n。
- 純描述樣本(不推斷總體)時,用 n 也行(叫“描述性標準差”)。
用 n-1 是為了讓樣本方差“公平”地代表總體,避免系統低估。這在小樣本中特別重要,能讓Z-Score更準確、更可靠
兩種計算方式的分布對比
從已知總體方差(25)的正態分布中重復抽樣(樣本量 n=5)
紅色分布:使用 n 作為分母計算的樣本方差,其平均值明顯低于真實總體方差(25),表現出系統性低估
藍色分布:使用 n-1 作為分母計算的樣本方差,其平均值非常接近真實總體方差(25),實現了無偏估計
黑色虛線:真實的總體方差值,清晰顯示 n-1 的估計更接近真實值
不同樣本量下的偏差對比
縱軸表示 “平均偏差”(估計值減去真實值),越接近 0 越好
紅色線:使用 n 作為分母時,始終存在負偏差(低估),樣本量越小偏差越大
藍色線:使用 n-1 作為分母時,偏差接近 0,基本無偏
規律:隨著樣本量增大3, 5, 10, 20, 50, 100, 500,兩種方法的差異逐漸減小,當 n 很大時(如 500),n 和 n-1 的結果幾乎相同
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns# 設置中文字體
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 解決負號顯示問題# 實驗參數設置
np.random.seed(42) # 設置隨機種子,保證結果可重復
population_mean = 50 # 總體均值
population_variance = 25 # 總體方差(已知)
population_std = np.sqrt(population_variance) # 總體標準差
sample_size = 5 # 樣本量(小樣本更能體現差異)
num_simulations = 10000 # 模擬次數# 存儲每次模擬的兩種方差結果
variances_n = [] # 用n作為分母的方差
variances_n_minus_1 = [] # 用n-1作為分母的方差# 進行多次抽樣模擬
for _ in range(num_simulations):# 從已知總體中隨機抽取樣本sample = np.random.normal(population_mean, population_std, sample_size)sample_mean = np.mean(sample)# 計算偏差平方和squared_deviations = np.sum((sample - sample_mean) **2)# 兩種方式計算方差var_n = squared_deviations / sample_sizevar_n_minus_1 = squared_deviations / (sample_size - 1)# 存儲結果variances_n.append(var_n)variances_n_minus_1.append(var_n_minus_1)# 計算兩種方法的平均值
mean_var_n = np.mean(variances_n)
mean_var_n_minus_1 = np.mean(variances_n_minus_1)# 創建可視化圖形
plt.figure(figsize=(12, 6))# 繪制兩種方差估計的分布直方圖
sns.histplot(variances_n, bins=50, color='#FF6B6B', alpha=0.6, label=f'分母 = n (平均值 = {mean_var_n:.2f})')
sns.histplot(variances_n_minus_1, bins=50, color='#4ECDC4', alpha=0.6, label=f'分母 = n-1 (平均值 = {mean_var_n_minus_1:.2f})')# 繪制真實總體方差的參考線
plt.axvline(x=population_variance, color='black', linestyle='--', linewidth=2, label=f'真實總體方差 = {population_variance}')# 添加標簽和標題
plt.title(f'n = {sample_size} 時兩種方差計算方式的分布對比', fontsize=15)
plt.xlabel('樣本方差值', fontsize=12)
plt.ylabel('頻率', fontsize=12)
plt.xlim(0, population_variance * 2) # 限制x軸范圍,使對比更清晰
plt.legend(fontsize=11)
plt.grid(alpha=0.3)plt.tight_layout()
plt.show()# 不同樣本量下的偏差對比
sample_sizes = [3, 5, 10, 20, 50, 100, 500] # 測試不同樣本量
#sample_sizes = [500]
bias_n = []
bias_n_minus_1 = []for n in sample_sizes:# 多次模擬sim_var_n = []sim_var_n1 = []for _ in range(1000):sample = np.random.normal(population_mean, population_std, n)sample_mean = np.mean(sample)sq_dev = np.sum((sample - sample_mean)** 2)sim_var_n.append(sq_dev / n)sim_var_n1.append(sq_dev / (n - 1))# 計算偏差(估計值 - 真實值)bias_n.append(np.mean(sim_var_n) - population_variance)bias_n_minus_1.append(np.mean(sim_var_n1) - population_variance)# 繪制不同樣本量下的偏差圖
plt.figure(figsize=(10, 5))
plt.plot(sample_sizes, bias_n, 'ro-', label='分母 = n 的偏差')
plt.plot(sample_sizes, bias_n_minus_1, 'bo-', label='分母 = n-1 的偏差')
plt.axhline(y=0, color='gray', linestyle='--') # 零偏差參考線plt.title('不同樣本量下兩種方差計算方式的偏差', fontsize=14)
plt.xlabel('樣本量 n', fontsize=12)
plt.ylabel('平均偏差(估計值 - 真實值)', fontsize=12)
plt.xscale('log') # 對數刻度,便于展示不同量級的樣本量
plt.legend()
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()