计算随机2个人在同一组的概率?
Calculate probability 2 random people are in the same group?
在我的数据集中,有 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
我想我知道如何获取样本 space,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)
我会用超几何分布来回答你的问题,超几何分布是一个离散的概率分布,它描述了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
我的离散数学技能有点生疏,请随时纠正我。您有 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)
- 他们在任何组中在一起的概率是#3中所有组中概率的总和。
代码:
import numpy as np
s = df['Count'].values
n = s.sum()
prob = np.sum(s/n * (s-1)/(n-1)) # 0.4117647058823529
我们可以将此解决方案推广到 "the probability of k
people all being in the same group":
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
.
在我的数据集中,有 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
我想我知道如何获取样本 space,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)
我会用超几何分布来回答你的问题,超几何分布是一个离散的概率分布,它描述了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
我的离散数学技能有点生疏,请随时纠正我。您有 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)
- 他们在任何组中在一起的概率是#3中所有组中概率的总和。
代码:
import numpy as np
s = df['Count'].values
n = s.sum()
prob = np.sum(s/n * (s-1)/(n-1)) # 0.4117647058823529
我们可以将此解决方案推广到 "the probability of k
people all being in the same group":
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
.