在上一章讲述了如何描述数据之后,统计的下一项任务就是如何通过抽样推测整体的信息。在统计01:概述中,我们介绍了要得到群体的分布,最准确的办法是收集整个群体的数据,当群体数据量小的时候当然可以这么做,但是当数据量非常大时,就变得不现实了,因此人们想到了抽样的方法以达到“窥一斑而知全豹”的目的。用样本来推测群体的信息,这被称为统计推断(statistical inference)。本章主要介绍统计推断中的参数估计(parameter estimation)部分,即通过样本数据估计出群体分布的参数信息,这具体又可以分为点估计(point estimation)和区间估计(interval estimation)。统计推断的另一部分,为假设检验(hypothesis testing),即我们先对总体的参数作出一个假设,然后搜集样本数据,计算出样本统计量,通过这些数据来推定我们的假设的可信性,并作出接受假设还是拒绝假设的判断。本章将主要介绍参数估计中的点估计部分。
点估计
点估计应用于这样的情形,我们已经知道了群体的分布,但是其中含有未知参数,比如我们知道湘北中学学生的身高服从正态分布,但是我们并不知道这个分布的均值以及方差。由于湘北中学共计有10000名学生,如果统计全部学生的身高数据有困难的话,我们可以采用参数估计的方法,从10000名学生中抽取1000名学生来进行采样,以此估计出整体10000名学生服从怎样的正态分布。
这个问题可以描述为:
湘北中学同学的身高$x_i \sim N(\mu,\sigma^2),i=1,2,3, ...,10000$,现我们采用抽样的方法,从10000名同学中抽取出1000名同学,他们的身高为$X_j, j=1,2,3,...,1000$,则我们得到的均值$\mu$和方差$\sigma^2$的估计量为:
$$\hat \mu = \bar X_j = \frac{1}{1000}\sum_{j=1}^{1000}X_j=171.76$$
$$\hat \sigma^2 = S^2 = \frac{1}{999}\sum_{j=1}^{1000}(X_j - \bar X)^2=106.53$$
我们可以将这个结果与群体的真实分布情况做一个对比,即我们对10000名学生的情况做一个完整的统计,结果为:
$$\mu = \frac{1}{10000}\sum_{i=1}^{10000}x_i=172.08$$
$$\sigma^2 = \frac{1}{10000}\sum_{i=1}^{10000}(x_i - \mu)^2=102.57$$
代码如下:
import numpy as np
with open("xiangbei_height.txt", "r") as f:
lines = f.readlines()
x = np.array(list(map(float, lines)))
x_sample = x[:1000]
x_sample_mean = x_sample.mean()
x_sample_var = np.sum((x_sample - x_sample_mean)**2)/999
print('样本均值为:',x_sample_mean)
print('样本方差为:',x_sample_var)
x_mean = x.mean()
x_var = np.sum((x - x_mean)**2)/10000
print('群体均值为:',x_mean)
print('群体方差为:',x_var)
可以看到,我们通过抽样得到的结果和群体的真实分布相差不大,并且我们只需要获取1/10的样本数量就可以得到接近真实分布的结果,这正是抽样方法的优越性。
通过上边这个例子,我们已经对参数估计的点估计有了一个初步认识,但是仍有一些问题留待解决:
1、这里之所以可以这样估计,是因为他们代表了相同的含义,我们认为样本统计量的均值和方差可以代表整体的均值和方差,更严谨地,我们也验证了:
$$E(\bar X) = \mu$$
$$E(S^2) = \sigma^2$$
这样正态分布的两个参数$\mu 和\sigma^2$我们都已经得到,但是对于其他的分布,比如伯努利分布中的$p$,指数分布中的$\lambda$,这些参数我们又应该怎么样得到呢?
2、细心的读者可以注意到,在计算群体的方差时,分母上是n,而在计算样本统计量的方差时,分母上却是n-1,在统计01:概述中,我们曾对此解释为:统计学家有意设计了样品统计量的形式,以便于它们的期望正好等于某些群体参数。这正是为了满足估计量“无偏性”的要求。更一般地,我们对于估计量有什么样的要求呢?
接下来,我们将分别回答以上两个问题。
对于像伯努利分布这样,它的关键参数和事件发生的概率相关时,我们可以利用事件发生的频率来估计它的参数。
比如对于伯努利分布,
\begin{align*} P(X=k) = \left\{ \begin{array}{rcl} p & for & k=1 \\ 1-p & for & k=0 \end{array} \right.\end{align*}
它的关键参数p即事件发生(k=1)的概率,因此我们自然可以采用样本中事件发生的频率来作为参数p的估计,即:
$$\hat p = \frac{\mu_n}{n},其中\mu_n为n重实验中事件发生的次数$$
比如我们进行一100次p=0.8的伯努利分布实验,统计其中事件发生的次数,结果如下:
可以看到,事件发生的频率为0.83,十分接近他的真实概率0.8。
代码如下:
from scipy.stats import bernoulli
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 中文字体设置
a=np.array(bernoulli.rvs(p=0.8, size=100))
plt.hist(a)
plt.text(0.03,100-a.sum()+1, str(100-a.sum()))
plt.text(0.94,a.sum()+1, str(a.sum()))
plt.title("伯努利实验结果")
plt.xlabel("实验结果")
plt.ylabel("统计次数")
plt.show()
另一种较为简单的估计方法是,我们将样本按照大小值进行排序,得到样本的中位数和极差。中位数的定义我们已经在统计01:概述中有过介绍,样本中位数与样本均值一样时刻华样本平均取值的数字特征,若在样本中有个别的分量出现异常值的话,那么中位数比均值更具代表性。样本极差的定义为:
$$R = Max(X_j) - Min(X_j)$$
样本极差反映了样本值的变化幅度,其功能和方差类似。
群体x无论服从什么分布,都可以将样本的中位数和极差作为群体的均值和标准差的估计。这种方法成为顺序统计量估计法,简单实用,但是显然它的精度比较差。
我们再次使用湘北中学同学身高的例子,采用1000个样本的中位数和极差作为群体的均值和标准差的估计,结果如下:
$$\hat \mu = X_{median} = 171.78$$
$$\hat \sigma^2 = X_{range} = Max(X_j) - Min(X_j) =67.32$$
可以看到,样本中位数和群体的均值差差距并不大,但是样本的极差和群体的标准差之间则相差比较大。
代码如下:
import numpy as np
with open("xiangbei_height.txt", "r") as f:
lines = f.readlines()
x = np.array(list(map(float, lines)))
x_sample = x[:1000]
x_sample_median = np.median(x_sample)
x_sample_range = np.max(x_sample) - np.min(x_sample)
print('样本中位数为:',x_sample_median)
print('样本极差为:',x_sample_range)
x_mean = x.mean()
x_var = np.sum((x - x_mean)**2)/10000
print('群体均值为:',x_mean)
print('群体方差为:',x_var)
一种较为通用的进行点估计的方法是1894年由英国统计学家K.Pearson提出的矩估计法。由大数定律可知,样本矩依概率收敛于总体矩,也就是说,只要样本容量n较大时,可以用样本矩来作为相应总体矩的估计,