5회차실습 24110–145분

PM4Py로 모델 발견과 평가

실습 23의 직접 이어짐 그래프는 “막힘이 있는 업무와 없는 업무 중 하나”인지 “막힘과 개발이 동시에 진행”되는지를 구분하지 못했다. 프로세스 모델(process model)은 순서, 선택, 병행, 반복을 구분해 그린다. 그런데 로그에서 자동으로 만든 모델은 로그를 얼마나 잘 설명하고, 로그에 없는 순서를 얼마나 허용하는가. 이 실습은 프로세스 마이닝 라이브러리 PM4Py를 브라우저에서 실행해 모델을 발견하고, 적합도와 정밀도로 모델을 평가한다.

진행
설명 10분, 실습 25분
결과
잡음 기준별 모델 두 개의 적합도·정밀도 비교, 페트리넷·BPMN 그림
도구
PM4Py 2.7.23.8 (교안의 웹 실습실 또는 내 컴퓨터)

1PM4Py와 웹 실습실

PM4Py는 독일 프라운호퍼 응용정보기술연구소(Fraunhofer FIT)에서 개발을 시작한 오픈소스 프로세스 마이닝 라이브러리다. 라이선스는 AGPL-3.0이며, 이 실습은 2026-09-01에 나온 2.7.23.8을 쓴다. 아래 웹 실습실은 PM4Py를 이 브라우저 안에서 실행한다. 구성은 다음과 같다.

구성 요소역할받는 곳
Pyodide 314.0.7WebAssembly로 컴파일한 Python 3.14.2cdn.jsdelivr.net
numpy, pandas, scipy, networkx, lxml, matplotlib 등PM4Py가 쓰는 패키지. Pyodide용으로 컴파일된 판cdn.jsdelivr.net
graphviz 0.21, pm4py 2.7.23.8순수 Python 패키지pypi.org
Viz.js 3.30.0PM4Py가 만든 그림 정의(Graphviz DOT)를 SVG로 그린다cdn.jsdelivr.net

PM4Py는 설치할 때 cvxopt라는 최적화 패키지를 요구하지만 Pyodide용 cvxopt는 없다. 웹 실습실은 PM4Py를 의존성 없이(deps=False) 설치하며, 이 실습의 코드는 cvxopt 없이 돈다. 처음 불러올 때 수십 MB를 내려받으므로 30초에서 몇 분이 걸린다. 회사 네트워크가 jsdelivr나 PyPI를 막으면 불러오지 못하며, 그때는 화면에 미리 계산한 결과와 그림이 그대로 남는다.

내 컴퓨터에서 실행할 때는 같은 코드가 키트의 pm4py-notebook.py에 있다. # %% 줄로 셀이 나뉘어 있어 VS Code나 Jupyter에서 셀 단위로 실행할 수 있다.

python3 -m pip install pm4py==2.7.23.8
python3 github-pm-starter-kit/pm4py-notebook.py pm-lab/orbit-event-log-clean.csv

내 컴퓨터에서는 그림이 .dot 파일로 저장된다. Graphviz를 설치했으면 dot -Tsvg petri-net.dot -o petri-net.svg로 그린다.

2웹 실습실

“PM4Py 불러오기”를 누르고 준비되었다는 문구가 나오면 셀 [1]부터 차례로 “실행”을 누른다. 코드는 고쳐서 다시 실행할 수 있고, “원래 코드”를 누르면 되돌아간다. “데이터”에서 원본 로그나 내 CSV 파일(event-log.sh가 만든 형식)을 고르면 셀 [1]부터 그 파일로 다시 실행한다.

이 화면은 자바스크립트로 그린다.

