【PowerBIメモ】DAX事始め　～計算列とメジャーを理解する～

PowerBIには、Data Analysis Expressions(DAX)という数式の部品として利用できる関数や演算子ライブラリが組み込まれています。


公式リファレンスでは以下のような記載があります。

>DAX は、計算を実行して 1 つ以上の値を返すために数式 (式) 内で使用できる関数、演算子、および定数のコレクションです。つまり、DAX を使用すると、モデル内に既にあるデータから新しい情報を作成できます。

引用：[クイック スタート: 30 分で学ぶ DAX の基礎](https://support.office.com/ja-jp/article/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF-%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-30-%E5%88%86%E3%81%A7%E5%AD%A6%E3%81%B6-DAX-%E3%81%AE%E5%9F%BA%E7%A4%8E-51744643-c2a5-436a-bdf6-c895762bec1a)

要するに、PowerBI上に取り込んだデータを基に、何らかの計算による結果を出すために利用できる言語だということです。

このDAXですが、使い始める前にある程度概念や使いどころを理解していないと、
使いはじめ早々挫折する可能性があります。
もちろん、私も挫折しましたw
まだ完全に理解できているわけではないですが、初歩的なことをお伝えして、なんとか挫折者を少なくしたいと思います。

#１　DAXはどこで使う？

まず理解すべきは、PowerBIにおけるデータ取り込みからグラフ化までのフローと、
その背景に使われている技術です。

以下にイメージ図を書きました。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/165789/2de69f40-2795-5a53-2fb7-ea6b3a44147a.png)

DAXが利用されるのは、データセットに対する***計算列の追加***と***（集計）メジャーの作成***のプロセスです。
例えば外部データからの取り込み、データの加工・編集は、PowerQueryという言語が使われています。
DAXとは全く違う言語が使われていること理解できると、DAXの勉強が捗ります。
*※PowerQueryで計算列の追加などができないわけではありません。あくまでDAXの主要な役割を整理するための概念として参考にしてください。*


#２　PowerQueryの記載場所

ちょっと蛇足ですが、PowerQueryが適用されている場所を確認します。
PowerQueryはPowerBI上のクエリエディタで利用されている言語です。

データの取り込みを行うと、このような画面に遷移します。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/165789/4a64ea07-08c7-98ef-af6f-849bf0fa4c5e.png)
クエリエディタでデータ形式の変換や、エラー削除等のデータ加工を行いますが、
GUI上での操作過程が「適用したステップ」として記録されていきます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/b6a69565-a6f1-6acc-4545-32383ec0c938.png" width = 200>

この操作は、PowerQueryのプログラムとして登録されていきます。
ホームタブの「詳細エディタ」を選択してみましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/b122a0e5-2971-5e5a-f543-74b1f4c6ced0.png" width = 500>

```
let
    ソース = Csv.Document(Web.Contents("http://www.soumu.go.jp/johotsusintokei/field/csv/gt010101.csv"),[Delimiter=",", Columns=3, Encoding=932, QuoteStyle=QuoteStyle.None]),
    変更された型 = Table.TransformColumnTypes(ソース,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}}),
    削除された最初の行 = Table.Skip(変更された型,5),
    昇格されたヘッダー数 = Table.PromoteHeaders(削除された最初の行, [PromoteAllScalars=true]),
    変更された型1 = Table.TransformColumnTypes(昇格されたヘッダー数,{{"西暦年", type text}, {"利用者数", type text}, {"人口普及率", type text}}),
    削除された最初の行1 = Table.Skip(変更された型1,6)
in
    削除された最初の行1
```

上記は、とあるデータの加工ステップですが、自動的に作成されています。
このコードがPowerQueryです。

PowerQueryの説明もしたいですが、ここでは割愛。
というか、まだまだ勉強不足。。。

ひとまず、これでPowerQueryがどこで使われているか分かりました。

#３　DAXの実際

ではDAXはどこで使われているの？

こちらです↓
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/165789/308bd616-c835-bf33-4030-96133afb4f89.png)

