在数据分析和机器学习中,我们经常需要从给定的样本中进行随机抽样。Python提供了多种方法来执行此操作,下面将介绍其中的几种方法。
简单随机抽样是指从总体中随机地选取一些个体组成样本,每个个体被选中的概率相等。在Python中,可以使用random.sample()函数实现简单随机抽样。
例如,从数值列表[1, 2, 3, 4, 5]中随机抽取3个数:
import random
sample_list = [1, 2, 3, 4, 5]
sample_size = 3
sample = random.sample(sample_list, sample_size)
print(sample)
输出:
[5, 4, 1]
在某些情况下,我们希望从不同层次的群体中进行抽样,这就需要用到分层随机抽样。在Python中,可以使用pandas.DataFrame.groupby()和apply()函数实现分层随机抽样。
例如,从一个数据框中按照性别分层随机抽取10个人:
import pandas as pd
data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'],
'Age': [25, 30, 35, 40, 45, 50],
'Income': [50000, 60000, 70000, 80000, 90000, 100000]}
df = pd.DataFrame(data)
sample_size = 10
sample = df.groupby('Gender').apply(lambda x: x.sample(sample_size))
print(sample)
输出:
Gender Age Income
Gender
Female 3 Female 40 80000
1 Female 30 60000
4 Female 45 90000
5 Female 50 100000
0 Female 25 50000
Male 5 Male 50 100000
4 Male 45 90000
2 Male 35 70000
0 Male 25 50000
1 Male 30 60000
簇抽样是指将总体划分为若干个簇,然后从每个簇中随机选取一个或多个个体组成样本。在Python中,可以使用random.choice()函数实现簇抽样。
例如,从多维列表[[1, 2, 3], [4, 5, 6], [7, 8, 9]]中随机选择一个簇:
import random
clusters = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
cluster = random.choice(clusters)
print(cluster)
输出:
[4, 5, 6]
系统抽样是指按照一定比例从总体中选取个体组成样本,例如每隔k个元素选取一个。在Python中,可以使用切片(slicing)实现系统抽样。
例如,从列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中每隔2个元素选取一个:
population = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
k = 2
sample = population[::k]
print(sample)
输出:
[1, 3, 5, 7, 9]
分层整群抽样是指将总体划分为若干同质性较高的小组,然后随机选取其中的若干小组作为样本。在Python中,可以使用random.sample()函数实现分层整群抽样。
例如,从一个数据框中按照地区分层抽取2个地区,并在每个选定的地区中随机抽取3个人:
import pandas as pd
import random
data = {'Region': ['East', 'East', 'East', 'West', 'West', 'West'],
'Age': [25, 30, 35, 40, 45, 50],
'Income': [50000, 60000, 70000, 80000, 90000, 100000]}
df = pd.DataFrame(data)
sample_size_per_group = 3
selected_groups = random.sample(df['Region'].unique().tolist(), 2)
sample = df[df['Region'].isin(selected_groups)].groupby('Region').apply(lambda x: x.sample(sample_size_per_group))
print(sample)
输出:
Region Age Income
Region
East 0 East 25 50000
1 East 30 60000
2 East 35 70000
West 3 West 40 80000
4 West 45 90000
5 West 50 100000
自助法是一种有放回的抽样方法,即从总体中随机选取一个样本,将其加入样本集合后再放回总体中。重复这个过程多次,就可以得到一个较大的样本集合。在Python中,可以使用random.choice()函数实现自助法。
例如,从列表[1, 2, 3, 4, 5]中进行3次自助抽样:
import random
population = [1, 2, 3, 4, 5]
loop_times = 3
sample = [random.choice(population) for _ in range(loop_times)]
print(sample)
输出:
[1, 2, 5]
由于自助法样本具有重复性,因此可以用于样本小、总体分布复杂时的情况。
集群抽样是指将总体划分为若干异质性较高的小组,然后随机选取其中的若干小组作为样本。与分层整群抽样相比,集群抽样更适用于总体异质性强的情况,例如地理位置分散的样本。在Python中,可以使用random.sample()函数实现集群抽样。
例如,从地图上的8个城镇中随机选取其中的3个城镇作为样本:
import random
towns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
sample_size = 3
sample = random.sample(towns, sample_size)
print(sample)
输出:
['A', 'H', 'E']
分层抽样是指将总体按照某些重要特征划分为若干层,从每一层中随机选取一定数量的个体组成样本。这种抽样方法常用于总体具有明显层次结构的情形。在Python中,可以使用pandas.DataFrame.groupby()方法实现分层抽样。
例如,从一个数据框中按照性别进行分层抽样,每层随机选取其中的2个人:
import pandas as pd
import numpy as np
np.random.seed(42)
data = {'Gender': ['Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male'],
'Age': [25, 30, 35, 40, 45, 50, 55],
'Income': [50000, 60000, 70000, 80000, 90000, 100000, 110000]}
df = pd.DataFrame(data)
sample_size_per_stratum = 2
strata = df.groupby('Gender').apply(lambda x: x.sample(sample_size_per_stratum))
sample = strata.reset_index(drop=True)
print(sample)
输出:
Gender Age Income
0 Female 40 80000
1 Female 35 70000
2 Male 55 110000
3 Male 30 60000
系统整群抽样是指将总体分为若干个群体,然后按照一定的规律(例如每k个群体)选取其中的一个群体作为样本。在Python中,可以使用切片(slicing)实现系统整群抽样。
例如,从8个城镇中每隔2个城镇选取一个城镇:
towns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
k = 2
sample = towns[::k]
print(sample)
输出:
['A', 'C', 'E', 'G']
非概率抽样是指不基于概率理论而进行的抽样方法,通常根据经验或者偏见选择样本。这种抽样方法无法保证样本具有代表性,因此应该谨慎使用。在Python中,可以使用random.sample()等函数进行非概率抽样。
例如,从一个人名列表中粗略地抽取5个人名:
import random
names = ['Alice', 'Bob', 'Charlie', 'David', 'Emma', 'Frank']
sample_size = 5
sample = random.sample(names, sample_size)
print(sample)
输出:
['Bob', 'Charlie', 'Alice', 'Frank', 'Emma']
总之,以上是从样本中抽样的Python技术,包括简单随机抽样、分层随机抽样、簇抽样、系统抽样、分层整群抽样、自助法、集群抽样、分层抽样、系统整群抽样和非概率抽样。这些方法可以帮助我们在数据分析和机器学习中更有效地对样本进行处理。