version: 1.1
항아리에 흰공 2개와 검은공 3개가 있다. 이중 흰공을 선택할 확률은 얼마인가?
물론, 전체 가능한 경우의 수는 5가지에서 흰공은 2개니까 P(X = 흰공) = 2/5 = 0.4가 된다.
자, 그럼 여기서 한 가지 더 생각해 보자.
이것을 일반화 하면 이렇게 된다. 7번 시도를 n 이라고 하고 흰공이 나온 횟수를 r이라고 하자. 그리고 한번 시도할 때 흰공이 나올 확률을 p라하면, 흰공이 아닐 확률은 q = 1 - p가 된다.
n번 시도해서 r번의 흰공이 나올 확률은 P(X = r) = choose(n, r) * p^r * q^(n-r) 이 된다.
이것을 1000번 실행해서 각 횟수(r)의 빈도수를 simulation으로 분포를 확인해보자.
library(ggplot2)
library(reshape2)
set.seed(1234)
# simulation
# --------------------------------
# 항아리(pot)에 아래와 같이 공이 들어 있다.
pot <- c(1, 1, 0, 0, 0) # 흰색공 1, 검은색공 0
# 시도 횟수는 7번이다.
n <- 7
# 결과를 담을 변수를 선언한다.
res <- c()
# 1000번 반복해서
for(i in 1:1000)
{
# 각각 7번을 복원추출한 후
s <- sample(pot, n, replace = T)
# 흰색 공의 갯수를 센 다음
s.1 <- sum(s)
# 결과변수에 저장한다.
res <- c(res, s.1)
}
# 각 횟수에 대해서 빈도수를 계산한다.
x <- table(res)
# 데이터프레임 형식으로 저장한다.
x.df <- data.frame(x)
# 상대빈도수를 계산한다.
x.df$rel_freq <- x.df$Freq / sum(x.df$Freq)
# 이론적 이항분포의 확률분포
# --------------------------------
n <- 7 # 시도 횟수
p <- 0.4 # 성공확률
q <- 1 - p # 실패확률
P_x <- c() # 결과변수
# 가능한 시도수 만큼 루프를 돌면서
for(r in 0:n)
{
# r번 성공했을 경우의 확률을 계산한 다음
Ptemp <- choose(7, r) * p ^ r * q ^(n - r)
# 결과변수에 저장한다.
P_x <- c(P_x, Ptemp)
}
P_x
## [1] 0.0279936 0.1306368 0.2612736 0.2903040 0.1935360 0.0774144 0.0172032
## [8] 0.0016384
위에서 구한 시뮬레이션 자료값과 이론적 확률값을 그래프로 비교해 본다.
x.df$P_x <- P_x
# 긴 자료형으로 변경한다.
long_df <- melt(x.df, measure.vars = c("rel_freq", "P_x"))
g <- ggplot(long_df, aes(x = as.numeric(res), y = value, colour=variable)) + geom_line()
g <- g + labs(title = "이항분포", x = "시도횟수 r", y = "성공확률 p")
g
# 7, 8개가 나올 확률은?
sum(x.df$rel_freq[7:8]) # simulation 값
## [1] 0.017
sum(P_x[7:8]) # 이론값
## [1] 0.0188416
pbinom(5, size = 7, prob = 0.4, lower.tail = FALSE) # R 함수 사용
## [1] 0.0188416
simulation으로 구한 확률분포와 이론적으로 구햔 확률분포가 거의 동일함을 알 수 있다. 확률분포의 모양은 n과 p에 의해 좌우된다. p가 0.5이면 좌우 대칭 모양이다.
이항분포의 예제를 엉터리로 만들어 본다.
하루에 5번의 로그인 회원 중 2명이 물건을 구매한다. 즉 하루에 물건이 판매될 확률은 약 40%이며 모든 날의 확률이 동일하다고 가정한다. 일주일 동안 3일 이상 물건이 판매될 확률은?
# 2는 포함되지 않는다.
pbinom(2, size = 7, prob = 0.4, lower.tail = FALSE)
## [1] 0.580096
# 포아송 분포로 근사화할 수 있다.
ppois(2, lambda = 0.4 * 7, lower.tail = FALSE)
## [1] 0.5305463