来自随机样本的Python概率

问题描述 投票:0回答:2

[我想做的是:在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)

python numpy random probability sample
2个回答
1
投票

我想在这种情况下,我们谈论的是没有从总体上进行替换的绘图,因此它是超几何分布,其概率质量函数(pmf)由下式给出:

enter image description here

其中

M是人口规模,在此示例中为200

n是人口中的女孩人数,0.47 * 200 = 94

N是开奖次数,24

k是观察到的成功次数,没有女孩

我们使用hypergeom from scipy

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

所以概率是0.21462937817887562


1
投票

尽管我更喜欢简单地使用数学来解决这个问题,但是有一种方法可以让您通过蒙特卡洛模拟来近似估计所需概率。我已经在这里解决了这两种方法。

蒙特卡洛方法

根据您的文字告诉我们,在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是数学上的精确概率,并且始终保持不变。
© www.soinside.com 2019 - 2024. All rights reserved.