Pythonでプロセスマイニング

プロセスマイニングで事務処理の流れをフロー図で表すことがあります。
おそらくこうすればできるであろうと思い、やってみたら簡単にできたので紹介します。
むしろダミーデータを作る方が面倒でした。

今回は請求書を受け付けて内容を確認し入力し支払を実行するという処理のフロー図を作ってみます。

まず事務処理の結果を表すログが必要です。
必要なのはこの3つです。
activity(処理内容)
timestamp(処理日時)
case_id(処理対象を一意に決める値)
あと人間が処理するので次の情報もあったほうがいいです。
member(処理担当者)

このログを次のようなCSVにします。

activity,timestamp,case_id,member
受付,2023/11/01 09:01:27,1011,佐藤
内容確認,2023/11/01 09:05:52,1011,佐藤
請求内容入力,2023/11/01 09:17:24,1011,佐藤
支払実行,2023/11/01 09:19:41,1011,佐藤
完了,2023/11/01 09:20:33,1011,佐藤

次にコードです。

import pandas as pd
import collections

def main():
  # CSVの読み込み
  df = pd.read_csv("data.csv")
 
  # データのソート(右から順にソート、右端にタイムスタンプ、左端に人など分割できない項目)
  df = df.sort_values(["member", "case_id", "timestamp"])
  transitions = collections.defaultdict(int)
  for i in range(len(df) - 1):
    src = df.iloc[i]["activity"]
    dst = df.iloc[i + 1]["activity"]
    transitions[(src, dst)] += 1

  # dotファイルを生成、出力  
  lines = []
  lines.append("digraph{")
  for (src, dst), count in transitions.items():
    lines.append(f'"{src}" -> "{dst}" [label="{count}"];')
  lines.append("}")
  text = "\n" . join(lines)
  fn = "process.dot"
  with open(fn, "w") as f:
    f.write(text)

if __name__ == "__main__":
  main()

これを実行するとDOT言語で書かれたファイルが生成されます。

digraph{
"受付" -> "内容確認" [label="281"];
"内容確認" -> "請求内容入力" [label="276"];
"請求内容入力" -> "支払実行" [label="273"];
"支払実行" -> "完了" [label="273"];
"完了" -> "受付" [label="272"];
"内容確認" -> "照会" [label="23"];
"照会" -> "内容確認" [label="26"];
"請求内容入力" -> "照会" [label="3"];
"受付" -> "処理不可" [label="19"];
"処理不可" -> "受付" [label="27"];
"内容確認" -> "処理不可" [label="8"];
}

%0 受付 受付 内容確認 内容確認 受付->内容確認 281 処理不可 処理不可 受付->処理不可 19 請求内容入力 請求内容入力 内容確認->請求内容入力 276 照会 照会 内容確認->照会 23 内容確認->処理不可 8 支払実行 支払実行 請求内容入力->支払実行 273 請求内容入力->照会 3 完了 完了 支払実行->完了 273 完了->受付 272 照会->内容確認 26 処理不可->受付 27

コメント

タイトルとURLをコピーしました