Ch03 Components of Process Data

Page content

I. 개요

지난시간에 patients에 관한 데이터를 통해서 프로세스 분석에 대한 일반적인 개념을 접했다.

이번 포스트에서는 bupaR에 대한 이론적인 내용과 함께 간단하게 실습을 진행하도록 한다.

지난시간과 마찬가지로 먼저 데이터를 획득하는 것에서부터 출발한다.

library(bupaR)
library(eventdataR)
patients <- patients
dim(patients)
## [1] 5442    7

5442행과 7개의 열이 확인되었다.

class(patients)
## [1] "eventlog"   "tbl_df"     "tbl"        "data.frame"

II. 용어 정리

우선 용어 정리가 필요하다. Events, Event log, Activity 등등. 하나씩 살펴보자.

(1) Events

우선 Events에 관한 이해를 돕기 위해 아래 그림을 우선 살펴보자.

John이 X-Ray를 촬영하면 크게 3가지의 log가 남을 것이다. Scheduled, Started, Completed 이러한 3가지 활동을 통칭해서 Events라고 부른다.

(2) Event Log

시간대별로 이렇게 다양한 log가 남겨지는 것을 Event log라고 불리운다.

patients %>% 
  filter(patient == "1") %>% 
  select(patient, handling, registration_type, time, force_df = TRUE) %>% 
  head(10)
## # A tibble: 10 x 4
##    patient handling              registration_type time               
##    <chr>   <fct>                 <fct>             <dttm>             
##  1 1       Registration          start             2017-01-02 11:41:53
##  2 1       Triage and Assessment start             2017-01-02 12:40:20
##  3 1       Blood test            start             2017-01-05 08:59:04
##  4 1       MRI SCAN              start             2017-01-05 21:37:12
##  5 1       Discuss Results       start             2017-01-07 07:57:49
##  6 1       Check-out             start             2017-01-09 17:09:43
##  7 1       Registration          complete          2017-01-02 12:40:20
##  8 1       Triage and Assessment complete          2017-01-02 22:32:25
##  9 1       Blood test            complete          2017-01-05 14:34:27
## 10 1       MRI SCAN              complete          2017-01-06 01:54:23
  • 위 코드에서 중요한 것은 Select(~, force_df = TRUE)를 꼭 입력해줘야 data.frame 형태로 출력된다.

  • event log는 결과적으로 다음 Components로 구성되어 있다.

    • case id
    • activity label
    • activity instance id
    • timestamp
    • lifecycle status
    • resource

III. event log 데이터 생성

일반적인 데이터를 작성해서 event log를 생성해보자. 어려운 것은 아니나, 기본적으로 포함해야 할 데이터가 있기 에 확인차 작성을 해본다.

(1) 데이터 생성

아래 소스코드를 활용하여 가상의 데이터를 만든다. 그 이후 eventlog() 함수를 활용하여, 각 데이터에 맞게 매칭해서 Column명을 입력하기만 하면 된다.

# 가상 데이터 생성
eventData <- data.frame(
  id          = c("pat_1", "pat_1", "pat_1", "pat_2", "pat_2"),
  action      = c(10002, 10011, 10015, 10024, 10024), 
  action_type = c("Check-in", "Payment", "Check-in", "Payment", "Payment"), 
  date        = as.Date(c("2020-01-12", "2020-03-21", "2020-01-15", "2020-03-23", "2020-04-01")), 
  originator  = c("Assistant_1", "Manager_2", "Assistant_7", "Manager_2", "Manager_2"), 
  status      = c("start", "start", "start", "start", "complete")
)

# event log 데이터 생성
claims_log <- eventlog(
  eventData,
  case_id = "id",
  activity_id = "action_type",
  activity_instance_id = "action",
  lifecycle_id = "status",
  timestamp = "date",
  resource_id = "originator"
)

(2) 두 데이터 비교

만들어진 소스코드를 통해서 실제로 summary()를 통해 실제 구조를 비교해본다. 먼저 eventData를 확인해보자.

# eventData
summary(eventData)
##       id                action      action_type             date           
##  Length:5           Min.   :10002   Length:5           Min.   :2020-01-12  
##  Class :character   1st Qu.:10011   Class :character   1st Qu.:2020-01-15  
##  Mode  :character   Median :10015   Mode  :character   Median :2020-03-21  
##                     Mean   :10015                      Mean   :2020-02-25  
##                     3rd Qu.:10024                      3rd Qu.:2020-03-23  
##                     Max.   :10024                      Max.   :2020-04-01  
##   originator           status         
##  Length:5           Length:5          
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       

매우 익숙한 구조가 나온 것을 확인할 수 있다. 이번에는 eventlog 데이터를 확인해보자.

# eventData
summary(claims_log)
## Number of events:  5
## Number of cases:  2
## Number of traces:  2
## Number of distinct activities:  2
## Average trace length:  2.5
## 
## Start eventlog:  2020-01-12
## End eventlog:  2020-04-01
##       id               action            action_type      date           
##  Length:5           Length:5           Check-in:2    Min.   :2020-01-12  
##  Class :character   Class :character   Payment :3    1st Qu.:2020-01-15  
##  Mode  :character   Mode  :character                 Median :2020-03-21  
##                                                      Mean   :2020-02-25  
##                                                      3rd Qu.:2020-03-23  
##                                                      Max.   :2020-04-01  
##        originator      status      .order 
##  Assistant_1:1    complete:1   Min.   :1  
##  Assistant_7:1    start   :4   1st Qu.:2  
##  Manager_2  :3                 Median :3  
##                                Mean   :3  
##                                3rd Qu.:4  
##                                Max.   :5

데이터의 구조가 달라진 것을 확인할 수 있다.

(3) Activity Label 확인

간단하게 바뀌어진 eventlog 데이터의 activity label이 바뀌어졌는지 확인해본다.

activity_labels(claims_log)
## [1] Check-in Payment 
## Levels: Check-in Payment

정상적으로 출력이 되었다면, 실제로 변환된 eventlog데이터를 가지고 본격적인 분석을 진행할 수 있다.

IV. Reference

R on notast. “Process Mining (Part 1/3): Introduction to BupaR Package.” R, 7 Mar. 2019, www.r-bloggers.com/process-mining-part-1-3-introduction-to-bupar-package/.

Aalst, W.m.p. Van Der, and A.j.m.m. Weijters. “Process Mining: a Research Agenda.” Computers in Industry, vol. 53, no. 3, 2004, pp. 231–244., doi:10.1016/j.compind.2003.10.001.