Распределения
Модуль scipy.stats содержит десятки вероятностных распределений и статистические функции. Распределение описывает, какие значения принимает случайная величина и как часто: рост людей, число посетителей за час, количество бракованных деталей.
Распределение как объект
Каждое распределение в scipy.stats — объект с одинаковым набором методов. Параметры задаются при создании:
from scipy.stats import norm
height = norm(loc=170, scale=8) # нормальное: среднее 170, отклонение 8
print(height.mean(), height.std()) # 170.0 8.0
У большинства распределений есть loc (сдвиг) и scale (масштаб). У нормального это среднее и стандартное отклонение — не дисперсия!
Методы можно вызывать и без создания объекта, передавая параметры каждый раз: norm.cdf(180, loc=170, scale=8).
Основные методы
Для непрерывных распределений:
pdf(x)— плотность: насколько «типично» значение рядом с x (это не вероятность!);cdf(x)— вероятность, что величина не больше x;sf(x)— вероятность, что величина больше x (равна1 - cdf(x), но точнее для маленьких значений);ppf(q)— квантиль: такое x, чтоcdf(x) = q.
print(height.cdf(180)) # доля людей ниже 180 см ≈ 0.894
print(height.sf(190)) # выше 190 см ≈ 0.0062
print(height.cdf(175) - height.cdf(165)) # от 165 до 175 см ≈ 0.468
print(height.ppf(0.9)) # 90 % людей ниже ≈ 180.25 см
Вероятность попасть в промежуток — разность значений cdf на его концах.
Дискретные распределения
Если величина принимает только целые значения (число успехов, число событий), вместо плотности используется pmf(k) — вероятность, что величина равна ровно k.
Биномиальное binom(n, p) — число успехов в n независимых попытках с вероятностью успеха p:
from scipy.stats import binom
print(binom.pmf(3, 10, 0.2)) # ровно 3 попадания из 10 бросков ≈ 0.201
print(binom.cdf(3, 10, 0.2)) # не больше 3 ≈ 0.879
print(binom.sf(3, 10, 0.2)) # больше 3, то есть не меньше 4
Будьте внимательны с границами: у дискретной величины «не меньше k» — это sf(k - 1), а sf(k) означает «строго больше k».
Распределение Пуассона poisson(mu) — число редких независимых событий за промежуток времени, если в среднем их mu: звонки в колл-центр за минуту, посетители за час.
from scipy.stats import poisson
print(poisson.pmf(0, 2)) # ни одного звонка при среднем 2 ≈ 0.135
print(poisson.ppf(0.9, 2)) # 3.0 — с вероятностью 90 % звонков не больше трёх
ppf дискретного распределения возвращает наименьшее целое k, для которого cdf(k) ≥ q, — но в виде дробного числа (3.0).
Случайные числа и описание данных
rvs(size=..., random_state=...) генерирует случайные значения из распределения, а scipy.stats.describe(data) выдаёт сводку по выборке: размер, минимум и максимум, среднее, дисперсию, асимметрию.
from scipy.stats import describe
print(describe([2, 4, 4, 5, 7]))
Итог
norm(loc, scale),binom(n, p),poisson(mu)— распределения-объекты;pdf/pmf— плотность / вероятность значения,cdf— «не больше»,sf— «больше»,ppf— квантиль;- у нормального
scale— стандартное отклонение; - у дискретных «не меньше k» =
sf(k - 1).