[Power BI] 計算グループ（Calculation Groups）を実装し、JAPAN RUGBY LEAGUE ONE の選手をポジション別に集計したあと、箱ひげ図で可視化する。

# はじめに

下記シリーズ連載の続きになります。

https://qiita.com/hanaseleb/items/ffb70fba16aa073a8814

https://qiita.com/hanaseleb/items/a6f77d453107bd05acf4

## やってみたこと

計算グループ（Calculation Groups）使用してポジション別の平均体重、最高体重などを集計したテーブルを作成し、箱ひげ図で可視化する。

https://app.powerbi.com/view?r=eyJrIjoiOGMzYTNmMTAtMGY1MC00OGEwLWExOGQtOTgyZDdhNDdiNTU5IiwidCI6IjdkMDZmZWVlLWI3MzYtNDE3Zi1hMGUyLTE3NTZjOTdiMDU5YyJ9&pageName=ReportSectionde1d926add5acb2becbb

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f71557d0-c390-7993-f441-0b39ec380938.png)

## 計算グループ / Calculation Groups とは

公式Documentsから引用。

>計算グループを使用すると、一般的なメジャー式を 計算品目 としてグループ化することにより、冗長なメジャーの数を大幅に削減できます。



### 今回のレポートでいうと

公式HPより取得した選手一覧からポジションを抜き出すと、下記の11種類あります。

- PR
- HO
- LO
- FL
- NO8
- SH
- SO
- CTB
- WTB
- FB
- 登録なし


http://www.honda-heat.jp/position.html

たとえばPRの平均体重を求めるDAXはこうなります。

```datastudio
PRの平均体重 =
CALCULATE (
    AVERAGEX (
        'Height&Weight',
        'Height&Weight'[Weight]
    ),
    'Height&Weight'[Position] = "PR（プロップ）"
)
```

通常通りDAXを書いていくと、この式をポジション別にあと**追加で10個書く必要**があります。
また、じゃあ平均身長、最高体重、最高身長、最低体重、最低身長・・なんて集計が必要なればなるだけ、**×11個のメジャーを記述する必要**が出てきます。

そこで登場するのが**計算グループ（Calculation Groups）**です。

## 必要なツール

**計算グループ（Calculation Groups）はPower BI Desktopでは実装できません。**
Tabular Editorというツールが必要です。無料版（コミュニティエディション）のTE2と、有料版のTE3があります。

スクリーンショットはTE3で撮っています。今回でてくる操作はTE2とTE3でほとんど変わりません。

- [Tabular Editor 2](https://github.com/TabularEditor/TabularEditor/releases/)
- [Tabular Editor 3](https://tabulareditor.com/)

## 実装

ということで、Tabular Editorを使用して実装に移ります。

### ベースメジャーの作成

```datastudio
AVERAGEX(
    'Height&Weight',
    'Height&Weight'[Height]
)
```

身長の平均を求めるDAXを記述。この時点では、チームやポジションでのフィルターについては考慮しません。

### `Calculation Group`の作成

Tabular Editor を開いて、TOM ExplorerでTableを右クリックして`Calculation Group`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f5549b22-d9a2-4592-e35b-ce6df15c3cda.png)

### New Calculation Group

New Calculation Group ができたら、そこをさらに展開して、`Calculation items`を右クリックして`Calculation item`作成へと進んでいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/97795d1e-b9c5-4a1e-cdb4-34a2c9c72e17.png)

### `Calculation item`作成

計算グループ（Calculation Groups）はここに具体的に記述していきます。今回はポジション別にさまざまな指標を求めていきたいので、ポジションごとのフィルターコンテキストを追加していきます。

ここで出てくる`SELECTEDMEASURE()`関数が特殊で、評価時にベースメジャーに置き換わるプレースホルダーです。特に引数ももちません。

```datastudio
CALCULATE(
    SELECTEDMEASURE(),
    'Height&Weight'[Position] = "PR（プロップ）"
)
```

`datastudio
CALCULATE(
    SELECTEDMEASURE(),
    'Height&Weight'[Position] = "HO（フッカー）"
)
`

といったかたちでポジション分作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/bcfb853e-f3c7-be80-4f9d-2549276b529c.png)

### 順序の調整

`Properties`の`Ordinal`の数字を変更すると、小さい数字から順に並び替わります。スライサーなどにするときもこの順番が生かされるので、必要なら使用してください。今回はFWからBKになるように順番を決めてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/0a9f9b34-d454-34d4-37c0-b556446f88ed.png)

