суббота, 5 декабря 2020 г.

Статистика с Python : дискретные распределения

 Распределение дискретной случайной величины - это полный список всех ее возможных значений с проставленными вероятностями этих значений.


В качестве примера рассмотри распределение выданных ипотечных займов за неделю в некотором банке

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

numprob
000.10
110.10
220.20
330.30
440.15
550.10
660.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.46

np.var(X)
2.4600000000000004

Стандартное отклонение $\sigma$ (standard deviation) это корень квадратный из              дисперсии

np.sqrt(var)
1.5684387141358123
np.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.988746865835491

3. Вероятность того, что более 5 клиентов будут возвращать товары, приобретенные     по ним.
Общая вероятность любого количества клиентов, возвращающих товары (включая 0),    всегда равна 1,0. таким образом, вероятность того, что более 5 клиентов вернут товары, может быть вычислена путем вычитания вероятности того, что максимум 5 клиентов        вернут товары из 1,0. Другими словами, вероятность того, что более 5 клиентов вернут          товары, может быть получена путем вычисления CDF из 5, а затем вычитания его из 1.0.

1 - stats.binom.cdf(5, 20, 0.1)
0.011253134164509015

4. среднее число клиентов, которые, вероятно, вернут товары, а также дисперсия и
стандартное отклонение числа возвратов.

а) среднее значение биномиального распределения задается  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()




Пример распределения Пуассона
Количество звонков, поступающих в колл-центр, следует распределению Пуассона при 10
1 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.32303442879144867

stats.binom.pmf(k, n, p)
0.32816231158747206

Как видим, значения полученные значения очень близки.




Комментариев нет:

Отправить комментарий