Рассчитать вероятность 2 случайные люди находятся в одной группе? - PullRequest
4 голосов
/ 23 сентября 2019

В моем наборе данных есть N человек, каждый из которых разделен на 3 группы (groups = {A, B, C}).Я хочу найти вероятность того, что два случайных человека, n_1 и n_2, принадлежат к одной группе.

У меня есть данные о каждой из этих групп и о том, сколько людей принадлежит им.Важно отметить, что каждая группа имеет разный размер.

import pandas as pd
import numpy as np
import math 

data = {
    "Group": ['A', 'B', 'C'],
    "Count": [20, 10, 5],
}

df = pd.DataFrame(data)
  Group  Count
0     A     20
1     B     10
2     C      5

Я думаю, что знаю, как получить пробное пространство, S, но я не уверен, как получитьчислитель.

def nCk(n,k):
  f = math.factorial
  return f(n) / f(k) / f(n-k)

n = sum(df['Count'])
k = 2
s = nCk(n, k)

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Мои дискретные математические навыки немного ржавые, поэтому не стесняйтесь поправлять меня.У вас есть N человек, разбитых на группы по размерам s_1, ..., s_n, так что N = s_1 + ... + s_n.

  1. Вероятность того, что один случайный человек принадлежит к группе i, составляет s_i / N
  2. Вероятность того, что оба человека окажутся в группе i, составит s_i / N * (s_i - 1) / (N - 1)
  3. Вероятность того, что они вместе любая группа - это сумма вероятностей в # 3 для всех групп.

Код:

import numpy as np

s = df['Count'].values
n = s.sum()
prob = np.sum(s/n * (s-1)/(n-1)) # 0.4117647058823529

Мы можем обобщить это решение на«вероятность того, что k людей все находятся в одной группе»:

k = 2
i = np.arange(k)[:, None]
tmp = (s-i) / (n-i)
prob = np.prod(tmp, axis=0).sum()

Когда k > s.max() (в данном случае 20), ответ равен 0, потому что вы не можете поместить их всех в одну группу,Когда k > s.sum() (35 в данном случае), результат равен nan.

1 голос
/ 23 сентября 2019

Я отвечу на вашу проблему, используя гипергеометрическое распределение, гипергеометрическое распределение - это дискретное распределение вероятностей, которое описывает вероятность k успехов (случайные ничьи, для которых у нарисованного объекта есть заданная особенность) в n ничьих, без замены, из конечногопопуляция размера N, которая содержит ровно K объектов с этим признаком, причем каждый розыгрыш является либо успешным, либо неудачным.Напротив, биномиальное распределение описывает вероятность k успехов в n розыгрышах с заменой.Таким образом, общая вероятность должна быть вероятностью того, что оба принадлежат A + вероятность того, что оба принадлежат B + вероятность того, что оба принадлежат C. Это означает

P(A) = (nCk(20,2) * nCk(15,0))/nCk(35,2)
P(B) = (nCk(10,2) * nCk(25,0))/nCk(35,2)
P(C) = (nCk(5,2) * nCk(5,0)) / nCk(35,2)

В кодовых терминах:

import pandas as pd
import numpy as np
import math 

data = {
    "Group": ['A', 'B', 'C'],
    "Count": [20, 10, 5],
}

df = pd.DataFrame(data)
def nCk(n,k):
  f = math.factorial
  return f(n) / f(k) / f(n-k)

samples = 2
succeses = 2
observations = df['Count'].sum()
p_a = ((nCk(df[df['Group'] == 'A'].set_index('Group').max(),samples)) * (nCk((observations - df[df['Group'] == 'A'].set_index('Group').max()),(samples-succeses)))) / nCk(observations,samples)
p_b = ((nCk(df[df['Group'] == 'B'].set_index('Group').max(),samples)) * (nCk((observations - df[df['Group'] == 'B'].set_index('Group').max()),(samples-succeses)))) / nCk(observations,samples)
p_c =((nCk(df[df['Group'] == 'C'].set_index('Group').max(),samples)) * (nCk((observations - df[df['Group'] == 'C'].set_index('Group').max()),(samples-succeses)))) / nCk(observations,samples)
proba = p_a + p_b + p_c
print(proba)

Вывод:

0.41176470588235287
...