【问题标题】:Calculate probability 2 random people are in the same group?计算2个随机人在同一组中的概率?
【发布时间】:2020-01-23 22:14:19
【问题描述】:

在我的数据集中,有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)

【问题讨论】:

  • 会不会是 P(都来自 A)+ P(都来自 B)+ P(都来自 C)?
  • 你需要计算连续绘制两个相同颜色的球不放回的总数。最终结果为:(nCk(n_1, 2) + nCk(n_2, 2) + nCk(n_3, 2)) / nCk(n_total, 2)
  • @James 当您说n_1 时,您指的是一个人还是第 1 组中的人数?
  • @Celius:假设它遵循经验分布

标签: python pandas numpy statistics probability


【解决方案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. 他们在任何组中的概率是所有组中#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

【讨论】:

  • 非常干净的解决方案!
【解决方案2】:

我将通过使用超几何分布来回答您的问题,超几何分布是一个离散的概率分布,它描述了 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

【讨论】:

  • 感谢您抽出宝贵的时间!我选择了另一个答案,因为它更干净,更快,尽管我很欣赏概率的基础。我曾经知道超几何分布......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2012-03-15
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多