「RRの稼働状況をヒートマップにしたい」とChatGPT先生に教えを請うた話 #BluePrism #ChatGPT #PowerBI

# やりたいこと：RRの埋まり具合が見たい
いつも稼働状況パンパンのような気がするけど、実はまだこの時間帯なら空いてるんじゃないか、とか、マジで満杯なのでライセンスを増やすべきでは、とか検討したいときってありますよね。

実は以前にもそういうことを検討するダッシュボードを作ったことがあるのですが（↓この記事）
[Blue Prismのダッシュボードを、Power BIで作ってみようとしています。 #blueprism #powerbi](https://qiita.com/Sumire_Neko/items/807fbc2e7d1358dca86c)
これに使ったカスタムビジュアルが廃止されたのか、見当たらなくなってしまい……。

じゃあせっかくなので今度はPower BIでヒートマップにしてみよう
というチャレンジが今回の内容です。

とは言え、RR稼働ログは業務データなので気軽に外には出せませんので
架空のシチュエーションを設定してみます。
- 24時間365日営業のカフェ
- テーブルは全5卓

このテーブルの埋まり具合を集計する、という設定にします。
- CSVデータ：BPASession
- カフェのテーブル：RR
- 来店するお客様：プロセス
- 着席日時：startdatetime
- 退席日時：enddatetime

と読み替えてください。

# ChatGPTにサンプルデータを作らせる
まず、集計するためのデータが必要です。
これをChatGPTに作ってもらいます。
Code InterpreterをONにして、以下の命令でデータを作ってもらいます。
```質問
プログラムのテストに使用するCSVデータを500件以上作成してください。
テスト対象は、カフェの集客状況を集計するプログラムです。
- ファイル名は「カフェ集客状況.csv」
- テーブルは全5卓：Table1～Table5
- カフェは24時間365日営業しています。
- CSVデータの列は4列：テーブル名、顧客名、着席日時、退席日時
- 顧客名は架空の姓を作成してください。日本人も外国人もいます。
- 集計期間は2023年3月1日～2023年6月30日
- 誰も来店しない日は存在しません。誰も来店していない時間帯は存在します。
- 1つのテーブルには同時に1人の顧客が占有し、相席はありません。
- 顧客の滞在時間は15秒～6時間で秒単位。日をまたいで滞在する顧客も存在します。
- 滞在日時と滞在時間の長さがおおよそ均等にばらけるようにテストデータを作成してください。
```

これでChatGPTがCSVファイルを作ってくれます。CodeInterpreterマジ便利。
「それでは、始めます。」と言われてから数分も待たないくらいかな？
実際には、回答の「カフェ集客状況.csvをダウンロード」と書いてあるところがリンクになっていて、クリックするとCSVファイルが落ちてきます。

ChatGPTの回答：
```ChatGPT
了解しました。指定された条件に基づいて、CSVデータを作成いたします。

- ファイル名: 「カフェ集客状況.csv」
- テーブル: Table1～Table5
- 列: テーブル名、顧客名、着席日時、退席日時
- 顧客名: 架空の姓で作成
- 集計期間: 2023年3月1日～2023年6月30日
- 顧客の滞在時間: 15秒～6時間 (秒単位)
まず、以下のステップで進めます：

- 架空の姓リストの作成
- 顧客の滞在時間をランダムに決定
- 着席日時と退席日時を計算
- 500件以上のデータを作成
- CSVファイルとして保存
それでは、始めます。

テストデータを作成しました。「カフェ集客状況.csv」というファイル名で保存しました。

カフェ集客状況.csvをダウンロード

データが期待通りであるかどうか、確認してください。何か修正や追加が必要な場合は、お知らせください。
```
ダウンロードしたファイルをテキストエディタで開いてみると……
おお！ちゃんとCSVできてる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/31fedd09-9a0d-77a1-e4ef-5d5509fc0272.png)

