在我的数据集中,有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)
答案 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
。
i
组的机会是s_i / N
i
组的机会为(s_i - 1) / (N - 1)
i
组的机会是s_i / N * (s_i - 1) / (N - 1)
代码:
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
。