음의 이항 분포란 무엇인가?
음의 이항 분포(Negative Binomial Distribution)는 음의 이항 이산 분포를 따르는 정수형 난수를 생성하는 확률 분포입니다. 이 분포는 파스칼 분포(Pascal's Distribution)라고도 알려져 있으며, 'k번의 성공이 발생하기 전까지의 실패 횟수'를 모델링하는 데 사용됩니다.
음의 이항 분포는 다음과 같은 수식으로 표현할 수 있습니다.
$$P\lgroup i\arrowvert k,p\rgroup=\lgroup \frac{k+i-1}{i}\rgroup p^{k}\lgroup 1-p\rgroup^{i}$$
수식의 구성 요소
- k: 목표로 하는 성공 횟수
- p: 각 시행에서 성공할 확률
- i: k번째 성공이 일어나기 전까지 발생한 실패 횟수
즉, 이 분포는 성공 확률이 p인 독립적인 베르누이 시행을 반복할 때, k번째 성공이 나오기까지 몇 번의 실패가 발생하는지를 확률적으로 나타냅니다.
C++ 예제 코드
다음은 C++의 <random> 헤더에 포함된 negative_binomial_distribution 클래스를 활용한 예제입니다. 총 10,000회의 시행을 수행하고, 각 결과값(0~9)의 빈도를 별표(*) 개수로 시각화하여 분포의 형태를 확인합니다.
#include <iostream>
#include <random>
using namespace std;
int main(){
const int nrolls = 10000; // 전체 시행(롤) 횟수
const int nstars = 100; // 배분할 별(*)의 최대 개수
default_random_engine generator;
negative_binomial_distribution<int> distribution(3,0.5);
int p[10]={};
for (int i=0; i<nrolls; ++i) {
int number = distribution(generator);
if (number<10)
p[number]++;
}
cout << "negative_binomial_distribution (3,0.5):" << endl;
for (int i=0; i<10; ++i)
cout << i << ": " << string(p[i]*nstars/nrolls,'*') << endl;
}코드 설명
negative_binomial_distribution<int> distribution(3, 0.5): 성공 횟수(k)를 3으로, 성공 확률(p)을 0.5로 설정한 음의 이항 분포 객체를 생성합니다.- 난수 엔진
default_random_engine을 사용해 10,000번의 표본을 추출합니다. - 결과값이 10 미만인 경우만 배열
p에 카운트하여, 값별 빈도를 집계합니다. - 마지막으로 각 값의 빈도에 비례하는 별표 문자열을 출력해 히스토그램 형태로 보여줍니다.
실행 결과
0: ************ 1: ******************* 2: ***************** 3: **************** 4: *********** 5: ******* 6: ***** 7: *** 8: ** 9: *
결과 해석
출력 결과를 보면 값이 커질수록 빈도가 점차 감소하는 것을 확인할 수 있습니다. 이는 음의 이항 분포의 전형적인 특징으로, 성공 확률이 0.5이고 성공 횟수가 3일 때 실패 횟수가 적은 경우가 상대적으로 더 자주 발생함을 의미합니다.
이러한 음의 이항 분포는 주사위 시뮬레이션, 대기 행렬 분석, 통계적 모델링 등 다양한 분야에서 활용되며, 특히 포아송 분포보다 분산이 큰 데이터를 모델링할 때 유용하게 사용됩니다.