공부/파이썬을 통한 기초통계학

Negative binomial distribution, 음이항 분포

ko_sick 2025. 2. 27. 15:36

🤩 Negative Binomial Distribution
음이항 분포에 대해서 알아보고, 파이썬을 통해서 간단한 예제 문제를 풀도록 하겠습니다.
파이썬 문제는 https://wikidocs.net/165633를 참고했습니다.

문제

당신은 영업을 뛰고 있으며, 각 잠재 고객에게 영업이 성공할 확률은 동일하게 70%라고 가정합시다. 당신은 하루에 10건의 영업을 성공시키면 집에 갈 수 있습니다. 이때 영업 성공 횟수가 이항 분포를 따르는지 확인해보기 위한 시뮬레이션을 완성시키세요. 베이스라인의 code here 을 채우세요.

베이스라인

import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
from collections import Counter

def try_till_success(n):
    '''
    1. 1회씩 시도(Bernoulli)하여 성공 횟수가 10회 누적될 때까지 try count를 누적시킨다
    2. 10번 성공하면 try_counts에 append 한 뒤 초기화
    3. 1~2를 n회 반복
    *numpy에는 Bernoulli가 없으니 이항 분포에서 n=1로 하여 대신 사용한다.

    '''
    try_counts = []
    for _ in tqdm(range(n)):
        try_count = 0
            '''       
                code here
            '''
        try_counts.append(try_count)
    return try_counts

def bar_plotter(nums):
    '''
    matplotlib이 제공하는 히스토그램은 여러 개를 겹쳐그릴 때 이쁘지 않아 bar plot으로 대신 그렸다
    '''
    num_counter = Counter(nums)
    plt.bar(
            num_counter.keys(),
            num_counter.values(),
            width=0.9, alpha=0.3
           )
    plt.show()

Input

n = 100000
p = 0.7
try_list = try_till_success(n)
nb_list = [10+np.random.negative_binomial(10, p) for _ in range(n)]
binom_list = [np.random.binomial(int(10/0.7**2), p) for _ in range(n)]

try_counter = Counter(try_list)
nb_counter = Counter(nb_list)
binom_counter = Counter(binom_list)

plt.figure(figsize=(12,10))
plt.subplot(2,1,1)
plt.bar(try_counter.keys(), try_counter.values(), alpha=0.3)
plt.bar(nb_counter.keys(), nb_counter.values(), alpha=.3)
plt.legend(['try till sucess', 'negative binomial'])

plt.subplot(2,1,2)
plt.bar(try_counter.keys(), try_counter.values(), alpha=0.3)
plt.bar(binom_counter.keys(), binom_counter.values(), alpha=.3)
plt.legend(['try till sucess', 'binomial'])
plt.show()

Output


베이스라인(정답 - 더보기 클릭)

더보기
def try_till_success(n):
    ## np.binomial(n, p, size=None) << 으로 이항확률 계산
    ##  numpy.org/doc/2.0/reference/random/generated/numpy.random.binomial.html
    try_counts = []
    for _ in tqdm(range(n)):
        try_count = 0
        success_count = 0
        
        while success_count<10:
            #이항 분포에서 n=1로 하여 대신 사용한다.(조건부)
            success = np.random.binomial(1, p)
            try_count += 1
       
            if success == 1:
                success_count += 1
        
        try_counts.append(try_count)
        
    return try_counts

 

음이항 분포, 기하 분포, 초기하 분포 상세 설명

음이항 분포

  • 성공 확률이 p인 베르누이 시행을 r번 성공할 때 까지 반복하는 확률 분포
  • 음이항 분포(Negative Binomial Distribution)는 성공확률이 고정된 상황에서 특정한 횟수까지 성공하는데 몇번을 시도했는지에 대해서 설명하는 분포이다.
  • 이항분포와는 큰차이가 있는데, 시행 횟수에 대한 고정이 아닌. 성공 횟수에 대해서 고정이 되어져있고, 포커스가 성공이 아닌 실패에 초점을 맞추기 때문에 "음(Negative)"이항 분포라는 이름이 붙어있습니다. 
  • 음이항 분포의 수식은 아래와 같습니다. 마지막 시행에서는 항상 성공으로 끝마무리가 되기 때문에 조합부분에서 r대신 r-1이 들어가고, r번 성공하기 때문에 p를 r제곱을 하게 됩니다.
