Monte Carlo Simulation

무작위 반복으로 답을 찾는 계산 전략

Monte Carlo Simulation의 핵심 아이디어, 수학적 근거, 그리고 실무 활용을 다룬다. 난수 생성부터 적분 근사, 불확실성 추정까지 단계별로 설명한다.

Statistics
저자

Kwangmin Kim

공개

2026년 03월 26일

1 정의

정의: Monte Carlo Simulation

Monte Carlo Simulation은 확률 분포로부터 난수(random sample)를 반복 생성하여 해석적으로 풀기 어려운 수학적 양(기대값, 적분, 확률 등)을 통계적으로 근사하는 계산 방법이다.

핵심 원리는 대수의 법칙(Law of Large Numbers)이다. 독립적인 확률 변수 \(X_1, X_2, \ldots, X_N\) 이 동일한 분포를 따를 때,

\[ \bar{X}_N = \frac{1}{N} \sum_{i=1}^{N} X_i \xrightarrow{P} E[X] \quad \text{as } N \to \infty \]

즉, 표본 평균은 \(N\) 이 충분히 크면 모집단 기대값에 수렴한다.


2 개념 및 원리

2.1 한 줄 요약

“정확한 답을 구할 수 없을 때, 랜덤으로 많이 해보면 답에 가까워진다.”

수학에서 어떤 양을 구하려면 보통 공식을 유도하거나 적분을 푼다. 하지만 현실의 많은 문제는 닫힌 해(closed-form solution)가 존재하지 않거나, 차원이 너무 높아서 적분이 사실상 불가능하다. Monte Carlo는 이런 상황에서 “계산 대신 시뮬레이션”으로 접근한다.

2.2 비유: 빗방울로 웅덩이 넓이 재기

운동장에 불규칙한 모양의 웅덩이가 있다고 하자. 넓이를 정확히 재려면 적분이 필요하지만, 웅덩이 모양이 복잡해서 공식을 세울 수 없다.

대신 이렇게 할 수 있다:

  1. 운동장 전체에 비가 균일하게 내린다
  2. 전체 빗방울 중 웅덩이 안에 떨어진 비율을 센다
  3. 웅덩이 비율 \(\times\) 운동장 넓이 = 웅덩이 넓이

빗방울이 많을수록(시행 횟수 \(N\) 이 클수록) 추정값은 실제 넓이에 가까워진다. 이것이 Monte Carlo의 본질이다.

2.3 수학적 근거: 대수의 법칙

Monte Carlo가 작동하는 이유는 대수의 법칙(Law of Large Numbers)이다.

함수 \(g(X)\) 의 기대값 \(E[g(X)]\) 를 구하고 싶다고 하자. 분포 \(f(x)\) 에서 \(N\) 개의 표본 \(x_1, x_2, \ldots, x_N\) 을 추출하면:

\[ E[g(X)] = \int g(x) f(x) dx \approx \frac{1}{N} \sum_{i=1}^{N} g(x_i) \]

\(N \to \infty\) 일 때 좌변과 우변은 확률적으로 같아진다. 적분을 풀 수 없더라도 표본 평균으로 대체할 수 있다는 것이 핵심이다.

2.4 수렴 속도

Monte Carlo 추정량의 표준오차는 다음과 같다:

\[ SE = \frac{\sigma}{\sqrt{N}} \]

\(\sigma\)\(g(X)\) 의 표준편차이다. \(N\) 을 4배로 늘리면 오차가 반으로 줄어든다. 차원(dimension)에 의존하지 않는다는 점이 중요하다. 고차원 적분에서 격자(grid) 기반 수치적분은 차원이 늘어날수록 계산량이 기하급수적으로 증가하지만, Monte Carlo는 항상 \(O(1/\sqrt{N})\) 이다.


3 왜 필요한가

3.1 닫힌 해가 없는 문제

통계학에서 많은 양은 적분으로 정의된다. 예를 들어 베이지안 추론의 사후분포(posterior distribution)는 다음과 같다:

\[ p(\theta | \mathbf{x}) = \frac{p(\mathbf{x} | \theta) \cdot p(\theta)}{\int p(\mathbf{x} | \theta) \cdot p(\theta) \, d\theta} \]

분모의 적분(주변우도, marginal likelihood)은 모수 \(\theta\) 가 다차원이면 해석적으로 풀 수 없는 경우가 대부분이다. Monte Carlo(특히 MCMC)를 쓰면 이 적분을 계산하지 않고도 사후분포에서 표본을 추출할 수 있다.

3.2 고차원 문제

격자(grid) 기반 수치적분은 차원 \(d\) 가 커지면 평가 횟수가 \(O(K^d)\) 로 폭발한다 (차원의 저주). \(d = 10\) 이고 축당 100개 격자를 잡으면 \(100^{10} = 10^{20}\) 번 계산해야 한다. Monte Carlo는 차원에 관계없이 \(N\) 번의 표본 추출만으로 추정한다.

방법 계산 복잡도 차원 \(d\) 증가 시
격자 수치적분 \(O(K^d)\) 기하급수적 증가
Monte Carlo \(O(N)\) 영향 없음

4 응용 분야

분야 활용 핵심 아이디어
베이지안 통계 사후분포 추정 (MCMC) 사후분포에서 표본을 추출하여 기대값, 신용구간 계산
금융 옵션 가격 산정, 리스크 분석 (VaR) 가격 경로를 수만 번 시뮬레이션하여 분포 추정
A/B 테스트 Thompson Sampling, 검정력 분석 보상 분포에서 표본을 추출하여 최적 선택
물리 입자 거동, 통계역학 상태 공간에서 무작위 표본으로 물리량 근사
공학 신뢰성 분석, 불확실성 전파 입력 변수의 불확실성이 출력에 미치는 영향 추정
머신러닝 Dropout, 변분추론 (VI), 확률적 최적화 모델 불확실성 추정, 기대 손실 근사

