ビジュアルに味付けをするモデリングを考えよう

6/22 に Power BI 勉強会を開催するんですよ。で、ちょっとお話をまとめておこうかと思った次第。ビジュアルに味付けをするモデリングについて。ビジュアルにも役立つモデリング/メジャーの記述もありますよということ。
データモデルをよく理解しない/モデリングがよくわからないから という理由でちょいムチャしているのを割とよく見るのだけど、まぁ、ビジュアライズできなくもないですよ、でもね... と思うのです。それって途中の経緯がないから行き止まりの最終奥義。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">次回 Power BI 勉強会 @ 東京 #13 は 6/22(Sat) ですよ。 <a href="https://t.co/SgcClZ5JNy">https://t.co/SgcClZ5JNy</a> <a href="https://twitter.com/hashtag/PBIJP?src=hash&amp;ref_src=twsrc%5Etfw">#PBIJP</a></p>&mdash; Takeshi Kagata (@PowerBIxyz) <a href="https://twitter.com/PowerBIxyz/status/1137563100394033152?ref_src=twsrc%5Etfw">2019年6月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# こんな話をしようかなと
## ビジュアルのプロパティをよーく見て！たくさん試して！
しょっぱなからモデリングの話ではないけれども。
標準ビジュアルでもかなりのことができるのです。わかりにくいよねというのは私も思うところではあるのだけど、もともと存在しているビジュアルの機能なのだから使わない道理はない。悩む前に試して💢

## 必要なモデリングとはどんなだ？
ディメンジョンテーブルとファクトテーブル間のリレーションシップでスタースキーマにすることをお勧めするのは変わらずなので、それ以外というかそれ以前の話。
データモデルにロードされるのは "テーブル"になったデータなのだけど、これらテーブルはビジネスエンティティ / Business entity でよくて、どういうものかをざっくりいうと 顧客 とか 受注とか 在庫とかの一覧のこと。"行" がアイテムや事象のひとつを表していて "列" がその属性値といった感じでしょうか。集計された表との違いを理解できていない人、思いのほか多いです。

### 集計された表をテーブルにしない方がよい
と、いうかやってはいけないレベル。ピボットされた集計表は不適なことがほとんど。
Excel ピボットテーブルあるあるでいうと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/8727194e-1ac0-4280-fd7f-b0676784acdf.png)
ピボットテーブルで Category のフィルタができないじゃんってなりますよね。スライサの追加できなくない？集計された表からチャートを表現してくれる機能は素晴らしいとは思うけれども、これは Excel の支援機能のひとつであって、一方 Power BI では手取り足取りしてくれない。ビジュアライズする機能の目的というか範囲が違いますからね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/3472ce50-adec-807d-77cf-d3cdcd49c3a7.png)
Categoryでフィルタリングしたり、スライサを追加することもできる。なので、Excel でもこうしたほうがよいはずだし、Power BI ではとてもうまくいく。

### メジャーを記述すること
メジャーの記述をしないという覚悟はまったく無駄、必ず明示的に記述すること。って考えている。だって、暗黙のメジャーだけで済まそうとすると、ビジュアルでできることが少なくなるから。ビジュアルにもうちょっと味付けをしたいなと思ったとき、必要な値や計算はどんなことかなと整理したらよい。

## カスタム ビジュアルの使用も検討する
標準のビジュアルでできない表現は カスタム ビジュアルが役立つ。ただし、前項モデリングの問題を解決していない場合は残念ながら徒労に終わることが多いので、できるだけ順番に解決しておくことが必要と思う。

# たとえば ...
以前参加したイベントであった質問を例として挙げてみる。たぶんデモなり解説なりする予定。
本当にそのビジュアルは必要なのか？というのは別の問題ということが前提。
## 特定のカテゴリをハイライト
最大値であるカテゴリをハイライトしたい。だいたいそんな感じだった。フィルタを適用したり、データが追加されていけば最大値は変化するので、ビジュアルのプロパティで設定しても希望を満たさない。テーブルやマトリクスであれば "条件付き書式" でよさそうだけど、棒グラフ だったらどうしたらよいか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/4aa53a19-33e6-c868-76f0-0e9903e66e14.png)

