728x90

* 이 글은 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 파일을 사용한다. 해당 데이터는 전화기 수리 프로세스를 나타낸 데이터이다. 아래 데이터를 다운 받으면 된다.

repairExample.xes
3.24MB

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])

아래와 같은 결과가 나오면 성공이다.

데이터 import 결과

 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)

도출된 bar chart. test repair 작업이 가장 많이 일어났고 System이 가장 많은 작업을 했음을 알 수 있다.

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로 표현해본다.

도출된 bar chart. 모든 케이스가 register 작업으로 시작되었고, archive repair 작업으로 종료된 케이스가 가장 많음을 알 수 있다.

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)

필터링 결과. filtered_log에서 Repair (Complex)로 종료된 케이스가 필터링된 것을 확인할 수 있다.

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)

Inductive miner로 도출된 프로세스 모델 (페트리넷)

 

 이번 포스팅에서는 PM4Py의 기능들을 간략하게 사용해보면서 PM4Py를 활용한 전반적인 프로세스 마이닝 분석 흐름에 대해 간략하게 알아보았다. 다음 PM4Py 포스팅부터는 PM4Py version 2의 각 기능들에 대해 좀 더 세세하게 알아보겠다. 

300x250
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기