5 예시: \(\pi\) 추정

가장 직관적인 Monte Carlo 예시는 원주율 \(\pi\) 를 추정하는 것이다.

한 변의 길이가 2인 정사각형 안에 반지름 1인 원을 그린다.

  • 정사각형 넓이: \(2 \times 2 = 4\)
  • 원 넓이: \(\pi r^2 = \pi\)

정사각형 안에 무작위로 점을 \(N\) 개 찍으면, 원 안에 들어간 비율은 \(\pi / 4\) 에 수렴한다.

\[ \hat{\pi} = 4 \times \frac{\text{원 안에 들어간 점 수}}{N} \]

수계산 예시 ( \(N = 10\) ):

점 번호 \(x\) \(y\) \(x^2 + y^2 \leq 1\) ? 원 안
1 0.3 0.5 0.34 O
2 0.9 0.8 1.45 X
3 -0.2 0.1 0.05 O
4 0.7 -0.7 0.98 O
5 -0.9 -0.4 0.97 O
6 0.1 0.95 0.91 O
7 -0.6 0.8 1.00 O
8 0.4 -0.9 0.97 O
9 -0.8 -0.7 1.13 X
10 0.5 0.3 0.34 O

원 안에 들어간 점: 8개 \(\to \hat{\pi} = 4 \times 8/10 = 3.2\)

\(N = 10\) 에서는 오차가 크지만, \(N = 100{,}000\) 이면 소수점 둘째 자리까지 정확해진다.


6 코드 예시

6.1 Step 1: 순수 Python (numpy)으로 구현

import numpy as np

def estimate_pi(N):
    """Monte Carlo로 pi를 추정한다."""
    # 정사각형 [-1, 1] x [-1, 1] 안에 균일 분포로 점 생성
    x = np.random.uniform(-1, 1, N)
    y = np.random.uniform(-1, 1, N)

    # 원 안에 들어간 점 수
    inside_circle = np.sum(x**2 + y**2 <= 1)

    # pi 추정
    pi_estimate = 4 * inside_circle / N
    return pi_estimate

# N이 커질수록 pi에 수렴
for N in [100, 1_000, 10_000, 100_000, 1_000_000]:
    pi_hat = estimate_pi(N)
    error = abs(pi_hat - np.pi)
    print(f"N={N:>10,}  pi_hat={pi_hat:.5f}  error={error:.5f}")
N=       100  pi_hat=3.12000  error=0.02159
N=     1,000  pi_hat=3.15200  error=0.01041
N=    10,000  pi_hat=3.14520  error=0.00361
N=   100,000  pi_hat=3.14059  error=0.00100
N= 1,000,000  pi_hat=3.14186  error=0.00027

\(N\) 이 10배 늘어날 때마다 오차가 약 \(1/\sqrt{10} \approx 0.316\) 배로 줄어드는 것을 확인할 수 있다.

6.2 Step 2: 적분 근사 — 일반적인 Monte Carlo

\(\pi\) 추정을 넘어, 임의의 함수에 대한 기대값을 Monte Carlo로 근사할 수 있다.

\[ I = \int_0^1 e^{x^2} dx \]

이 적분은 닫힌 해가 없다. Monte Carlo로 근사하면:

import numpy as np

def monte_carlo_integral(func, a, b, N):
    """[a, b] 구간에서 func의 적분을 Monte Carlo로 근사한다."""
    x = np.random.uniform(a, b, N)
    estimate = (b - a) * np.mean(func(x))
    se = (b - a) * np.std(func(x)) / np.sqrt(N)
    return estimate, se

# exp(x^2)의 [0, 1] 적분
f = lambda x: np.exp(x**2)
I_hat, se = monte_carlo_integral(f, 0, 1, N=1_000_000)
print(f"추정값: {I_hat:.5f} +/- {se:.5f}")
# 참값 약 1.46265

핵심 구조:

  1. 적분 구간에서 균일 분포로 \(N\) 개 표본 추출
  2. 각 표본에 함수를 적용하여 평균 계산
  3. 구간 길이를 곱하면 적분 근사값

7 Monte Carlo의 변형과 확장

Monte Carlo Simulation은 기본 개념이고, 이를 확장한 방법들이 다양하게 존재한다.

방법 핵심 아이디어 사용 시점
기본 Monte Carlo 균일 분포에서 표본 추출 → 평균 단순 적분 근사, \(\pi\) 추정
Importance Sampling 분산이 큰 영역에 더 많은 표본을 집중 희귀 사건(rare event) 확률 추정
MCMC 목표 분포에서 직접 표본 추출이 어려울 때 마르코프 체인으로 근사 베이지안 사후분포 추정
Bootstrap 관측 데이터를 복원추출하여 통계량의 분포 추정 신뢰구간, 표준오차 추정

MCMC(Markov Chain Monte Carlo)는 Monte Carlo의 가장 중요한 확장이다. 기본 Monte Carlo는 표본을 독립적으로 추출하지만, MCMC는 이전 표본에 의존하는 마르코프 체인을 구성하여 복잡한 분포에서도 표본을 추출할 수 있다. 베이지안 통계의 사실상 표준 도구이며, Metropolis-Hastings, Gibbs Sampling, Hamiltonian MC 등이 대표적인 알고리즘이다.


8 관련 주제

선행 지식:

후속 주제:

Subscribe

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