음이항분포는 기하분포의 일반화이다. 기하분포가 첫번째 성공전의 실패횟수에 관심이 있다면, 음이항분포는 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
위에서 진행한 simulation 결과와 이론적 PMF 값을 서로 비교한다.
# 그래프를 그린다.
plot(trial_result_prop)
lines(X, theorical_result, col='red')