テーブル画面の上部、数式バーに記載されているコードがDAX式です。
Excel関数をイメージしていただければいいかもしれません。
データテーブルに対して、どのような処理を行うのかが書かれています。

#４　計算列とメジャーの違い

DAXは「計算列」の作成と、「メジャー」の作成で利用できます。
なにが違うのでしょうか？？
公式リファレンスでは以下のような解説があります。

>計算列は、メジャーと同様 DAX 数式に基づきますが、使い方が異なります。 メジャーが最も使用されるのは、テーブルの行にある他のフィールドに基づいて結果を計算するための視覚化の [値] 領域です。また、視覚化の [軸] や [凡例]、[グループ] 領域でも使用されます。 一方、計算列が使用されるのは、テーブル内の行や、[軸] 領域、[凡例] 領域、または [グループ] 領域内の行の列の結果が必要な場合です。

引用元：[チュートリアル: Power BI Desktop で計算列を作成する](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-tutorial-create-calculated-columns/)

かみ砕くとこんな感じ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/19eb982b-c028-9485-a580-33b5a2d8f28e.png" width=600>

レコード単位でデータが必要なケースは計算列をDAXで追加します。
以前記事にしたカレンダーテーブルの作成は典型的な計算列追加の例です。
[【PowerBIメモ】時系列データとうまく付き合うための整理・可視化・分析・予測Tips](https://qiita.com/h_kobayashi1125/items/0db6efe91db7df821429)

例えば、とある身長・体重リストからBMIを計算する場合。
一人ひとりのレコード単位でBMIを計算し、テーブルに付け加えないといけませんよね。
この場合は以下のように計算列を追加します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/4e91a433-f5f6-8ef1-81b7-d56e6adf2970.png" width = 600>

```
BMI = [体重] / ( [身長]/100 )^2
```


Excelを使い慣れている日本人にとって、計算列は容易にイメージがつきます。
問題はメジャーちゃん。

#５　分かりにくいメジャーのお話

メジャーは“固定のデータ”ではなく、“集計する条件”というイメージを持つと分かりやすいかもしれません。

先ほどのBMIの例、平均を計算したい場合はどのようにすべきでしょうか？
列の追加は意味がないことはお分かりですね。

以下のようなメジャーを作りましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/b2e3e4e7-83b7-963c-afb5-5006811330d6.png" width = 600>

```
BMI平均 = AVERAGE('テーブル1'[BMI])
```

この「BMI平均」というメジャー。
フィルタ条件によって色々な値を出力することは容易に分かりそうですね。
PowerBI上で「BMI平均」をグラフ化してみます。
フィルタ（軸）条件に「クラス（Aクラス or Bクラス）」を使いましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/5f00c2cd-7a6d-c289-7376-ad5c6e5b11b0.png" width = 600>

しっかりクラスごとに平均点が計算されています。
可視化の条件設定に応じて、メジャーは色々な形にデータが変わるのです。

#６　実は裏で活躍しているメジャーちゃん

ところで、先ほどの追加した計算列「BMI」、
これをそのまま値フィールドにもってくるとどうなるでしょうか。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/1e6fbbed-06fb-e234-1bfe-0d7de6c0c6b3.png" width=600>

同じ値になりました。
じつは計算列を値フィールドに持ってきて、「平均」を選択すると同じグラフが作れます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/935698e8-d232-77fa-5f96-9d5ceb41599c.png" width=600>

これ、実は裏でメジャーが自動生成されているだけと理解してください。
計算列の合計や平均、最小値などの単純な統計指標は、クリック操作だけでできるようになっているのです。
（当初はこれのイメージが全くつかず、混乱していました・・・）

ちなみに、高度なメジャーを自動作成する機能もあります。
詳細は以下公式リファレンスで。
[クイック メジャーを使用して一般的で強力な計算を簡単に実行する (プレビュー)](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-quick-measures/)


#７　おわりに

計算列とメジャー、目的の違いや利用方法のイメージはつかめたでしょうか。
ここをクリアにできると、DAX関数の勉強など、次のステップに進めると思います。
いずれそのあたりまでQiitaで書けるといいですが・・・。