Proses Penambangan tanpa PM4PY





Sangat mudah untuk membuat grafik dari log proses. Analis saat ini memiliki beragam pengembangan profesional yang memadai, seperti Celonis, Disco, PM4PY, ProM, dll., Yang dirancang untuk memfasilitasi studi proses. Jauh lebih sulit untuk menemukan penyimpangan dalam grafik, untuk menarik kesimpulan yang benar darinya.



Bagaimana jika beberapa perkembangan profesional yang telah membuktikan dirinya dan memiliki minat tertentu tidak tersedia karena satu dan lain alasan, atau Anda ingin lebih banyak kebebasan dalam perhitungan saat bekerja dengan grafik? Seberapa sulit menulis penambang sendiri dan menerapkan beberapa kemampuan yang diperlukan untuk bekerja dengan grafik? Kami akan melakukan ini dalam praktiknya menggunakan pustaka Python standar, mengimplementasikan kalkulasi dan memberikan, dengan bantuan mereka, jawaban atas pertanyaan terperinci yang mungkin menarik bagi pemilik proses.



Saya ingin segera membuat reservasi bahwa solusi yang diberikan dalam artikel bukanlah implementasi industri. Ini adalah beberapa upaya untuk mulai bekerja dengan log Anda sendiri dengan bantuan kode sederhana yang bekerja dengan jelas, dan karenanya membuatnya mudah untuk diadaptasi. Solusi ini tidak boleh digunakan pada big data; ini memerlukan perbaikan yang signifikan, misalnya, menggunakan penghitungan vektor atau dengan mengubah pendekatan untuk mengumpulkan dan menggabungkan informasi tentang peristiwa.



Sebelum membuat grafik, Anda perlu melakukan perhitungan. Perhitungan sebenarnya dari grafik akan sama dengan penambang yang disebutkan sebelumnya. Untuk melakukan perhitungan, perlu untuk mengumpulkan pengetahuan tentang peristiwa - simpul grafik dan hubungan di antara mereka dan mencatatnya, misalnya, dalam buku referensi. Referensi diisi menggunakan prosedur perhitungan kalk ( kode di github). Referensi lengkap diteruskan sebagai parameter untuk prosedur menggambar gambar grafik (lihat kode dari tautan di atas). Prosedur ini memformat data seperti yang ditunjukkan di bawah ini:



digraph f {"Permit SUBMITTED by EMPLOYEE (6255)" -> "Permit APPROVED by ADMINISTRATION (4839)" [label=4829 color=black penwidth=4.723857205400346] 
"Permit SUBMITTED by EMPLOYEE (6255)" -> "Permit REJECTED by ADMINISTRATION (83)" [label=83 color=pink2 penwidth=2.9590780923760738] 
"Permit SUBMITTED by EMPLOYEE (6255)" -> "Permit REJECTED by EMPLOYEE (231)" [label=2 color=pink2 penwidth=1.3410299956639813] 
start [color=blue shape=diamond] 
end [color=blue shape=diamond]}


dan meneruskannya ke mesin grafis Graphviz untuk rendering.



Mari mulai membuat dan memeriksa grafik menggunakan penambang yang diimplementasikan. Kami akan mengulangi prosedur untuk membaca dan menyortir data, menghitung dan menggambar grafik, seperti pada contoh di bawah ini. Misalnya, log acara diambil dari deklarasi internasional dari kompetisi BPIC2020. Tautan ke kompetisi.



Kami membaca data dari log, mengurutkannya berdasarkan tanggal dan waktu. Format .xes sebelumnya diubah menjadi .xlsx.



df_full = pd.read_excel('InternationalDeclarations.xlsx')
df_full = df_full[['id-trace','concept:name','time:timestamp']]
df_full.columns = ['case:concept:name', 'concept:name', 'time:timestamp']
df_full['time:timestamp'] = pd.to_datetime(df_full['time:timestamp'])
df_full = df_full.sort_values(['case:concept:name','time:timestamp'], ascending=[True,True])
df_full = df_full.reset_index(drop=True)


Mari kita hitung grafiknya.



dict_tuple_full = calc(df_full)


Mari menggambar grafiknya.



draw(dict_tuple_full,'InternationalDeclarations_full')


Setelah menyelesaikan prosedur, kami mendapatkan grafik proses:







Karena grafik yang dihasilkan tidak dapat dibaca, kami menyederhanakannya.



Ada beberapa pendekatan untuk meningkatkan keterbacaan atau menyederhanakan grafik:



  1. menggunakan pemfilteran berdasarkan bobot simpul atau tautan;
  2. singkirkan kebisingan;
  3. acara kelompok dengan kesamaan nama.


Mari kita lakukan pendekatan 3.



Mari buat kamus untuk menggabungkan acara:



