version: 1.1

R 이항분포 정리

항아리에 흰공 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