统计学中的抽样方法及python pandas编码实践

介绍统计学中的一个关键概念,抽样。
抽样是从一个总体中提取一部分样本用于分析,以便在总体不可完全观测或不易观测的情况下,依据样本数据对总体进行推断。

抽样在统计学、数据科学、机器学习等领域都很重要,因为很多时候处理总体数据的成本或时间非常高,通过抽样可以大大减小数据处理的开销。

简单随机抽样

简单随机抽样是最基本的抽样方法,其核心是从总体中随机选择样本,使得每个个体被选中的概率相等。
优点:简单直观,抽样过程中没有人为干扰。
缺点:当总体结构复杂或规模很大时,简单随机抽样可能导致代表性不足,无法有效捕获总体特征。

实施方法

  1. 给每个总体单位分配一个唯一编号。
  2. 通过随机数生成器选择这些编号,确保每个单位有相等的概率被选中。
import pandas as pd
import numpy as np
data = pd.DataFrame({
    'CustomerID': range(1, 201),
    'PurchaseAmount': np.random.normal(100, 20, 200)  # Normal distribution with mean=100, std=20
})

sample_random = data.sample(n=50, random_state=1)
mean_random_sample = sample_random['PurchaseAmount'].mean()
print("Mean Purchase Amount (Random Sample):", mean_random_sample)

分层抽样

分层抽样是将总体划分为若干个互不重叠的子集(称为“层”),然后在每个层内进行随机抽样。
每个层的样本数通常按比例分配,以确保各层在样本中的代表性。
优点:如果总体中存在显著的异质性,通过分层可以使每一层的样本代表性更强,从而提高总体估计的准确性。
缺点:在层划分不准确的情况下,分层抽样可能反而降低样本的代表性。

实施方法

  1. 将总体按照特定特征(如年龄、性别、地理位置等)划分成若干个层。
  2. 在每一层中随机抽取样本,通常每层的样本量根据该层在总体中的比例确定。
data['SpendingCategory'] = np.where(data['PurchaseAmount'] > 100, 'High', 'Low')

# Performing stratified sampling
sample_stratified = data.groupby('SpendingCategory', group_keys=False).apply(lambda x: x.sample(25, random_state=1))
mean_stratified_sample = sample_stratified['PurchaseAmount'].mean()
print("Mean Purchase Amount (Stratified Sample):", mean_stratified_sample)

系统抽样

系统抽样是按照一个确定的规则对总体进行均匀抽样的过程。
通常从总体的第一个样本开始,每隔固定的间隔抽取下一个样本。间隔大小通常由总体规模和样本大小确定。
优点:系统抽样可以保证样本均匀分布于总体中,易于实施。
缺点:如果总体中存在周期性特征,系统抽样可能会引入偏差。

实施方法

  1. 将总体按某种顺序排列。
  2. 确定一个固定的间隔 k。
  3. 随机选择第一个样本起点,然后按固定间隔抽取后续样本。

自举法(Bootstrap Sampling)

自举法是一种基于重复抽样的非参数方法,特别用于样本量小的情况下估计统计量的分布。
它通过在样本数据上进行重复抽样来生成多个“再抽样样本”,以估计总体的统计特性。
优点:可以用于估计统计量的分布、置信区间等,并且在小样本数据集上特别有用。
缺点:在样本数量少的情况下可能引入一定偏差。

实施方法

  1. 从样本数据中随机抽取若干样本,可以重复抽取(即每个样本有可能多次被抽取)。
  2. 每次抽样生成一个样本集,重复这一过程以生成多个样本集。
  3. 通过这些样本集计算统计量,并估计其分布。
bootstrap_means = []

for _ in range(1000):  # Drawing 1000 bootstrap samples
    bootstrap_sample = data.sample(n=50, replace=True)
    bootstrap_means.append(bootstrap_sample['PurchaseAmount'].mean())
# Calculating the mean and 95% confidence interval of bootstrapped means
mean_bootstrap = np.mean(bootstrap_means)
ci_lower, ci_upper = np.percentile(bootstrap_means, [2.5, 97.5])
print("Bootstrap Mean Purchase Amount:", mean_bootstrap)
print("95% Confidence Interval for Mean Purchase Amount:", (ci_lower, ci_upper))

来源:小寒 小寒聊python

THE END