이산균등 분포 (Discrete Uniform Distribution)

Casella & Berger Ch.3.2 — 정의, 적률, MGF, 최대 엔트로피, 순서통계량, 실무 응용

이산균등 분포는 유한 집합의 모든 원소에 동일한 확률을 부여하는 가장 단순한 이산 분포이다. PMF, CDF, 적률, MGF를 수학적으로 도출하고, 최대 엔트로피 성질, 연속균등 분포와의 관계, 해싱, 암호학, 무작위 배정 등 실무 응용을 체계적으로 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 03월 28일

1 이산균등 분포란 무엇인가

이산균등 분포(Discrete Uniform Distribution)는 유한 집합의 모든 원소에 동일한 확률 질량을 부여하는 분포이다. 주사위를 굴릴 때 1부터 6까지 각 눈이 나올 확률이 정확히 \(1/6\) 인 상황이 전형적인 예이다.

“동일 확률”이라는 조건은 단순해 보이지만, 이 분포는 확률론과 통계학의 여러 핵심 개념과 연결된다:

  • 고전적 확률: 라플라스의 “동등하게 가능한 결과(equally likely outcomes)” 정의가 바로 이산균등 분포의 가정이다
  • 최대 엔트로피: 유한 표본공간에서 아무런 사전 정보가 없을 때, 엔트로피를 최대화하는 분포가 이산균등 분포이다
  • 순열과 조합: 비복원 추출에서 모든 순서가 동등하다는 가정은 이산균등 분포에 기반한다
  • 난수 생성: 컴퓨터에서 정수 난수를 생성할 때의 기초 분포이다

2 정의

정의: 이산균등 분포

확률변수 \(X\) 가 이산균등 \((1, N)\) 분포를 따르면, 확률질량함수(PMF)는 다음과 같다:

\[ P(X = x \mid N) = \frac{1}{N}, \quad x = 1, 2, \ldots, N \]

\(N\) 은 지정된 양의 정수이며, 모든 결과에 동일한 확률 질량 \(1/N\) 을 할당한다 (Casella & Berger, 2002, Ch.3).

직관: PMF \(\frac{1}{N}\) 이 왜 이 형태인가

\(N\) 개의 결과가 있고 어떤 결과도 다른 결과보다 더 가능하다는 근거가 없다. 확률의 합이 1이어야 하므로, 각 결과에 동일하게 \(\frac{1}{N}\) 을 배분하는 것이 유일한 해이다.

이 분포를 “기준선”으로 생각할 수 있다: 아무 정보가 없을 때 불확실성을 최대화하는 분포이다. 어떤 결과를 더 가능하게 만드는 정보가 생기면, 그 정보로 균등 분포에서 벗어나는 것이 합리적이다.

주사위 \((N=6)\): 각 눈이 \(1/6\) 로 공정하다. 만약 PMF가 균등하지 않다면(예: \(P(X=6) = 2/6\)) 이미 “편향된 주사위”라는 추가 정보가 있는 것이다. 어떤 결과를 특별 취급하려면 그 근거가 필요하다.

정규화 확인: \(\sum_{x=1}^{N} P(X = x) = \sum_{x=1}^{N} \frac{1}{N} = N \cdot \frac{1}{N} = 1\) . 당연하지만, 이 확인은 PMF가 유효한 확률 분포임을 보장한다.

2.1 일반화: 임의의 정수 구간

표준 형태 \(\{1, 2, \ldots, N\}\) 뿐만 아니라, 임의의 정수 구간 \(\{N_0, N_0+1, \ldots, N_1\}\) 으로 일반화할 수 있다:

\[ P(X = x \mid N_0, N_1) = \frac{1}{N_1 - N_0 + 1}, \quad x = N_0, N_0+1, \ldots, N_1 \]