_dict = {'Permit SUBMITTED by EMPLOYEE': 'Permit SUBMITTED',
 'Permit APPROVED by ADMINISTRATION': 'Permit APPROVED',
 'Permit APPROVED by BUDGET OWNER': 'Permit APPROVED',
 'Permit APPROVED by PRE_APPROVER': 'Permit APPROVED',
 'Permit APPROVED by SUPERVISOR': 'Permit APPROVED',
 'Permit FINAL_APPROVED by DIRECTOR': 'Permit FINAL_APPROVED',
 'Permit FINAL_APPROVED by SUPERVISOR': 'Permit FINAL_APPROVED',
 'Start trip': 'Start trip',
 'End trip': 'End trip',
 'Permit REJECTED by ADMINISTRATION': 'Permit REJECTED',
 'Permit REJECTED by BUDGET OWNER': 'Permit REJECTED',
 'Permit REJECTED by DIRECTOR': 'Permit REJECTED',
 'Permit REJECTED by EMPLOYEE': 'Permit REJECTED',
 'Permit REJECTED by MISSING': 'Permit REJECTED',
 'Permit REJECTED by PRE_APPROVER': 'Permit REJECTED',
 'Permit REJECTED by SUPERVISOR': 'Permit REJECTED',
 'Declaration SUBMITTED by EMPLOYEE': 'Declaration SUBMITTED',
 'Declaration SAVED by EMPLOYEE': 'Declaration SAVED',
 'Declaration APPROVED by ADMINISTRATION': 'Declaration APPROVED',
 'Declaration APPROVED by BUDGET OWNER': 'Declaration APPROVED',
 'Declaration APPROVED by PRE_APPROVER': 'Declaration APPROVED',
 'Declaration APPROVED by SUPERVISOR': 'Declaration APPROVED',
 'Declaration FINAL_APPROVED by DIRECTOR': 'Declaration FINAL_APPROVED',
 'Declaration FINAL_APPROVED by SUPERVISOR': 'Declaration FINAL_APPROVED',
 'Declaration REJECTED by ADMINISTRATION': 'Declaration REJECTED',
 'Declaration REJECTED by BUDGET OWNER': 'Declaration REJECTED',
 'Declaration REJECTED by DIRECTOR': 'Declaration REJECTED',
 'Declaration REJECTED by EMPLOYEE': 'Declaration REJECTED',
 'Declaration REJECTED by MISSING': 'Declaration REJECTED',
 'Declaration REJECTED by PRE_APPROVER': 'Declaration REJECTED',
 'Declaration REJECTED by SUPERVISOR': 'Declaration REJECTED',
 'Request Payment': 'Request Payment',
 'Payment Handled': 'Payment Handled',
 'Send Reminder': 'Send Reminder'}


Mari kelompokkan kejadian dan gambar grafik proses lagi.



df_full_gr = df_full.copy()
df_full_gr['concept:name'] = df_full_gr['concept:name'].map(_dict)
dict_tuple_full_gr = calc(df_full_gr)
draw(dict_tuple_full_gr,'InternationalDeclarations_full_gr'




Setelah mengelompokkan peristiwa berdasarkan kemiripan nama, keterbacaan grafik telah meningkat. Mari kita coba mencari jawaban atas pertanyaan. Tautan ke daftar pertanyaan. Misalnya, berapa banyak deklarasi yang tidak didahului dengan otorisasi yang disetujui sebelumnya?



Untuk menjawab pertanyaan yang diajukan, kami memfilter grafik berdasarkan peristiwa yang menarik dan menggambar grafik proses lagi.



df_full_gr_f = df_full_gr[df_full_gr['concept:name'].isin(['Permit SUBMITTED',
                                                            'Permit APPROVED',
                                                            'Permit FINAL_APPROVED',
                                                            'Declaration FINAL_APPROVED',
                                                            'Declaration APPROVED'])]
df_full_gr_f = df_full_gr_f.reset_index(drop=True)
dict_tuple_full_gr_f = calc(df_full_gr_f)
draw(dict_tuple_full_gr_f,'InternationalDeclarations_full_gr_isin')






Dengan bantuan grafik yang dihasilkan, kami dapat dengan mudah memberikan jawaban atas pertanyaan yang diajukan - pernyataan 116 dan 312 tidak didahului dengan izin yang telah disetujui sebelumnya.



Anda juga dapat "gagal" (memfilter berdasarkan 'case: concept: name', berpartisipasi dalam koneksi yang diinginkan) untuk koneksi 116 dan 312 dan memastikan bahwa tidak akan ada peristiwa yang terkait dengan izin pada grafik.



Mari kita "gagal" untuk komunikasi 116:



df_116 = df_full_gr_f[df_full_gr_f['case:concept:name'].isin(d_case_start2['Declaration FINAL_APPROVED'])]
df_116 = df_116.reset_index(drop=True)
dict_tuple_116 = calc(df_116)
draw(dict_tuple_116,'InternationalDeclarations_full_gr_isin_116')






Mari kita "gagal" untuk koneksi 312:



df_312 = df_full_gr_f[df_full_gr_f['case:concept:name'].isin(d_case_start2['Declaration APPROVED'])]
df_312 = df_312.reset_index(drop=True)
dict_tuple_312 = calc(df_312)
draw(dict_tuple_312,'InternationalDeclarations_full_gr_isin_312')






Karena tidak ada peristiwa yang terkait dengan izin pada grafik yang diterima, kebenaran jawaban 116 dan 312 dikonfirmasi.



Seperti yang Anda lihat, menulis penambang dan menerapkan kemampuan yang diperlukan untuk bekerja dengan grafik bukanlah tugas yang sulit, yang telah berhasil diatasi oleh fungsi bawaan Python dan Graphviz sebagai mesin grafis.



All Articles