# 作成手順をChatGPT先生に教わる
まず質問。
親切に教えてもらいたいときは「ステップバイステップで」という詠唱が効きます。
```質問
カフェにはテーブルが5卓あります。
この各テーブルの稼働状態を調査して、Power BIでテーブルごと1時間単位のヒートマップにしたいです。
持っている情報は「カフェ集客状況.csv」で、csvの列は「テーブル名（Table1〜Table5）、顧客名、着席日時、退席日時」です。
ひとつのテーブルには同時に1組の顧客が占有し、相席はありません。
テーブルに数時間着席していたり、日をまたいで着席している客もいます。
これをヒートマップにするには「指定の時間帯に各テーブルが埋まっているかどうか」の情報が必要だと思うのですが、これを算出する方法をステップバイステップで提示してください。
新しい列を作成する必要があるならば、列名と列の作成方法をステップバイステップで教えてください。
```
教えてくれた回答がこれ。
ChatGPTの回答：
```ChatGPT
1. データのインポート
「テーブル使用状況.csv」をPower BIにインポートします。

2. 新しい列の作成
以下の新しい列を作成します。
    2.1. 「着席時間」列の作成
        列名: 着席時間
        式: HOUR([着席日時])
    2.2. 「退席時間」列の作成
        列名: 退席時間
        式: HOUR([退席日時])

3. 稼働状態の計算
数時間着席している客のデータをヒートマップに反映するためには、各時間帯におけるテーブルの使用状況を正確に把握する必要があります。
以下の手順で元データを加工します。

    3.1. 時間帯テーブルの作成
        0時から23時までの各時間帯を表すテーブルを作成します。
        このテーブルは以下のようになります。

        | 時間帯 |
        |:------|
        | 0 |
        | 1 |
        |...|
        | 23 |

    3.2. 元データの拡張
        元のデータテーブルを、各顧客の着席時間と退席時間の間のすべての時間帯で拡張します。

        例: 顧客Aが10時から12時半までテーブル1に着席していた場合、以下のような行を追加します。
        | テーブル番号 | 顧客名 | 時間帯 |
        |:------------|:-------|:------|
        | Table1      | 顧客A  | 10 |
        | Table1      | 顧客A  | 11 |
        | Table1      | 顧客A  | 12 |

4. ヒートマップの作成
- Power BIの「行列」ビジュアルを使用します。
- 行に「時間帯」を、列に「テーブル番号」を配置します。
- 値として、各セルに該当する時間帯とテーブルの組み合わせの行数（つまり、その時間帯にそのテーブルが使用されているかどうか）をカウントします。
- 「条件付き書式」オプションを使用して、ヒートマップの色を設定します。使用されている時間帯は濃い色、使用されていない時間帯は薄い色となるように設定します。

この手順により、数時間着席している客のデータも正確にヒートマップに反映することができます。

```
なるほど！滞在時間が毎時正時をまたぐ場合は、1時間の区分ごとに行を分割するのね。
でもそれってどうやるの？
```ChatGPT
Power BIでは、元のデータテーブルを直接編集することはできませんが、新しいテーブルを作成することは可能です。
以下の手順で「元データの拡張」を行うための新しいテーブルを作成します。

【Power Queryを使用して新しいテーブルを作成】

- Power BI Desktopを開き、ホームタブのクエリの編集をクリックします。
- 左側のペインで元のデータテーブル（例:「カフェ集客状況」）を選択します。
- ホームタブの参照をクリックして、元のテーブルのコピーを作成します。
- 新しいテーブルの名前を「拡張データ」としてリネームします。
追加列タブのカスタム列をクリックします。
- 次の式を入力して、各顧客の着席時間と退席時間の間のすべての時間帯のリストを作成します。
    {[着席時間]..[退席時間]}
- 新しいカスタム列が作成されるので、その列の名前を「時間帯リスト」としてリネームします。
- 変換タブのリストを展開をクリックして、新しい行を追加します。
この操作により、各顧客の着席時間と退席時間の間のすべての時間帯で新しい行が作成されます。
- 必要ならば、他の不要な列を削除します。
- ホームタブの変更を適用をクリックして、変更を保存します。

これで、「拡張データ」テーブルが作成され、各顧客の着席時間と退席時間の間のすべての時間帯で新しい行が追加されています。
このテーブルを使用してヒートマップを作成することができます。
```



