统计量的经验分布

平均律表明,一个大的随机样本的经验分布将以高概率类似于从中抽取样本的总体的分布。

这种相似性在两个直方图中可见:大的随机样本的经验直方图很可能类似于总体的直方图。

作为提醒,以下是 united 中所有航班延误的直方图,以及这些航班中 1,000 个航班的随机样本的延误经验直方图。

[In ]:
from datascience import *
%matplotlib inline
path_data = '../../../assets/data/'
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')
import numpy as np
[In ]:
united = Table.read_table(path_data + 'united_summer2015.csv')
[In ]:
delay_bins = np.arange(-20, 201, 10)
united.hist('Delay', bins = delay_bins, unit = 'minute')
plots.title('Population');
Histogram titled 'Population' with 'Delay (minute)' on the x-axis and 'Percent per minute' on the y-axis. The tallest bars are between -10 and 10. There is a long right tail extending to 200.
[In ]:
sample_1000 = united.sample(1000)
sample_1000.hist('Delay', bins = delay_bins, unit = 'minute')
plots.title('Sample of Size 1000');
Histogram titled 'Sample of Size 1000' with 'Delay (minute)' on the x-axis and 'Percent per minute' on the y-axis. The tallest bars are between -10 and 10. There is a long right tail extending to 200. The height of the bars does visually differ than the previous graph, but not by a lot.

这两个直方图明显相似,尽管它们并不完全相同。

参数

通常,我们关注与总体相关的数值量。 - 在选民总体中,百分之多少会投票给候选人 A? - 在 Facebook 用户总体中,用户拥有的 Facebook 好友数最大值是多少? - 在联合航空航班总体中,出发延误的中位数是多少?

与总体相关的数值量称为“参数”。对于 united 中的航班总体,我们知道参数“中位数延误”的值:

[In ]:
np.median(united.column('Delay'))
2.0

NumPy 函数 median 返回数组的中位数(中间点)。在 united 的所有航班中,中位数延误为 2 分钟。也就是说,总体中约 50% 的航班延误不超过 2 分钟:

[In ]:
united.where('Delay', are.below_or_equal_to(2)).num_rows / united.num_rows
0.5018444846292948

一半的航班在计划起飞时间后不超过 2 分钟起飞。这是一个非常短的延误!

注意。 百分比不完全是 50%,因为存在“并列”,即延误恰好为 2 分钟的航班。有 480 个这样的航班。并列在数据集中很常见,在本课程中我们不会对此过于担心。

[In ]:
united.where('Delay', are.equal_to(2)).num_rows
480

统计量

在许多情况下,我们将对找出未知参数的值感兴趣。为此,我们将依赖于从总体中抽取的大随机样本的数据。

“统计量”(注意是单数!)是使用样本中的数据计算的任何数字。因此,样本中位数是一个统计量。

记住 sample_1000 包含从 united 中抽取的 1,000 个航班的随机样本。样本中位数的观测值为:

[In ]:
np.median(sample_1000.column('Delay'))
2.0

我们的样本——一组 1,000 个航班——给了我们统计量的一个观测值。这引发了一个重要的推断问题:

统计量本可以不同。 在使用基于随机样本的任何统计量时,一个基本考虑是“样本本来可能以不同的方式得出”,因此统计量也可能以不同的方式得出。

[In ]:
np.median(united.sample(1000).column('Delay'))
3.0

多次运行上面的单元格,看看答案如何变化。通常它等于 2,与总体参数的值相同。但有时它不同。

统计量本可能有多大的不同? 回答这个问题的一种方法是多次模拟该统计量并记录其值。这些值的直方图将告诉我们关于统计量分布的信息。

让我们回顾一下模拟的主要步骤。

模拟统计量

我们将使用之前开始学习模拟时建立的步骤来模拟样本中位数。你可以将 1000 的样本大小替换为任何其他样本大小,并将样本中位数替换为任何其他统计量。

第 1 步:确定要模拟哪个统计量。 我们已经决定了:我们将模拟从航班延误总体中抽取的容量为 1000 的随机样本的中位数。

第 2 步:定义一个返回统计量一个模拟值的函数。 抽取一个容量为 1000 的随机样本并计算样本的中位数。我们在上面的代码单元格中做了这个。这里再次将其封装在一个函数中。

[In ]:
def random_sample_median():
    return np.median(united.sample(1000).column('Delay'))

第 3 步:确定要生成多少个模拟值。 让我们做 5,000 次重复。

第 4 步:使用 for 循环生成模拟值数组。 像往常一样,我们将首先创建一个空数组来收集结果。然后我们将设置一个 for 循环来生成所有模拟值。循环的主体将包括生成一个样本中位数的模拟值,并将其追加到我们的收集数组中。

模拟需要相当长的时间来运行。这是因为它在执行 5000 次重复的抽容量为 1000 的样本并计算其中位数的过程。这是大量的抽样和重复!

[In ]:
medians = make_array()

for i in np.arange(5000):
    medians = np.append(medians, random_sample_median())

模拟完成了。所有 5,000 个模拟的样本中位数已收集到数组 medians 中。现在是时候可视化结果了。

可视化

以下是表格 simulated_medians 中显示的模拟随机样本中位数。

[In ]:
simulated_medians = Table().with_column('Sample Median', medians)
simulated_medians
Sample Median
2
3
1
3
2
2.5
3
3
3
2
... (4990 rows omitted)

我们还可以使用直方图来可视化模拟数据。该直方图称为“统计量的经验直方图”。它显示统计量的“经验分布”。记住“经验”意为“观察到的”。

[In ]:
simulated_medians.hist(bins=np.arange(0.5, 5, 1))
Histogram with 'Sample Median' on the x-axis and 'Percent per unit' on the y-axis. There are two short bars centered at 1 and 4. The bars centered at 2 and 3 are much taller, with heights of about 50 and 45 respectively.

你可以看到样本中位数极有可能是大约 2,即总体中位数的值。由于 1000 个航班延误的样本很可能类似于总体的延误分布,因此这些样本的中位数延误接近总体中的中位数延误也就不足为奇了。

这是统计量如何提供对参数的良好估计的一个例子。

模拟的力量

如果我们能生成所有可能的容量为 1000 的随机样本,我们就能知道统计量(样本中位数)的所有可能值,以及所有这些值的概率。我们可以将所有这些值和概率可视化在统计量的概率直方图中。

但在包括本例的许多情况下,所有可能样本的数量大到超过计算机的容量,而纯数学的概率计算可能难以处理。

这就是经验直方图的用武之地。

我们知道,根据平均律,如果样本量很大且反复多次进行随机抽样过程,统计量的经验直方图很可能类似于统计量的概率直方图。

这意味着反复模拟随机过程是一种近似概率分布的方法,“无需从数学上计算概率或生成所有可能的随机样本”。因此,计算机模拟成为数据科学中的一个强大工具。它们可以帮助数据科学家理解随机量的性质,而这些性质用其他方式分析会很复杂。