Python вероятность из случайной выборки - PullRequest
0 голосов
/ 30 марта 2020

Вот что я хотел бы сделать: 47% девушек среди населения в 200 человек. После выбора случайной выборки из 24 человек я должен найти вероятность, что в этой выборке будет от 6 до 9 девочек. Я пробовал много способов, но каждый из них просто оказался неправильным!

Не могли бы вы помочь мне, используя NUMPY и L OOP?

Вот что я сделал:

import numpy as np 

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

и я просто не знаю, как создать al oop вроде: for in range(6,9) из моей выборки на 24 человека?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Хотя я бы предпочел просто использовать математику для решения этого вопроса, есть способ приблизить желаемую вероятность с помощью симуляции Монте-Карло. Я разработал оба подхода здесь.

Подход Монте-Карло

Из того, что говорит нам ваш текст, составляют 47% девушек в населении 200 человек. , Таким образом, вы не должны использовать 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)

Рассчитать общую вероятность наличия от 6 до 9 девочек при случайном выборе 24 человек из набора из 200 человек, повторить этот случайный тест несколько раз (например, 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}')

Точный подход

Чтобы вычислить точную вероятность, просто используйте Биномиальное распределение , чтобы вычислить вероятности для этих 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

Обратите внимание, что результат * 10 33 * может варьироваться при разных прогонах, поскольку это генерируется случайным образом, тогда как p_exact является математической точной вероятностью и остается неизменной все время.

1 голос
/ 29 марта 2020

Я полагаю, что в данном случае мы говорим о рисовании без замены из совокупности, поэтому это гипергеометрия c, и его функция вероятности массы (pmf) определяется как:

enter image description here

, где

M - численность населения, в данном примере 200

n - число девочек в популяции, 0,47 * 200 = 94

N - число др aws, 24

k - количество наблюдаемых успехов, число девочек

Мы используем гипергеом от scipy :

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

Таким образом, вероятность составляет 0,21462937817887562

...