Power BI で What-if 分析するには

Power BI Desktop の2017年8月の更新で What-if 分析を行えるレポートの作成が簡単にできるようになったので使い方設定などの解説メモ。

What-if分析とは 特定の要素(値)が変化することで関連する値がどのように影響を与えるのかというさまざまな分析うちのひとつ。

# 追加された DAX 関数
- Power BI Desktop(2.49.4831.521 / 2017-Aug)で追加された関数
- Excel の Power Pivot や SQL Server Analysis Services でもいずれ使えるようになると考えられる。

## GENERATESERIES - DAX 関数
[GENERATESERIES | MSDN - DAX Function Reference][GENERATESERIES]
開始および終了の範囲の連続した数値をひとつの列にしたテーブルを返す。

```text:構文
GENERATESERIES(<startValue>, <endValue>[, <incrementValue>])

startValue : 開始の値
endValue : 終了の値
incrementValue : 増分はオプション / 既定値は 1
```
```text:例1
GENERATESERIES(1, 5)
```

|Value|
|--:|
|1|
|2|
|3|
|4|
|5|

という、**列がひとつのテーブル** が返る。

他テーブルと変わりがなく、計算列(Caluclated Column)を追加してレポートのページフィルタに使ったり、増分が異なる結果を [UNION | MSDN - DAX Function Reference][UNION] で結合すると、すこし複雑なテーブルを生成できる。

```text:例2
UNION(
    GENERATESERIES(7, 10)
   ,GENERATESERIES(20, 40, 20)
)
```
|Value|
|--:|
|7|
|8|
|9|
|10|
|20|
|40|

### 注意
incrementValue が小数を持つ値のときなどビタっといかないことがある。
くわしくは、[Generating a series of numbers in DAX - SQLBI](https://www.sqlbi.com/articles/generating-a-series-of-numbers-in-dax/) がとても参考になります。
機微な数値を扱うことでなければ表示書式での対応でもよいし、[CURRENCY | MSDN - DAX Function Reference][CURRENCY]を使うと期待する結果が得られそうです。

```text:例3
SELECTCOLUMNS(
    GENERATESERIES(-0.25, 0.25, 0.05),
    "Value", CURRENCY([Value])
) 
```
ELT作業があれば、クエリ エディター / Power Query で生成するのもよいかと。

## SELECTEDVALUE - DAX 関数
[SELECTEDVALUE | MSDN - DAX Function Reference][SELECTEDVALUE]

フィルタリングされたテーブルの **列の値がひとつのとき** その値を返す。

```text:構文
SELECTEDVALUE(<columnName>[, <alternateResult>])

columnName : テーブルの列名
alternateResult : 列の値がひとつでないとき返すオプション / 既定値は BLANK()
```

|地区名|人数|
|:--:|--:|
|西地区|10000|
|東地区|5000|
|南地区|300|
というテーブル : 地域 があったとして、

```text:例4
SELECTEDVALUE('分布'[地区名], "---")
```
テーブルに対し、

- '分布'[人数] > 8000 とか '分布'[人数] < 1000 のフィルタがされたとき、地区名を返す。
- '分布'[人数] > 4000 とか '分布'[人数] < 9000 のフィルタがされたとき、文字列"---" を返す。
- '分布'[人数] = 6000 とか '分布'[人数] < 200 のフィルタがされたとき、文字列"---" を返す。

```text:例5-同様の結果を得られる記述
IF(
    HASONEVALUE('分布'[地区名]),
    VALUES('分布'[地区名]),
    "---"
)
```
[Using the SELECTEDVALUE function in DAX -SQLBI](https://www.sqlbi.com/articles/using-the-selectedvalue-function-in-dax/) にはいくつかの利用パターンが紹介解説されているので必読です。

# What-if 分析できる レポートを作成
前段で紹介した2つの新しいDAX関数が利用される機能が追加されたので使ってみる。

## 試してみる
![モデリングタブ → What-ifグループ → 新しいパラメーター](https://qiita-image-store.s3.amazonaws.com/0/193509/d9e85813-bd4b-15bb-c673-8734c9ebdb3a.png)
[モデリング]タブ → [What-if]グループ → [新しいパラメーター]

![What-if パラメーター ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/193509/ddcc6a3f-53c3-0679-af77-11de7e77227f.png)
試しにそのまま [OK]
レポートには スライサーが、データモデルにはテーブルとメジャーが自動的に追加される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/3c880d53-b0ff-f6cf-3c63-165b58da31b3.png)

```text:追加されたテーブル
パラメーター = GENERATESERIES(0, 20, 1)
```
```text:追加されたメジャー
パラメーター 値 = SELECTEDVALUE('パラメーター'[パラメーター])
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/3548459d-a031-84fa-70ff-f512d751ced2.png)
動作を確認するため カード ビジュアルをレポートのページ追加し、フィールドには作成されたメジャーを設定してみた。パラメーターを変化させるスライサーは既定の状態で値が選択されていない状態なので、カード には (空白) もしくは (BLANK)が表示される。スライサーを操作すると対応する値がカードビジュアルに表示されるはず。

## サンプル - もう少し具体的に
受注に関するファクトテーブルから受注額の増減具合をパーセンテージ指定しで試してみるサンプル
追加された機能[新しいパラメーター]を使わなくても作業は可能。

|列名|データ型|
|:--|:--|
|受注日|日付|
|数量|整数|
|単価|通貨|

```text:集計用メジャー
受注額 = SUMX('受注', [数量] * [単価])
```
```text:パラメータ用テーブル
増減率 =
SELECTCOLUMNS(
    GENERATESERIES(-0.25, 0.25, 0.05),
    "増減(%)", CURRENCY([Value])
)
```

```text:パラメーター用メジャー
選択された増減率 = 
SELECTEDVALUE(
    '増減率'[増減(%)],
    0
)
```

```text:パラメーターに関連して増減させるメジャー
受注額(What-if %) = 
[受注額] * (1 + [選択された増減率])
```

例えば、集合縦棒グラフを用いて 軸 は [日付]フィールド、値に [受注額]と[受注額(What-if %)]のメジャー2つを配置。フィールドへは[増減(%)] を設定したスライサーを同じページに配置。スライサーを操作すると凡例でいうところの [受注額(What-if %)]が変化する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/29137372-1b5c-f169-ce1d-2f5a789ba2a2.png)


# 情報
[Power BI Desktop August Feature Summary | Microsoft Power BI ブログ](https://powerbi.microsoft.com/ja-jp/blog/power-bi-desktop-august-2017-feature-summary/)
[Query and Data Modeling Languages | MSDN](https://msdn.microsoft.com/en-us/library/mt244090.aspx)
[Articles - SQLBI](https://www.sqlbi.com/articles/)

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

[CURRENCY]:https://msdn.microsoft.com/en-us/library/gg492191.aspx
[UNION]:https://msdn.microsoft.com/en-us/library/dn802530.aspx
[SELECTEDVALUE]:https://msdn.microsoft.com/en-us/library/mt842608.aspx
[GENERATESERIES]:https://msdn.microsoft.com/en-us/library/mt842624.aspx