pandas 不成比例分层采样- Python

agxfikkp  于 2023-05-15  发布在  Python
关注(0)|答案(1)|浏览(132)

我有一个人的数据集,它包括他们分配的ID从1到8,以及他们的性别。使用python,我如何使用不成比例分层采样来创建一些团队?
我使用了以下代码来获取分发:

from openpyxl import load_workbook
wb = load_workbook("dataset.xlsx")
sh = wb["Page"]
dist = []
for i in range(415):
    gr = sh[f'C{i+1}'].value
    gend = sh[f'D{i+1}'].value
    dist.append(str(int(inc))+onc)
for i in range(8):
    print(f'Grade {i+1} Males:' +str(dist.count(str(i+1)+'M')))
    print(f'Grade {i+1} Females:' +str(dist.count(str(i+1)+'F')))
p1tboqfb

p1tboqfb1#

根据您的数据集,我们将执行以下步骤:
1.从Excel加载数据集。
1.统计每个年级的男女人数。
1.使用不成比例分层抽样为每个团队选择样本。
以下是如何实现这些步骤:
首先,让我们修复加载数据和计算每个年级中男性和女性人数的代码。在你的代码中,你似乎使用了inconc,它们在任何地方都没有定义。我猜你打算使用grgend代替。下面是正确的代码:

from openpyxl import load_workbook

# Load the workbook and select the sheet
wb = load_workbook("dataset.xlsx")
sh = wb["Page"]

# Initialize the distribution list
dist = []

# Iterate over the rows in the sheet and append grade and gender to the distribution list
for i in range(415):
    gr = sh[f'C{i+2}'].value  # Excel uses 1-based indexing, so the first data row is 2
    gend = sh[f'D{i+2}'].value
    dist.append(str(int(gr)) + gend)

# Print the counts of males and females in each grade
for i in range(1, 9):
    print(f'Grade {i} Males: ' + str(dist.count(str(i) + 'M')))
    print(f'Grade {i} Females: ' + str(dist.count(str(i) + 'F')))

接下来,我们将使用不成比例分层抽样为每个团队选择样本。不成比例分层抽样是指我们以这样一种方式选择样本,即每个分层的样本大小与总体中的比例大小不相对应。
为了简单起见,假设我们要组成10个团队,每个团队有8名成员(4名男性和4名女性),我们将从每个年级中选择一名男性和一名女性。这是一种非常简单的不成比例分层抽样形式,分层是年级和性别。以下是你可以做的:

import random

# Initialize teams as empty lists
teams = [[] for _ in range(10)]

# For each team
for team in teams:
    # For each grade
    for i in range(1, 9):
        # Select one male and one female randomly
        while True:
            candidate = random.choice(dist)
            if candidate.startswith(str(i)) and candidate.endswith('M') and candidate not in team:
                team.append(candidate)
                break
        while True:
            candidate = random.choice(dist)
            if candidate.startswith(str(i)) and candidate.endswith('F') and candidate not in team:
                team.append(candidate)
                break

# Print the teams
for i, team in enumerate(teams, 1):
    print(f'Team {i}: {team}')

这个代码将从每个年级随机选择一名男性和一名女性组成一个团队。这确保了每个小组都有来自所有年级和性别的成员。
请注意,这是一种简单的不成比例分层抽样,没有考虑到人口中年级和性别的实际分布。不成比例分层抽样的实际方法将需要关于样本中的期望分布的知识。

相关问题