IBM Process Mining Use Tips

## 1. はじめに

業務で IBM Process Mining(以下 IPM) に触れる機会があったため、その忘備録として記録したものを共有する。

## Process Mining とは

https://www.sbbit.jp/article/cont1/39189

>「プロセスマイニング」とは、企業において従業員が行うさまざまな業務活動のログを取得し分析、業務プロセスを可視化することで、現状を把握して業務改善に活用する手法である。



## 2. よく出てくる用語

- `ケース`: ある対象の処理を追ったものの単位。
  - e.g. 会社で PC を購入する際に次のような社内プロセスがあるとする:  
      - `購入申請 → 購入承認 → 注文書発注 → オーダー確認 → 受領書作成 → 請求書作成`
  - この一連の処理を経る、識別できる単位のことを「ケース」という。つまり、**「XX月YY日にZZという PC を購入するケース」** のように、一意に識別できるものとなる。
  - 通常多数のケースが存在し、それらを総合的あるいは局所的に分析するのがプロセスマイニングである。
- `アクティビティ`: 上記の例で、社内プロセスにあたる一つ一つの処理(購入申請、注文書発注 etc)
- `イベントデータ`: システムにロードするデータ

## 3. データの Transform & Load

IPM によるプロセスマイニングを行う上で、最も大変な作業の一つがデータの加工・整形処理である。  
以下にデータロード時、加工時の制約を挙げる。

- データロード時の制約
  IPM へのデータロードは、カラム構成を決定した上で CSV ファイルとして行う必要がある。
  また、一度にロードできる CSV ファイルのサイズ上限は 300MB である。

- データ加工時の制約
  上記制約のため、データロード後に表示・分析したいメトリック/KPI に応じて、複数の元データを一つの CSV ファイルとしてまとめる必要がある。  
  ここでは考慮が必要ないくつかのパターンを紹介する。

上記制約により、経験上特筆すべきと判断した点を紹介する。  
今回は、python3 の環境で、`pandas` というデータ処理ライブラリを使用した。

<!-- TODO: ソース見ながら思い出す -->

### 3.1 イベントデータの CSV ファイルサイズをできるだけ小さくするべく、必要最低限のカラムに絞る。

```py
import pandas as pd

df = pd.read_csv("path_to_csv")
df = df[["REQUIRED_COL_1", "REQUIRED_COL_2", "REQUIRED_COL_3"]] # 必要なカラムのみピックアップ
```

### 3.2 テーブル結合時の処理

<!-- ここは別途もっと詳細にまとめた直したほうが良いかもしれない -->

以下の説明では、テーブル A とテーブル B から生成したイベントデータを用いる。

#### テーブル A

<!-- prettier-ignore-start -->

| A_ID |   Col1  |
| ---- | ------- |
|    1 | data1_1 |
|    2 | data1_2 |
|    3 | data1_3 |
|    4 | data1_4 |

<!-- prettier-ignore-end -->

#### テーブル B

<!-- prettier-ignore-start -->

| B_ID | A_ID | Col2    |
| ---- | ---- | ------- |
| 1    | 1    | data2_1 |
| 2    | 2    | data2_2 |
| 3    | 3    | data2_3 |
| 4    | 3    | data2_4 |

<!-- prettier-ignore-end -->

#### パターン 1: join 後の NaN のハンドリング

- A と B を Left Join

```py
import pandas as pd

df_A = pd.read_csv("path_to_csv_a")
df_B = pd.read_csv("path_to_csv_b")

df = df_A.merge(df_B, how='left', on=['A_ID'])
```

<!-- prettier-ignore-start -->

| A_ID |   Col1  | B_ID |   Col2  |
| ---- | ------- | ---- | ------- |
|    1 | data1_1 |    1 | data2_1 |
|    2 | data1_2 |    2 | data2_2 |
|    3 | data1_3 |    3 | data2_3 |
|    3 | data1_3 |    4 | data2_4 |
|    4 | data1_4 |  NaN | NaN     |

<!-- prettier-ignore-end -->

イベントデータに `NaN` が含まれる場合、IPM へのロード時にエラーが発生するため、適切な値で埋める必要がある。

```py
df = df.fillna({'B_ID': 0, 'Col2': ''})
```

#### パターン 2: 子テーブル(テーブル B)の対応するレコード数をイベントデータに含める

## 4. 拡張フィルター

既存のフィルター機能で実現できない条件や複雑な条件に対して、JavaScript を使用したカスタムフィルターを作成することで、より高度なフィルタリングを行うことができる。
詳細は[こちらを参照](https://www.ibm.com/docs/en/process-mining/1.14.1?topic=SSWR2IP_1.14.1/process-mining-documentation/references/case-object-methods.htm)。

例) `DIVISION_CODE`=`ICE`を含むケースを抽出するフィルター

