A Smart Rabbit
이현승의 개인 홈페이지[자기소개]

프로세스의 병목구간 시뮬레이션(Identification of Bottlenecks in Passenger Handling Processes Using Data-Driven Tools)

작성 2026.01.13분류 레퍼런스주제 C. 전략·시장

원문
사이트
mdpi.com
저장한 날
2026.01.13

유형: 논문 · 저자: Edina Jenčová, Tatiana Gajdušková, Martin Jezný · 출처: · 별점: ⭐️⭐️⭐️


개요

  • 공항 승객 처리 프로세스의 병목구간을 데이터 기반 시뮬레이션/대기이론 모델로 분석
  • 공항 승객 처리 흐름에서 어디서 병목이 생기는지를 찾아내려는 연구
    • 자원 배치를 바꾸면 대기 시간이 어떻게 달라지는지를 분석
  • 기존 연구는 디지털 트윈이나 고급 모델 사용
    • 이 논문은 Excel 기반 시뮬레이션으로도 병목 식별이 가능함 보여줌

연구 내용

시뮬레이션

  • Discrete Event Simulation (이산 사건 시뮬레이션)
    • 여러 처리 단계에서 승객이 도착하고 이동하는 과정을 시간의 흐름에 따라 하나씩 처리하는 시뮬레이션
    • “도착 → 체크인 → 보안 → 탑승” 등 과정 하나하나를 시간 순서대로 재연해 보는 모델
  • Queueing model (대기행렬 모델)
    • 승객이 줄을 서서 기다리고 처리되는 모든 과정은 일종의 대기행렬로 볼 수 있다.
    • 예시
      • 체크인 창구: 5개, 한 명 처리에 2분
      • 보안 검색: 3개, 한 명 처리에 1.5분
      • 승객이 100명 도착 → 체크인 창구가 처리 속도보다 느리면 줄이 늘어남
  • Excel 기반 시뮬레이션
    • 예시
      • 열
        • A열: 시간
        • B열: 체크인 대기열 길이
        • C열: 보안 검색 대기열 길이
        • D열: 처리된 승객 누적
      • 행 단위로 시간 축적
        • 08:00: 10명 도착
        • 08:02: 체크인 처리 5명 완료
        • 08:02: 대기열이 5 → 15로 증가
  • Monte Carlo 요소 승객 도착 및 처리 시간을 확률적으로 생성

진행 내용

Step 1. 승객 처리 프로세스를 단계로 쪼갠다

  • Stage 1: 도착 (Arrival)
  • Stage 2: 체크인 (Check-in)
  • Stage 3: 보안 검색 (Security check)
  • Stage 4: 다음 단계로 이동 (출국 심사 또는 탑승)

Step 2. 각 단계에 대해 3가지 숫자만 정한다

  1. 서버 수 (처리 자원 수)
    • 예: 체크인 카운터 5개, 보안 검색대 3개
  2. 평균 처리 시간
    • 예: 체크인 1명당 2분, 보안 검색 1명당 1.5분
  3. 분산 또는 변동성
    • 예: 어떤 승객은 1분, 어떤 승객은 3분

Step 3. 도착 흐름을 확률 이벤트로 만든다 (Monte Carlo)

  • 1분 단위 또는 30초 단위로 시간 분해
  • 각 시간 단위마다 “이번 분에 승객이 들어오는가?”를 확률로 결정
  • 예시
    • 평균 도착률이 분당 3명이면
    • 실제 구현 시에는 0~5명 정도로 확률적으로 입력되도록
    • 병목은 평균이 아니라 변동성 때문에 생기기 때문

Step 4. 이산 사건 시뮬레이션을 시간표로 돌린다

  • 시간 t에서
    1. 도착 이벤트 발생
    2. 처리 가능한 서버가 있으면 바로 처리
    3. 없으면 대기열에 적재
  • 시간 t+Δt로 이동
  • 반복
현재 시간 도착 승객 수 체크인 대기열 길이 체크인 처리 중 인원 보안 대기열 길이
08:00
08:01
08:02
….

Step 5. 병목 정의

  • 처리 용량 < 유입량 + 변동성이 지속되는 지점
  1. 평균 대기 시간
    • 이 단계에서 사람들이 얼마나 오래 머무는가
  2. 대기열의 누적 증가 여부
    • 시간이 지나도 줄이 줄지 않는가

Step 6. 자원을 가정 변경으로 조정

  • 예시 (시뮬레이션 입력값만 바꿔서 다시 돌림)
    • 체크인 카운터 +1
    • 보안 검색대 +1
    • 처리 시간 10% 감소

결과

  • 체크인 카운터와 보안 검색 구간이 처리 병목을 유발하는 핵심 단계로 도출됨.
  • 보안 검색기 추가 및 자원 재배치 시 평균 대기 시간이 유의하게 감소하는 것으로 나타남

