=> є 10 телефонних спроб зв’язатися з донором; імовірність, що донор відповість хоч на один дзвінок (перший, другий, третій…) = 0.3.
Ймовірність = 0.3 ( probability the donor picks up each call [1,2,3,4,5,6,7,8,9,10] or doesn’t [0] )
Ми можемо назвати це - коєфіціент успіху є 0.3 проти неуспіху 0.7 для кожного дзвінку.
Випадкова змінна X — кількість відповідей (successes) серед 10 дзвінків.
\[ Це \; біноміальний \;розподіл: X∼Binomial(n=10,p=0.3). \]
=> біноміальна модель підходить, коли маємо фіксовану кількість незалежних випробувань (10 дзвінків), у кожному свій шанс — “успіх/неуспіх” (відповів/не відповів) з однаковою ймовірністю успіху p.
Ми хочемо максимізувати наш рівень успіху, навіть коли маємо дуже обмежені дані, і знати, коли має сенс припинити телефонувати.
Наскільки ймовірно, що ми отримаємо 3 позитивні з трьох? Або 0 з десяти? Або усі десять із десяти?
Приблизно у 26% випадків можна очікувати, що отримувач відповість на 3 дзвінки з 10, близько 20% — на 4 дзвінки з 10, і майже 0% — на всі 10 дзвінків із 10. 0 відповідей означає, що жоден із 10 дзвінків не був прийнятий, і ймовірність цього становить близько 3%.
\[ {\textstyle\ P(X=k)={\binom {n}{k}}p^{k}(1-p)^{n-k}} \] \[ {\textstyle\ P(3 \;yes, 7 \;no \;given \;that \; | \;success = 0.3)={\binom {10}{3}}(0.3)^{3}(1-0.3)^{10-3}} \]
• підрахунок успіхів:
0: немає успіху
1: відповів один раз
10: відповів кожного разу (very rare)
Ми хочемо максимізувати наш рівень успіху, навіть коли маємо дуже обмежені дані, і знати, коли має сенс припинити телефонувати.
library(rsconnect) # for publishing
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
# Параметри біноміального розподілу
n <- 10 # кількість спроб (дзвінків)
p <- 0.3 # ймовірність відповіді (assuming you know truw success rate = 0.3)
k <- 0:n # можливі значення X (кількість відповідей)
binom_df <- tibble(
k = k,
pmf = dbinom(k, size = n, prob = p)
)
# ggplot PMF (стовпчикова діаграма)
g_binom <- ggplot(binom_df, aes(x = k, y = pmf)) +
geom_col() +
geom_point(size = 2) +
labs(
title = "Біноміальний розподіл: X ~ Binomial(n=10, p=0.3)",
subtitle = "X = кількість success відповідей серед 10 дзвінків",
x = "Кількість відповідей (k)",
y = "Ймовірність P(X = k)"
) +
theme_minimal()
g_binom
#Інтерактивно (plotly) з ggplotly
ggplotly(g_binom)
#Або напряму через plotly
plot_ly(binom_df, x = ~k, y = ~pmf, type = "bar") %>%
layout(
title = "Біноміальний розподіл (інтерактивно)",
xaxis = list(title = "Кількість відповідей (k)"),
yaxis = list(title = "P(X = k)")
)
Іншими словами, біноміальний розподіл показує нам ймовірність спостережень певних даних.
(наприклад, перші три дзвінка відповів з 10, або жодного - 0 з 10, або на усі відповів - 10 з 10) за умови відомої имовірності успіху 0.3.
Ймовірність успіху може бути різною, але загальна ідея полягає в тому, що ми хочемо розглянути зворотне питання:
якщо відома ймовірність успіху (0.3 для кожного дзвінка), то які фіксовані дані (або яку кількість успіхів) вона б породила?
На графіку виділений стовпчик для значення 3.
library(ggplot2)
library(dplyr)
# параметри
n <- 10
p <- 0.3
df <- tibble(
k = 0:n,
pmf = dbinom(k, size = n, prob = p),
grp = ifelse(k == 3, "k = 3 (зелений)", "Інші")
)
ggplot(df, aes(x = k, y = pmf, fill = grp)) +
geom_col(color = "black", width = 0.9) +
# тонка «лінія» на рівні стовпчика k=3 (для акценту)
geom_segment(
data = df %>% filter(k == 3),
aes(x = k - 0.45, xend = k + 0.45, y = pmf, yend = pmf),
inherit.aes = FALSE, linewidth = 0.8
) +
scale_fill_manual(values = c("k = 3 (зелений)" = "#2E7D32", "Інші" = "gray70")) +
scale_x_continuous(breaks = 0:10) +
scale_y_continuous(limits = c(0, 0.5), breaks = seq(0, 0.5, by = 0.1)) +
labs(
title = "PMF біноміального розподілу: X ~ Binomial(n=10, p=0.3)",
subtitle = "Виділено k = 3",
x = "Кількість відповідей (k)",
y = "Ймовірність P(X = k)",
fill = NULL
) +
theme_minimal(base_size = 12) +
theme(legend.position = "top")
and if we change our success rate from 0.3 to 0.6 and the number of total calls to 100 what is going to happen? What’s the probability of getting calls 30 all picked up by the donor?
p = 0.6
library(ggplot2)
library(dplyr)
n <- 100
p <- 0.6
df2 <- tibble(
k = 0:n,
pmf = dbinom(k, size = n, prob = p),
grp = case_when(
k == 60 ~ "k = 60 (зелений)",
k %in% c(0, 30) ~ "k = 0 або 30 (помаранчевий)",
TRUE ~ "Інші"
)
)
ggplot(df2, aes(x = k, y = pmf, fill = grp)) +
geom_col(color = "black", width = 0.9) +
# лінії-акценти на верхівках виділених стовпчиків
geom_segment(
data = df2 %>% filter(grp != "Інші"),
aes(x = k - 0.45, xend = k + 0.45, y = pmf, yend = pmf),
inherit.aes = FALSE, linewidth = 0.8
) +
scale_fill_manual(values = c(
"k = 60 (зелений)" = "#2E7D32",
"k = 0 або 30 (помаранчевий)" = "#FB8C00",
"Інші" = "gray70"
)) +
scale_x_continuous(breaks = c(0,10,20,30,40,50,60,70,80,90,100)) +
labs(
title = "PMF біноміального розподілу: X ~ Binomial(n=100, p=0.6)",
subtitle = "Виділено k = 60 (зелений) та k = 0, 30 (помаранчевий)",
x = "Кількість відповідей (k)",
y = "Ймовірність P(X = k)",
fill = NULL
) + scale_y_sqrt() +
theme_minimal(base_size = 12) +
theme(legend.position = "top")
Коли p=0.3
Розподіл був зміщений вліво <== , тобто більшість маси ймовірності знаходилась навколо 3 з 10.
Це означало, що ймовірність отримати мало “успіхів” [0,1,2,3,4] (відповідей) є вищою, ніж [5,6,7,8,9,10].
Коли p=0.6
Тепер розподіл зміститься вправо — бо кожна спроба має більшу ймовірність успіху.
Найімовірніше значення (мода) буде приблизно при 6.
Ймовірність отримати 3 успіхи різко зменшиться, а 6 чи 7 стане значно більшою.
Інтуїтивно: якщо донори відповідають у 60% випадків, ми очікуємо, що більшість результатів будуть «успішними» — отже, крива піднімається праворуч.
\[ {\textstyle\ P(data \;| \; success \; rate) = C \; • (success \;rate)^{number \;of\;expected\;successes}(1-success \;rate)^{number\;of\;expected\;failures}} \] \[ {\textstyle\ P(300 \;given \;that \; | \;success = 0.6)={\binom {1000}{300}}(0.6)^{300}(1-0.6)^{1000-300}} \]
Використовується для характеристики кількості випадкових подій у часі наприклад: кількість помилок на 1000 транзакцій, дзвінків за тиждень, поломок за тиждень тощо. Кількість пацієнтів, що прибувають у відділення швидкої допомоги між 23:00 та північчю. Кількість клієнтів, що приходять до банку між 9:00 та 11:00.
λ (лямбда) — це середнє значення і водночас дисперсія. У розподілі Пуассона випадкова змінна X рахує кількість подій, що відбуваються в одиниці інтервалу. Відповідні R-функції для функції ймовірності (PMF) і функції розподілу (CDF) розподілу Пуассона: dpois(x, lambda) та ppois(x, lambda)
Відділення швидкої допомоги отримує 8 пацієнтів між 23:00 та північчю.
λ = 8
Ймовірність того, що саме 6 пацієнтів прибудуть у цей інтервал, дорівнює:
dpois(6, lambda=8) # це PMF, 12.2% ймовірності, що прибудуть саме 6 пацієнтів
## [1] 0.1221382
Ймовірність того, що прибудуть не більше 2 пацієнтів:
ppois(2, lambda=8) # це CDF, 1.37% ймовірності, що прибудуть 2 або менше пацієнтів
## [1] 0.01375397
ppois(15, lambda = 10) # the probs at most 15 patients arrive during this interval if the mean and variance (lambda =15) is 15:
## [1] 0.9512596
Ймовірність того, що прибудуть від 5 до 10 пацієнтів (включно):
ppois(10, lambda=8) - ppois(4, lambda=8)
## [1] 0.7162534
або, використовуючи вектор із двох значень і беручи різницю отриманого вектора:
diff(ppois(c(4,10), lambda=8))
## [1] 0.7162534
pmf <- dpois(0:40, lambda=16)
pmf # усі розподіли Пуассона є правосторонньо-скошеними
## [1] 1.125352e-07 1.800563e-06 1.440450e-05 7.682401e-05 3.072961e-04
## [6] 9.833474e-04 2.622260e-03 5.993736e-03 1.198747e-02 2.131106e-02
## [11] 3.409770e-02 4.959665e-02 6.612887e-02 8.138938e-02 9.301644e-02
## [16] 9.921753e-02 9.921753e-02 9.338121e-02 8.300552e-02 6.989938e-02
## [21] 5.591951e-02 4.260534e-02 3.098570e-02 2.155527e-02 1.437018e-02
## [26] 9.196915e-03 5.659640e-03 3.353861e-03 1.916492e-03 1.057375e-03
## [31] 5.639332e-04 2.910623e-04 1.455312e-04 7.056056e-05 3.320497e-05
## [36] 1.517941e-05 6.746407e-06 2.917365e-06 1.228364e-06 5.039443e-07
## [41] 2.015777e-07
Побудова графіка PMF — усі розподіли Пуассона є правосторонньо-скошеними
plot(0:40, pmf, type="h",
xlab="x", ylab="PMF", ylim = c(0, 0.25))
abline(h=0, col="red")
Розподіл Пуассона моделює окрему кількість рідкісних подій (0, 1, 2, 3, …) в фіксованому інтервалі (часу, простору тощо). Оскільки негативних підрахунків не буває, розподіл починається з 0 і тягнеться нескінченно вправо — отже «хвіст» природно лежить праворуч.
У розподілі Пуассона і середнє, і дисперсія дорівнюють λ.
Коли λ мала (наприклад, 2, 3, 5), більша частина маси ймовірності біля 0, але можливі й вищі значення — утворюється довгий правий хвіст → правостороння скошеність.
Коли λ зростає (наприклад, ≥ 15–20), розподіл стає симетричнішим, а для великих λ наближається до нормального.
Підсумок:
• λ (середнє) = Форма розподілу Пуассона
λ мала (≤ 5) сильно правосторонньо скошений λ середня (~10) помірно скошений λ велика (≥ 20) майже симетричний, прямує до нормального
\[ P(X = k) = \frac{e^{-\lambda} \lambda^{k}}{k!}, \quad k = 0, 1, 2, \dots \] Формула показує ймовірність отримати саме k подій, якщо середня частота подій дорівнює λ.
Член e−λ гарантує, що всі ймовірності в сумі дорівнюють 1.
Коли λ велика, розподіл наближається до нормального, а коли мала: він сильно правосторонньо скошений.
=> на гарячу лінію програми надходить у середньому 5 звернень за годину. Випадкова змінна Y — кількість звернень за годину.
Тоді Y∼Poisson(λ=5).
=> знов, пуассонівський розподіл добре описує кількість подій у фіксованому інтервалі часу/простору, особливо події що трапляються “рідко” й приблизно незалежно, із сталою середньою інтенсивністю λ.
# Параметри Пуассона
lambda <- 5
k_max <- 20 # обріжемо вісь до розумного максимуму
k_pois <- 0:k_max
pois_df <- tibble(
k = k_pois,
pmf = dpois(k_pois, lambda = lambda)
)
# ggplot PMF для Пуассона
g_pois <- ggplot(pois_df, aes(x = k, y = pmf)) +
geom_col() +
geom_point(size = 2) +
labs(
title = "Пуассонівський розподіл: Y ~ Poisson(λ=5)",
subtitle = "Y = кількість звернень на гарячу лінію за годину",
x = "Кількість звернень (k)",
y = "Ймовірність P(Y = k)"
) +
theme_minimal()
g_pois
#Інтерактивно (plotly)
ggplotly(g_pois)
#Або напряму через plotly
plot_ly(pois_df, x = ~k, y = ~pmf, type = "bar") %>%
layout(
title = "Пуассонівський розподіл (інтерактивно)",
xaxis = list(title = "Кількість звернень (k)"),
yaxis = list(title = "P(Y = k)")
)
Біноміальний: коли маємо фіксовану кількість спроб і успіх/неуспіх з імовірністю p. Приклад — скільки донорів піднімуть слухавку з 10 дзвінків.
Пуассонівський: коли рахуємо кількість подій за інтервал з середньою інтенсивністю λ. Приклад — скільки звернень прийде на гарячу лінію за годину.