원소의 개수 \(n = N_1 - N_0 + 1\) 이 분포를 결정한다. 예를 들어 \(\{-3, -2, -1, 0, 1, 2, 3\}\) 위의 이산균등 분포는 \(N_0 = -3\) , \(N_1 = 3\) , \(n = 7\) 이다.

이하에서는 표기의 간결함을 위해 \(\{1, 2, \ldots, N\}\) 형태를 기본으로 사용하되, 일반화된 결과도 함께 제시한다.


3 누적분포함수 (CDF)

\[ F(x) = P(X \leq x) = \begin{cases} 0 & \text{if } x < 1 \\[4pt] \dfrac{\lfloor x \rfloor}{N} & \text{if } 1 \leq x \leq N \\[4pt] 1 & \text{if } x > N \end{cases} \]

여기서 \(\lfloor x \rfloor\) 는 바닥 함수(floor function)이다. CDF는 각 정수점에서 \(1/N\) 만큼 점프하는 계단함수(step function)이다. 연속균등 분포의 CDF가 직선인 것과 대비하면, 이산 버전은 “계단으로 올라가는 직선”으로 이해할 수 있다.


4 평균과 분산

4.1 기대값 유도

등차급수 항등식을 활용한다. 수학적 귀납법으로 증명 가능한 항등식:

\[ \sum_{i=1}^{k} i = \frac{k(k+1)}{2} \]

이를 적용하면:

\[ E[X] = \sum_{x=1}^{N} x \cdot \frac{1}{N} = \frac{1}{N} \sum_{x=1}^{N} x = \frac{1}{N} \cdot \frac{N(N+1)}{2} = \frac{N+1}{2} \]

직관: 기대값이 \(1\)\(N\) 의 정확한 산술 평균이다. 대칭적인 분포이므로 무게중심이 중앙에 놓이는 것은 자연스럽다. 주사위 \((N=6)\) 의 경우 \(E[X] = 3.5\) 로, 어떤 눈과도 정확히 일치하지 않는 값이다 — 기대값은 반드시 실현 가능한 값일 필요가 없다.

4.2 이차 적률 유도

두 번째 항등식을 사용한다:

\[ \sum_{i=1}^{k} i^2 = \frac{k(k+1)(2k+1)}{6} \]

\[ E[X^2] = \sum_{x=1}^{N} x^2 \cdot \frac{1}{N} = \frac{1}{N} \cdot \frac{N(N+1)(2N+1)}{6} = \frac{(N+1)(2N+1)}{6} \]

4.3 분산

\[ \begin{aligned} \text{Var}(X) &= E[X^2] - (E[X])^2 \\[6pt] &= \frac{(N+1)(2N+1)}{6} - \left(\frac{N+1}{2}\right)^2 \\[6pt] &= \frac{(N+1)}{6}\left[(2N+1) - \frac{3(N+1)}{2}\right] \\[6pt] &= \frac{(N+1)}{6} \cdot \frac{2(2N+1) - 3(N+1)}{2} \\[6pt] &= \frac{(N+1)}{6} \cdot \frac{N-1}{2} \\[6pt] &= \frac{(N+1)(N-1)}{12} = \frac{N^2 - 1}{12} \end{aligned} \]

해석: \(N = 1\) 이면 \(\text{Var}(X) = 0\) (결과가 하나뿐이므로 불확실성 없음), \(N\) 이 커지면 분산은 대략 \(N^2/12\) 으로 증가한다. 주사위 \((N=6)\) 의 분산은 \(35/12 \approx 2.917\) 이다.

직관: 분산 \(\frac{N^2-1}{12}\) 이 왜 이 형태인가

\(N\) 이 크면 선택지가 많아져 불확실성이 커진다 → 분산 증가. \(N = 1\) 이면 결과가 하나뿐이라 확실하다 → 분산 = 0. 이 두 경계조건을 만족하는 가장 단순한 함수가 \(N^2/12\) 형태이다.

