[R 과 통계학 - 5] 이산확률분포(2) - 베르누이분포, 이항분포, 음이항분포

 이산확률분포의 종류에는 베르누이분포, 이항분포, 음이항분포, 기하분포, 초기하분포, 포아송분포, 이산형 균일분포 등 다양한 분포가 존재하는데 이번 포스팅에서는 베르누이분포, 이항분포, 음이항분포에 대해서 알아보도록 하겠습니다.

 

1. 베르누이분포(Bernoulli Distribution)

베르누이 시행이라는 것이 있는데, 베르누이 시행이란 성공, 실패 둘 중 하나로 구분되는 실험을 수행하는 것으로 예를 들면 동전을 던졌을 때의 앞면, 뒷면, 성별검사의 남,여, 제품검사의 합,불합 등 이분법적으로 나눌 수 있는 실험을 베르누이 시행이라고 합니다.

이때 확률변수 X가 가질 수 있는 것을 간단하게 0또는 1이라고 표현할 수 있고, "P(X=0)은 1-p =q 이고 p(X=1)은 p이다."라고 표현할 수 있는데 이것을 함수로 표현하면 아래와 같습니다.

이와 같은 확률분포를 베르누이분포라고 합니다.

어떤 분포를 결정짓는 값을 우리는 모수(parameter)라고 부르는데 베르누이분포에서는 p가 모수입니다.

따라서 확률변수 X가 베르누이분포를 따르는 것을 기호로 표현하면 X~Bernoulli(p)로 씁니다.

베르누이분포를 따른다면 평균과 분산을 다음과 같이 구할 수 있습니다.

2. 이항분포

위에서 살펴본 베르누이 시행을 독립적으로 반복시행하는 경우의 실험을 이항실험이라고 합니다.

이항분포를 정리하자면 성공률이 p로 일정한 베르누이 시행을 독립적으로 반복시행할 때 성공의 횟수를 X라 하면 이 확률분포를 이항분포라고 부릅니다.

확률변수 X가 실험횟수가 n이고 매 시행의 성공률이 p인 이항분포를 따르는 것을 X~B(n,p)라고 표현합니다.

확률분포는 다음과 같이 구합니다.

매 시행의 성공률이 p로 일정한 이항실험에서 (q=1-p)

확률변수 X : n번 시행하는 실험이라고 가정할 때에 평균과 분산은 다음과 같습니다.

평균 = n*p

분산 = n*p*q

3. 음이항분포 (베르누이, 이항분포와 개념 비교정리)

베르누이 시행을 독립적으로 반복시행하는 경우가 이항분포라고 했습니다.

그럼 이러한 성공확률이 p인 베르누이 시행을 독립적으로 반복하는데, k번째 성공이 나올 때 까지의 총시행횟수를 확률변수 X라고 정의한다면 이때의 확률분포를 '음이항분포'라고하며 확률분포는 다음과 같이 표현할 수 있습니다.

또는 실패횟수에 관심을 갖는 것도 음이항 분포라고 부르는데요, 매 성공률이 p로 일정한 베르누이 시행을 독립시행할 때, k번 성공이 일어날 대가지의 실패횟수를 확률변수 X라고 놓는 것 또한 음이항분포이고 확률분포는 다음과 같습니다.

예시를 통해 개념을 다시 한 번 정리해보도록 하겠습니다.

우리 보통 PC게임이던 모바일 게임이던 게임에서는 다양한 아이템들이 존재하고 게임속 자신의 케릭터를 좀 더 가치있게 만들기 위해서 보통 거의 모든게임에서는 장비강화라는 시스템이 존재하죠?

이 게임속 아이템 장비강화를 예시로 들어보도록 하겠습니다.

#베르누이분포

아이템 강화는 베르누이 시행이라고 볼 수 있습니다.

게임 케릭터의 장비를 강화하면 일정 확률로 강화가 성공하거나 실패합니다. 시행의 결과는 오직 강화 성공과 실패 두가지 밖에 존재하지 않으니 베르누이 시행이라고 볼 수 있겠죠?

강화 성공확률은 게임개발자는 알고 있습니다. 성공 확률이 p라고 한다면 장비 아이템 강화 시행이란 성공확률이 p인 베르누이 시행이됩니다.

#이항분포

그런데 게임에선 항상 문제가 존재하죠. 바로 강화를 딱 한번만 지르지 않는다는 문제점이 존재합니다.

즉 성공확률이 p인 베르누이 시행을 n번 반복하게됩니다.

정리하자면 성공확률이 p인 베르누이 시행을 n번 시도했을 때 k번 성공하는 사건은 얼마나될까?? 하고

즉 "10% 장비강화 주문서를 사용해 7장 사용해서 3번 성공할 확률은 얼마나 될까?"를 궁금해할 수 있습니다.

