Python中的分层抽样技巧
更新时间:2023-07-09分层抽样技巧介绍
分层抽样技术是指将总体按照某一或几个特征相同或相似的分成几个层次(层),然后从各层中分别抽取一定数量或比例的样本进行检查。
分层抽样示例1 - 随机抽取数据集中的一部分
下面是一个随机抽取数据集中的一部分的示例:
import random
# 构造一个包含100个元素的数据集
data_set = list(range(100))
# 随机抽取其中10个元素
sample = random.sample(data_set, 10)
print(sample)
分层抽样示例2 - 根据特征属性进行抽样
下面是一个根据特征属性进行抽样的示例:
class Person:
def __init__(self, age, sex, name):
self.age = age
self.sex = sex
self.name = name
# 构造一个Person对象的列表,其中包含10个元素,其中5个女性,5个男性
data_set = [
Person(age=25, sex='Male', name='Tom'),
Person(age=30, sex='Female', name='Linda'),
Person(age=21, sex='Male', name='Jack'),
Person(age=28, sex='Male', name='Mike'),
Person(age=35, sex='Female', name='Emily'),
Person(age=23, sex='Female', name='Amy'),
Person(age=29, sex='Male', name='Harry'),
Person(age=27, sex='Female', name='Lucy'),
Person(age=24, sex='Female', name='Maggie'),
Person(age=31, sex='Male', name='David'),
]
# 根据性别抽取一个样本集合
male_sample = filter(lambda x: x.sex == 'Male', data_set)
# 输出样本集合中的所有人的名字
print([p.name for p in male_sample])
分层抽样示例3 - 根据分层指标进行抽样
下面是一个根据分层指标进行抽样的示例:
class Person:
def __init__(self, age, sex, name, income):
self.age = age
self.sex = sex
self.name = name
self.income = income
# 构造一个Person对象的列表,其中包含10个元素,其中5个女性,5个男性,10个不同的收入水平
data_set = [
Person(age=25, sex='Male', name='Tom', income=10000),
Person(age=30, sex='Female', name='Linda', income=20000),
Person(age=21, sex='Male', name='Jack', income=30000),
Person(age=28, sex='Male', name='Mike', income=50000),
Person(age=35, sex='Female', name='Emily', income=70000),
Person(age=23, sex='Female', name='Amy', income=100000),
Person(age=29, sex='Male', name='Harry', income=15000),
Person(age=27, sex='Female', name='Lucy', income=25000),
Person(age=24, sex='Female', name='Maggie', income=35000),
Person(age=31, sex='Male', name='David', income=45000),
]
# 根据收入水平将数据集分解成3个层次
low_income = [p for p in data_set if p.income < 30000]
medium_income = [p for p in data_set if 30000 <= p.income < 70000]
high_income = [p for p in data_set if 70000 <= p.income]
# 从每个层次中抽取1个样本
sample = [random.choice(low_income), random.choice(medium_income), random.choice(high_income)]
# 输出样本中的所有人的名字和收入
print([(p.name, p.income) for p in sample])