Summary

음이항분포는 기하분포의 일반화이다. 기하분포가 첫번째 성공전의 실패횟수에 관심이 있다면, 음이항분포는 r번째 성공까지 실패한 횟수에 관심이 있다.

예제로, 축구선수가 프리킥 성공율이 20% 이다. 이 선수가 5번 성공까지 실패한 횟수를 simulation 결과와 이론적 확률값 PMF 로 비교해보자.

# 2021-04-10 by skkong
# 음이항분포 Negative Binomial distribution 연습, simulation
# 프리킥 성공률이 20% 이다. 5번 성공하기 위해서 몇 번의 실패가 있었는지를 
# 확률변수 X 로 한다면, X 에 대한 확률질량함수값을 계산한다.

#sample_size <- 100 # 표본크기
num_trials <- 1000 # simulation 시도 횟수 
p <- 0.2 # 성공확률
r <- 5 # 5번 성공
X <- 0 # 확률변수

# 1번의 게임을 실행함
my_trial <- function()
{
  result <- c() # 프리킥 결과 
  while (TRUE) {
    # 1: 골, 0: 노골
    one_trial <- sample(c(1, 0), size = 1, prob = c(p, 1-p))
    result <- c(result, one_trial)
    
    # 성공횟수까지 시도하고, 실패횟수를 반환한다.
    if(sum(result) == r) {
      return (length(result) - r)
    }
  }
}
my_trial() # 함수 기능 테스트
## [1] 27
trial_result <- sapply(1:num_trials, function(i) my_trial()) # simulation
trial_result_prop <- table(trial_result) / length(trial_result) # 상대도수를 구한다.
round(trial_result_prop, 2)
## trial_result
##    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
## 0.00 0.00 0.00 0.00 0.01 0.01 0.01 0.02 0.03 0.02 0.03 0.04 0.04 0.04 0.05 0.04 
##   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31 
## 0.04 0.04 0.05 0.04 0.03 0.03 0.04 0.04 0.04 0.02 0.03 0.03 0.03 0.03 0.01 0.02 
##   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47 
## 0.01 0.02 0.01 0.01 0.01 0.01 0.00 0.01 0.01 0.01 0.01 0.01 0.00 0.00 0.00 0.00 
##   48   49   50   52   53   55   56   60   63 
## 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# 이론적 값과 시뮬레이션 값을 비교한다.
X = 0:70 # 실패횟수

# 이론적 확률값을 구한다.
theorical_result = sapply(X, function(n) choose(n+r-1, r-1) * p^r * (1-p)^n)
round(theorical_result, 2)
##  [1] 0.00 0.00 0.00 0.01 0.01 0.01 0.02 0.02 0.03 0.03 0.03 0.04 0.04 0.04 0.04
## [16] 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.03 0.03 0.03 0.03 0.02 0.02 0.02
## [31] 0.02 0.02 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.00 0.00 0.00
## [46] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## [61] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Plots

위에서 진행한 simulation 결과와 이론적 PMF 값을 서로 비교한다.

# 그래프를 그린다.
plot(trial_result_prop)
lines(X, theorical_result, col='red')