【Power BI】「時間の家計簿」の週次/月次/年次集計

# はじめに

自分の時間の使い方を Google スプレッドシートに記録しています。それぞれ週次・月次での振り返りを note に投稿し、自分の行動の振り返り・最適化を図ってきました。

https://note.com/anpanda_44075/n/n673f61513b9d?magazine_key=m3c5cc20afa07

https://note.com/anpanda_44075/n/n5ee6dea910f3?magazine_key=m3c5cc20afa07

年次の振り返りをするにあたって、Power BI で集計をすれば簡単・柔軟なのではと考え、 Google スプレッドシートから Power BI に置き換えてみました。

> ※基礎的かつ圧倒的にプライベートユースな内容を、初学者の学習メモとしてアウトプットしております。

# 現行システム

データ入力と週次・月次の振り返りを Google スプレッドシートで行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/930743a3-1600-f42d-1fb3-8218b942ecf6.png)

週次・月次の振り返りシートには、該当期間の項目を集計するための関数が作り込まれています。2023シートの99～121行目で、1日分の各項目の合計時間を集計しているので、そこを参照する形です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/248c3dea-2532-ce01-14c7-9c3b995c208f.png)

```
=SUMIFS(
    INDEX('2023'!$99:$121,
        MATCH($B9, '2023'!$A$99:$A$121, 0 )
    ),
    '2023'!$1:$1, ">=" & AM$2,
    '2023'!$1:$1, "<=" & AM$3
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/d9be5e64-5bef-33e1-c22d-b0f2faa8359f.png)

```
=SUMIFS(
    INDEX('2023'!$99:$121,
        MATCH($A8, '2023'!$A$99:$A$121, 0 )
    ),
    '2023'!$1:$1, ">=" & AM$1,
    '2023'!$1:$1, "<=" & EOMONTH(AM$1, 0 )
)
/
IF($A$1 = "平均",
    DAY( EOMONTH(AM$1, 0 ) ),
    1
)
```

このように、週次・月次の集計は別々に作る必要があり、スプレッドシートでやろうとするとやや複雑になっていました。

Power BI なら、週次・月次・年次の集計で計算式を作り直す必要はないはず。タイムインテリジェンスで対応できます。

# Power BIに移行

## 取り込み

まずはシート全体を取り込み、Power Query で整形します。転置やピボット解除を行い、Date と Time をキーに、Action が特定できるような状態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/d56ace39-f83f-548e-d5d4-db00ac2ab8c8.png)

2022年分と2023年分のデータではファイルの仕様が異なります。別々にインポート・整形してから、「クエリの追加」で合体して Fact クエリとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/4c18a488-5df0-524e-9792-04f5d1a7d8c4.png)

Category クエリは、スプレッドシートからカテゴリマスタを取得したものです。そのままでもよかったんですが、インデックスを追加してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/2ff5262a-c53e-ef1b-12c8-e3ea39eac4bd.png)

# 分析準備

## 日付テーブル

CALENDAR 関数で作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/b29a236a-1fe8-4371-72a0-75fe249b246f.png)

Week 列は、自分の誕生週を0として、金曜日始まりになるように計算しています。DATEDIFF の後ろの `- x`で、開始曜日を調整できます。

```
Week = 
INT(
    DIVIDE(
        DATEDIFF("1987-mm-dd", [Date], DAY) - x, 7
    )
)
```


一応伏せてますが、週数から計算したらだいたい特定できる説


## メジャー

時間の家計簿では15分を1単位としているので、カウントした Action の数に15を掛けて、費やした時間を分単位で表現しています。

```
Action Minute = COUNT( 'Fact'[Action] ) * 15
```

ただ、月次・年次の集計で分単位だと直感的ではないので、0.25時間を1単位として計算したものを使うようにしました。小数点以下第2位まで表示させています。

```
Action Hour = DIVIDE( COUNT( 'Fact'[Action] ), 4)
```

投下時間の前年比(YOY)・増減率(RC)も計算しました。CALCULATE 関数と PREVIOUSYEAR 関数を使って、コンテキストに対する前年の値を取得しています。

```
Action Hour YOY = DIVIDE( [Action Hour],
    CALCULATE( [Action Hour], PREVIOUSYEAR( 'Date'[Date] ) )    
)
```

```
Action Hour RC = 
VAR _previousAH = CALCULATE( [Action Hour], PREVIOUSYEAR( 'Date'[Date] ) )
RETURN DIVIDE( [Action Hour] - _previousAH, _previousAH )
```


## 階層

日付とカテゴリは、階層を作成しておきます。年→月→週の切り替えや、5カテゴリに分類したレベル感での確認をできるようにするため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/f4dcb0c0-4320-44bf-a981-802d27a7322d.png)

## データモデル

ここまでの準備で、データモデルはこのようになりました。シンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/0ddb41bf-96e1-106b-25ce-99a1bf75d85f.png)

Fact テーブルから、Category テーブル・Date テーブルに対して、それぞれ多対1のリレーションが設定されています。(自動)

# Power BIで可視化

## リボングラフ

2022年から2023年末までをリボングラフで俯瞰してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/c0a7f807-9f28-c0ac-8e94-e140ffe779f5.png)

育休を取得(赤＝Work がない)した2023年4月を境に、Study ＞ Fun になったことがわかります。会社側の配慮で Work を最小限にしてもらっている分、Home や Study に回せていたと確認できて安心しました。

ちなみに、週次で2年分を表示するとこうなります。細かすぎて伝わらないヤツ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/f9bf1057-d036-f9f4-d271-4f3c4cb7d3fd.png)

週次の傾向を把握したいときは、フィルターで直近の約3ヶ月(12週)のみを表示させるとちょうどいい感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/a2b6db1a-5158-8daf-7481-a091dab96470.png)


## マトリクス：前年からの増減

前年からの増減は、年単位でのマトリクスで確認します。先ほど作ったメジャー `Action Hour RC` を、Category ごとに表示。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/61ee7fe3-c867-8f01-5902-612caa1d4252.png)

年単位で見ても、Fun・Work の減少と、Home・Study の増加が確認できました。Life は食事・睡眠・風呂などなので、増減の余地が小さいですね。2023年はまだ4%ほど残っているので、Life の増減はプラマイゼロに近づいていく想定です。

なお、Action 単位での比較だと、最も増加率が高いのは発信(+59.76％)、最も減少率が高いのは通勤(-78.20％)でした。

# おわりに

分析ツールをスプレッドシートから Power BI に切り替えたことで、様々な切り口での分析が簡単にできるようになったと実感しました。特に、時間軸を柔軟に変更できるところが Power BI の強みだと思います。すでに2年分の行動データが蓄積されているので、Power BI の学習と自己洞察を兼ねて、引き続きデータ活用していきます。

以前作ってみたレポートを年次集計に対応させるだけのつもりでしたが、イマイチな点がたくさんあって、結局あちこち修正することになりました… 最低限の可視化の基盤は作れたので、今週⇔前週や今月⇔先週の比較が一目でできる、ダッシュボード的なページを作っていきたいと思います。

また、私の時間の家計簿には、時間ごとの行動記録以外にも、イベント(テキスト型)・飲んだコーヒー(整数型)・起床時刻(時刻型)・習慣化チェックリスト(Boolean 型)と、様々なデータを記録しています。これらのデータも活用できるように、Power Query・データモデルの再調整もバックログですね。