我们知道总体标准差(σ)是按照下面的公式来计算的:
但是在真实世界中,找到一个总体的标准差是不现实的。大多数情况下,我们都是通过计算样本标准差(s)来估计总体标准差(σ)的。但是s的计算公式是这样的:
分母为什么要(n-1)呢,而不是n?
维基百科给出的解释有点费解:
看过很多统计学的教程和问答,一个比较利于理解的通俗的解释是:__
分母为n的话算出来的s会低估总体标准差(σ)。__
下面用MATLAB编程来证明这一点。大体是,我们随机生成1000个整数作为总体,然后从这个总体里抽取100个数,作为1个sample,共抽取1000个sample。然后我们用两种方式计算一下这个sample的标准差,即分母为n-1或者n,然后我们数一下这两种计算方式得到的s低于总体标准差(σ)的个数,这
里我们统计1000次的结果,代码在最后面。结果如下图,果不其然,分母为n的时候会较多的低估总体标准差(1000个sample平均有550个低估了总体标准差),而分母为(n-1)的时候基本大差不差(1000个sample基本有一半低估,一半高估)。
代码如下,可直接copy运行:
%% 总体(1000个1-100之间的整数),总体均值和总体标准差
population = [1:1000]
mean_population = mean(population);
sigma_population =sqrt(sum((population-mean_population).^2)/1000);
%% 统计1000次结果,每次1000个sample,看有多少次标准差低估总体标准差的
No_underestimate = [];
No_underestimate_real = [];
for m = 1:1000
sigma_sample = [];
real_sigma_sample = [];
%随机取1000次sample
for i = 1:1000
%从population里随机选取100个数作为sample
idx_sample = randi(1000,100,1);
sample = population(idx_sample);
%样本的均值和“标准差(分母不减一)”
mean_sample = mean(sample);
sigma_sample = [sigma_sample sqrt(sum((sample-mean_sample).^2)/length(sample))];
%样本的标准差,分母减一
real_sigma_sample = [real_sigma_sample sqrt(sum((sample-mean_sample).^2)/(length(sample)-1))];
end
%分母不减一求样本标准差时候低估总体标准差的个数
No_underestimate =[No_underestimate length(sigma_sample(sigma_sample<= sigma_population))];
%分母减一求样本标准差时候低估总体标准差的个数
No_underestimate_real = [No_underestimate_real length(real_sigma_sample(real_sigma_sample<= sigma_population))];
end
%绘图
figure(1)
plot(No_underestimate)
title('分母不减一求样本标准差')
figure(2)
plot(No_underestimate_real)
title('实际求样本标准差(分母减一)')