$$P(X = x;r,p) = \binom{r+x-1}{r-1}p^{r}(1-p)^{x}, \quad x = 0, 1, ...$$
  • 음이항 분포의 평균은 r/p로 계산됩니다. 위에서 예시로한 영업 사례에서의 수치를 이용하여. 10건의 영업을 성공해야하고, 해당 영업에 성공할 확률은 70%라고 지정된 수치를 이용하여 계산한다면 $10/0.7 \simeq 14.3$

 

음이항 분포와 이항 분포의 혼동 방지: 핵심 차이점 명확히 하기

음이항 분포는 성공/실패 두 가지 결과만 존재하는 베르누이 시행을 기반으로 하므로, 얼핏 보면 이항 분포와 유사해 보일 수 있습니다. 하지만 두 분포 사이에는 중요한 차이점이 존재하며, 이 차이점을 간과하면 오류가 발생할 수 있습니다.

 

핵심 차이점:

  • 시행 횟수 (n):
    • 이항 분포: 시행 횟수 n이 고정된 상수입니다. 예를 들어, 동전을 10번 던지는 경우 n은 항상 10입니다.
    • 음이항 분포: 시행 횟수가 확률 변수입니다. 즉, 시행 횟수가 매번 달라질 수 있습니다. 영업 성공 사례에서, 10번 성공할 때까지 시도하는 횟수는 매일 달라질 수 있습니다.
  • 성공 횟수 (r):
    • 이항 분포: 성공 횟수가 확률 변수입니다.
    • 음이항 분포: 성공 횟수가 고정된 상수입니다.

주의해야 할 점:

  • 성공/실패의 두 가지 결과만 존재한다는 이유로 음이항 분포를 이항 분포로 잘못 판단하기 쉽습니다.
  • 특히, 시행 횟수 n이 고정되지 않고 변동하는 상황에서는 이항 분포를 적용하면 오류가 발생할 수 있습니다.
  • 따라서 데이터 수집 과정을 명확히 이해하고, 각 분포의 특성을 정확히 파악하여 적절한 분포를 선택하는 것이 중요합니다.

 

기하 분포

  • 정의:
    • 기하 분포는 첫 번째 성공이 발생할 때까지 실패 횟수를 나타내는 확률 분포입니다.
    • 성공 확률이 p인 베르누이 시행을 반복할 때, 첫 성공까지의 시도 횟수를 모델링합니다.
    • 예시: 동전을 던져 처음 앞면이 나올 때까지 던지는 횟수, 제품 검사에서 처음 불량품이 나올 때까지 검사하는 횟수 등
  • 특징:
    • 무기억성(memoryless property)을 가집니다. 즉, 과거의 실패가 미래의 성공 확률에 영향을 미치지 않습니다.
    • 이산 확률 분포입니다.
  • 계산공식
    • 확률 변수 X가 k번째 시행에서 처음으로 성공할 확률은 다음과 같이 계산됩니다.
$$P(X = k) = (1 - p)^{k-1}*p$$
- $p$는 각 시행에서 성공할 확률(고정값)
- $k$는 첫번째 성공이 발생하는 시행 횟수

초기하 분포

  • 정의:
    • 초기하 분포는 유한한 모집단에서 비복원 추출을 할 때 특정 특성을 가진 표본의 개수를 나타내는 확률 분포입니다.
    • 예시: N개의 공 중에서 K개의 흰 공이 있을 때, n개의 공을 임의로 뽑았을 때 흰 공의 개수
  • 특징:
    • 비복원 추출을 가정하기 때문에 각 시행이 독립적이지 않습니다.
    • 이산 확률 분포입니다.
  • 계산공식
    • 모집단의 크기가 이고, 특정 특성을 가진 개수가 일 때, 개의 표본을 추출했을 때 그중 개가 특정 특성을 가질 확률은 다음과 같이 계산됩니다.
$$P(X = x) = \frac{\binom{K}{x}\binom{N-K}{n-x}}{\binom{N}{n}}$$
- $N$은 모집단의 크기
- $K$는 모집단에서 특정 특성을 가진 갯수
- $n$은 추출하는 표본의 크기
- $x$는 추출한 표본에서 특정 특성을 가진 갯수
- $\binom{a}{b}는 조합을 나타내며, a개 중에서 b개를 선택하는 경우$