计算2个随机人群在同一组中的概率?

时间:2019-09-23 19:48:19

标签: python pandas numpy statistics probability

在我的数据集中,有N个人,每个人被分为3个组(groups = {A, B, C})。我想找到两个随机的人n_1n_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 个答案:

答案 0 :(得分:1)

我将通过使用超几何分布来回答您的问题,超几何分布是一种离散概率分布,它描述了n次绘制中k个成功(随机绘制的对象具有指定特征的随机绘制)的概率,而无替换项是有限的大小为N的总体,其中恰好包含具有该特征的K个对象,其中每个绘制都是成功或失败。相反,二项式分布描述了在n次抽签中有k次替换成功的概率。 因此,总概率应为均属于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

答案 1 :(得分:1)

我的离散数学技能有些生锈,所以请随时纠正我。您有N个人被分成大小为s_1, ..., s_n的组,以便N = s_1 + ... + s_n

  1. 一个随机人属于i组的机会是s_i / N
  2. 第二个人进入i组的机会为(s_i - 1) / (N - 1)
  3. 两个人都属于i组的机会是s_i / N * (s_i - 1) / (N - 1)
  4. 它们在 any 组中在一起的概率是所有组中#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