```js
var filter = {
  keepTrace: function (trace) {
    for (var k = 0; k < trace.size(); k++) {
      var event = trace.get(k);
      var divisionCode = event.getStringCustomAttributeValue("DIVISION_CODE");
      if (divisionCode.indexOf("ICE") >= 0) return true;
    }
    return false;
  },
};
```

### 4.1 注意点

- `getStringCustomAttributeValue`関数で指定するカラムは、データ・マッピングにおいて対象カラムをマッピングしておく必要がある。(**カスタム(オプション) > テキスト**)

## 5. コンポーネント(ダッシュボード)作成

主要なコンポーネント（カード、グラフ etc）を作成する上での基本的な**測定指標**の設定方法についてまとめる。

### 5.1 カウント(ケース単位で何かの数を合計する系)

ケースごとに、**DIMENSION_NAME(e.g. `PURCHASE_REQUISITION_NUM`)** 数をカウントする

#### 測定指標: `count(casedistinct(PURCHASE_REQUISITION_NUM))`

ケースごとに何かの値をカウントする際には、`casedistinct` が使える。

#### コンポーネント全体の設定

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/8300f7eb-0f52-5371-7e5c-926a02747a9f.png width="600">

### 5.2 アクティビティ間リードタイム(スループット)

アクティビティ「購入申請作成」から「購入申請承認・注文書作成」までの平均スループットを計算する場合

#### 測定指標: `avg(pathtime)`

#### コンポーネント全体の設定

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/dfbcabc1-d7f4-8af2-ee8d-8bba9abd392b.png width="600">


## 6. その他

### 6.1 ユーザー権限と機能

#### ユーザーの組織への追加

新規作成したカスタム・プロセスを利用させたいユーザーは、そのプロセスに割り当てられた`組織`に所属する必要がある。
以下の手順でユーザーを組織に追加することができる。

1. **管理 > 組織** に移動する。
2. 該当組織が選択されている状態で、追加したいユーザーを選択し、**招待** をクリックする。

#### 参照モデル(BPMN ファイル)の追加権限

適合性チェックを行う際など、参照モデルを利用する場合、それをあらかじめ追加(アップロード)しておく必要がある。
やり方は[こちらを参照](https://www.ibm.com/docs/ja/process-mining/1.14.1?topic=project-reference-model#adding-a-reference-model)。

##### 注意点

参照モデルの追加は、対象となるプロジェクトの所有者のみが行える。
プロジェクトの所有者の設定方法は以下の通り。

1. **管理 > 利用者** に移動する。
2. 所有者に設定したいユーザーの編集ボタンをクリックする。
3. **プロジェクトおよびコンポーネント** を選択し、**オーナーの変更** をクリックする。
    <img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/2779bd29-295f-603c-0fe5-9278ca356f7f.png">

4. 「**コンポーネントの新規所有者を選択してください**」という欄にユーザー名を入力して、**続行**をクリックする。

#### 各ユーザー権限(アナリティクス/ビジネス)でできることのまとめ

<!-- prettier-ignore-start -->
| メニュー         | サブカテゴリ                           |                          | 利用者            | 管理者   |
| ---------------- | -------------------------------------- | ------------------------ | ----------------- | -------- |
| プロセス         | モデル                                 | 統計の表示、関係の表示   | ○                 | ○        |
|                  |                                        | フィルターの設定         | ×                 | ○        |
|                  |                                        | 適合分析                 | ×                 | ○        |
|                  | BPMN                                   | -                        | ×                 | ○        |
|                  | 統計情報                               | -                        | ×                 | ○        |
|                  | 比較機能                               | -                        | ×                 | ○        |
|                  | リソースマッピング                     | -                        | ×                 | ○        |
|                  | 管理                                   | -                        | ×                 | ○        |
| アナリティクス   | 自分が作成したダッシュボード           | 作成                     | ○                 | ○        |
|                  |                                        | 編集                     | ○                 | ○        |
|                  |                                        | 共有                     | ○                 | ○        |
|                  |                                        | 表示                     | ○                 | ○        |
|                  |                                        | 設定                     | △(言語設定のみ)   | ○        |
|                  |                                        | 削除                     | ○                 | ○        |
|                  | 他アカウントが作成したダッシュボード   | 編集                     | ×                 | ○        |
|                  |                                        | 共有                     | ×                 | ×        |
|                  |                                        | 表示                     | ○                 | ○        |
|                  |                                        | 設定                     | △(言語設定のみ)   | ○        |
|                  |                                        | 削除                     | ×                 | ×        |
| 管理             |                                        |                          | ×                 | ○        |

<!-- prettier-ignore-end -->