"最大値を強調"の考え方としては、ふたつの計算が必要。

- 選択範囲内での最大値
- 最大値と比較

これらを使ってビジュアルに反映させればよい。[Infographic Designer](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA104380898) で割と簡単。許容される範囲に収まる可能性は高いけど表示は遅い。標準ビジュアルの場合は追加の計算が必要。だけど表示が速い。

## で、やってみる
当日自習時間でやろうとおもったのだけど気持ちがざわざわしてたので。

### ビジュアルの機能で

まぁこんな関係で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/990660c2-4a67-555e-e458-f186f36e8782.png)

```text:受注額
受注額 = 
    SUMX(
        '受注',
        '受注'[数量] * RELATED( '商品'[単価] )
    )
```

スライサで選択された中で最大の[受注額]を求めたいので

```text:受注額(Max)
受注額 (Max) = MAXX( ALLSELECTED( '担当'[氏名] ), [受注額] )
```
ね、簡単でしょ！とするけれども、こうなってしまうことがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/028de5f7-19c6-bb37-d7c8-92efc6ca5940.png)

"列で並べ替え" を '担当'[氏名] で適用しているから。なぜこうなるかはビジュアルのために用意された DAX クエリを読み解くとよいですよ。

```text:受注額(Max)
受注額 (Max) = 
    MAXX(
        ALLSELECTED( '担当'[氏名], '担当'[社員ID] ), // 並べ替えに使用した列も追加する
        [受注額]
    )
```
ね、簡単でしょ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/d66f286c-df7b-72b3-e559-8f9230e76294.png)

今回は金額を必要としないので、真偽を整数に置き換えた。そのほうがビジュアルでうまくいくことが多いから。そのままでも別に構わないこともありますよ。

```text:受注額(IsMax)
受注額 (IsMax) = 
VAR MaxAmount =
    MAXX(
        ALLSELECTED( '担当'[氏名], '担当'[社員ID] ),
        [受注額]
    )
VAR Result = INT( MaxAmount = [受注額] )
RETURN
    Result
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/9d6f3343-2677-43a5-92e7-64dbc80b26ab.png)

Infographic Designer を配置して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/a7807c9f-6754-a3eb-aa32-a0214401e5a1.png)


Mark Designer で "Fill Percentage" を設定するだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/47f52f64-3784-db77-3f1a-6caa7d878648.png)

ね、簡単でしょ！

標準のビジュアルにはこの機能はないので、こんな感じのメジャーを使うとよいのではないかな。

```text
受注額(Max) =
    IF( [IsMaxSalesAmount] = 1, [受注額] )
受注額(Other) = 
    IF( [IsMaxSalesAmount] = 0, [受注額] )
```
### 条件付き書式を使う
あーそういえば、条件付き書式ありましたね。こんな感じにすればメジャーとかなくてもよいのである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/f31d68b1-adb2-7b7d-2f7a-c44fea37428a.png)


### 書式をメジャーで定義する

```text
BarColor = 
    VAR MaxSales = 
        MAXX( ALLSELECTED( '社員'[社員ID], '社員'[氏名] ), [受注額] )
    RETURN
        IF(
            [受注額] = MaxSales,
            "#F2C811",
            "#CCCCCC"
        )
```

条件書式で色を指定するメジャーを記述して設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/dc9f1b59-b417-0f5d-2d8f-3a6f5b3961fa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/be7e95eb-e144-3d13-cade-844591f110cf.png)


# 思ったこと🙄
Power Query / データモデル(モデリングとメジャー) / ビジュアル、どれかひとつだけでもできればいいやってことにはならないですね。すべてをまんべんなくできるようになっておかないとダメなんだろうね。ビジュアルのためにダミーデータを追加してごにょごにょするのってたまに見かけるけれども、全く興味がない。ファクトデータをいじるってことだからデータ改ざんのひとつじゃねと思うのです。

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)