Время прочтения: 4 мин.

Допустим, у нас уже есть файл (csv) журнала (лога) событий активностей пользователей в интернет-магазине. Воспользуемся пакетом readr для загрузки лога событий из данного файла и методом  activities_to_eventlog из bupaR для преобразования:

library(readr)
library(bupaR)

df <- readr::read_csv('./gift4iaia_log_file.csv',locale=locale(encoding = 'cp1251'))
events <- bupaR::activities_to_eventlog(
  df,
  case_id = 'UserID',
  activity_id = 'Activity',
  resource_id = 'User_name',
  timestamps = c('StartTime', 'CompleteTime')
)

Теперь выведем сопоставление между идентификаторами событий и полями данных лога.

mapping(events)
Case identifier:                UserID 
Activity identifier:            Activity 
Resource identifier:            User_name 
Activity instance identifier:   activity_instance_id 
Timestamp:                      timestamp 
Lifecycle transition:           lifecycle_id 

Выведем количество действий из лога событий.

n_activities(events)
[1] 4

Посмотрим сводные данные (метод summary):

events %>% 
     summary
Number of events:  26
Number of cases:  4
Number of traces:  3
Number of distinct activities:  4
Average trace length:  6.5

Start eventlog: 2021-12-01 19:52:01
End eventlog:  2021-12-03 20:48:51

UserID                              Activity                                     User_name
Length:26                         Авторизация             :8            Виннипух:8  
Class :character                Оплата товара           :4            Кролик  :4  
Mode  :character              Оформление заказа       :6       Пятачок :6  
                                         Поиск товаров в каталоге:8    Сова    :8  
                                                                                                              
 activity_instance_id       lifecycle_id                 timestamp                                     .order    
 Length:26                       CompleteTime:13       Min.   :2021-12-01 19:52:01        Min.   : 1.00 
 Class :character              StartTime   :13            1st Qu.:2021-12-01 20:34:53       1st Qu.: 7.25 
 Mode  :character                                                 Median :2021-12-01 21:16:51     Median :13.50   
                                                                             Mean   :2021-12-02 09:53:00      Mean   :13.50
                                                                             3rd Qu.:2021-12-02 21:51:53      3rd Qu.:19.75   
                                                                             Max.   :2021-12-03 20:48:51       Max.   :26.00 

Построим диаграмму частот действий на основе лога событий. Для этого воспользуемся функцией activity_frequency с параметром «activity», которая формирует свод по каждой активности (количество/частота) и на основе данного свода генерируем саму диаграмму (метод plot()).

library(ggplot2)
events %>% 
  activity_frequency(level = "activity") %>%
  plot() 

Теперь построим карту процесса. Для этого нам понадобится метод process_map. В данном примере в качестве значения type используется функция frequency с параметром «relative_case» для отображения частоты в процентах (по умолчанию без задания параметров для process_map будут отображаться абсолютные величины)

events %>%
  process_map(type = frequency("relative_case")) 

По полученному графу видим, что 75%  поиска товаров в каталоге завершилось оформлением заказа и 50% — оплатой товара.

            Построим карту процесса в плане производительности. Здесь используем в process_map функцию performance, определяемую двумя аргументами — это статистическая функция, применимая ко времени обработки (среднее — mean, медиана — median и т.д.), а так же единица времени (дни — «days», часы —«hours» , минуты —«mins» и т.д.).

events %>%
  process_map(performance(mean, "mins"))

В данном случае мы можем оценить этапы процесса по длительности. Например, этап поиска товаров занимает в среднем 22.82 минуты, а оформление 18.48 минут.

            Теперь воспользуемся функцией фильтра filter_trim, которая обрезает для анализа лог событий, таким образом, что последовательность действий начинается с активности (активностей) start_activities и заканчивается активностью (активностями) end_activities. Построим карту процесса для последовательностей действий начинающихся с поиска товаров в каталоге и завершающихся оплатой товара.

events %>%
  filter_trim(start_activities = "Поиск товаров в каталоге", end_activities="Оплата товара")%>%
  process_map(performance(mean, "mins"))

Из полученного графа видим, что для покупателей, завершивших этап оплаты товара среднее время поиска товаров в каталоге существенно выше, чем для всех пользователей.

            Так же в построении карты процесса существует возможность комбинировать вышеперечисленные подходы. Для этого в функции process_map необходимо задать параметры типов узлов и ребер графа процесса (type_nodes, type_edges).

events %>%
  process_map(type_nodes=performance(mean, "mins"), type_edges = frequency("relative_case"))

BupaR даёт возможность рассмотреть бизнес-процесс под самыми разными углами. В сочетании с простотой освоения, кастомизацией (в частности, в построении карты процесса), широким набором полезных функций, и, конечно, огромными возможностями языка R, ориентированного на анализ данных и работу со статистикой, использование данного пакета видится отличным решением в проекте по анализу бизнес-процессов.