8번 글에서 M/M/1을 한 번 돌렸더니 이론값 4.0 대신 4.05, 3.97처럼 흔들리는 값이 나왔다. 1부에서 못 박았듯, 시뮬레이션 결과는 정답이 아니라 표본이기 때문이다. 그렇다면 흔들리는 숫자 하나를 어떻게 믿을 만한 결론으로 바꿀까? 이 글은 시뮬레이션 출력을 통계적으로 다루는 output analysis를 다룬다. 어쩌면 시뮬레이션 방법론에서 가장 자주 무시되는, 그러나 가장 중요한 단계다.

핵심 원칙: 한 번 돌린 숫자를 보고하지 마라

가장 먼저 새겨야 할 원칙이다. 시뮬레이션을 한 번 실행해 나온 평균 대기시간 “5.2분”은 추정치 하나일 뿐, 그 자체로는 정밀도를 알 수 없다. 통계 실험에서 측정 한 번으로 결론 내지 않듯, 시뮬레이션 결과도 반복해서 신뢰구간으로 말해야 한다. 출력 분석은 결국 “이 추정치가 얼마나 정확한가”를 정량화하는 일이다.

먼저 시뮬레이션의 종류를 가른다

출력을 다루는 방식은 시뮬레이션의 성격에 따라 갈린다.

  • 종료형(terminating): 자연스러운 시작과 끝이 있다. 오전 9시에 문 열고 오후 5시에 닫는 은행, 하루치 생산 등. 관심사는 “그 유한한 기간의 거동”이며, 시작 조건(빈 상태)도 현실의 일부다.
  • 정상상태형(steady-state): 끝없이 돌아가는 시스템의 장기 평형이 관심사다. 24시간 가동 공장처럼. 종료 시점은 인위적으로 정해야 하고, 초기 조건의 영향을 걷어내야 한다.

이 구분이 중요한 이유는, 정상상태형에서만 등장하는 고유한 문제 — 초기 편향 — 때문이다.

초기 편향과 warm-up

정상상태를 추정할 때, 보통 시뮬레이션은 텅 빈 시스템에서 시작한다. 그런데 빈 시스템은 한동안 비현실적으로 한가하다. 큐가 채워지기까지 걸리는 이 초기 과도구간(warm-up period) 의 데이터를 그대로 평균에 넣으면, 추정치가 참값보다 작게 치우친다(initial bias).

해결책은 단순하다. 초기 구간을 잘라내고(deletion) 그 이후 데이터만으로 평균을 낸다. 어디까지 잘라낼지는 여러 번의 실행을 겹쳐 평균 곡선이 평평해지는 지점을 찾는 식으로 정한다(Welch의 방법이 대표적이다). 8번 글 끝에서 언급한 “시작 직후가 평균을 끌어내리는 문제”가 바로 이것이다.

반복(replication)과 신뢰구간

정확도를 정량화하는 가장 기본적이고 깔끔한 방법은 독립 반복이다. 서로 다른 seed로 시뮬레이션을 번 돌리면, 각 실행이 하나의 독립 표본 이 된다(예: 각 실행의 평균 대기시간). 그러면 표본평균 와 표본표준편차 로 신뢰구간을 만든다.

여기서 는 자유도 -분포 임계값이다. 이 구간이 좁을수록 추정이 정밀하다. 핵심은, 각 실행이 독립이어야 이 공식이 성립한다는 점이다. 그래서 실행마다 겹치지 않는 난수열을 쓰는 것이 중요하다(이 독립성 덕분에 신뢰구간의 통계 이론을 그대로 쓸 수 있다).

얼마나 많이/길게 돌려야 하나

신뢰구간의 절반 너비(half-width) 가 원하는 정밀도 이내가 될 때까지 반복 수 을 늘린다. 로 줄어드므로(이 또한 Monte Carlo과 같은 법칙이다), 정밀도를 2배로 높이려면 약 4배의 반복이 필요하다. 목표 정밀도를 먼저 정하고 거기에 맞춰 을 결정하는 것이 올바른 순서다.

정상상태의 특수 기법: batch means

정상상태형에서 독립 반복을 쓰면, 매 실행마다 warm-up을 버려야 해 낭비가 크다. 대안이 batch means다. 하나의 아주 긴 실행을 여러 개의 큰 배치로 나누고, 각 배치의 평균을 표본처럼 취급한다. warm-up을 한 번만 버리면 된다는 장점이 있다. 단, 인접한 배치는 서로 상관될 수 있으므로(앞 배치 끝의 혼잡이 다음 배치 앞에 이어짐), 배치를 충분히 크게 잡아 자기상관을 줄여야 신뢰구간이 타당해진다.

정리

  • 시뮬레이션 출력은 표본이다. 한 번 돌린 숫자가 아니라 신뢰구간으로 보고해야 한다.
  • 먼저 종료형 vs 정상상태형을 가른다. 정상상태형은 빈 시스템에서 시작하는 초기 편향이 있어, warm-up 구간을 잘라내야 한다.
  • 정확도는 독립 반복으로 정량화한다: . 정밀도를 2배로 높이려면 반복은 약 4배.
  • 정상상태형에서는 긴 실행을 나누는 batch means가 warm-up 낭비를 줄여 준다(단, 배치를 충분히 크게).

다음 글에서는 “이 모델과 코드를 애초에 믿어도 되는가”를 따지는 verification & validation을 다룬다.