Загрузил Imoto FF

Важнейшие законы распределения дискретных и непрерывных случайных величин

реклама
Важнейшие законы распределения дискретных и
непрерывных случайных величин
Сначала загрузим все необходимые для работы библиотеки
In [1]:
import
import
import
import
pandas as pd
numpy as np
matplotlib.pyplot as plt
scipy.stats as sts
matplotlib может выводить графики на экран разными способами (использовать различные backend).
Для построения графиков в Jupiter Notebook нам нужен backend, способный работать с браузером, т.е.
основанный на javascript. Чтобы его подключить нужна команда
In [2]:
%matplotlib inline
Разумеется, для работы с matplotlib в Spyder эта команда не нужна
Законы распределения непрерывных случайных
величин
Нормальное распределение
Сгенерируем выборку из значений нормально распределенной случайной величины с параметрами m
иσ
In [3]:
m=2
sigma=0.5
# создаем нормально распределенную случайную величину с именем norm_rv
# нормальное распределение - функция norm из пакета stats
norm_rv = sts.norm(m,sigma)
# сгенерируем 10 значений случайной величины
norm_rv.rvs(10)
Out[3]:
array([3.01138822, 2.68695265, 1.98464881, 1.88789464, 1.99915153,
1.91876321, 1.60921193, 2.38642799, 1.56853471, 2.06141442])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf
In [4]:
norm_rv.cdf(2.2)
Out[4]:
0.6554217416103243
Мы знаем, что P (a < X < b) = F (b) − F (a) . Можем найти вероятность попадания нормально
распределенной случайной величины в интервал
In [5]:
norm_rv.cdf(3)-norm_rv.cdf(1)
Out[5]:
0.9544997361036416
Например, проверим правило "трех сигм": практически все возможные значения нормально
распределенной случайной величины принадлежат промежутку (m − 3 ⋅ σ; m + 3 ⋅ σ)
In [6]:
norm_rv.cdf(m+3*sigma)-norm_rv.cdf(m-3*sigma)
Out[6]:
0.9973002039367398
Построим график функции распределения F (x)
In [7]:
# формируем массив из 100 абсцисс точек в диапазоне от 0 до 4
x = np.linspace(0,4,100)
# считаем F(x) для каждого x
cdf = norm_rv.cdf(x) # функция cdf может принимать и вектор x
#cтроим график функции распределения
plt.plot(x, cdf)
# добавим названия для осей и графика
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения нормального закона")
Out[7]:
Text(0.5, 1.0, 'Функция распределения нормального закона')
Для вычисления значения функции плотности вероятностей f (x) в точке x используется функция
pdf
In [8]:
norm_rv.pdf(2.2)
Out[8]:
0.7365402806066466
Построим график функции плотности f (x) :
In [9]:
x = np.linspace(0,4,100)
pdf = norm_rv.pdf(x)
plt.plot(x, pdf)
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.title("Плотность вероятностей нормального закона")
Out[9]:
Text(0.5, 1.0, 'Плотность вероятностей нормального закона')
Посмотрим, как ведут себя нормально распределенные величины при разных значениях параметров.
Сначала исследуем влияния параметра m при фиксированном параметре σ = 1 .
In [10]:
sigma=1
x = np.linspace(-6,6,100)
for m in [-2, 0, 2]:
rv = sts.norm(m, sigma)
cdf = rv.cdf(x)
plt.plot(x, cdf, label="m=%s" % m) #аргумент label нужен для легенды
plt.legend() #добавим легенду
plt.title("Функция распределения нормального закона")
plt.ylabel('$F(X)$')
plt.xlabel('$x$')
Out[10]:
Text(0.5, 0, '$x$')
In [11]:
for m in [-2, 0, 2]:
rv = sts.norm(m, sigma)
pdf = rv.pdf(x)
plt.plot(x, pdf, label="m=%s" % m)
plt.legend()
plt.title("Плотность вероятностей нормального закона")
plt.ylabel('$F(X)$')
plt.xlabel('$x$')
Out[11]:
Text(0.5, 0, '$x$')
А теперь исследуем влияния параметра σ при фиксированном параметре m
= 0
.
In [12]:
m=0
x = np.linspace(-4,4,100)
for sigma in [0.5, 1, 2]:
rv = sts.norm(m, sigma)
cdf = rv.cdf(x)
plt.plot(x, cdf, label="sigma=%s" % sigma)
plt.legend()
plt.title("Функция распределения нормального закона")
plt.ylabel('$F(X)$')
plt.xlabel('$x$')
Out[12]:
Text(0.5, 0, '$x$')
In [13]:
x = np.linspace(-4,4,100)
for sigma in [0.5, 1, 2]:
rv = sts.norm(m, sigma)
pdf = rv.pdf(x)
plt.plot(x, pdf, label="sigma=%s" % sigma)
plt.legend()
plt.title("Плотность вероятностей нормального закона")
plt.ylabel('$f(X)$')
plt.xlabel('$x$')
Out[13]:
Text(0.5, 0, '$x$')
Равномерное распределение
Сгенерируем выборку из значений равномерно распределенной на отрезке [a, b] случайной величины
In [14]:
a = 1
b = 4
# создаем равномерно распределенную случайную величину с именем uniform_rv
# равномерное распределение - функция uniform из пакета stats
# обратите внимание, что в этой функции задается левая граница и масштаб, а не левая и
правая границы
uniform_rv = sts.uniform(a, b-a)
uniform_rv.rvs(10)
Out[14]:
array([1.28407581, 1.21311567, 3.76498308, 1.67015849, 2.3553841 ,
3.52769406, 3.44770038, 1.34517103, 2.90690785, 1.87110479])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf , для
вычисления значения функции плотности вероятностей f (x) в точке x используется функция pdf
In [15]:
# значение функции распределения F(3)
uniform_rv.cdf(3)
Out[15]:
0.6666666666666666
In [16]:
# значение плотности вероятностей f(3)
uniform_rv.pdf(3)
Out[16]:
0.3333333333333333
Построим график функции распределения F (x)
In [17]:
x = np.linspace(0,5,100)
cdf = uniform_rv.cdf(x)
plt.plot(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения равномерного закона")
Out[17]:
Text(0.5, 1.0, 'Функция распределения равномерного закона')
Построим график функции плотности f (x) :
In [18]:
x = np.linspace(0,5,1000)
pdf = uniform_rv.pdf(x)
plt.plot(x, pdf)
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.title("Плотность вероятностей равномерного закона")
Out[18]:
Text(0.5, 1.0, 'Плотность вероятностей равномерного закона')
Показательное (экпоненциальное) распределение
Сгенерируем выборку из значений случайной величины, имеющей показательное распределение с
параметром λ
In [19]:
lamda=0.3
# создаем случайную величину expon_rv c показательным распределением
# показательное распределение - функция expon из пакета stats
expon_rv = sts.expon(lamda)
uniform_rv.rvs(10)
Out[19]:
array([1.70228407, 3.63454393, 1.99370089, 2.03016075, 3.54813031,
1.85365909, 2.56362254, 3.2865129 , 3.73384582, 3.50411048])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf , для
вычисления значения функции плотности вероятностей f (x) в точке x используется функция pdf
In [20]:
# значение функции распределения F(1)
expon_rv.cdf(1)
Out[20]:
0.5034146962085905
In [21]:
# значение плотности вероятностей f(1)
expon_rv.pdf(1)
Out[21]:
0.4965853037914095
Построим график функции распределения F (x)
In [22]:
x = np.linspace(-1,6,100)
cdf = expon_rv.cdf(x)
plt.plot(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения показательного закона")
Out[22]:
Text(0.5, 1.0, 'Функция распределения показательного закона')
Построим график функции плотности f (x) :
In [23]:
x = np.linspace(-1,6,100)
pdf = expon_rv.pdf(x)
plt.plot(x, pdf)
plt.ylabel('$f(x)$')
plt.xlabel('$x$')
plt.title("Плотность вероятностей показательного закона")
Out[23]:
Text(0.5, 1.0, 'Плотность вероятностей показательного закона')
Законы распределения дискретных случайных величин
Биномиальное распределение
Сгенерируем выборку из значений случайной величины, имеющей биномиальное распределение с
параметрами n и p
In [24]:
n=20
p=0.7
# создаем случайную величину binomial_rv с биномиальным распределением
# биномиальное распределение - функция binomial из пакета stats
binomial_rv = sts.binom(n, p)
binomial_rv.rvs(10)
Out[24]:
array([16, 14, 13, 17, 13, 11, 15, 14, 11, 13])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf
In [25]:
binomial_rv.cdf(14)
Out[25]:
0.5836291705525185
Построим график функции распределения F (x)
In [26]:
x = np.linspace(0,20,21)
cdf = binomial_rv.cdf(x)
plt.step(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения биномиального закона")
Out[26]:
Text(0.5, 1.0, 'Функция распределения биномиального закона')
Для дискретных случайных величин используется функция вероятности pmf , считающая вероятность
P (x = x) случайной величине X принять значение x
In [27]:
binomial_rv.pmf(14)
Out[27]:
0.19163898275344177
Построим "многоугольник" распределения
In [28]:
x = np.linspace(0,20,21) # x = 0, 1, 2, ..., 19, 20
pmf = binomial_rv.pmf(x)
plt.step(x, pmf,'o') # 'o' в качестве "типа линии" означает рисовать точки кружочками и
не соединять их линиями
plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')
plt.title("Вероятности биномиального закона")
Out[28]:
Text(0.5, 1.0, 'Вероятности биномиального закона')
Посмотрим, как ведут себя биномиально распределенные величины при разных значениях
параметров
In [29]:
x = np.linspace(0,20,23)
for n in [10, 20]:
for p in [0.2, 0.7]:
rv = sts.binom(n, p)
cdf = rv.cdf(x)
plt.step(x, cdf, label="$n=%s, p=%s$" % (n,p))
plt.legend()
plt.ylabel('$F(X)$')
plt.xlabel('$x$')
plt.title("Функция распределения биномиального закона")
Out[29]:
Text(0.5, 1.0, 'Функция распределения биномиального закона')
In [30]:
symbols = iter(['o', 's', '^', '+']) #круги для 1-ой линии, квадраты для 2-ой, треуголь
ники для 3-ей и плюсы для 4-ой
x = np.linspace(0,20,21)
for n in [10, 20]:
for p in [0.2, 0.7]:
rv = sts.binom(n, p)
pmf = rv.pmf(x)
plt.step(x, pmf, next(symbols), label="$n=%s, p=%s$" % (n,p))
plt.legend()
plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')
plt.title("Вероятности биномиального закона")
Out[30]:
Text(0.5, 1.0, 'Вероятности биномиального закона')
Распределение Пуассона
Сгенерируем выборку из значений случайной величины, имеющей распределение Пуассона с
параметром λ
In [31]:
lamda=5
# создаем случайную величину poisson_rv с распределением Пуассона
# распределение Пуассона - функция poisson из пакета stats
poisson_rv = sts.poisson(lamda)
poisson_rv.rvs(10)
Out[31]:
array([4, 2, 5, 3, 5, 7, 6, 6, 3, 6])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf
In [32]:
poisson_rv.cdf(3)
Out[32]:
0.2650259152973616
Построим график функции распределения F (x)
In [33]:
x = np.linspace(0,30,31) # x = 0, 1, 2, ...
cdf = poisson_rv.cdf(x)
plt.step(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения закона Пуассона")
Out[33]:
Text(0.5, 1.0, 'Функция распределения закона Пуассона')
Для вычисления вероятность P (x
функция pmf
= x)
случайной величине X принять значение x используется
In [34]:
poisson_rv.pmf(3)
Out[34]:
0.1403738958142805
Построим "многоугольник" распределения
In [35]:
x = np.linspace(0,30,31)
pmf = poisson_rv.pmf(x)
plt.plot(x, pmf,'o')
plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')
plt.title("Вероятности закона Пуассона")
Out[35]:
Text(0.5, 1.0, 'Вероятности закона Пуассона')
Распределение Бернулли
Сгенерируем выборку из значений случайной величины, имеющей биномиальное распределение с
параметром p
In [36]:
p=0.3
# создаем случайную величину bernoulli_rv c распределением Бернулли
# распределение Бернулли - функция bernoulli из пакета stats
bernoulli_rv = sts.bernoulli(p)
bernoulli_rv.rvs(10)
Out[36]:
array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1])
Для вычисления значения функции распределения F (x) в точке x используется функция cdf
In [37]:
bernoulli_rv.cdf(0)
Out[37]:
0.7
Построим график функции распределения F (x)
In [38]:
x = np.linspace(0,1,2) # x = 0, 1
cdf = bernoulli_rv.cdf(x)
plt.step(x, cdf)
plt.ylabel('$F(x)$')
plt.xlabel('$x$')
plt.title("Функция распределения закона Бернулли")
Out[38]:
Text(0.5, 1.0, 'Функция распределения закона Бернулли')
Для вычисления вероятность P (x
функция pmf
= x)
случайной величине X принять значение x используется
In [39]:
bernoulli_rv.pmf(0)
Out[39]:
0.7000000000000001
Построим "многоугольник" распределения
In [40]:
x = np.linspace(0,1,2)
pmf = bernoulli_rv.pmf(x)
plt.plot(x, pmf,'o')
plt.ylabel('$P(X=x)$')
plt.xlabel('$x$')
plt.title("Вероятности закона Бернулли")
Out[40]:
Text(0.5, 1.0, 'Вероятности закона Бернулли')
Другие распределения
Полный список функций SciPy для работы со всеми распределениями можно найти тут:
http://docs.scipy.org/doc/scipy-0.14.0/reference/stats.html (http://docs.scipy.org/doc/scipy0.14.0/reference/stats.html)
Скачать