ThinkStats2项目中的随机抽样与统计推断实践指南
引言
在统计学和数据科学领域,理解抽样分布和统计推断是至关重要的基础能力。本文将基于ThinkStats2项目中的抽样分析案例,深入讲解如何使用Python实现随机抽样、计算抽样分布,并进行统计推断。
准备工作
首先我们需要导入必要的Python库:
import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
from ipywidgets import interact
设置随机种子以保证结果可重现:
np.random.seed(18)
第一部分:基础抽样分析
1.1 理解总体分布
假设我们研究美国女性的体重分布,基于BRFSS数据,女性体重(kg)可以用对数正态分布很好地建模:
female_weight = scipy.stats.lognorm(0.23, 0, 70.8)
print(f"均值: {female_weight.mean():.1f}, 标准差: {female_weight.std():.1f}")
可视化这个分布:
xs = np.linspace(20, 160, 100)
ys = female_weight.pdf(xs)
plt.plot(xs, ys)
plt.xlabel('体重(kg)')
plt.ylabel('概率密度')
plt.title('美国女性体重分布');
1.2 从总体中抽样
定义抽样函数,从总体分布中抽取n个样本:
def make_sample(n=100):
return female_weight.rvs(n)
测试抽样函数:
sample = make_sample(100)
print(f"样本均值: {sample.mean():.1f}, 样本标准差: {sample.std():.1f}")
1.3 抽样分布分析
计算抽样分布的函数:
def compute_sampling_distribution(n=100, iters=1000):
stats = [make_sample(n).mean() for _ in range(iters)]
return np.array(stats)
运行1000次实验:
sample_means = compute_sampling_distribution(n=100, iters=1000)
可视化抽样分布:
plt.hist(sample_means, bins=30)
plt.xlabel('样本均值')
plt.ylabel('频数')
plt.title('样本均值的抽样分布');
1.4 关键统计量
计算标准误差(SE)和90%置信区间(CI):
std_err = sample_means.std()
conf_int = np.percentile(sample_means, [5, 95])
print(f"标准误差: {std_err:.2f}")
print(f"90%置信区间: [{conf_int[0]:.2f}, {conf_int[1]:.2f}]")
1.5 样本大小的影响
创建交互式可视化,观察不同样本量对抽样分布的影响:
def plot_sampling_distribution(n=100, xlim=[55, 95]):
stats = compute_sampling_distribution(n)
se = stats.std()
ci = np.percentile(stats, [5, 95])
plt.hist(stats, bins=30)
plt.xlim(xlim)
plt.text(0.05, 0.9, f'SE: {se:.2f}', transform=plt.gca().transAxes)
plt.text(0.05, 0.8, f'90% CI: [{ci[0]:.2f}, {ci[1]:.2f}]',
transform=plt.gca().transAxes)
plt.show()
interact(plot_sampling_distribution, n=(10, 1000, 10), xlim=fixed([55, 95]))
第二部分:重抽样技术
2.1 重抽样框架
当不知道总体分布时,可以使用重抽样技术。创建一个重抽样类:
class Resampler:
def __init__(self, sample):
self.sample = sample
self.n = len(sample)
def resample(self):
return np.random.choice(self.sample, self.n, replace=True)
def sample_stat(self, sample):
return sample.mean()
def compute_sampling_distribution(self, iters=1000):
return np.array([self.sample_stat(self.resample()) for _ in range(iters)])
2.2 使用重抽样
从原始样本创建重抽样器:
original_sample = make_sample(100)
resampler = Resampler(original_sample)
resampled_means = resampler.compute_sampling_distribution(1000)
2.3 扩展统计量
计算标准差的抽样分布:
class StdResampler(Resampler):
def sample_stat(self, sample):
return sample.std()
std_resampler = StdResampler(original_sample)
std_dist = std_resampler.compute_sampling_distribution(1000)
第三部分:差异分析
3.1 比较两组数据
分析男性和女性体重的差异:
male_weight = scipy.stats.lognorm(0.20, 0, 87.3)
male_sample = male_weight.rvs(100)
print(f"男性平均体重: {male_sample.mean():.1f}")
print(f"女性平均体重: {female_sample.mean():.1f}")
print(f"差异: {male_sample.mean() - female_sample.mean():.1f}")
3.2 效应量计算
Cohen's d效应量计算:
def cohen_d(group1, group2):
diff = group1.mean() - group2.mean()
pooled_std = np.sqrt((group1.std()**2 + group2.std()**2)/2)
return diff / pooled_std
print(f"Cohen's d: {cohen_d(male_sample, female_sample):.2f}")
结论
通过本文的实践,我们学习了:
- 如何从已知分布中进行随机抽样
- 计算和理解抽样分布的特性
- 使用重抽样技术进行统计推断
- 比较两组数据的差异并计算效应量
这些技术是统计推断的基础,可以应用于各种数据分析场景。理解这些概念对于正确解释数据分析结果至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考