이러한 경우 이항분포를 활용하게 됩니다.

#음이항분포

이항분포는 "10%짜리 장비강화 주문서 7장을 사용해서 3번 성공할 확률이 얼마나 될까?"라는 상황에서 활용한다고 했습니다. 그럼 음이항분포는 어떠한 상황일까요?

게임유저라면 내가 원하는 강화횟수 예를 들면 내가 7번 강화에 성공해서 7성짜리 무기를 만들려면 몇번이나 강화를 시도해야하는지가 궁금할 것입니다.

즉 성공 확률이 p인 강화를 k번 성공시키기 위해선 n번의 시도수가 필요할 확률을 구하는 것 그것이 바로 음이항분포입니다. 다시한번 정리하자면 목표한 성공 횟수에 도달하기 위해서 얼마나 많은 실패가 필요한지 실패횟수 r에 대한 확률을 계산하는 하는 것이죠.

그럼 마지막으로 총정리를 한번해보겠습니다.

1) 베르누이분포에서의 확률변수 X란, 변수 X가 성공 or 실패인 경우

2) 이항분포에서의 확률변수 X란, n번의 베르누이 시행에서 성공의 횟수

3) 음이항분포에서의 확률변수 X란, k번 성공할 때까지의 총 실험횟수(실패횟수)

정리되셨나요?

4.R에서 이항분포, 음이항분포 활용하기 - dbinom(), dnbinom() 함수

독자분들 우리 저번 포스팅에서 R과 R Studio 설치했었으니 이번에 한번 써먹어봐야겠죠??

그럼 지금 바로 R Studio를 실행시켜주시고 아래와 같은 코드를 작성해보도록 하겠습니다.

4-01 R 설정

R Studio 실행화면

다들 요 화면보고 계시리라 생각하고 진행할게요.

코드를 작성하기전에 간단한거 하나 알려드릴게 있는데요! 위 여러가지 Tab들이 존재하는데

Tools -> Global options를 클릭하시면 다음과 같은 창이 뜹니다.

여기에서 Code -> Saving 으로 이동하신다음 아래 그림처럼 엔코딩설정을 해줄 수 있는데 change 버튼을 클릭하셔서 'UTF-8'로 설정해주시기 바랍니다. 이 설정을 하지 않으면 한글깨짐현상이 발생하기 때문에 설치하시고 난 후에 한번씩 확인해주는게 좋습니다.

디폴트 엔코딩 설정 : UTF-8

이외에도 여러가지 설정을 할 수 있는데 크게 딱히 건드릴건 없고

Appearance에서 원하시는 테마설정정도만 하셔도 될 것 같습니다. 저는 어두운 배경이 좋아서 ㅎㅎ...

4-02 이항분포 - dbinom()

만약 강화 성공 확률이 10%인 주문서를 10번 사용했을 때, 1번 성공할 확률은 몇%일까요?

10%이기 때문에 10%라고 생각하실 수 있겠지만 구체적으로 이 시행은 이항분포를 따른다고 볼 수 있기때문에 아래와 같은 식으로 구할 수 있습니다.

그럼 적용한다면 다음과 같이 쓸 수 있겠죠?

(앞에 괄호처럼 표시한 것이 바로 조합을 의미하는 수식기호임)

위 식을 R에서 계산해보도록 할까요?

(factorial(10)/factorial(9))*0.1*0.9^9

R에서 팩토리얼함수와 지수표현은 '^'을 통해서 할 수 있고 위 코드의 결과값을 확인하면 아래와 같이 약 38.74%라고 구할 수 있겠습니다.

결국 강화 성공 확률이 10%인 주문서를 10번 사용했을 때, 1번 성공할 확률을 이항분포를 몰랐을 때에는

그냥 단순하게 생각하면 10%라고 생각했지만 실제로 10%짜리 주문서를 10번 질러서 1번 성공할 확률은 10%가 아니라 38.74%가 됩니다.

그런데 이런 이항분포를 따르는 확률을 계산하기가 너무 귀찮지 않나요?

그래서 R에서는 dbinom()이라는 함수를 제공합니다.

dbinom(x=1, size=10, prob =0.1)

위에서 처럼 x는 성공횟수, size는 n, prob 는 성공확률을 각각 넣어주고 함수를 돌리면

이처럼 따로 수식을 작성하지 않고도 간단하고 빠르게 구할 수 있습니다.

그렇다면 10%짜리 주문서를 10번 질러서 0번 성공할 확률, 1번성공할 확률, 2번성공할 확률 ..... 해서 10번 다 성공할 확률을 알아볼까요?

dbinom(x=0:10, size=10, prob =0.1)

위와 같이 X에 0:10이라는 표현을 사용해주면 되는데 이는 0부터 10까지 시퀀스 벡터를 의미합니다.