분모 12는 이산 세계와 연속 세계 모두에서 나타난다: 연속균등 \(\text{Uniform}(0, 1)\) 의 분산도 \(1/12\) 이다. 이산에서 연속으로 극한을 취하면 \((N^2-1)/12N^2 \to 1/12\) 로 수렴하여 두 세계가 같은 구조를 공유함을 확인할 수 있다.

반사실: \(N = 6\) 대신 \(N = 12\) 인 12면체 주사위라면 \(\text{Var}(X) = 143/12 \approx 11.9\) 로, 6면체보다 약 4배 불확실하다. 선택지가 2배 늘었는데 분산은 4배 수준으로 증가하는 이유는 \(N^2\) 에 비례하는 구조 때문이다.

4.4 일반화된 구간 \(\{N_0, \ldots, N_1\}\) 에서의 적률

\(n = N_1 - N_0 + 1\) 로 놓으면:

\[ E[X] = \frac{N_0 + N_1}{2}, \qquad \text{Var}(X) = \frac{n^2 - 1}{12} \]

일반화 공식은 \(\text{Uniform}(1, n)\)\(N_0\) 만큼 이동(shift)한 것으로 이해할 수 있다. 이동은 평균만 바꾸고 분산은 변하지 않는다.


5 적률생성함수 (MGF)

\[ M_X(t) = E[e^{tX}] = \sum_{x=1}^{N} e^{tx} \cdot \frac{1}{N} = \frac{1}{N} \sum_{x=1}^{N} e^{tx} \]

등비급수 공식 \(\sum_{x=1}^{N} r^x = r \cdot \frac{1 - r^N}{1 - r}\) (단, \(r \neq 1\) )를 \(r = e^t\) 에 적용하면:

\[ M_X(t) = \frac{e^t(1 - e^{Nt})}{N(1 - e^t)} = \frac{e^t - e^{(N+1)t}}{N(1 - e^t)}, \quad t \neq 0 \]

\(t = 0\) 일 때는 \(M_X(0) = 1\) 이다.

직관: MGF \(\frac{e^t - e^{(N+1)t}}{N(1-e^t)}\) 의 의미

\(M_X(t) = E[e^{tX}]\) 는 확률변수의 지수 변환의 기대값이다. 이산균등 분포에서는 \(N\) 개의 동일한 가중치 \(1/N\) 으로 \(e^{t}, e^{2t}, \ldots, e^{Nt}\) 를 평균한 값이다:

\[\frac{1}{N}(e^t + e^{2t} + \cdots + e^{Nt}) = \frac{1}{N} \cdot e^t \cdot \frac{1 - e^{Nt}}{1 - e^t}\]

분자 \(e^t - e^{(N+1)t}\): 위 등비급수를 닫힌 형태로 표현한 것. 분모 \(N(1-e^t)\): \(N\) 개의 동일 가중치와 등비급수 공비 \((1-e^t)\) 의 결합이다.

\(t = 0\) 에서 \(0/0\) 형태가 되는 것은 정상이다. 로피탈 법칙을 적용하면 \(E[X] = (N+1)/2\) 가 복원된다. “모든 결과를 \(t=0\) 에서 동등하게 평균하면 산술 평균”이라는 당연한 결과이다.

MGF를 왜 쓰는가: 이 복잡한 표현을 미분하면 모든 적률이 자동으로 나온다. 직접 합산 계산보다 대수적으로 다루기 쉬운 경우가 많다.

5.1 MGF에서 평균 복원

\(t \to 0\) 에서 분자와 분모가 모두 0이 되므로 로피탈 법칙을 적용한다:

