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

«А выживет ли у меня дома кот?[1]», — задался я вопросом, прежде чем забрать себе пушистого друга из приюта домашних животных. И решил проверить свою гипотезу средствами Process Mining, этогоотносительно нового, но активно развивающегося направления анализа процессов. Среди программных продуктов этой сферы есть достаточное количество альтернатив, в частности: Celonis, Disco, ProM, Apramore. Я же решил попробовать библиотеку языка Python — PM4PY (Process Mining for Python), первая версия которой появилась на GitHub (https://github.com/pm4py/) чуть больше года назад, в конце 2018. Ее особенность в том, что это свободно распространяемое ПО, и оно не имеет ограничений как по объему загружаемых файлов, так и по количеству событий, рассматриваемых в логе (журнале событий). PM4PY также имеет обширную документацию, описывающую базовую функциональность — с примерами кода и справочной информацией можно ознакомиться на официальном сайте — https://pm4py.org/

Первым делом – … нет, не самолеты, а данные! PM4PY поддерживает несколько форматов входных данных. Среди них: CSV (разделители — запятые), XES (eXtensible Event Stream) и Parquet. Самый простой как в понимании, так и в плане доступного функционала — это формат CSV.

Именно в этом формате и были представлены данные об утреннем распорядке, использованные далее в рассмотренном примере процесса. В ряд таких событий утра, как «подъем», «завтрак», «почистить зубы» и т.д. был добавлен такой существенный новый шаг как «покормить кота». Данный пример был искусственно сгенерирован в таблице MS Excel и потом сохранен в CSV (количество дней моделирования равно 39, а общее количество событий составило 250). Импорт данных происходит в две строчки кода. В первой — загружается так называемая фабрика импорта (соответствующий класс Python данной библиотеки), а во второй — имя файла данных подается на вход данной «фабрике» с присвоением в нужную переменную.

Загруженный извне лог (в том или ином формате) может быть подан на вход «майнерам» (Miners) — алгоритмам, которые анализируют загруженный в память журнал событий и пытаются по этим входным данным построить предполагаемую модель процесса в виде сети Петри. Примеры доступных в PM4PY алгоритмов: Alpha, IMDFb, Heuristic. Но меня, если вы помните, интересовал не академически строгий теоретический граф модели процесса, а сугубо практический вопрос о выживаемости кота.

И потому, двигаемся к гораздо более интересному в практическом применении анализу процесса в виде DFG графов (Directly-Follows Graph), где вершины графа — это события загруженного нами журнала событий, а направленные ребра соединяют пары

событий, происшедшие одно после другого хотя бы один раз. Плюс такого представления — в подробном отображении всех возможных переходов. Минусом является чрезмерная загроможденность картинки соединяющими линиями, число которых резко возрастает при увеличении количества действий в журнале и многовариантности фактических шагов, случившихся в наблюдаемом процессе. Видно, что и без того не простой процесс утренней рутины с добавлением еще одного дополнительного шага с кормлением домашнего питомца стал еще сложнее. DFG можно построить в разрезе частоты, т.е. сколько переходов было от одной вершины к другой. А можно построить в разрезе эффективности по времени, выбрав в качестве показателя среднее значение времени между событиями. Также в качестве показателя можно выбрать минимальное значение, максимальное или медиану.

Чтобы иметь возможность сузить рассматриваемую область данных, PM4PY предоставляет возможность работы с фильтрами (можно устанавливать фильтры по столбцам аналогично работе в библиотеке pandas) и с вариантами (типовыми последовательностями шагов) лога. Например, на рисунках выше были отображены DFG со всеми вариантами, без ограничений. Но можно выбрать, например, 3 самых частых последовательности шагов, и тогда картинка будет существенно проще.

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

В итоге мы видим, что, даже в наиболее типичных последовательностях событий, шаг «покормить кота» случался лишь в 4 из 8 случаев, а в половине случаев (4) это действие пропускалось и возвращения к нему уже не было. Т.е. в данном случае, лучше пока не торопиться и, не беря на себя дополнительной ответственности, поработать над своими дисциплиной и обязательностью, не обнадеживая животное заботой, которой по факту не будет.


[1] Скажу заранее: в процессе эксперимента ни одно животное не пострадало.