프로세스의 병목구간 시뮬레이션(Identification of Bottlenecks in Passenger Handling Processes Using Data-Driven Tools)
유형: 논문 · 저자: 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가지 숫자만 정한다
- 서버 수 (처리 자원 수)
- 예: 체크인 카운터 5개, 보안 검색대 3개
- 평균 처리 시간
- 예: 체크인 1명당 2분, 보안 검색 1명당 1.5분
- 분산 또는 변동성
- 예: 어떤 승객은 1분, 어떤 승객은 3분
Step 3. 도착 흐름을 확률 이벤트로 만든다 (Monte Carlo)
- 1분 단위 또는 30초 단위로 시간 분해
- 각 시간 단위마다 “이번 분에 승객이 들어오는가?”를 확률로 결정
- 예시
- 평균 도착률이 분당 3명이면
- 실제 구현 시에는 0~5명 정도로 확률적으로 입력되도록
- 병목은 평균이 아니라 변동성 때문에 생기기 때문
Step 4. 이산 사건 시뮬레이션을 시간표로 돌린다
- 시간 t에서
- 도착 이벤트 발생
- 처리 가능한 서버가 있으면 바로 처리
- 없으면 대기열에 적재
- 시간 t+Δt로 이동
- 반복
| 현재 시간 | 도착 승객 수 | 체크인 대기열 길이 | 체크인 처리 중 인원 | 보안 대기열 길이 |
|---|---|---|---|---|
| 08:00 | ||||
| 08:01 | ||||
| 08:02 | ||||
| …. |
Step 5. 병목 정의
- 처리 용량 < 유입량 + 변동성이 지속되는 지점
- 평균 대기 시간
- 이 단계에서 사람들이 얼마나 오래 머무는가
- 대기열의 누적 증가 여부
- 시간이 지나도 줄이 줄지 않는가
Step 6. 자원을 가정 변경으로 조정
- 예시 (시뮬레이션 입력값만 바꿔서 다시 돌림)
- 체크인 카운터 +1
- 보안 검색대 +1
- 처리 시간 10% 감소
결과
- 체크인 카운터와 보안 검색 구간이 처리 병목을 유발하는 핵심 단계로 도출됨.
- 보안 검색기 추가 및 자원 재배치 시 평균 대기 시간이 유의하게 감소하는 것으로 나타남
실행 지침
- 단계가 너무 많아지지 않도록 주의할 것 (3~6단계)
- 데이터 정확도에 집착하지 말 것 (1차는 추정치로 돌려도 됨 → 병목 위치부터 확인)
- 병목을 해결했다고 착각하지 말 것
0) 준비
- 분석 대상 프로세스 1개를 고른다
- 예: 리드 → 컨택 → 미팅 → 제안서 → 계약
- 예: 콘텐츠 제작 → 검수 → 업로드
- 예: 고객문의 → 1차 응대 → 2차 처리 → 종료
- 시간 단위를 고른다(권장: 10분 또는 1시간)
- 리드/세일즈/운영은 보통 1시간, 고객문의/CS는 10분 단위가 관리하기 쉽다
- 관측 기간을 고른다(권장: 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)
- 각 단계 i에 대해 시간 t마다 아래 열을 둔다
5) 병목 판정
- 병목 기준(3개 중 2개만 만족해도 병목)
- 대기열이 연속 증가
- 예: 3시간 연속 backlog가 증가
- 상류 단계는 backlog가 없는데 해당 단계만 backlog 증가
- 해당 단계의 가동률이 지속적으로 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 이상인데 대기열까지 증가하면 거의 확정 병목