\[ M_X'(0) = \lim_{t \to 0} \frac{d}{dt}\left[\frac{e^t - e^{(N+1)t}}{N(1 - e^t)}\right] \]

직접 계산하면 \(M_X'(0) = (N+1)/2 = E[X]\) 가 복원된다. 이는 MGF의 \(k\) 차 도함수가 \(k\) 차 적률을 생성한다는 일반 성질의 구체적 확인이다.


6 최대 엔트로피 성질

이산균등 분포는 정보 이론적으로 특별한 지위를 갖는다.

정리: 유한 표본공간에서의 최대 엔트로피

크기 \(N\) 인 유한 표본공간 \(\{1, 2, \ldots, N\}\) 위의 모든 확률 분포 중에서, 섀넌 엔트로피(Shannon entropy)를 최대화하는 분포는 이산균등 분포이다.

6.1 증명

임의의 PMF \(p_1, p_2, \ldots, p_N\) ( \(p_x \geq 0\) , \(\sum p_x = 1\) )에 대해 섀넌 엔트로피는:

\[ H(X) = -\sum_{x=1}^{N} p_x \log p_x \]

라그랑주 승수법으로 \(\sum p_x = 1\) 제약 하에서 \(H\) 를 최대화한다:

\[ \mathcal{L} = -\sum_{x=1}^{N} p_x \log p_x - \lambda\left(\sum_{x=1}^{N} p_x - 1\right) \]

\[ \frac{\partial \mathcal{L}}{\partial p_x} = -\log p_x - 1 - \lambda = 0 \implies p_x = e^{-(1+\lambda)} = \text{상수} \]

\(\sum p_x = 1\) 에서 \(p_x = 1/N\) 이 유일한 해이다. \(\square\)

최대 엔트로피 값: \(H_{\max} = \log N\) (자연 로그 사용 시 \(\ln N\) 나트(nat), 밑 2 사용 시 \(\log_2 N\) 비트(bit)).

해석: 엔트로피는 “불확실성” 또는 “정보량”을 측정한다. 균등 분포가 엔트로피를 최대화한다는 것은, 어떤 결과가 더 가능성이 높은지 전혀 모르는 상태가 가장 큰 불확실성을 나타낸다는 뜻이다. 따라서 사전 정보가 없을 때 이산균등 분포를 가정하는 것은 정보 이론적으로 가장 보수적인(least biased) 선택이다.

실무 연결: 최대 엔트로피 원리

Jaynes의 최대 엔트로피 원리(MaxEnt principle)는 “알려진 제약만 반영하고, 그 외에는 최대한 불확실하게 모형화하라”는 추론 규칙이다. 유한 집합에서 아무 제약도 없으면 균등 분포가 MaxEnt 해이고, 평균에 대한 제약이 추가되면 기하 분포(이산) 또는 지수 분포(연속)가 MaxEnt 해가 된다. 이 원리는 베이지안 통계에서 무정보 사전분포(uninformative prior)를 정당화하는 근거 중 하나이다.


7 연속균등 분포와의 관계

이산균등 분포 \(\text{Uniform}(1, N)\)\(N \to \infty\) 에서 적절히 정규화하면 연속균등 분포로 수렴한다.

\(X_N \sim \text{Uniform}(1, N)\) 에 대해 \(Y_N = X_N / N\) 으로 정의하면:

\[ P\left(Y_N \leq y\right) = P\left(X_N \leq Ny\right) = \frac{\lfloor Ny \rfloor}{N} \to y \quad (N \to \infty) \]

이는 \(\text{Uniform}(0, 1)\) 의 CDF이다. 직관적으로, 격자점 \(\{1/N, 2/N, \ldots, 1\}\) 위의 이산균등이 격자가 조밀해지면서 연속균등으로 수렴한다.

7.1 적률의 수렴

적률 이산 \(\text{Uniform}(1, N)\) \(Y_N = X_N/N\) \(N \to \infty\) 극한 연속 \(\text{Uniform}(0, 1)\)
평균 \((N+1)/2\) \((N+1)/(2N)\) \(1/2\) \(1/2\)
분산 \((N^2-1)/12\) \((N^2-1)/(12N^2)\) \(1/12\) \(1/12\)

두 분포의 분모에 공통적으로 나타나는 12는 우연이 아니다. 이산과 연속 세계에서 동일한 적분(합산) 구조가 작동하기 때문이다.


8 순서통계량

\(X_1, X_2, \ldots, X_n \overset{\text{iid}}{\sim} \text{Uniform}(1, N)\) 의 순서통계량은 비복원 추출 및 순위 기반 분석과 직결된다.

8.1 최댓값의 분포

최댓값 \(X_{(n)} = \max(X_1, \ldots, X_n)\) 의 PMF:

\[ P(X_{(n)} = k) = P(X_{(n)} \leq k) - P(X_{(n)} \leq k-1) = \left(\frac{k}{N}\right)^n - \left(\frac{k-1}{N}\right)^n \]

\(k = 1, 2, \ldots, N\) 에 대해 성립한다. 각 관측값이 독립이므로 \(P(X_{(n)} \leq k) = P(X_1 \leq k)^n = (k/N)^n\) 이다.

생일 문제와의 연결: \(N = 365\) 일 중 \(n\) 명의 생일이 모두 다를 확률은 이산균등 분포의 순서통계량과 관련된다. \(n\) 명 중 가장 늦은 생일이 특정 날 이전인 확률이 아니라, 충돌(같은 값) 확률을 구하는 문제이지만, 기초 분포는 이산균등이다.

8.2 기대 최댓값

\(E[X_{(n)}]\) 은 다음과 같다:

\[ E[X_{(n)}] = \sum_{k=1}^{N} k \left[\left(\frac{k}{N}\right)^n - \left(\frac{k-1}{N}\right)^n\right] \]

\(n\)\(N\) 이 모두 클 때, 연속 근사를 적용하면 \(E[X_{(n)}] \approx \frac{n}{n+1} N\) 이 된다. 이 결과는 \(\text{Uniform}(0, \theta)\) 에서 MLE \(\hat{\theta} = X_{(n)}\) 의 기대값 \(E[\hat{\theta}] = n\theta/(n+1)\) 과 정확히 대응한다.


9 응용 분야

분야 활용 구체적 예시
무작위 배정 실험 설계 A/B 테스트에서 사용자를 \(K\) 개 그룹에 균등 배정
암호학 키 생성 키 공간 \(\{0, 1, \ldots, 2^{256}-1\}\) 에서 균등 추출
해시 함수 충돌 분석 이상적인 해시 함수는 출력이 이산균등 분포
부트스트랩 재표본 추출 \(n\) 개 관측값에서 복원 추출 시 각 인덱스가 \(\text{Uniform}(1, n)\)
게임 이론 혼합 전략 순수 전략 \(N\) 개에 균등 확률 배정 (완전 혼합 전략)
로드 밸런싱 라운드 로빈 \(N\) 대 서버에 요청을 순환 배분
품질 관리 표본 추출 로트에서 검사 대상 제품을 무작위로 선정

9.1 해시 함수와 생일 역설

이상적인 해시 함수 \(h\)\(M\) 개의 가능한 출력값에 대해 이산균등 분포를 따른다고 가정하면, \(n\) 개의 서로 다른 입력이 모두 다른 해시값을 가질 확률은:

\[ P(\text{충돌 없음}) = \prod_{i=0}^{n-1} \frac{M - i}{M} = \prod_{i=0}^{n-1}\left(1 - \frac{i}{M}\right) \]

\(n\) 이 작고 \(M\) 이 클 때 근사하면:

\[ P(\text{충돌 없음}) \approx e^{-n(n-1)/(2M)} \]

충돌 확률이 50%를 넘는 데 필요한 입력 수는 대략 \(n \approx \sqrt{M}\) 이다. 이것이 생일 역설(birthday paradox)이며, 해시 함수의 출력 크기 설계에 직접 영향을 준다. 예를 들어 128비트 해시에서 \(M = 2^{128}\) 이면, 약 \(2^{64}\) 개의 입력으로 충돌이 발생할 수 있다.

균등성 가정의 중요성

위 분석은 해시 출력이 이산균등 분포를 따른다는 가정에 의존한다. 실제 해시 함수가 이 가정을 만족하지 못하면 충돌률이 예측보다 높아진다. 암호학적 해시 함수(SHA-256 등)의 설계 목표 중 하나가 바로 이 균등성이다.


10 코드 예시

10.1 Step 1: 순수 Python 구현 (원리 이해)

import math

# ----- 이산균등 분포 기본 성질 -----
N = 6  # 공정한 주사위

# PMF
pmf = 1.0 / N
print(f"PMF: P(X = x) = {pmf:.4f} for x = 1, ..., {N}")

# 기대값과 분산 (공식)
mean = (N + 1) / 2
var = (N**2 - 1) / 12
print(f"E[X] = {mean:.4f}")
print(f"Var(X) = {var:.4f}")

# 기대값과 분산 (정의에서 직접 계산)
mean_direct = sum(x * (1/N) for x in range(1, N+1))
var_direct = sum((x - mean)**2 * (1/N) for x in range(1, N+1))
print(f"E[X] (직접) = {mean_direct:.4f}")
print(f"Var(X) (직접) = {var_direct:.4f}")

# ----- MGF 계산 -----
def mgf(t, N):
    if abs(t) < 1e-12:
        return 1.0
    return (math.exp(t) - math.exp((N+1)*t)) / (N * (1 - math.exp(t)))

# MGF에서 평균 수치적 확인 (수치 미분)
h = 1e-8
mgf_deriv = (mgf(h, N) - mgf(-h, N)) / (2 * h)
print(f"\nMGF'(0) ≈ {mgf_deriv:.6f} (이론값: {mean:.6f})")

# ----- 엔트로피 -----
entropy = math.log(N)  # 나트 단위
entropy_bits = math.log2(N)  # 비트 단위
print(f"\n엔트로피 = {entropy:.4f} nats = {entropy_bits:.4f} bits")
print(f"주사위 결과를 인코딩하려면 최소 {entropy_bits:.2f} 비트 필요")

# ----- 생일 문제 -----
def birthday_no_collision(n, M):
    """n명이 M일 중 모두 다른 생일을 가질 확률"""
    prob = 1.0
    for i in range(n):
        prob *= (M - i) / M
    return prob

M = 365
print(f"\n생일 문제 (M={M}):")
for n in [10, 23, 30, 50, 70]:
    p_no = birthday_no_collision(n, M)
    print(f"  n={n:2d}: P(충돌 없음) = {p_no:.4f}, P(충돌) = {1-p_no:.4f}")

10.2 Step 2: scipy/numpy 구현 (실무 활용)

import numpy as np
from scipy import stats

# ----- scipy에서의 이산균등 분포 -----
# stats.randint(low, high)는 {low, low+1, ..., high-1}을 지원
N = 6
dist = stats.randint(1, N + 1)  # {1, 2, 3, 4, 5, 6}

print(f"E[X] = {dist.mean():.4f}")
print(f"Var(X) = {dist.var():.4f}")
print(f"P(X <= 3) = {dist.cdf(3):.4f}")  # 3/6 = 0.5

# PMF 확인
for x in range(1, N + 1):
    print(f"  P(X={x}) = {dist.pmf(x):.4f}")
# ----- 순서통계량 시뮬레이션 -----
import numpy as np

np.random.seed(42)
N = 100
n_sample = 10
n_sim = 100000

# n개의 Uniform(1, N) 표본에서 최댓값 추출 반복
maxima = np.array([
    np.random.randint(1, N + 1, size=n_sample).max()
    for _ in range(n_sim)
])

theoretical_mean_max = n_sample / (n_sample + 1) * N  # 연속 근사
print(f"최댓값의 표본 평균: {maxima.mean():.2f}")
print(f"연속 근사 이론값: {theoretical_mean_max:.2f}")
print(f"최댓값의 표본 표준편차: {maxima.std():.2f}")
# ----- 해시 충돌 시뮬레이션 -----
import numpy as np

def simulate_birthday(M, n_trials=10000):
    """M개의 슬롯에서 첫 충돌까지의 삽입 수를 시뮬레이션"""
    counts = []
    for _ in range(n_trials):
        seen = set()
        for k in range(1, M + 2):
            val = np.random.randint(0, M)
            if val in seen:
                counts.append(k)
                break
            seen.add(val)
    return np.array(counts)

M = 365
collision_counts = simulate_birthday(M, n_trials=50000)
theoretical_50pct = np.sqrt(2 * M * np.log(2))  # ≈ 22.5

print(f"해시 슬롯 수 M = {M}")
print(f"첫 충돌까지 평균 삽입 수: {collision_counts.mean():.1f}")
print(f"첫 충돌까지 중앙값 삽입 수: {np.median(collision_counts):.1f}")
print(f"이론적 50% 충돌 지점: {theoretical_50pct:.1f}")

10.3 R 코드

# R에서의 이산균등 분포
N <- 6

# 기본 통계량
mean_val <- (N + 1) / 2
var_val <- (N^2 - 1) / 12
cat("E[X] =", mean_val, "\n")
cat("Var(X) =", var_val, "\n")

# sample()로 이산균등 난수 생성
set.seed(42)
samples <- sample(1:N, size = 10000, replace = TRUE)
cat("표본 평균:", mean(samples), "(이론값:", mean_val, ")\n")
cat("표본 분산:", var(samples), "(이론값:", var_val, ")\n")

# 빈도 확인 — 각 값이 약 1/N 비율로 등장하는지
freq <- table(samples) / length(samples)
print(freq)

# 생일 문제
pbirthday(23, classes = 365)  # R 내장 함수
# P(최소 2명이 같은 생일) ≈ 0.5073

11 주사위 공정성 검정: 카이제곱 적합도 검정

이산균등 분포의 중요한 실무 응용 중 하나는 관측된 빈도가 기대 빈도(균등)와 일치하는지 검정하는 것이다.

적합도 검정의 아이디어

주사위를 \(n\) 번 굴려 각 눈의 빈도 \(O_1, O_2, \ldots, O_6\) 을 관측했다면, 공정한 주사위의 기대 빈도는 \(E_i = n/6\) 이다. 카이제곱 통계량:

\[ \chi^2 = \sum_{i=1}^{6} \frac{(O_i - E_i)^2}{E_i} \]

이 값이 크면 균등 가설을 기각한다. 검정 통계량은 근사적으로 \(\chi^2(5)\) 분포를 따른다 (자유도 = \(N - 1\) ).

from scipy import stats
import numpy as np

# 주사위 공정성 검정
np.random.seed(42)
n_rolls = 600

# 공정한 주사위 시뮬레이션
fair_rolls = np.random.randint(1, 7, size=n_rolls)
observed = np.bincount(fair_rolls, minlength=7)[1:]  # 1~6 빈도
expected = np.full(6, n_rolls / 6)

chi2_stat, p_value = stats.chisquare(observed, expected)
print(f"공정한 주사위: chi2 = {chi2_stat:.3f}, p = {p_value:.4f}")

# 편향된 주사위: 6이 2배 많이 나옴
biased_probs = [1/7, 1/7, 1/7, 1/7, 1/7, 2/7]
biased_rolls = np.random.choice(range(1, 7), size=n_rolls, p=biased_probs)
observed_biased = np.bincount(biased_rolls, minlength=7)[1:]

chi2_biased, p_biased = stats.chisquare(observed_biased, expected)
print(f"편향된 주사위: chi2 = {chi2_biased:.3f}, p = {p_biased:.4f}")

12 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

Enjoy this blog? Get notified of new posts by email: