Распределение дискретной случайной величины - это полный список всех ее возможных значений с проставленными вероятностями этих значений.
В качестве примера рассмотри распределение выданных ипотечных займов за неделю в некотором банке
df=pd.DataFrame({'num':[0,1,2,3,4,5,6],'prob':[0.1,0.1,0.2,0.3,0.15,0.1,0.05]})
df
num | prob | |
---|---|---|
0 | 0 | 0.10 |
1 | 1 | 0.10 |
2 | 2 | 0.20 |
3 | 3 | 0.30 |
4 | 4 | 0.15 |
5 | 5 | 0.10 |
6 | 6 | 0.05 |
Математическое ожидание $\mu$ дискретной случайной величины X - это взвешенное среднее всех возможных исходов , где в качестве весов служат вероятности каждого исхода
mu=sum(df['num']*df['prob'])
mu
2.8
Смоделируем эту же случайную величину, пусть у нас есть данные по недельной выдаче ипотечных кредитов за 100 недель
X=np.repeat([0,1,2,3,4,5,6],[10,10,20,30,15,10,5])
X
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6])Среднее количество выданных кредитов
X.mean()
2.8Выведем количество уникальных значений
np.unique(X)
array([0, 1, 2, 3, 4, 5, 6])
И количество их повторов в течении 100 недель
np.bincount(X)
array([10, 10, 20, 30, 15, 10, 5], dtype=int64)Функция bincount возвращает число вхождений каждого значения в массив
неотрицательных целых чисел
А теперь сделаем из них датафрейм
df=pd.DataFrame({'num':np.unique(X),'prob':np.bincount(X)/sum(np.bincount(X))})
В результате получили первоначальный датафрейм
Графическое представление распределения тоже можно получить двумя способами
df['prob'].plot(kind='bar') plt.xlabel('num') plt.ylabel('prob')
plt.bar(df.num, df.prob) plt.xlabel('num') plt.ylabel('prob')
График получается аналогичный.
Дисперсия $\sigma^2$ (variance) дискретной случайной величины X представляет собой взвешенное среднее квадратов разностей между всеми ее возможными значениями и математическим ожиданием. В качестве весов служат вероятности соответствующих исходов.
var=sum((df.num-mu)**2*df.prob) var
2.46np.var(X)
2.4600000000000004Стандартное отклонение $\sigma$ (standard deviation) это корень квадратный из дисперсии
np.sqrt(var)
1.5684387141358123np.std(X)
1.5684387141358123
Биномиальное распределение-это теоретическое распределение, которое применяется к случайным переменным и удовлетворяет следующим трем характеристикам:
• Условие 1: для индивидуального наблюдения существует только два возможных результата, обычно обозначаемых как успех и неудача. Если вероятность успеха равна p, то вероятность неудачи должна быть равна 1 – p.
• Условие 2: эксперимент выполняется фиксированное число раз, обычно обозначаемое n.
• Условие 3: все эксперименты независимы, что означает, что знание результата эксперимента не меняет вероятности следующего.
Поэтому вероятность успеха (и неудачи) остается прежней. Если эти условия выполняются, то мы говорим, что случайная величина следует биномиальному распределению или что случайная величина является биномиальной случайной величиной. Мы можем получить точное распределение вероятностей биномиальной случайной величины X по формуле :
$$P(X=x)=\frac{n!}{x!(n-x)!}p^x(1-p)^x$$
Эта функция называется вероятностной массовой функцией и определяет вероятность
x успехов при заданном объеме выборки n и вероятности успеха p.
Величина $\frac{n!}{x!(n-x)!}$ определяет количество возможных комбинаций состоящих
из x успехов в выборке объема n.
Пример работы с биномиальным распределением :
Компания электронной коммерции продает женскую одежду. Замечено, что 10% их клиентов возвращают товары, купленные ими по многим причинам (таким как несоответствие размера, цвета и материала). В определенный день 20 клиентов приобрели товары у этой компании .
Вычислить:
1. Вероятность того, что ровно 5 клиентов вернут товар. 2. Вероятность того, что максимум 5 клиентов вернут товар. 3. Вероятность того, что более 5 клиентов будут возвращать товары, приобретенные по ним. 4. Среднее число клиентов, которые, скорее всего, вернут товары, а также дисперсия и стандартное отклонение числа возвратов.
Мы решаем каждый из них следующим образом:
1. Вероятность того, что ровно 5 клиентов вернут товар.
Функция stats.binom.pmf() вычисляет PMF для биномиального распределения и
принимает три параметра: а) ожидаемое число успешных испытаний (5) b) общее число испытаний (20) c) вероятность успеха (0,1)
from scipy import stats stats.binom.pmf(5, 20, 0.1)
0.03192136111995428Соответствующая вероятность равна 0,03192, то есть вероятность того,
что ровно 5 клиентов вернут товар, составляет примерно 3%. Чтобы визуализировать, как изменяется PMF с увеличением числа успешных испытаний, мы создадим список всех возможных чисел успехов (от 0 до 20) и
соответствующих значений PMF и нарисуем гистограмму, как показано на рис. 3.1.
# range(0,21) возвращает все значения от 0 до 20 (исключая 21) import seaborn as sns pmf_df = pd.DataFrame({ 'success': range(0,21),'pmf': list(stats.binom.pmf(range(0,21),20, 0.1))}) # Выводим cтолбчатую диаграмму с количеством успехов и их вероятностью sns.barplot(x = pmf_df.success, y = pmf_df.pmf) plt.ylabel('pmf') plt.xlabel('Number of items returned')
2. Вероятность того, что максимум 5 клиентов вернут товар. Функция stats.binom.cdf() вычисляет CDF для биномиального распределения. В этом случае функция кумулятивного распределения возвращает вероятность того, что максимум 5 клиентов вернут товары.
stats.binom.cdf(5, 20, 0.1)
0.9887468658354913. Вероятность того, что более 5 клиентов будут возвращать товары, приобретенные по ним. Общая вероятность любого количества клиентов, возвращающих товары (включая 0), всегда равна 1,0. таким образом, вероятность того, что более 5 клиентов вернут товары, может быть вычислена путем вычитания вероятности того, что максимум 5 клиентов вернут товары из 1,0. Другими словами, вероятность того, что более 5 клиентов вернут товары, может быть получена путем вычисления CDF из 5, а затем вычитания его из 1.0.
1 - stats.binom.cdf(5, 20, 0.1)
0.0112531341645090154. среднее число клиентов, которые, вероятно, вернут товары, а также дисперсия и стандартное отклонение числа возвратов.
а) среднее значение биномиального распределения задается n * p (b) дисперсия биномиального распределения задается n * p * (1 − p)
mean, var = stats.binom.stats(20, 0.1) print('Average: ', mean , 'Variance:', var)
Average: 2.0 Variance: 1.8РАСПРЕДЕЛЕНИЕ ПУАССОНА
Во многих ситуациях нас может заинтересовать подсчет количества событий, которые могут произойти за определенный промежуток времени или пространства. Например, количество отмен заказов клиентами на портале электронной коммерции, количество жалоб клиентов, количество снятия наличных в банкомате, количество типографских ошибок в книге и т. д. Чтобы найти вероятность числа событий, мы используем распределение Пуассона. PMF распределения Пуассона задается формулой :
$$P(X=k)=\frac{e^{\lambda}\lambda^{k}}{k!}$$
P(X=k) - вероятность k успешных испытаний, $\lambda$ - ожидаемое количество успехов (среднее количество успехов
в заданной области возможных исходов), k - количество успехов в единицу времени.
Математическое ожидание и дисперсия задаются соответственно следующими выражениями
$$E(X)=\lambda$$
$$Var(X)=\lambda$$
Выведем графики распределения для различных $\lambda$
k=np.arange(15) plt.figure(figsize=(12,8)) for i, lambda_ in enumerate([1,2,4,6]): plt.plot(k, stats.poisson.pmf(k, lambda_), '-o', label="$\lambda$=" + str(lambda_)) plt.legend() plt.title('Possion distribution PMF for various $\lambda$') plt.ylabel('PMF at $k$') plt.xlabel('$k$') plt.show()Пример распределения ПуассонаКоличество звонков, поступающих в колл-центр, следует распределению Пуассона при 101 0 звонках в час.1. вычислите вероятность того, что количество звонков <= 5. 2. вычислите вероятность того, что количество звонков за 3-часовой период превысит 30.Мы решаем каждый из них следующим образом:1. Рассчитайте вероятность того, что в колл-центр поступит не более 5 звонков.Поскольку количество вызовов, поступающих в центр, следует распределению Пуассона,мы можем использовать stats.poisson.cdf для вычисления значения вероятности.Он принимает следующие два параметра:а) первый параметр: количество событий (в данном случае 5 вызовов),для которых необходимо рассчитать вероятность. б) Второй параметр: среднее число событий (т. е. 10 звонков в час).stats.poisson.cdf(5, 10)0.06708596287903189
2. Вычислите вероятность того, что количество звонков за 3-часовой период превысит 30.
Поскольку среднее количество звонков в час равно 10 ($\lambda=10$),
а мы заинтересованы в поиске звонков за 3 часа, то среднее количество звонков за 3 часа равно $\lambda t=10$.Вероятность того, что количество звонков будет больше 30, определяется
1 - stats.poisson.cdf(30, 30)
0.45164848742208863Чтобы визуализировать распределение Пуассона для средних звонков в час как 10, мы можем построить PMF для всех возможных чисел звонков, которые колл-центр может принять в диапазоне от 0 до 30. Мы создадим фрейм данных, который будет содержать количество вызовов в диапазоне от 0 до 30 в одном столбце с именем success и соответствующим PMFs в другом столбце с именем pmf. Построение графика выполняется с помощью barplot в библиотеке seaborn.
# Range(0,30) возвращает все значения от 0 до 30 исключая 30 pmf_df = pd.DataFrame({ 'success': range(0,30), 'pmf': list(stats. poisson.pmf(range(0,30), 10))}) #Делаем график с количеством звонков как x и pmf как y sns.barplot(x = pmf_df.success, y = pmf_df.pmf) plt.xlabel('Number of Calls Received')
Аппроксимация биномиального распределения распределением Пуассона
Если число n велико, а число p - мало, биномиальное распределение можно аппроксимировать распределением Пуассона. Чем больше n и меньше число p, тем выше
точность аппроксимации. При аппроксимации биномиального распределения распределением Пуассона следует считать :
$$\lambda=np$$
Для примера предположим, что 8% шин, произведенных некоторым заводом, являются бракованными. С помощью аппроксимации биномиального распределения найти вероятность обнаружить одну бракованную шину в выборке из 20 шин.
n=20 p=0.08 lam=n*p k=1
stats.poisson.pmf(k,lam)
0.32303442879144867stats.binom.pmf(k, n, p)
0.32816231158747206Как видим, значения полученные значения очень близки.
Комментариев нет:
Отправить комментарий