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

Как при помощи графов провести анализ процесса и найти в нем изъяны?

Полный код, а также вспомогательные материалы размещены на github1 странице. Как и всегда работу начинаем с импорта необходимых библиотек:

Библиотеки numpy, pandas и datetime необходимы для работы с данными, библиотека graphviz для отрисовки графов.

Для примера возьмем данные с сайта2 соревнований по анализу бизнес-процессов. Данные представляют собой информацию по процессу выдачи кредита от одной из европейских финансовых организаций. Данные на сайте соревнования представлены в xes формате. Пример того, как перевести данные из xes формата в табличный вид можно найти на github3 странице.

Загрузим необходимые данные:

Для построения графа процесса необходимы 3 основных столбца:

  • идентификатор клиента;
  • наименование события процесса;
  • временная метка о начале исполнения события.

В нашем примере это case_name, concept:name, time:timestamp.

Далее необходимо найти последовательность событий от начала до конца процесса (т.е. пары событий с момента подачи заявки на кредит до момента выдачи кредита) для каждого из клиентов, а также потраченное время при переходах между событиями.

Функция shift_event_column находит последовательность и связность событий в процессе, за счет операции сдвига столбца событий. Важно отметить, что данная операция должна выполняться в разрезе одного клиента, в противном случае первое событие второго клиента перейдет в конец событий первого клиента. Таким образом получаем новый столбец, последнее значение которого заполняем как («Конец лога»):

Также для дальнейшей обработки создадим новый столбец, который объединяет два названия событий, разделенные знаком «à» в одну строку.

Далее повторяем действия сдвига, только для столбца с временной меткой начала исполнения события, функция shift_time_column:

После сдвига находим время, затраченное на выполнение события, как разность столбцов со сдвигом и без, последнее значение для каждого из клиентов заполняем 0. На вход функции shift_event_column подаем название переменной с нашей таблицей (в нашем примере data), название столбца с идентификаторами клиентов, название столбца с наименованиями событий и название столбца с временными метками. Для функции shift_time_column указываем имя переменной, с результатом функции shift_event_column, название столбца с идентификаторами клиентов и название столбца с временными метками.

По завершении обработки данных получаем таблицу со столбцами (идентификатор клиента; последовательность переходов между событиями; время, затраченное на переход в секундах):

Далее получим список переходов между событиями и их частоты для отрисовки:

Основной проблемой интерпретации графов является эффект спагетти, для борьбы с которым используются различные методы. В нашем случае реализуем функции, с помощью которых будет происходить фильтрация данных в зависимости от частоты переходов. Будет полезно отобразить только низкочастотные случаи или наоборот, переходы, которые соответствуют наиболее популярному поведению, все зависит от характера изучаемого процесса. Также реализуем функции для изменения толщины и цвета линий, в зависимости от частоты повторений переходов. Для фильтрации событий по частотам реализуем функцию get_stat_freq:

Изменение толщины и цвета линий будет регулироваться при помощи функций change_width_freq и change_color_freq:

Обработка данных завершена, осталось с помощью библиотеки graphviz отрисовать полученные результаты для частот переходов между событиями:

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

Также построим граф, на котором вместо частот переходов, будет отображаться медианное время выполнения перехода между событиями. Для этого рассчитаем значения времени для каждого из переходов:

Далее с помощью библиотеки graphviz отрисуем граф и получим следующий результат:

Для читабельности графа и рассмотрения отдельных событий, данные следует фильтровать по значению частот или времени. Таким образом мы получили карты процесса выдачи кредита по двум параметрам, которые помогут найти пути оптимизации процесса и сокращения потерь финансовой организации.

Читайте также: Как решить задачу по выявлению связей между группами лиц, занимающиеся экономической деятельностью (ссылка)