ThinkStats2项目中的随机抽样与统计推断实践指南

ThinkStats2项目中的随机抽样与统计推断实践指南

ThinkStats2 Text and supporting code for Think Stats, 2nd Edition ThinkStats2 项目地址: https://gitcode.com/gh_mirrors/th/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}")

结论

通过本文的实践,我们学习了:

  1. 如何从已知分布中进行随机抽样
  2. 计算和理解抽样分布的特性
  3. 使用重抽样技术进行统计推断
  4. 比较两组数据的差异并计算效应量

这些技术是统计推断的基础,可以应用于各种数据分析场景。理解这些概念对于正确解释数据分析结果至关重要。

ThinkStats2 Text and supporting code for Think Stats, 2nd Edition ThinkStats2 项目地址: https://gitcode.com/gh_mirrors/th/ThinkStats2

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晏宇稳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值