统计 - 估计总体比例
总体比例是指属于特定类别的总体份额。
置信区间用于估计总体比例。
估计总体比例
来自样本的统计量用于估计总体的参数。
参数最可能的值是点估计。
此外,我们还可以为估计的参数计算一个下界和一个上界。
误差范围是下界和上界与点估计之间的差值。
下界和上界共同定义了置信区间。
计算置信区间
以下步骤用于计算置信区间:
- 检查条件
- 找到点估计
- 确定置信水平
- 计算误差范围
- 计算置信区间
例如
- 总体:诺贝尔奖得主
- 类别:出生在美国
我们可以抽取一个样本,看看其中有多少人出生在美国。
样本数据用于估计所有诺贝尔奖获得者在美国出生的比例。
通过随机抽取 30 位诺贝尔奖获得者,我们发现
样本中有 30 位诺贝尔奖获得者中有 6 位出生在美国
根据这些数据,我们可以按照以下步骤计算置信区间。
1. 检查条件
计算比例置信区间的条件是
- 样本是随机选择的
- 只有两个选项
- 属于该类别
- 不属于该类别
- 样本至少需要
- 5 个成员属于该类别
- 5 个成员不属于该类别
在我们的例子中,我们随机抽取了 6 位出生在美国的人。
其余的人不是出生在美国,所以其他类别有 24 人。
在这种情况下,条件得到满足。
注意:在每种类别中都有 5 个的情况下,计算置信区间是可能的。但需要进行特殊调整。
2. 找到点估计
点估计是样本比例(\(\hat{p}\))。
计算样本比例的公式是发生次数(\(x\)) 除以样本大小(\(n\))。
\(\displaystyle \hat{p} =\frac{x}{n}\)
在我们的例子中,30 人中有 6 人出生在美国:\(x\) 是 6,\(n\) 是 30。
因此,比例的点估计是
\(\displaystyle \hat{p} = \frac{x}{n} = \frac{6}{30} = \underline{0.2} = 20\%\)
因此,样本中有 20% 的人出生在美国。
3. 确定置信水平
置信水平用百分比或小数表示。
例如,如果置信水平是 95% 或 0.95
那么剩余的概率(\(\alpha\)) 是:5% 或 1 - 0.95 = 0.05。
常用的置信水平是
- 90% 带有 \(\alpha\) = 0.1
- 95% 带有 \(\alpha\) = 0.05
- 99% 带有 \(\alpha\) = 0.01
注意: 95% 的置信水平意味着,如果我们抽取 100 个不同的样本并分别为每个样本制作置信区间
真实参数将有 95 次出现在这 100 个置信区间内。
我们使用标准正态分布来计算置信区间的误差范围。
剩余的概率(\(\alpha\)) 被分成两半,一半在分布的左尾区域,一半在右尾区域。
分隔尾部区域和中间区域的 z 值轴上的值称为临界 z 值。
下面是标准正态分布的图,显示了不同置信水平的尾部区域(\(\alpha\))。
4. 计算误差范围
误差范围是点估计与下界和上界之间的差值。
比例的误差范围(\(E\)) 使用临界 z 值和标准误差来计算
\(\displaystyle E = Z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \)
临界 z 值 \(Z_{\alpha/2} \) 从标准正态分布和置信水平计算得出。
标准误差 \(\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \) 从点估计(\(\hat{p}\)) 和样本大小(\(n\)) 计算得出。
在我们例子中,30 位诺贝尔奖获得者样本中有 6 位出生在美国,标准误差是
\(\displaystyle \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} = \sqrt{\frac{0.2(1-0.2)}{30}} = \sqrt{\frac{0.2 \cdot 0.8}{30}} = \sqrt{\frac{0.16}{30}} = \sqrt{0.00533..} \approx \underline{0.073}\)
如果我们选择 95% 作为置信水平,则 \(\alpha\) 是 0.05。
所以我们需要找到临界 z 值 \(Z_{0.05/2} = Z_{0.025}\)
临界 z 值可以使用Z 表或编程语言函数找到。
示例
使用 Python,请使用 Scipy Stats 库的 norm.ppf()
函数找到 \(\alpha\)/2 = 0.025 的 Z 值。
import scipy.stats as stats
print(stats.norm.ppf(1-0.025))
自己动手试一试 »
使用任一方法,我们都可以发现临界 Z 值 \( Z_{\alpha/2} \) 约为 \(\underline{1.96}\)。
标准误差 \(\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\) 约为 \(\underline{0.073}\)。
因此,误差范围(\(E\)) 是
\(\displaystyle E = Z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \approx 1.96 \cdot 0.073 = \underline{0.143}\)
5. 计算置信区间
置信区间的下界和上界是通过从点估计(\(\hat{p}\)) 减去和加上误差范围(\(E\)) 来找到的。
在我们的例子中,点估计为 0.2,误差范围为 0.143,那么
下界是
\(\hat{p} - E = 0.2 - 0.143 = \underline{0.057} \)
上界是
\(\hat{p} + E = 0.2 + 0.143 = \underline{0.343} \)
置信区间是
\([0.057, 0.343]\) 或 \([5.7 \%, 34.4 \%]\)
我们可以通过陈述来总结置信区间:
出生在美国的诺贝尔奖获得者比例的95%置信区间在5.7% 和 34.4%之间。
使用编程计算置信区间
置信区间可以使用许多编程语言计算。
对于大型数据集,使用软件和编程计算统计量更为常见,因为手动计算会变得困难。
示例
使用 Python,请使用 scipy 和 math 库来计算估计比例的置信区间。
这里,样本大小是 30,发生次数是 6。
import scipy.stats as stats
import math
# 指定样本发生次数 (x)、样本大小 (n) 和置信水平
x = 6
n = 30
confidence_level = 0.95
# 计算点估计、alpha、临界 z 值、标准误差和误差范围
point_estimate = x/n
alpha = (1-confidence_level)
critical_z = stats.norm.ppf(1-alpha/2)
standard_error = math.sqrt((point_estimate*(1-point_estimate)/n))
margin_of_error = critical_z * standard_error
# 计算置信区间的下界和上界
lower_bound = point_estimate - margin_of_error
upper_bound = point_estimate + margin_of_error
# 打印结果
print("点估计: {:.3f}".format(point_estimate))
print("临界 Z 值: {:.3f}".format(critical_z))
print("误差范围: {:.3f}".format(margin_of_error))
print("置信区间: [{:.3f},{:.3f}]".format(lower_bound,upper_bound))
print("人口比例的 {:.1%} 置信区间为:".format(confidence_level))
print("介于 {:.3f} 和 {:.3f} 之间".format(lower_bound,upper_bound))
自己动手试一试 »
示例
使用 R,请使用内置的数学和统计函数来计算估计比例的置信区间。
这里,样本大小是 30,发生次数是 6。
# 指定样本发生次数 (x)、样本大小 (n) 和置信水平
x = 6
n = 30
confidence_level = 0.95
# 计算点估计、alpha、临界 z 值、标准误差和误差范围
point_estimate = x/n
alpha = (1-confidence_level)
critical_z = qnorm(1-alpha/2)
standard_error = sqrt(point_estimate*(1-point_estimate)/n)
margin_of_error = critical_z * standard_error
# 计算置信区间的下界和上界
lower_bound = point_estimate - margin_of_error
upper_bound = point_estimate + margin_of_error
# 打印结果
sprintf("点估计: %0.3f", point_estimate)
sprintf("临界 Z 值: %0.3f", critical_z)
sprintf("误差范围: %0.3f", margin_of_error)
sprintf("置信区间: [%0.3f,%0.3f]", lower_bound, upper_bound)
sprintf("人口比例的 %0.1f%% 置信区间为:", confidence_level*100)
sprintf("介于 %0.4f 和 %0.4f 之间", lower_bound, upper_bound)
自己动手试一试 »