选择样本量

候选人A正在参加一场选举。一家民调机构希望估计将会投票给她的选民比例。假设他们计划对选民进行简单随机抽样,尽管实际上他们的抽样方法会更复杂。他们如何决定样本量应该多大才能达到所需的准确性水平?

在做出几个假设后,我们现在可以回答这个问题: - 选民总体非常大,因此我们可以假设随机样本将有放回地抽取。 - 民调机构将通过构建将会投票给候选人A的选民百分比的近似95%置信区间来进行估计。 - 所需的准确性水平是区间宽度不超过1%。这相当精确!例如,置信区间(33.2%, 34%)可以接受,但(33.2%, 35%)就不行。

我们将使用样本中投票给候选人A的选民比例。回顾一下,当总体中的值仅为0(你不计数的个体类型)或1(你计数的个体类型)时,比例就是一种均值。

[In ]:
from datascience import *
import numpy as np
path_data = '../../../../data/'
%matplotlib inline
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')

置信区间的宽度

如果我们有一个随机样本,我们可以使用自助法为投票给候选人A的选民百分比构建一个置信区间。但我们还没有样本——我们正试图找出样本需要多大,才能使我们的置信区间达到我们想要的窄度。

在这种情况下,看看理论的预测会有所帮助。

中心极限定理表明,样本比例的概率大致呈正态分布,以总体中1的比例为中心,SD等于0-1总体的SD除以样本量的平方根。

因此,置信区间仍将是正态分布的“中间95%”,尽管我们不能将其两端作为自助法比例的第2.5和第97.5百分位数来选取。

有没有其他方法可以找出区间会有多宽?有的,因为我们知道对于正态分布的变量,“中心 $\pm$ 2个SD”的区间包含95%的数据。

置信区间将在中心两侧各延伸样本比例的2个SD。因此,区间的宽度将是样本比例的4个SD。

我们可以容忍1% = 0.01的宽度。因此,使用上一节推导的公式,

$$ 4 \times \frac{\mbox{0-1总体的SD}}{\sqrt{\mbox{样本量}}} ~ \le ~ 0.01 $$

所以

$$ \sqrt{\mbox{样本量}} ~ \ge ~ 4 \times \frac{\mbox{0-1总体的SD}}{0.01} $$

0和1集合的标准差

如果我们知道总体的SD,我们就完成了。我们可以计算样本量的平方根,然后取平方得到样本量。但我们不知道总体的SD。总体由每个投票给候选人A的选民对应1,所有其他选民对应0组成,我们不知道每种各占多大比例。这正是我们要估计的。

那么我们就卡住了吗?不,因为我们可以,*界定)总体的SD。以下是两个此类分布的直方图,一个1和0的比例相等,另一个90%为1、10%为0。哪一个的SD更大?

[In ]:
pop_50 = make_array(1, 1, 1, 1, 1, 0, 0, 0, 0, 0)
pop_90 = make_array(1, 1, 1, 1, 1, 1, 1, 1, 1, 0)

coins = Table().with_columns(
   "Proportion of 1's: 0.5", pop_50,
   "Proportion of 1's: 0.9", pop_90,
)
coins.hist(bins=np.arange(-0.5, 1.6, 1))
plots.scatter(0.5, -0.02, marker='^', color='darkblue', s=60)
plots.scatter(0.9, -0.02, marker='^', color='gold', s=60)
plots.ylim(-0.05, 1);
Two overlapping histograms. In dark blue is 'Proportion of 1's: 0.5' and in gold is 'Proportion of 1's: 0.9.' The dark blue histogram shows two bars of equal height at 50. In gold, the first bar has height of 10 and the second bar has height of 90. A triangle is shown below both histograms at x=0.5

请记住,总体中的可能值只有0和1。

蓝色直方图(50%的1和50%的0)比金色具有更大的分散程度。均值为0.5。一半的离差等于0.5,另一半等于-0.5,因此SD为0.5。

在金色直方图中,所有面积都被压缩在1周围,导致较小的分散程度。90%的离差很小:0.1。其余10%为-0.9,相对较大,但总体分散程度小于蓝色直方图。

如果我们改变1的比例或让0的比例大于1的比例,同样的观察结果也适用。让我们通过计算仅由0和1组成、比例各不相同的10元素总体的SD来验证这一点。函数 np.ones 对此很有用。它接受一个正整数作为参数,并返回一个由那么多1组成的数组。

[In ]:
sd = make_array()
for i in np.arange(1, 10, 1):
    # Create an array of i 1's and (10-i) 0's
    population = np.append(np.ones(i), 1-np.ones(10-i))
    sd = np.append(sd, np.std(population))
    
zero_one_sds = Table().with_columns(
    "Population Proportion of 1's", np.arange(0.1, 1, 0.1),
    "Population SD", sd
)

zero_one_sds
Population Proportion of 1's | Population SD
0.1                          | 0.3
0.2                          | 0.4
0.3                          | 0.458258
0.4                          | 0.489898
0.5                          | 0.5
0.6                          | 0.489898
0.7                          | 0.458258
0.8                          | 0.4
0.9                          | 0.3

毫不奇怪,10%为1、90%为0的总体的SD与90%为1、10%为0的总体的SD相同。这是因为你将一个直方图的条形互换就得到了另一个;分散程度没有变化。

对我们的目的更重要的是,SD随着1的比例增加而增加,直到1的比例达到0.5;然后它开始对称地减小。

[In ]:
zero_one_sds.scatter("Population Proportion of 1's")
A scatterplot with 'Population Proportion of 1's' on the x-axis and 'Population SD' on the y-axis. The nine dots are equally spaced across the x-axis and range from x=0.1 to x=0.9 From x=0.1 to x=0.5, the y values increase from 0.3 to 0.5. Then from x=0.5 to x=0.9 the y values decrease back down to 0.3, mirroring the shape of the previous data points.

总结: 由1和0组成的总体的SD至多为0.5。这是当总体中50%编码为1、另外50%编码为0时SD的值。

样本量

我们知道

$$ \sqrt{\mbox{样本量}} ~ \ge ~ 4 \times \frac{\mbox{0-1总体的SD}}{0.01} $$

并且0-1总体的SD至多为0.5,无论总体中1的比例如何。因此,取以下值是安全的:

$$ \sqrt{\mbox{样本量}} ~ \ge ~ 4 \times \frac{0.5}{0.01} ~=~ 200 $$

所以样本量至少应为 $200^2 = 40,000$。这是一个巨大的样本!但如果你想在无论总体情况如何的情况下都确保高置信度下的高准确性,这就是你所需要的。