3셀 [1]~[3]: 같은 로그, 같은 숫자

  • [1] 로그 읽기: format_dataframe은 열 이름을 XES 표준 이름(case:concept:name, concept:name, time:timestamp)으로 바꾼다. 시각은 +09:00을 떼고 한국 시각 그대로 읽는다. 업무 시간(평일 09~18시)을 한국 시각 기준으로 재기 위해서다.
  • [2] 변형: 변형 20개, 가장 많은 변형 125건(49%)으로 process-map.sh와 같다. 도구를 바꿔도 같은 숫자가 나오는지 확인하는 것이 첫 검산이다.
  • [3] 직접 이어짐 그래프: discover_performance_dfg에 business_hours=True와 평일 09~18시 구간을 주면 연결의 대기를 업무 시간으로 잰다. “변경 요청 → 리뷰 승인”은 달력 시간 중앙값이 23.8시간(실습 23)이지만 업무 시간으로는 8.0h다. 고치는 시간과 다시 리뷰를 기다린 시간이 대부분 밤을 넘겼다는 뜻이다.

4셀 [4]: 귀납적 마이너와 잡음 기준

귀납적 마이너(Inductive Miner)는 로그를 순서, 선택, 병행, 반복으로 나눌 수 있는지 차례로 시험하며 블록 구조 모델을 만든다. 잡음 기준(noise threshold)을 주면 드물게 나온 행동을 잡음으로 보고 버린다(2013년 리만스 Leemans 등이 발표한 IMf 방식). 결과는 프로세스 트리(process tree)로 적을 수 있다. 기호는 -> 순서, X 선택, + 병행, * 반복, tau 아무것도 하지 않는 단계다.

잡음 기준 0.0
->( '업무 생성', '작업 시작', X( tau, ->( '막힘', '막힘 해소' ) ),
    +( *( '업무 완료', tau ),
       X( tau, *( ->( '첫 커밋', X( tau, '결정 기록' ), 'PR 생성', X( tau, *( '변경 요청', tau ) ),
                    '리뷰 승인', 'PR 병합' ), '다시 열림' ) ) ) )

잡음 기준 0.2
->( '업무 생성', '작업 시작', X( tau, ->( '막힘', '막힘 해소' ) ), '첫 커밋', X( tau, '결정 기록' ),
    'PR 생성', X( tau, *( '변경 요청', tau ) ), '리뷰 승인', 'PR 병합', *( '업무 완료', tau ) )

위 트리는 같은 로그로 pm4py.discover_process_tree_inductive를 실행한 결과다. 셀 [4]의 출력과 함께 읽는다.

잡음 기준모델적합도정밀도읽는 법
0.0전이 24개. 업무 완료가 PR 갈래와 병행(+)으로 놓였다1.0000.724PR이 없는 QA 업무와 다시 열린 업무까지 모두 설명하려고 “업무 완료가 PR보다 먼저 와도 된다”는 순서까지 허용했다
0.2전이 19개. 처음부터 끝까지 한 줄의 순서0.9890.988QA 업무 23건과 다시 열린 업무 13건을 설명하지 않는 대신, 개발 업무의 절차를 그대로 보여 준다

적합도(fitness)는 모델이 로그의 사례를 얼마나 재현하는가, 정밀도(precision)는 모델이 로그에 없는 순서를 얼마나 적게 허용하는가다. 둘은 서로 당긴다. 모든 순서를 허용하는 모델은 적합도가 1.0이지만 절차로서 아무것도 말하지 않는다. 뷔스(J. C. A. M. Buijs) 등은 2012년에 여기에 일반화(generalization, 로그에 없던 새 사례도 설명하는가)와 단순성(simplicity, 모델이 작은가)을 더해 네 가지 품질 차원으로 정리했다.

잡음 기준 0.2 모델로 그린 페트리넷과 BPMN이 셀 [4] 아래에 있다. 페트리넷의 동그라미(장소, place)에 토큰이 있으면 그다음 네모(전이, transition)를 실행할 수 있고, 이름 없는 검은 네모는 tau다. BPMN은 같은 모델을 업무 담당자가 익숙한 순서도 기호로 바꾼 것이다. 그림이 가로로 길면 “원래 크기로 보기”를 누르고 옆으로 넘겨 읽는다.

5알고리즘 바꿔 보기

셀 [4]의 pm4py.discover_petri_net_inductive(log, noise_threshold=noise)를 pm4py.discover_petri_net_alpha(log) 또는 pm4py.discover_petri_net_heuristics(log)로 바꿔 실행한다. 반복문 없이 한 번만 실행하려면 for noise in (0.0,):로 줄인다. 같은 로그에서 미리 계산한 결과는 다음과 같다.

알고리즘발표전이적합도그대로 재현한 사례정밀도건전성(soundness)
알파 알고리즘2004120.7790%0.597아니다
휴리스틱 마이너2006190.97775.5%0.996아니다
귀납적 마이너, 잡음 0.22013190.98986.0%0.988그렇다

알파 알고리즘은 짧은 반복(“변경 요청 → 변경 요청”)과 건너뛰기(결정 기록이 있을 수도 없을 수도 있음)를 표현하지 못해 한 사례도 그대로 재현하지 못한다. 건전성은 모델이 시작에서 끝까지 막힘 없이 실행되고 끝난 뒤 토큰이 남지 않는 성질이며, pm4py.check_soundness(net, im, fm)로 확인한다. 건전하지 않은 모델은 정렬 같은 다음 분석의 입력으로 쓰기 어렵다.

팀에서 쓸 때

발견한 모델은 “팀이 일하는 방식의 요약”으로 쓴다. 회의에서 잡음 기준 0.2 모델의 BPMN을 보여 주고 “이 순서가 우리가 합의한 절차인가, 빠진 갈래(QA 업무, 다시 열림)를 절차에 넣을 것인가”를 묻는다. 합의한 절차는 로그와 비교할 기준 모델로 쓴다.

막히면
증상확인과 해결
“PM4Py를 불러오지 못했다”네트워크가 cdn.jsdelivr.net이나 pypi.org를 막았다. 교안을 GitHub Pages 주소나 로컬 웹 서버로 열었는지 확인하고, 안 되면 내 컴퓨터에서 pm4py-notebook.py를 실행한다
셀 실행 중 화면이 몇 초 멈춘다Python 코드가 브라우저의 화면 처리와 같은 흐름에서 돈다. 셀 [4]는 컴퓨터에 따라 수 초가 걸린다
NameError: name 'log' is not defined셀 [1]을 실행하지 않았다. 셀의 “실행”은 앞 셀부터 차례로 실행하므로 셀 [1]의 코드에 오류가 없는지 본다
내 CSV 파일에서 KeyError: 'timestamp'열 이름이 다르다. 첫 줄이 case_id,activity,timestamp,resource로 시작해야 한다
내 컴퓨터에서 pip install이 cvxopt 빌드에서 실패한다python3 -m pip install pm4py==2.7.23.8 --no-deps 뒤 python3 -m pip install pandas numpy scipy networkx lxml matplotlib graphviz tqdm pytz로 나눠 설치한다
  • 웹 실습실이나 내 컴퓨터에서 셀 [1]~[4]를 실행했다.
  • PM4Py의 변형 수와 가장 많은 변형의 건수가 process-map.sh와 같은지 확인했다.
  • “변경 요청 → 리뷰 승인”의 달력 시간과 업무 시간이 다른 이유를 설명할 수 있다.
  • 잡음 기준 0.0과 0.2 모델의 적합도·정밀도 차이를 설명할 수 있다.
  • 알고리즘 하나를 바꿔 실행하고 결과를 표와 비교했다.

마치며...

로그에서 자동으로 만든 모델은 하나가 아니다. 잡음 기준과 알고리즘에 따라 모든 사례를 설명하지만 무엇이든 허용하는 모델부터, 주된 절차만 정확히 보여 주는 모델까지 나온다. 적합도와 정밀도를 함께 보고 질문에 맞는 모델을 고르며, 모델은 시간을 말해 주지 않는다. 다음 실습에서는 업무가 단계마다 업무 시간으로 얼마나 기다렸는지 재서 병목을 찾는다.