이항분포를 다시 한번 생각해보자.
볼링을 치는데 한 번 칠때 스트라이크 될 확률이 0.1 이라고 하자. 만약 100번을 쳤을 경우 12번 스트라이크될 확률은?
이 경우 X ~ B(n, p)를 따른다. 즉, X ~ B(100, 0.1)이고 기대치 E(X) = n * p = 100 * 0.1 = 10 이고 분산 Var(X) = n * p * q = 100 * 0.1 * 0.9 = 9가 된다. 확률 P(X = r) = nCr * p^r * q^(n-r) = 0.09878801 이 된다.
library(ggplot2)
# 방법 1: 공식을 사용
p <- 0.1
q <- 1 - p
n <- 100
r <- 12
choose(n, r) * p^r * q^(n-r)
## [1] 0.09878801
# 방법 2: R의 함수 사용
dbinom(x = r, size = n, prob = p)
## [1] 0.09878801
위의 문제를 이렇게 볼 수도 있다. 확률이 0.1이고 100번을 쳤을 때 스트라이크가 평균적으로 10번(기대치값과 동일) 나온다고 할 수 있다. 즉, 100번을 쳤을 때 평균적으로 10번의 스트라이크가 있다. 그럼, 12번 칠 확률은?
일정 기간동안의 평균값이 주어질 경우, 확률을 구하는 문제는 푸아송분포로 풀 수 있다. 위의 예와 같이 이항분포의 확률은 푸아송분포의 확률로 근사치로 구할 수 있다.
푸아송분포는 X ~ Po(lambda) 로 표현하고 확률은 P(X = r) = {e^(-lambda) * lambda^r} / r!, 기대치 E(X) = lambda, 분산 Var(x) = lambda로 정의한다.
푸아송분포는 기대치와 분산이 동일하다. 이항분포의 기대치는 E(X) = n * p, 분산은 Var(X) = n * p * q로 정의된다. 이항분포의 기대치와 분산이 비슷한 값을 갖는다면, 이항분포의 계산은 푸아송으로 바꾸어도 확률은 비슷하게 구할 수 있다.
그럼, 어떤 경우에 이항분포의 기대치와 분산이 비슷한 값을 가질까?
먼저 기대치와 분산에 모두 n * p가 있고 분산에만 q가 있다. 일단, q가 1에 가까워야 기대치와 분산이 비슷해진다. q가 1에 가까우면 p는 0에 가깝게 된다. (왜냐하면 p + q = 1) n은 적당히 커야 한다. n이 50보다 크고 p가 0.1 보다 작으면 푸아송분포로 계산해도 된다.
또한, 100! 을 계산할 필요가 없기 때문에 계산량이 작아진다.
푸아송분포는 평균값이 주어졌기 때문에 평균값 안에 시행횟수 n, 확률 p를 모두 포함한다.
값을 먼저 구해보자.
# 방법 1:
lambda <- 10
r <- 12
exp(-lambda) * lambda^r / factorial(r)
## [1] 0.09478033
# 방법 2:
dpois(x = r, lambda = lambda)
## [1] 0.09478033
그럼, 수식에 의한 이항분포와 푸아송분포를 서로 비교해보자. 그래프를 보면, 2개의 분포가 서로 비슷함을 알 수 있다.
# 이항분포 확률값 계산
p <- 0.1
q <- 1 - p
n <- 100
p_x1 <- dbinom(x = 0:n, size = n, prob = p)
# 푸아송분포 확률값 계산
lambda <- n * p
p_x2 <- dpois(x = 0:n, lambda = lambda)
# 그래프를 그린다.
df <- data.frame(x = 0:n, y1 = p_x1, y2 = p_x2)
g <- ggplot(df, aes(x = x, y = y1, group = 1, colour = 'red')) + geom_line()
g <- g + geom_line(aes(x = x, y = y2, group = 2, colour = 'blue'))
g <- g + labs(title = "이항분포, 푸아송분포 비교", x = "횟수", y = "확률")
#g <- g + theme(text = element_text(family = "나눔명조")) # for windows
g <- g + theme(text = element_text(family = "NanumGothic")) # for mac
g