# 教わったとおりにやってみる
## データのインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/0c7d6dc1-2c02-9d6d-9c60-bda69986de31.png)
## 新しい列の作成
「着席時間」「退席時間」列を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/2a00be8f-d967-0bbb-a358-3b7d7ef786e6.png)

## 時間帯テーブル作成
あとカレンダーテーブルもついでに作っとく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/bb1b9362-83b8-a8e4-d7d4-d3b9af09ef70.png)

## 元データの拡張
最初にCSVを読み込んだ「カフェ集客状況」テーブルを使用して「拡張データ」テーブルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/0c828fcf-eaea-0842-7eaf-9dbdd2de38dc.png)
できた列の見出しのパカッて開くアイコンを押して、「新しい行に展開する」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/c773e291-7d25-0870-79f5-0e38d336530b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/8671bf5c-326b-eec2-c5b3-057afce96b33.png)
あれ？null値になる行があるな…… と思ったら、滞在時間が日をまたいでいる顧客でした。
この場合は、「22」「23」「0」「1」と4行できるのが正解ですね。
なので、「時間帯リスト」列を作成するときの式を、日をまたいでもいけるやつに変更します。
つまり、日をまたいでいる場合は
「着席時間から23まで」「0から退席時間まで」と分割して行を作成するようにします。

:::note info
※今回は滞在時間をせいぜい23時間くらいまでとして式を作っています。なので「滞在時間が3日間」などがある場合は、式をこれじゃないものに変えないといけないです。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/22101a92-ec72-93ac-3366-108c2c4db22b.png)
今度はちゃんと展開されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/df630c23-99e8-e124-d66c-665af046fe1f.png)
展開できた列と時間帯テーブルとの間にリレーションをはっておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/ca64b3af-3f14-0aed-34fc-c08ad4ecdf7e.png)

## ヒートマップの作成
レポートビューでマトリックスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/8f497789-6b06-b954-cd60-9becd751807b.png)

行：拡張データテーブルの「テーブル名」
列：時間帯テーブルの「時間帯」
値：拡張データテーブルで何かカウントできるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/17cab6c4-0500-9c2f-f7b0-36095d5e6d9f.png)

## ヒートマップのスタイル設定
書式タブで、「セル要素」の「背景色」をONにして「fx」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/622d76f7-df7f-0ac7-2428-40c3c1353063.png)
グラデーションの設定が出てくるので設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/ca8bb642-550d-9194-ae23-f77655b9fbc9.png)

## 期間を絞って集計できる機能もつけておく
ヒートマップのビジュアルが**選択されてない状態**で（ここ大事！選択されていると、せっかく今作ったビジュアルが新しく選択されたビジュアルで上書きされてつぶれます！私はもう何回もやりました！）「スライサー」のビジュアルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/eb39da6d-b79d-0cdc-53d3-a81bc84d6bd7.png)
スライサーのフィールドは「着席日時」とかでいいかな？

## ヒートマップできました！
ChatGPT先生の言うとおりに作ったらほんとにできちゃった……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/f3436233-2bb2-aa62-0659-48119988c541.png)

# 終わりです
いやすごいなChatGPT…… 
ここには載せていませんが、作業中に「これって操作どうやるの？」「なんかエラー出たんだけど」など、ちょっとしたことでもガンガン質問できて、そのたびにどんなことでも根気強く丁寧に回答してくれて、ChatGPT先生の教師力がハンパないです。
ちょっと前まではこういうシチュエーションで使うのはGoogle検索で、要求されるのは「ググりスキル」だったりしたのですが、ChatGPTにも「質問詠唱スキル」がある感じがします。
- 私はどういう立場で何をしたいか
- ChatGPTは何の役で、どう振舞ってほしいか
- ChatGPTに何をしてもらいたいか（具体的であればあるほどイケる）

とは言え「今の質問はマズったな」と思ったら新しい会話でもっと整えて質問し直せばいいので、トライアンドエラーで詠唱スキルを練習していけばいいのかな。