Power BI で残業管理レポートをつくる

# はじめに
Excel形式で収集した残業データをPower BIでレポート作成するための手順です。
そんなに難しい機能は使わない初心者向け。
teams上のファイルを指定してPowerQueryでの加工、BIでのビジュアル化を想定。
自分用の忘備録としての側面が強いです。

# 使用するデータ
ある事業所Aでのメンバーの残業をまとめたExcelファイル。
残業が必要な場合に業務分類と時間を入力して管理していると仮定します。みんなが使用するのでteamsのとあるチームに保存しています。
フォーマットはまだまだよくある、人は見やすいけどデータとしてすぐには使用できない状態を想定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/30264edb-9987-b8eb-6fb8-525de255a6cb.png)

# PowerQueryによるデータソース作成
今回はある先ほどのファイルがteams上あるとしてこれをデータソースとします。

## データソース取り込み
teams上に保存してあるExcelブックは**Webページからのデータインポート**です。"Excelブック" を選択しても残念ながらteamsファイルは選べないので注意。これはteams上のチームに保存してあるファイルの実態がSharePointサイト上に保存してあるためです。
そのため、リボンのホームタブ、データ項目からデータを取得→Webを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/99982567-67b0-1098-ba5d-8a55a7532ce6.png)

ポップアップが出てくるのでteams上のファイルリンクをコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/f35b4fd6-a2ca-175b-f7d3-ba3ea666cb86.png)
この時、張り付けたURLの.xlsx以降(フラグメント部分)は不要なので削除します。

ちなみにリンクはteams上のファイルからコピーするとよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/da036940-5312-9c49-cdba-6030f6351313.png)

うまくいかない場合は[Power BIでSharePointのデータを利用する](https://qiita.com/Yellow11/items/39336e331c397bd94d2a "Power BIでSharePointのデータを利用する")を参考にしてください。
コネクタをSharePoint系にするとよいみたいです。先達はあらまほしきことなり。

データソースの指定がうまくいった場合はこんな感じの画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/2221352f-36c1-9fda-4b53-4aecc042bc62.png)


## データのクレンジングと変換
データをBIが使用できる形式にするクレンジング処理を行います。
工程としては
①いらない行(上位)と列を削除
②ヘッダー作成
③いらない行(下位)の削除
です。完成イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/c7a10ac2-d2ff-5fd2-0156-8459410ac0a3.png)


①いらない行(上位)と列を削除
今回残すのは
行：残業時間が入力されている行
列：入力日、年、月、日、氏名、残業が必要になった理由、分類、（ｈ）
です。
行と列の削除はリボンにあるここ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/8171efd0-1f1c-bcca-71c8-134666150147.png)
から実施します。
ヘッダーとなる行が一列目かつ一番左側の行からスタートするようにどんどん削除しましょう。
行の削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/ccc92518-21ad-4ac6-a87a-8efc29c72263.png)
列の削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/25dc7a11-2d9c-65c6-4e20-57a77bb910b4.png)

完了形はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/64ac0d19-9048-7eee-3c9c-c54dac07d21a.png)

②ヘッダー作成
"一行目をヘッダーとして使用"を選択してヘッダー名称を決定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/c69070a5-3225-6fdc-3a0d-521ea2720e50.png)

一行目がヘッダーとなった状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/eb1b30cd-4430-5b00-125e-c2bda19bbce5.png)

③いらない行(下位)の削除
下位に空白行や無駄な入力があると結合時にゴミとなるので削除します。
まずは行の削除から空白行の削除を選択して空白行を削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/bce87db0-eb6a-4761-bc82-9fe0355e257a.png)

その月の最終日以下の行をすべて削除してください。
例としてはこんなやつ。時間に合計値が入ってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/8c7b7584-36ef-d0b4-9ada-616d146e5acb.png)

変換が完了したら"閉じて適用"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/73a2cefa-3377-9928-e233-df1e607ffb18.png)

# 日付テーブルの作成と適用
PowerBIで日付データを活用する際に必須である日付テーブルを作成します。
日付テーブルはフィールド内のテーブルの日付データを連動させるために必要なものです。
使用することで各テーブルの日付が結びつき、日付によるインタラクティブなビジュアルを実現できます。
日付テーブルを作らずにドはまりしたことがあるので要注意。

## 作成手順
BIで画面左のデータビューを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/00d9e834-52e5-6c14-9a6c-0e6edbf937bd.png)

次にテーブルツールタブで新しいテーブルの作成を選択します。
入力欄が選択されているのでここに以下の様にDAX式を入力します。
```DAX:
カレンダー = CALENDAR(DATE(2023,4,1),DATE(2024,3,31))
```
今回はFY2023における1年分の日付を作成しています。
今ある日付のみほしい場合は
```DAX:
カレンダー = CALENDAR(RIRSTDATE('シート名称'[入力日].[Date]),LASTDATE('シート名称'[入力日].[Date]))
```
としてください。

