September 17, 2022

Биномиальное распределение с Python

Биномиальное распределение задает вероятности k успехов в схеме длины n. Его можно задать при помощи функции binom из модуля scipy.stats:

from scipy.stats import binom
import seaborn as sns
import numpy as np
np.random.seed(0)

n=5
p = 0.3
distr = binom(n, p)

sns.histplot(distr.rvs(10000))

Также у нашего распределения distr есть методы:

  • pmf - вероятность k успехов;
  • cdf - вероятность, что произойдет не более k успехов;
  • expect - математическое ожидание распределения;
  • rvs - случайное значений из распределения.

Выведем матожидание:

distr.expect()

Для демонстрации использования перечисленных методов найдем вероятность пройти k собеседований из n, если вероятность пройти одно равна 0.3:

for k in range(0, n+1):
    print(f"Вероятность пройти {k} собеседований из {n} равна {distr.pmf(k)}")

Это же можно сделать вручную, так как каждая вероятность пройти в точности k собеседований - это число способов выбрать эти k собеседований из n (например, при k=1 - это 1 или 2, или 3, или 4, или 5), умноженное на вероятность последовательности - p^k*(1-p)^(n-k). Число способов считается как число сочетаний из n по k:

from math import factorial
for k in range(0, n+1):
    p_k = factorial(n)/(factorial(k)*factorial(n-k))*p**k*(1-p)**(n-k)
    print(f"Вероятность пройти {k} собеседований из {n} равна {p_k}")

А так можно посчитать вероятность пройти хотя бы одно собеседование:

1 - distr.cdf(0)