正态分布 - 计算 Z-Score 的 无偏估计
正态分布 - 计算 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ˉ 是总体均值 μ 的估计器;样本方差是总体方差 σ² 的估计器。
- 偏估计(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 个独立偏差。
数学原因(简单证明):
总体方差 σ² = 1N∑i=1N(xi−μ)2\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2N1∑i=1N(xi−μ)2(N 是总体大小,通常很大)。
现在,从总体中随机抽取 n 个样本,计算样本方差。
-
如果用分母 n 的有偏方差,记为 s²_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[s²_bias] = n−1nσ2\frac{n-1}{n} \sigma^2nn−1σ2 < σ²(低估了 1n\frac{1}{n}n1 的比例)。
-
如果用分母 n-1 的无偏方差,记为 s²_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} s²_biasn−1nsb2ias。
-
期望值 E[s²_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(正好等于真实方差,无偏)。
这个证明基于统计学的“期望值”计算(涉及χ²分布等),但核心是: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()