실행 지침

  1. 단계가 너무 많아지지 않도록 주의할 것 (3~6단계)
  2. 데이터 정확도에 집착하지 말 것 (1차는 추정치로 돌려도 됨 → 병목 위치부터 확인)
  3. 병목을 해결했다고 착각하지 말 것

0) 준비

  1. 분석 대상 프로세스 1개를 고른다
    • 예: 리드 → 컨택 → 미팅 → 제안서 → 계약
    • 예: 콘텐츠 제작 → 검수 → 업로드
    • 예: 고객문의 → 1차 응대 → 2차 처리 → 종료
  2. 시간 단위를 고른다(권장: 10분 또는 1시간)
    • 리드/세일즈/운영은 보통 1시간, 고객문의/CS는 10분 단위가 관리하기 쉽다
  3. 관측 기간을 고른다(권장: 5일 또는 2주)
    • 짧게 만들고 반복 개선하는 게 ROI가 높다

1) 프로세스 쪼개기

  • 규칙
    • 단계 수를 늘리지 말 것(많을수록 병목이 흐려짐)
    • 대기가 생길 수 있는 지점만 단계로 잡을 것
  • 예시(세일즈)
    • S1: 신규 리드 유입
    • S2: 1차 컨택 시도(메일/콜)
    • S3: 미팅 세팅
    • S4: 제안서/조건 협의
    • S5: 계약/결제

2) 단계 마다 아래 3개 작성

A. 서버 수(처리 자원 수)

  • 사람 수, 좌석 수, 승인 가능한 담당자 수 등
  • 예: BD 1명, 운영자 2명, 승인자 1명

B. 평균 처리 시간(1건 처리에 걸리는 시간)

  • 예: 컨택 1건 6분, 미팅 조율 15분, 제안서 45분

C. 변동성(처리시간이 흔들리는 정도)

  • 정확한 표준편차 몰라도 됨
  • “빠른 경우/보통/느린 경우” 추정으로 충분
    • 예: 제안서 20분(빠름) / 45분(보통) / 120분(느림)

3) 시간 단위별로 유입량 만들기

  • 예시: 1시간 단위라면
    • 10:00–11:00 유입 8건
    • 11:00–12:00 유입 3건
  • “평균 유입”을 계산하고 변동성을 추가(몬테카를로)
    • “평균 5건/시간”이면 실제 입력은 2, 4, 7, 6, 1…

4) 시뮬레이션 로직 만들기

  • 각 시간 t마다, 각 단계에서 “처리 가능한 양”과 “들어온 양(이전 대기 + 신규 유입)”을 비교
  • 남는 건 대기열(backlog)로 넘긴다
  • 엑셀에서 구현
    • 각 단계 i에 대해 시간 t마다 아래 열을 둔다
      • Backlog_start(i,t) : 시간 시작 시 대기열
      • Arrivals(i,t) : 해당 시간에 새로 들어온 양(첫 단계는 외부 유입, 그 외는 이전 단계 완료량)
      • Capacity(i,t) : 해당 시간에 처리 가능한 최대량
        • 계산: (서버 수 × 시간 단위 길이) / 평균 처리시간
        • 예: 서버 2명, 60분 단위, 평균 처리 15분 → 용량 = 2×60/15 = 8건/시간
      • Completed(i,t) : 실제 처리 완료량
        • MIN(Backlog_start + Arrivals, Capacity)
      • Backlog_end(i,t) : 시간 종료 시 대기열
        • Backlog_start + Arrivals − Completed
    • 연결 규칙
      • Arrivals(i+1,t) = Completed(i,t)

5) 병목 판정

  • 병목 기준(3개 중 2개만 만족해도 병목)
    1. 대기열이 연속 증가
      • 예: 3시간 연속 backlog가 증가
    2. 상류 단계는 backlog가 없는데 해당 단계만 backlog 증가
    3. 해당 단계의 가동률이 지속적으로 90% 이상
      • 가동률 = Completed / Capacity
      • 90% 이상이 길게 유지되면 변동성 때문에 쉽게 폭주함

6) 가정 바꾸고 다시 돌리기

A. 자원 추가/이동

  • 서버 수 +1
  • 혹은 다른 단계에서 서버를 빼서 병목 단계로 이동

B. 처리시간 단축(표준화/템플릿/자동화)

  • 평균 처리시간 10% 감소 가정

C. 유입 평준화(슬롯팅/예약/마감)

  • 피크 시간 유입을 다른 시간대로 분산

엑셀 템플릿

1) 시트 구성

  • Params 시트: 입력값(자원/시간/도착률/처리시간)
  • Sim 시트: 시간 전개 시뮬레이션(대기열이 쌓이는지 관찰)

