随机样本的概率

2024-05-23 21:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是:在200人的人口中,有47%的女孩。在随机选取24人的样本后,我必须找出样本中有6到9个女孩的概率。我尝试了很多方法,但结果都是错的

你能帮我用NUMPY和LOOP吗

以下是我所做的:

import numpy as np 

population=np.random.choice(np.arange(0,2),size=200, p=[0.53, 0.47])

我只是不知道如何从我的24人样本中创建一个循环,比如:for in range(6,9)


Tags: 方法importnumpyloopasnprandom概率
2条回答

我假设在这种情况下,我们讨论的是从总体中不替换地绘制,因此它是超几何分布,其概率质量函数(pmf)由下式给出:

enter image description here

在哪里

M is the population size, 200 in this example

n is the number of girls in the population, 0.47*200 = 94

N is the number of draws, 24

k is the number of observed successes, no of girls

我们使用hypergeom from scipy

from scipy.stats import hypergeom
rv = hypergeom(200,94,24)
sum(rv.pmf([6,7,8,9]))
0.21462937817887562

所以概率是0.21462937817887562

虽然我更喜欢简单地用数学来解决这个问题,但是有一种方法可以让你通过蒙特卡罗模拟来近似想要的概率。这两种方法我都想好了

蒙特卡罗方法

根据你的文字告诉我们的,在200人的人口中有47%的女孩。因此,您不应该使用np.random.choise()来获取人口,而是应该生成一组200人,其中106名男性和94名女性,其中0表示男性,而1表示女性:

population = [0] * 106 + [1] * 94

从该组中,您必须随机选择24人:

subpopulation = np.random.choice(population, size=24)

要评估该子集中的女性人数,只需将数组总结为:

female_count = np.sum(subpopulation)

从200人中随机选择24人,计算6至9名女孩的总概率,重复该随机测试几次(例如N=100000),并计算female_count在6至9范围内的频率:

import numpy as np

population = [0] * 106 + [1] * 94
N = 100000
count_in_range = 0

for _ in range(N):
    subpopulation = np.random.choice(population, size=24)
    female_count = np.sum(subpopulation)

    if female_count in range(6, 10):  # 10 is not included 
        count_in_range += 1


in_range_probabilty = count_in_range/N
print(f'p = {in_range_probabilty}')

精确逼近

要计算准确的概率,只需使用Binomial Distribution来计算24人中有6人是女性、7人是女性等的概率,并将这些概率相加:

import scipy.special
p = 0.47
n = 24

p_exact = 0
for k in range(6,10):
    p_exact += scipy.special.binom(n,k) * p**k * (1-p)**(n-k)

print(f'p_exact = {p_exact}')

样本输出:

p = 0.226853
p_exact = 0.22672292898157842

请注意,p的结果可能因不同的运行而不同,因为这是随机生成的,而p_exact是数学上的精确概率,并且始终保持不变

相关问题 更多 >