즉 x라는 벡터(R에서의 변수를 담는 그릇)에는 0,1,2,3,4,5,6,7,8,9,10 이라는 11가지 숫자가 들어가게 됩니다.

해서 결과값을 보면!

위와 같이 구할 수 있고 2번 성공할 확률이 19.37%, 3번 성공할 확률이 5.73%로 급격하게 감소하는 것을 확인 할 수 있습니다.

그럼 이것을 그래프로 시각화하여 한번 확인해볼까요?

plot(0:10, dbinom(0:10, 10, 0.1), type = 'h')

위 코드는 R에 내장된 기본적인 그래프를 그리는데 사용되는 plot()함수입니다.

실행 결과를 보면 다음과 같은 그래프를 확인하실 수 있습니다.

이렇게 그래프로 보니 10% 강화 주문서를 10번 질러서 1번 성공할 확률은 38%나 되지만 2번이상 성공할 확률은 급격하게 줄어들기 때문에 10번 질러서 1번되면 다행인 것처럼 보입니다.

정말 운이 좋아야 2번성공하는거죠!

그런데 뭔가 그래프가 안이쁜 것 같아서 다음과 같은 코드를 통해 좀 더 이쁜 그래프를 그려보도록 할게요.

library(ggplot2) x=0:10 y=dbinom(0:10,10,0.1) data1 <- data.frame(x,y) ggplot(data=data1, aes(x=data1$x, y=data1$y)) + geom_col(fill='orange') + scale_x_continuous(breaks=c(0:10))

library(ggplot2) x=0:10 y=dbinom(0:10,10,0.1) 
data1 <- data.frame(x,y) 
ggplot(data=data1, aes(x=data1$x, y=data1$y)) + geom_col(fill='orange') + scale_x_continuous(breaks=c(0:10))

'ggplot2'라는 패키지안에 있는 ggplot()이라는 함수를 통해서 아래와 같은 그래프를 얻을 수 있습니다.

코드가 조금 어려워보여도 계속 눈으로 보다보면 어떻게 적용된건지 금방 감이오실거에요.

(코드부분에서 이해가 안되는 부분이 있으면 댓글로 남겨주세요)

4-03음이항분포

자 10%강화 주문서를 10번 성공시켜서 10성 장비를 얻으려면 대체 몇번이나 시도해야하는지 궁금하다고 합시다. 이럴 때 바로 음이항 분포를 활용하면 되겠습니다.

(이 때, 음이항분포는 이항분포와 달리 실패 횟수가 무한대까지 확장이 가능하다는 점을 생각해야합니다.)

그럼 음이항분포의 2가지 확률분포 중

위와 같은 확률분포를 활용하면 되겠죠?

마찬가지로 R에서는 당연히 음이항분포에 대한 함수도 제공합니다.

다음 코드를 통해서 결과값을 구해보도록 할게요.

​x=0:200 y=dnbinom(x=0:200, size=10, prob = 0.1) 
data2 <- data.frame(x,y) 
ggplot(data=data2, aes(x=data2$x, y=data2$y)) + geom_col(fill='green') #1번째 sum(dnbinom(1:200, size=10, prob = 0.1)) #2번째 pnbinom(100,10,0.1) #3번째

먼저 #1번째의 실행결과로 다음과 같은 그래프를 얻을 수 있습니다.

이 그래프를 보면 100번정도는 시행해야 반이상의 확률을 구할 수 있다는 건데요 (x까지의 누적면적의 합이 확률입니다.)

#2번이 바로 200번시도했을 때 얻어지는 확률값인데

200번정도는 해야 99.81%의 확률로 10% 강화주문서를 써서 10강 무기를 만들 수 있다는겁니다.

그럼 100번정도하면 몇 %의 확률로 구할수 있을까요? 저기서 1:200을, 1:100으로 바꾸어도 되는데

x까지의 누적확률값을 구해주는 함수가 있습니다.

그래서 #3번을 보시면 pnbinom()함수를 활용한 것이고 결과값은 다음과 같습니다.

 

보시다시피 sum(1:100)으로 바꿔준것과 동일한 값이 나오는 것을 확인할 수 있죠?

이로써 R로 이항분포와 음이항분포에 관한 활용사례들을 살펴보았습니다.

여기까지 꽤나 긴글이 된 것 같습니다.

그래서 마찬가지로 베르누이 시행을 독립적으로 반복하는 상황에서 나오는 기하분포와 초기하분포

그리고 주어진 시간, 면적, 공간내에 발생하는 어떤 사건의 횟수에 관심이 있을 때 사용하는 포아송분포까지

이 3가지 확률분포에 대해서는 다음 포스팅에서 다루도록 하겠습니다.

긴글읽으시느라 고생많으셨고 다음 포스팅에서 찾아뵙도록 하겠습니다.

감사합니다.