中心极限定理是统计学中比较重要的一个定理。 本文将通过实际模拟数据的形式,形象地展示中心极限定理是什么,是如何发挥作用的。

什么是中心极限定理(Central Limit Theorem)

中心极限定理指的是给定一个任意分布的总体。我每次从这些总体中随机抽取 n 个抽样,一共抽 m 次。 然后把这 m 组抽样分别求出平均值。 这些平均值的分布接近正态分布。

我们先举个栗子🌰

现在我们要统计全国的人的体重,看看我国平均体重是多少。当然,我们把全国所有人的体重都调查一遍是不现实的。所以我们打算一共调查1000组,每组50个人。 然后,我们求出第一组的体重平均值、第二组的体重平均值,一直到最后一组的体重平均值。中心极限定理说:这些平均值是呈现正态分布的。并且,随着组数的增加,效果会越好。 最后,当我们再把1000组算出来的平均值加起来取个平均值,这个平均值会接近全国平均体重。

其中要注意的几点:

  1. 总体本身的分布不要求正态分布
    上面的例子中,人的体重是正态分布的。但如果我们的例子是掷一个骰子(平均分布),最后每组的平均值也会组成一个正态分布。(神奇!)

  2. 样本每组要足够大,但也不需要太大
    取样本的时候,一般认为,每组大于等于30个,即可让中心极限定理发挥作用。

话不多说,我们现在来一步步看到中心极限定理是如何起作用的。

用实际数据来展示中心极限定理

注:我们使用python语言以及iPython Notebook来生成和展现数据。不懂的童鞋可以略过代码

第一步, 生成数据

假设我们现在观测一个人掷骰子。这个骰子是公平的,也就是说掷出1~6的概率都是相同的:1/6。他掷了一万次。我们用python来模拟投掷的结果:

1
2
3
4
import numpy as np 
random_data = np.random.randint(1, 7, 10000)
print random_data.mean() # 打印平均值
print random_data.std() # 打印标准差

生成出来的平均值:3.4927 (每次重新生成都会略有不同)
生成出来的标准差:1.7079

平均值接近3.5很好理解。 因为每次掷出来的结果是1、2、3、4、5、6。 每个结果的概率是1/6。所以加权平均值就是3.5。

第二步,画出来看看

我们把生成的数据用直方图画出来直观地感受一下:

Image 01

可以看到1~6分布都比较平均,不错。

第三步,抽一组抽样来试试

我们接下来随便先拿一组抽样,手动算一下。例如我们先从生成的数据中随机抽取10个数字:

1
2
3
4
5
sample1 = []
for i in range(0, 10):
sample1.append(random_data[int(np.random.random() * len(random_data))])

print sample1 # 打印出来

这10个数字的结果是: [3, 4, 3, 6, 1, 6, 6, 3, 4, 4]
平均值:4.0
标准差:1.54

可以看到,我们只抽10个的时候,样本的平均值(4.0)会距离总体的平均值(3.5)有所偏差。
有时候我们运气不好,抽出来的数字可能偏差很大,比如抽出来10个数字都是6。那平均值就是6了。 为什么会出现都是6的情况呢?因为我比较6…哦不是,因为这就是随机的魅力呀!

不过不要担心,接下去就是见证奇迹的时刻。

第四步,见证奇迹的时刻

我们让中心极限定理发挥作用。现在我们抽取1000组,每组50个。
我们把每组的平均值都算出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
samples = []
samples_mean = []
samples_std = []

for i in range(0, 1000):
sample = []
for j in range(0, 50):
sample.append(random_data[int(np.random.random() * len(random_data))])
sample_np = np.array(sample)
samples_mean.append(sample_np.mean())
samples_std.append(sample_np.std())
samples.append(sample_np)

samples_mean_np = np.array(samples_mean)
samples_std_np = np.array(samples_std)

print samples_mean_np

这一共1000个平均值大概是这样的:[3.44, 3.42, 3.22, 3.2, 2.94 … 4.08, 3.74] (我肯定不会把1000个数字都写完,又没有稿费可以骗)

然后,我们把这1000个数字用直方图画出来:

Image 02

TADA! 完美地形成了正态分布。

结果打印如下:

平均值:3.48494
标准差:0.23506

实际应用

在实际生活当中,我们不能知道我们想要研究的对象的平均值,标准差之类的统计参数。中心极限定理在理论上保证了我们可以用只抽样一部分的方法,达到推测研究对象统计参数的目的。
在上文的例子中,掷骰子这一行为的理论平均值3.5是我们通过数学定理计算出来的。而我们在实际模拟中,计算出来的样本平均值的平均值(3.48494)确实已经和理论值非常接近了。