### テーブル名、カラム名

計算グループ（Calculation Groups）を作成して、Power BI Desktopに反映すると下図のような名前になっています。Tableau Editorで確認すると、対応する部分がわかります。それぞれ、適当な名前をつけておきます。

#### Power BI Desktop

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f2988cd1-be03-2206-369b-6e47ccacac21.png)

#### Tableau Editor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/de27b52e-f54a-da4b-5a1a-84528aee67bc.png)

## ビジュアルの作成

Power BI Desktop でマトリックスビジュアルを選択し、「行」にチーム名、「列」に計算グループ（Calculation Groups）を適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/7b8504bc-72b9-c56d-fce9-27e47ad56979.png)

ここまでしかやらないと、エラーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8b4677aa-03a3-6ce9-203d-85080bf6c2ff.png)

これはまだ**「値」**を設定していないため、ベースメジャーなく、`SELECTEDMEASURE()`が置き換えるメジャーがないためエラーとなってしまっています。

ここで、値に`Ave_Height`を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/0ba57a44-2296-1064-3e08-63846456d5f4.png)

```datastudio
Ave_Height = AVERAGEX(
    'Height&Weight',
    'Height&Weight'[Height]
)
```

### 結果１

期待通りの数値がでました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/dd986355-ab56-7110-6977-fa2312a561f9.png)

## ベースメジャーを追加

ここまで作成をすると、あとはベースメジャーを追加していくだけで、ポジションごとの集計を追加していくことができます。以下６項目でマトリックスを作成してみます。

1. 平均身長
1. 平均体重
1. 最高身長
1. 最低身長
1. 最高体重
1. 最低体重

```平均体重ベースメジャー.dax
Ave_Weight = AVERAGEX(
    'Height&Weight',
    'Height&Weight'[Weight]
)
```

`最高身長ベースメジャー.dax
MAX_Height = MAXX( 'Height&Weight', 'Height&Weight'[Height] )


```最高体重ベースメジャー.dax
MAX_Weight = MAXX( 'Height&Weight', 'Height&Weight'[Weight] )
```

### 結果２

ベースメジャーを**「値」**にどんどん放り込むだけで、各種指標でポジション別に数値を検証することが出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e3af4b71-8be4-f866-6c26-08cdc42d25fb.png)

## スライサーを追加

**計算グループ（Calculation Groups)** を使って作成したビジュアルは、**計算グループ（Calculation Groups)**のスライサーで表示をコントロール可能です。

横にかなり長い表になってしまっているので、`LO`でフィルターします。

### 結果３

無事期待どおりの数値が出ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f37f721f-8b99-5d9a-f493-ab89a173e75e.png)

## 箱ひげ図の追加

デフォルトのビジュアルでは箱ひげ図はサポートされていないので、カスタムビジュアルを追加します。今回はこれを追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9c5cd8a1-a334-eb1b-40b9-17ec6e00ad50.png)

箱ひげ図はデータの最大値、最小値、四分位数、四分位範囲、平均値が一目でわかり、大まかな散らばり具合を把握でき、複数のデータを比較しやすいという特徴があります。

### 結果４

箱ひげ図を作成することができました。ざっと見た感じで、FLとCTBの体格分布が似ていることなどがわかります。散布図ではわかりにくかったデータの広がりも比較しやすくていいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/1d0b5097-5dfc-8cc5-7299-6c280308e73c.png)


## 完成

https://app.powerbi.com/view?r=eyJrIjoiOGMzYTNmMTAtMGY1MC00OGEwLWExOGQtOTgyZDdhNDdiNTU5IiwidCI6IjdkMDZmZWVlLWI3MzYtNDE3Zi1hMGUyLTE3NTZjOTdiMDU5YyJ9&pageName=ReportSectionde1d926add5acb2becbb

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f71557d0-c390-7993-f441-0b39ec380938.png)

## まとめ

計算グループ（Calculation Groups）を使用してレポートを作成できました。計算グループ（Calculation Groups）の使用場面の王道はタイムインテリジェント関数との組み合わせで解説しているものがほとんどですが、こういったよりシンプルな題材で手を動かせば理解は早くなるなと感じます。とても便利な半面、よくよく調べていくと落とし穴もたくさんあるので、少し複雑な局面で使う際には要注意な関数だと思います。公式DocumentsやSQLBIなど勉強必須:relaxed:

## 公式Documents

https://docs.microsoft.com/ja-jp/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions

## 参考資料

https://www.sqlbi.com/calculation-groups/