Я отвечу на вашу проблему, используя гипергеометрическое распределение, гипергеометрическое распределение - это дискретное распределение вероятностей, которое описывает вероятность 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