目录
文章导航
一、抽样
1、抽样的定义与重要性
在统计学中,抽样是指从总体中选取一部分个体作为样本进行研究的过程。抽样的重要性在于,它允许我们通过研究样本的特性来推断总体的特性,而无需对每一个个体都进行研究。这种方法不仅节省了大量的时间和资源,而且在很多情况下也是实际可行的唯一方式。
2、抽样的基本原则
抽样需要遵循一些基本原则,以确保样本的代表性和可靠性。其中最重要的是随机性原则,即每个个体被选中的概率应该相等,以避免主观偏见和误差。此外,还需要考虑样本的大小和分布,以确保样本能够充分反映总体的特征。
3、抽样的类型与选择
根据不同的研究目的和条件,可以选择不同的抽样方法。常见的抽样类型包括简单随机抽样、系统抽样、分层抽样和整群抽样等。每种方法都有其优缺点和适用范围,需要根据实际情况进行选择。
①简单随机抽样
也称为纯随机抽样,是从总体中不加任何分组、划类、排队等完全随机地抽取调查单位。
import pandas as pd
# 假设你有一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'B': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
})
# 使用sample方法进行简单随机抽样,抽取3行
sample_size = 3
sample_df = df.sample(n=sample_size)
print(sample_df)
②系统抽样
按照一定规律从总体中选取样本。具体方法为先随机确定一个起始位置,然后每隔一定距离(称为抽样间隔)选取一个样本。
import pandas as pd
import numpy as np
# 假设df是你的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'B': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
})
# 设置系统抽样的步长
k = 3 # 每3个样本取一个
# 获取样本总数
n = len(df)
# 计算起始索引,确保每个间隔都有样本(这里简单地设置为0,也可以随机选择一个小于步长的整数)
start = 0
# 根据步长和起始索引创建样本索引
indices = np.arange(start, n, k)
# 使用索引从DataFrame中抽取样本
systematic_sample_df = df.iloc[indices]
# 打印系统抽样结果
print(systematic_sample_df)
③分层抽样
先按对主要研究指标影响较大的某种特征,将总体分为若干类别(统计上称之为“层”),再从每一层内随机抽取一定数量的观察单位,合起来组成样本。
import pandas as pd
# 假设你有一个DataFrame,其中包含两个列:'feature' 和 'target'
# 'feature' 列用于分层,'target' 列是你要研究的变量
data = {
'feature': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'target': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
df = pd.DataFrame(data)
# 分层抽样的实现
# 首先,根据'feature'列对数据进行分组
grouped = df.groupby('feature')
# 接下来,对每个组进行抽样。假设我们想要从每个组中抽取两个样本
sampled_df_list = [group.sample(n=2) for name, group in grouped]
# 最后,将抽样后的各组数据合并成一个DataFrame
sampled_df = pd.concat(sampled_df_list, ignore_index=True)
# 显示抽样结果
print(sampled_df)
# 根据每层的比例进行抽样
# 首先计算每层的样本数
sample_sizes = df.groupby('feature').size() * 0.5 # 假设我们想从每层抽取50%的样本
# 对每个层进行按比例抽样
sampled_df_list = [group.sample(n=int(size)) for name, group, size in zip(grouped.groups.keys(), grouped, sample_sizes)]
# 合并抽样后的数据
sampled_df = pd.concat(sampled_df_list, ignore_index=True)
# 显示抽样结果
print(sampled_df)
④整群抽样
先将总体按照某种与主要研究指标无关的特征划分为K个“群”,每个群包含若干观察单位,然后再随机抽取k个“群”,由抽取的各个群的全部观察单位组成样本。
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
np.random.seed(0) # 为了结果的可重复性
data = {
'cluster': np.repeat(list('ABC'), 10), # 假设有3个群,每个群有10个观察单位
'value': np.random.rand(30) # 每个观察单位的某个值
}
df = pd.DataFrame(data)
# 查看原始数据
print("原始数据:")
print(df)
# 定义群的数量
num_clusters = len(df['cluster'].unique())
# 定义要抽取的群的数量
num_samples = 2 # 例如,我们想从3个群中抽取2个群
# 随机选择群
sampled_clusters = np.random.choice(df['cluster'].unique(), size=num_samples, replace=False)
# 根据选中的群来筛选数据,形成样本
sample_df = df[df['cluster'].isin(sampled_clusters)]
# 查看抽样结果
print("抽样结果:")
print(sample_df)
二、置信
1、置信区间的概念与意义
置信区间是根据样本数据计算出的一个数值范围,用于估计总体参数的取值范围。这个范围具有一定的可靠性或置信水平,表示我们有多大的信心认为总体参数的真实值落在这个范围内。置信区间的意义在于它提供了一种量化的方式来评估估计的准确性和可靠性。
2、置信水平的理解与选择
置信水平是表示置信区间可靠性的概率值,通常用百分比来表示。例如,95%的置信水平意味着我们有95%的信心认为总体参数的真实值落在我们计算的置信区间内。置信水平的选择取决于研究的需求和可接受的风险水平。较高的置信水平通常意味着更可靠的估计,但也可能需要更大的样本量。
3、置信区间的计算与应用
置信区间的计算通常涉及样本统计量、标准误差和置信水平等因素。通过一定的统计公式或软件工具,我们可以计算出置信区间的上下限。这些置信区间可以应用于各种统计推断和决策制定的场景,帮助我们更好地理解和利用样本数据。
①t分布法
适用于样本量较小(通常小于30)的情况。其计算公式为:置信区间 = 样本均值 ± t值 × 标准误差。其中,t值需要根据样本量和置信水平来查表得到,标准误差则是样本标准差除以样本量的平方根。
import numpy as np
from scipy import stats
# 假设你有一个样本,这里我们创建一个简单的例子
sample = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 计算样本均值
sample_mean = np.mean(sample)
# 计算样本标准差
sample_std = np.std(sample, ddof=1) # ddof=1 是为了得到样本标准差的无偏估计
# 计算样本量
n = len(sample)
# 假设自由度 df = n - 1
df = n - 1
# 设定置信水平,例如95%的置信水平
confidence_level = 0.95
# 计算t分布的临界值(双侧检验)
alpha = 1 - confidence_level
t_critical = stats.t.ppf(1 - alpha / 2, df)
# 计算置信区间
# 置信区间的公式为:样本均值 ± t_critical * (样本标准差 / sqrt(样本量))
confidence_interval = (sample_mean - t_critical * (sample_std / np.sqrt(n)),
sample_mean + t_critical * (sample_std / np.sqrt(n)))
print(f"置信区间为:({confidence_interval[0]:.2f}, {confidence_interval[1]:.2f})")
②z分布法
适用于样本量较大(通常大于30)的情况。其计算公式为:置信区间 = 样本均值 ± z值 × 标准误差。其中,z值需要根据置信水平来查表得到,标准误差同样是样本标准差除以样本量的平方根。
import numpy as np
def compute_confidence_interval(data, confidence_level=0.95):
# 计算样本均值
sample_mean = np.mean(data)
# 计算样本标准差
sample_std = np.std(data, ddof=1) # ddof=1是为了得到样本标准差的无偏估计
# 计算样本大小
sample_size = len(data)
# 计算标准误差
standard_error = sample_std / np.sqrt(sample_size)
# 根据置信水平查找对应的z值
# 对于95%的置信水平,双尾检验的z值为1.96
z_value = 1.96 if confidence_level == 0.95 else stats.norm.ppf((1 + confidence_level) / 2)
# 计算置信区间的上下限
lower_bound = sample_mean - z_value * standard_error
upper_bound = sample_mean + z_value * standard_error
return lower_bound, upper_bound
# 示例数据
data = np.random.randn(100) # 假设我们有100个来自正态分布的样本数据
# 计算95%置信区间的上下限
lower, upper = compute_confidence_interval(data)
print(f"95%置信区间为: ({lower:.2f}, {upper:.2f})")
三、小试牛刀
假设我们要研究某城市居民的平均收入情况。由于总体规模庞大,直接对所有居民进行调查是不现实的。因此,我们采用抽样的方法,从总体中随机抽取一部分居民作为样本进行调查。
在得到样本数据后,我们可以计算样本的平均收入,并利用置信区间的计算方法,确定一个具有一定置信水平的平均收入估计范围。例如,我们可能得出一个95%置信水平下的平均收入置信区间为[4916.93, 5035.54]元。
这个置信区间告诉我们,有95%的信心认为这个城市居民的平均收入在这个范围内。虽然这个范围存在一定的不确定性,但它为我们提供了一个大致的估计,并帮助我们了解估计的准确性。基于这个置信区间,我们可以进一步进行统计推断和决策制定,比如评估政策效果、制定经济计划等。
import numpy as np
import pandas as pd
from scipy import stats
# 设置随机种子以确保结果可复现
np.random.seed(0)
# 生成模拟数据 - 假设城市居民的平均收入为5000元,标准差为1000元
population_mean = 5000 # 总体均值
population_std = 1000 # 总体标准差
population_size = 100000 # 假设总体大小为100,000
# 生成正态分布的总体收入数据
population_income = np.random.normal(population_mean, population_std, population_size)
# 将总体数据存储到DataFrame中以便后续分析
population_df = pd.DataFrame({'income': population_income})
# 执行随机抽样 - 假设我们抽取一个大小为1000的样本
sample_size = 1000
sample = population_df.sample(n=sample_size, replace=False)
# 计算样本的平均收入
sample_mean = sample['income'].mean()
# 计算样本的标准差(注意使用ddof=1来得到无偏估计)
sample_std = sample['income'].std(ddof=1)
# 计算标准误差
standard_error = sample_std / np.sqrt(sample_size)
# 设置置信水平
confidence_level = 0.95
# 计算z值
z_value = stats.norm.ppf((1 + confidence_level) / 2)
# 计算置信区间的上下限
confidence_interval_lower = sample_mean - z_value * standard_error
confidence_interval_upper = sample_mean + z_value * standard_error
# 输出结果
print(f"样本平均收入: {sample_mean:.2f}元")
print(f"样本标准差: {sample_std:.2f}元")
print(f"{confidence_level*100}% 置信区间为: ({confidence_interval_lower:.2f}元, {confidence_interval_upper:.2f}元)")