また、1年間のデータを表示する際に月で分けると便利なことが多いです。
そこでYYYY年MM月で表示可能な年月メジャーを作成します。
フィールドペインでカレンダーを選択した状態で新しいメジャーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/691a08e1-dacb-13de-8f25-324ee8b3c9e8.png)

メジャーには次のように入力します。
```DAX:
年月 = FORMAT('カレンダー'[Date],"YYYY年MM年")
```
これで日付テーブルは完成です。こんな感じのテーブルができてるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/53049654-7c6a-1d62-4867-4c8230006a40.png)

最後にカレンダーテーブルを日付テーブルとしてマークするで日付テーブルとして設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/3c341560-c610-71a1-64de-37891c9466e9.png)

# リレーションシップの設定
作成したカレンダーのDateを残業一覧の残業日と結びつけます。

画面左のモデルビューを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/47250345-6353-597a-daac-c063211147d6.png)

カレンダーテーブルの「Date」をドラッグして残業一覧テーブルの「残業日」でドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/c3efe2c5-16fa-b462-6bb1-566bfa60f7f6.png)

すると以下のようにリレーションシップが形成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/c45f5e41-6c05-d547-2221-1797795c185e.png)

以上でBIでのビジュアルを設定するための前処理は完了です。

# PowerBIでのデータビジュアライゼーション
白状すると私にはデザインのセンスがありません。そこで今回は[イースト株式会社](https://blog.est.co.jp/2022/11/20221129 "イースト株式会社")さんのレポートを参考にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/15d3a986-74bc-7fbd-929e-0b527f7a1633.png)
このレポートのデザインを基にしてビジュアル化していきます。

## 完成品
そしてできあがったのがこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/fdf5d147-d30b-dbc3-c18b-ea6c53d6d5a1.png)
一つずつ解説します。

### 個人別残業時間合計(積み上げ縦棒グラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/3ee7baae-4906-037b-641d-cffc33780fae.png)
使用する項目
X軸：氏名
Y軸：残業時間の合計
ポイントはデータラベルの表示。グラフだけではわかりにくい残業時間の詳細を数値表示によって把握しやすくしている。データラベルの表示は視覚化ペインの書式設定からデータラベルスイッチをONするだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/2fdd324a-c207-6c78-75ec-9a39f7e41637.png)


### 分類別残業時間合計(集合縦棒グラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/b321a613-5593-7a38-bf56-1ec87738dc73.png)
使用する項目
X軸：氏名
Y軸：残業時間の合計
ポイントは各項目の塗分け。通常だと規定の一色での表示だが各項目ごとに塗分けている。
塗分け方法は視覚化ペイン書式設定→列→カラーより設定の適用先を該当の項目にしてからカラーを変更するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/aad92a78-27c6-3530-66f1-c19d519961c4.png)


### 氏名テーブル(テーブル)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/7a4a2356-4177-2046-af24-576b56c8f4a4.png)
使用する項目
列：氏名
  　　残業時間
　　残業可能時間(月間)→DAX式で設定。内容は後述
ポイントはDAX式と条件付き書式。残業時間では当月の残業時間とデータバーを表示。DAX式で定義した残業可能時間(月間)では最大残業可能時間を45時間としてあと何時間残業可能かを表示。また、時間の過多によってアイコンが変化することで残業可能時間が少なくなる場合に注意喚起。
条件付き書式は視覚化ペインの残業時間から条件付き書式を選択することで設定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/6839d18c-bde7-819b-8dba-6d92f4d08288.png)
アイコンの例では、
45~20:緑アイコン
20~10:黄アイコン
10~0 :赤アイコン
に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/9176f961-c478-cb23-cc0d-aed271c11afd.png)

## DAX式について
DAX式は新しいメジャーを算出するための式です。Excelの数式とよく似ています。
今回は残業可能時間を算出するために使用します。 ~~カレンダーテーブル作成に使用していることを忘れていました。~~

今回は月間の最大残業時間が45時間までとして、あと何時間残業できるのかを表示するメジャー**残業可能時間(月間)**を作成します。
まずリボンから新しいメジャーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269431/61e60420-5718-07d9-c289-eac67e5128c4.png)

次に以下の式を入力します。
```DAX:
残業可能時間(月間) = 45 - SUM('2024年1月'[残業時間])
```
この式は最大の45時間からその月の残業時間の合計を引くことを意味しています。

# おわりに
思っていたよりも記事の作成に時間がかかりました。
忘れたころに役に立つといいなー。