728x90

 이번 포스팅에서는 PM4Py로 Token-based replay Confromance Checking을 하는 방법에 대해 알아보겠다.

*Token-based replay conformance checking이 무엇인지 모른다면 다음 포스팅을 참고하도록 한다.

2019/07/29 - [Process Mining - Theory/Conformance Checking] - Token-based Replay Conformance Checking이란?

 

Token-based Replay Conformance Checking이란?

Token-based Replay Conformance Checking이란 말 그대로 토큰을 이용하여 이를 프로세스 모델에 replay하면서 모델의 conformance를 checking하는 것을 말한다. 이번 포스팅에서는 token-based conformance check..

process-mining.tistory.com

1. 우선, 분석할 XES 파일을 import하여 이를 log에 저장하고, Conformance Checking을 원하는 모델을 net에 저장해준다. 필자는 inductive miner를 선택했다.

import os
from pm4py.objects.log.importer.xes import factory as xes_importer
from pm4py.algo.discovery.inductive import factory as inductive_miner

log = xes_importer.import_log(os.path.join("input_data","running-example.xes")) #join 안에 원하는 파일의 경로

net, initial_marking, final_marking = inductive_miner.apply(log) #원하는 모델을 선택한다.

2. 해당 log와 net에 대해서 token based replay를 적용시킨다.

from pm4py.algo.conformance.tokenreplay import factory as token_replay

replay_result = token_replay.apply(log, net, initial_marking, final_marking)

3. 결과값을 보기 위해 다음 코드를 입력해준다.

for i in replay_result:
    print(i)

4. 다음과 같은 결과가 나오면 성공이다.

{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, examine thoroughly, check ticket, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 10, 'remaining_tokens': 0, 'produced_tokens': 10}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, check ticket, examine casually, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine thoroughly, check ticket, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, check ticket, examine casually, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 14, 'remaining_tokens': 0, 'produced_tokens': 14}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, check ticket, examine thoroughly, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}

이 결과값이 무엇을 뜻하는지 하나하나 살펴보겠다. 우선, 각 줄은 하나의 trace에 해당한다.

  • trace_is_fit: 해당 trace가 model에 fit했는지를 표시한다. True이면 fitting, False이면 non-fitting이다.
  • trace_fitness: 해당 trace가 model에 대해 가지는 token-based replay conformance checking 결과 fitness 값이다.
  • activated_transitions: replay 동안 activate된 트랜지션의 목록이다.
  • reached_marking: replay 마지막의 marking이다.
  • enabled_transitions_in_marking: 마지막 marking에서 enable된 트랜지션의 목록이다.

5. 각 trace에 대한 fitness 값이 아닌 전체의 fitness 값을 보고 싶으면 다음 코드를 입력한다.

from pm4py.evaluation.replay_fitness import factory as replay_fitness_factory

log_fitness = replay_fitness_factory.evaluate(replay_result, variant="token_replay")
print(log_fitness)

 

6. 다음과 같은 결과값이 나오면 성공이다.

{'percFitTraces': 100.0, 'averageFitness': 1.0}

각 결과값은 다음과 같은 의미를 가지고 있다.

  • percFitTraces: 모델에 대해 perfectly fitting하는 trace의 비율
  • averageFitness: 전체 이벤트 로그의 평균 fitness 값

 

 이번 포스팅에서는 pm4py를 이용하여 token-based replay conformance checking을 하는 법에 대해 알아보았다. 몇몇 툴들이 conformance checking은 다루지 않는 경우가 있는데, 그럴 때 pm4py를 이용하여 모델의 성능을 판단할 수 있을 것이다.

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