プロセスマイニングで事務処理の流れをフロー図で表すことがあります。
おそらくこうすればできるであろうと思い、やってみたら簡単にできたので紹介します。
むしろダミーデータを作る方が面倒でした。
今回は請求書を受け付けて内容を確認し入力し支払を実行するという処理のフロー図を作ってみます。
事務処理を表すログ
まず事務処理の結果を表すログが必要です。
必要なのはこの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,佐藤
受付,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,佐藤
Pythonコード
次にコードです。
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()
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"];
}
"受付" -> "内容確認" [label="281"];
"内容確認" -> "請求内容入力" [label="276"];
"請求内容入力" -> "支払実行" [label="273"];
"支払実行" -> "完了" [label="273"];
"完了" -> "受付" [label="272"];
"内容確認" -> "照会" [label="23"];
"照会" -> "内容確認" [label="26"];
"請求内容入力" -> "照会" [label="3"];
"受付" -> "処理不可" [label="19"];
"処理不可" -> "受付" [label="27"];
"内容確認" -> "処理不可" [label="8"];
}
コメント