</>
Topic 3 of 5

Course materials are currently available in Russian only.

Распределения

Модуль 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).