=> є 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}} \]
=> на гарячу лінію програми надходить у середньому 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 дзвінків.
Пуассонівський: коли рахуємо кількість подій за інтервал з середньою інтенсивністю λ. Приклад — скільки звернень прийде на гарячу лінію за годину.