2) Params 시트 만들기 (정확히 이대로)

A구역: 공통 파라미터

A1: 항목

B1: 값

A2: Δt(분)

B2: 5

A3: 시뮬레이션 시간(분)

B3: 240 (4시간 예시)

A4: 총 스텝 수

B4: =B3/B2

B구역: Stage 1(체크인)

D1: Stage1(체크인)

D2: 서버 수 E2: 5

D3: 평균 처리시간(분/명) E3: 2

D4: 처리시간 변동(±분) E4: 1

C구역: Stage 2(보안검색)

G1: Stage2(보안)

G2: 서버 수 H2: 3

G3: 평균 처리시간(분/명) H3: 1.5

G4: 처리시간 변동(±분) H4: 0.5

D구역: Arrival(도착)

J1: 도착(Arrival)

J2: 평균 도착(명/Δt) K2: 4

J3: 도착 변동(±명) K3: 3

3) Sim 시트 만들기 (열 설계 + 수식)

3-1) 헤더 작성

Sim!A1부터 아래 헤더를 쓴다

A1 Step

B1 Time(min)

C1 Arrivals

D1 Q1_start

E1 Cap1

F1 Done1

G1 Q1_end

H1 Arrive2

I1 Q2_start

J1 Cap2

K1 Done2

L1 Q2_end

M1 WIP_total

3-2) 첫 행(2행) 값

A2 (Step)

=1

B2 (Time)

=0

C2 (Arrivals: 외부 유입을 변동성 있게 생성)

=MAX(0, Params!K2 + RANDBETWEEN(-Params!K3, Params!K3))

D2 (Q1_start)

=0

E2 (Cap1: 이번 Δt 동안 체크인이 처리할 수 있는 최대 인원)

처리시간을 랜덤으로 흔들어 “서비스 시간 변동”을 반영한다

=Params!E2 * Params!B2 / MAX(0.1, Params!E3 + (RAND()*2-1)*Params!E4)

설명

  • 서버 수 * Δt / (랜덤 처리시간)
  • 랜덤 처리시간은 평균 ± 변동 범위에서 흔들림

F2 (Done1)

=MIN(D2 + C2, E2)

G2 (Q1_end)

=D2 + C2 - F2

H2 (Arrive2: 2단계로 넘어간 양)

=F2

I2 (Q2_start)

=0

J2 (Cap2)

=Params!H2 * Params!B2 / MAX(0.1, Params!H3 + (RAND()*2-1)*Params!H4)

K2 (Done2)

=MIN(I2 + H2, J2)

L2 (Q2_end)

=I2 + H2 - K2

M2 (WIP_total: 시스템 내 대기 총량)

=G2 + L2

3-3) 3행부터 끝까지(반복 행) 수식

A3

=A2+1

B3

=B2 + Params!B2

C3

=MAX(0, Params!K2 + RANDBETWEEN(-Params!K3, Params!K3))

D3 (Q1_start는 직전 Q1_end)

=G2

E3

=Params!E2 * Params!B2 / MAX(0.1, Params!E3 + (RAND()*2-1)*Params!E4)

F3

=MIN(D3 + C3, E3)

G3

=D3 + C3 - F3

H3

=F3

I3 (Q2_start는 직전 Q2_end)

=L2

J3

=Params!H2 * Params!B2 / MAX(0.1, Params!H3 + (RAND()*2-1)*Params!H4)

K3

=MIN(I3 + H3, J3)

L3

=I3 + H3 - K3

M3

=G3 + L3

4) 병목 판정

4-1) 병목 후보 1: 대기열이 계속 증가하는 단계

Q1_end(G열) 또는 Q2_end(L열)가 시간 지나며 계속 커지면 그 단계가 병목

더 확실하게 보려면 “증가 횟수”를 센다

Sim!N1 Q1_increase

Sim!N2

=IF(G2>G1,1,0)

단, G1이 헤더라서 첫 행은 제외해야 하므로 N3부터 쓰는 게 낫다

Sim!N3

=IF(G3>G2,1,0)

끝까지 복사 후 합계

Sim!N50 같은 곳에

=SUM(N3:N49)

Q1 증가 횟수가 높으면 Stage1이 구조적 병목 가능성이 큼

Stage2도 동일하게 O열로 L을 비교

4-2) 병목 후보 2: 가동률이 90% 이상으로 붙어있다

Sim!P1 Util1

P2

=IF(E2=0,0,F2/E2)

Sim!Q1 Util2

Q2

=IF(J2=0,0,K2/J2)

가동률이 계속 0.9 이상인데 대기열까지 증가하면 거의 확정 병목


A Smart Rabbit|GitHub|LinkedIn|RSS