📜  Pandas 中的分层抽样

📅  最后修改于: 2022-05-13 01:54:34.107000             🧑  作者: Mango

Pandas 中的分层抽样

分层抽样是一种抽样技术,用于获取最能代表总体的样本。它通过将总体划分为称为的同质子组,并从每个层(层的单一形式)随机抽样数据来减少选择样本时的偏差。

在统计学中,当每个层的平均值不同时,使用分层抽样。在机器学习中,分层抽样通常用于创建测试数据集来评估模型,尤其是当数据集非常大且不平衡时。



分层抽样涉及的步骤

  • 将人口分成层:在这一步中,根据相似的特征将人口分成层,并且人口中的每个成员必须完全属于一个层(层的单数)。
  • 确定样本大小:决定样本应该多小或多大。
  • 对每个层进行随机抽样:使用不成比例抽样(其中每个层的样本大小与层的总体规模无关)或按比例抽样(其中每个层的样本大小与总体规模成比例)从每个层中选择随机样本地层。

示例 1:

在这个例子中,我们有一个包含 10 名学生的虚拟数据集,我们将根据他们的成绩抽取 6 名学生,使用不成比例和成比例的分层抽样。

第 1 步:使用 Pandas DataFrame 从Python字典创建虚拟数据集

Python3
import pandas as pd
  
# Create a dictionary of students
students = {
    'Name': ['Lisa', 'Kate', 'Ben', 'Kim', 'Josh',
             'Alex', 'Evan', 'Greg', 'Sam', 'Ella'],
    'ID': ['001', '002', '003', '004', '005', '006', 
           '007', '008', '009', '010'],
    'Grade': ['A', 'A', 'C', 'B', 'B', 'B', 'C', 
              'A', 'A', 'A'],
    
    'Category': [2, 3, 1, 3, 2, 3, 3, 1, 2, 1]
}
  
# Create dataframe from students dictionary
df = pd.DataFrame(students)
  
# view the dataframe
df


Python3
df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(2))


Python3
df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(frac=0.6))


Python3
import pandas as pd
  
# read the dataset as csv file
data = pd.read_csv('Titanic.csv')
  
# drop the name column as it is of no importance here
data.drop('Name', axis=1, inplace=True)
  
# view the first 5 rows of the titanic dataset
data.head()


Python3
(data['Survived'].value_counts()) / len(data) * 100


Python3
# Disproportionate sampling:
# randomly select 4 samples from each stratum
  
data.groupby('Survived', group_keys=False).apply(lambda x: x.sample(4))


Python3
data.groupby('Survived', group_keys=False).
apply(lambda x: x.sample(frac=0.01))


输出:

请注意, A 级学生占 50%B 级学生占 30%C 级学生占 20%

步骤 2:不成比例地创建 6 名学生的样本(每个年级的学生人数相等)

不成比例的抽样:使用pandas groupby,根据学生的成绩将学生分成组,即A、B、C,并使用sample函数从每个年级组中随机抽取2名学生



蟒蛇3

df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(2))

输出:

第 3 步:按比例抽取 60% 的学生(根据每个阶层在总体中的比例从每个阶层中创建比例样本)

比例抽样:使用pandas groupby,根据学生的成绩将学生分成组,即A、B、C,并根据人口比例从每个组中随机抽取样本。总样本量为总体的 60%(0.6)

蟒蛇3

df.groupby('Grade', group_keys=False).apply(lambda x: x.sample(frac=0.6))

输出:

请注意,即使在样本中,也有50% 的 A 级学生、 30% 的 B 级学生和20% 的 C 级学生。

示例 2:

在这个例子中,我们将从训练数据集创建样本数据。泰坦尼克号是一名英国乘客,在撞上冰山后沉入北大西洋。该数据集包含有关登上泰坦尼克号的所有乘客的信息,其中一名乘客在坠机事故中死亡或幸存,因此我们将使用 Survived 列作为我们的分层列。



步骤 1:从 CSV 文件中读入数据集

蟒蛇3

import pandas as pd
  
# read the dataset as csv file
data = pd.read_csv('Titanic.csv')
  
# drop the name column as it is of no importance here
data.drop('Name', axis=1, inplace=True)
  
# view the first 5 rows of the titanic dataset
data.head()

输出:

第 2 步:检查死亡/幸存乘客的百分比

检查死亡或幸存乘客的比例/百分比这是给出的死亡或活着的乘客数量/乘客总数* 100

蟒蛇3

(data['Survived'].value_counts()) / len(data) * 100

输出:

0    61.616162
1    38.383838

其中0代表死亡的乘客 (61.6%) 和1代表幸存的乘客 (38.4%)

第 3 步:不成比例地抽取 8 名乘客(4 人死亡,4 人幸存)



蟒蛇3

# Disproportionate sampling:
# randomly select 4 samples from each stratum
  
data.groupby('Survived', group_keys=False).apply(lambda x: x.sample(4))

输出:

第 4 步:按比例抽取 1% (0.01) 名乘客(0.6% 死亡,0.4% 幸存)

蟒蛇3

data.groupby('Survived', group_keys=False).
apply(lambda x: x.sample(frac=0.01))

输出: