* 이 글은 PM4Py version 2.2.7.1을 기준으로 작성되었습니다. 이 글은 파이썬에 대한 기본 지식 및 프로세스 마이닝의 기본 용어에 대한 지식이 있다는 가정 하에 진행됩니다.
대부분의 PM4Py 포스팅이 2019년에 작성되었고, 2년이라는 시간 동안 PM4Py의 버전이 1이나 올라버렸다. 그래서 PM4Py 버전 2에 맞는 포스팅들을 다시 하나하나 작성하려고 한다. (PM4Py 설치는 다음 포스팅을 참고한다.)
이번 포스팅에서는 PM4Py를 사용해서 프로세스마이닝 분석을 하려면 어떤 흐름으로 분석을 진행해야 하는지에 대해 간략하게 알아보고자 한다. 각 기능들에 대한 세부 포스팅은 차후에 진행하겠다.
Library 및 모듈 import
import statistics
import pm4py
import matplotlib.pyplot as plt
from pm4py.objects.log.importer.xes import importer
from pm4py.objects.conversion.log.converter import to_data_frame
from pm4py.algo.filtering.pandas.attributes import attributes_filter
from pm4py.statistics.traces.log import case_statistics
from pm4py.objects.log.util import interval_lifecycle
from pm4py.statistics.traces.log import case_arrival
from pm4py.statistics.sojourn_time.log import get as soj_time_get
from pm4py.visualization.graphs import visualizer as graphs_visualizer
from pm4py.util import constants
from pm4py.algo.filtering.log.timestamp import timestamp_filter
from pm4py.algo.filtering.log.end_activities import end_activities_filter
from pm4py.algo.filtering.log.start_activities import start_activities_filter
from pm4py.algo.discovery.alpha import algorithm as alpha_miner
from pm4py.algo.discovery.inductive import algorithm as inductive_miner
from pm4py.algo.discovery.dfg import algorithm as dfg_discovery
from pm4py.visualization.dfg import visualizer as dfg_visualization
from pm4py.visualization.petri_net import visualizer as pn_visualizer
from pm4py.visualization.decisiontree import visualizer as tree_visualizer
from pm4py.algo.decision_mining import algorithm as decision_mining
Data Import
이 튜토리얼에서는 프로세스 마이닝에서 가장 기본적인 예시 데이터인 repairExample 파일을 사용한다. 해당 데이터는 전화기 수리 프로세스를 나타낸 데이터이다. 아래 데이터를 다운 받으면 된다.
1. 데이터를 import한다.
# 원하는 데이터를 import한다.
log = importer.apply('repairExample.xes')
# 데이터의 확인을 위해 이벤트 로그를 print해본다.
# print the first trace of the event log
print(log[0])
# print the first event of the first trace
print(log[0][0])
아래와 같은 결과가 나오면 성공이다.
2. 이벤트 로그를 데이터프레임 형태로 바꾸어 데이터를 확인해본다.
# convert event log into dataframe
df = to_data_frame.apply(log)
df.head()
EDA
본격적인 프로세스 마이닝 분석 전에 우리의 이벤트 로그 데이터를 탐색해본다.
Activity & Resource Analysis
이 단계에서는 이벤트 로그의 액티비티와 resource 분포를 분석한다. 여기에서 좀 더 나아가 가장 빈도가 높은 작업(액티비티)이 무엇인지, 가장 일을 많이 하는 작업자(resource)가 누구인지 등을 도출할 수 있지만 tutorial이기 때문에 해당 심층 분석은 추후 포스팅에서 진행한다.
1. activity와 resource 목록을 도출한다.
# activity 목록 도출
activities = attributes_filter.get_attribute_values(df, attribute_key="concept:name")
# resource 목록 도출
resources = attributes_filter.get_attribute_values(df, attribute_key="org:resource")
2. activity의 목록을 print해본다.
print(activities)
3. activity와 resource를 bar chart로 표현해본다.
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(25,10))
ax = ax.ravel()
ax[0].bar(x=list(activities.keys()), height=list(activities.values()))
ax[0].set_title("Activity Distribution", fontsize=20)
ax[1].bar(x=list(resources.keys()), height=list(resources.values()))
ax[1].set_title("Resource Distribution", fontsize=20)
Start & End Activities
이 단계에서는 시작 작업과 종료 작업의 분포에 대해 분석한다. 위의 Activity &Resource Analysis와 마찬가지로 심층적인분석(어떤 작업으로 종료된 케이스가 가장 많은지 등)이 가능하지만, 이 포스팅에서는 생략한다.
1. start activity와 end activity의 목록을 도출한다.
start_activities = start_activities_filter.get_start_activities(log)
end_activities = end_activities_filter.get_end_activities(log)
2. start activity와 end activity의 분포를 bar chart로 표현해본다.
Filtering
프로세스 마이닝 분석에서 필요하지 않은 데이터를 제거하는 필터링은 필수적이다. 이 단계에서는 프로세스 마이닝의 필터링을 진행해본다. (작업시간 / 시작시각 등 다양한 필터링 기준이 존재하지만, 튜토리얼이기 때문에 종료 작업으로 하는 필터링만을 진행한다.)
# 기존 이벤트 로그의 종료 액티비티 목록
print(end_activities)
# 필터링
filtered_log = end_activities_filter.apply(log, ["Repair (Complex)"], parameters={'positive':False})
filtered_end_activities = end_activities_filter.get_end_activities(filtered_log)
# 필터링된 이벤트 로그의 종료 액티비티 목록
print(filtered_end_activities)
Process Discovery
이번 단계에서는 이벤트 로그를 기반으로 프로세스 모델을 도출하는 process discovery와 함께 이 모델을 visualization한다. 가장 많이 쓰이는 process discovery 알고리즘 중 하나인 inductive miner를 이용해 프로세스 모델을 도출한다.
# process discovery
net_in, im_in, fm_in = inductive_miner.apply(filtered_log)
# process model visualization
gviz_in = pn_visualizer.apply(net_in, im_in, fm_in)
pn_visualizer.view(gviz_in)
이번 포스팅에서는 PM4Py의 기능들을 간략하게 사용해보면서 PM4Py를 활용한 전반적인 프로세스 마이닝 분석 흐름에 대해 간략하게 알아보았다. 다음 PM4Py 포스팅부터는 PM4Py version 2의 각 기능들에 대해 좀 더 세세하게 알아보겠다.
최근댓글