12.9K Views
August 22, 24
スライド概要
Power BIのフィルター コンテキストとCALCULATE関数について
フィルター コンテキストと CALCULATE関数を理解する 2024年8月 「料理は技法に走ったらだめだっ!!旨味だけを追ったらだめだっ!! 料理とは、素材にほれこんで、その素材の素晴しさを 一つでも多く引き出してやることなのだっ!!」 海原雄山 『美味しんぼ 第16巻 第5話 対決!!野菜編』より
自己紹介(k_makiとかいう人) 1. 職業: 金融機関でDX推進的なことをやる人 2. オンラインでは a. Qiita: k_maki – Qiita b. Github: knmaki (github.com) c. connpass: k_maki_ - connpass 2
目次 1. 動機付け 2. フィルター コンテキストとメジャー 3. CALCULATE関数の機能 4. CALCULATE関数の例 5. CALCULATE関数の真価 6. 次のステップ 3
動機付け 4
動機付け: こういうことができるように 1. フィルター コンテキストとCALCULATE関数を正しく理解するれば、 Power BIは潜在能力を発揮 2. CALCULATE関数活用例 a. 年度累計、前月比、前年同期比 b. カテゴリー別構成比 c. 期初の値で正規化 3. つまり a. セマンティックモデル内のデータを自由自在に集計可能 b. しかもスライサーやビジュアルによって動的に変化 c. さらに事前の集計は最小限に(=モデルをシンプルに保てる) 5
動機付け: アンチパターンは避けよう 1. Excel的発想(BI的発想がない) a. ビジュアル用にテーブル、メジャーを作成 b. 計算列多用:行コンテキストはとっかかりやすいけど。。 c. 無茶な計算:前日比を計算列やPower Queryでやろうとしたり。。 2. 初心者が使うべきではない関数を多用 a. FILTER, LOOKUPVALUE, GROUPBY, etc b. 結果悪いメジャーに ① ② ③ やたら難しい 特定のビジュアルでしか使えない・クロスフィルタリングが効かない パフォーマンスが悪い 3. 何をどうしたらよいかわからないのでスタースキーマの重要性もわ からない 6
フィルター コンテキストとメジャー 9
フィルター コンテキストの前に 1. 大前提として、ビジュアルは集約された結果を表示 テーブル ビジュアルを使っても明細は出せない(明示的な行識別IDがなければ重複す るデータは集約) (しかも、テーブル ビジュアルによる明細出力はCUを大量に消費するので、明細を共有したいならデータフローで) 2. 集約の条件がフィルター コンテキスト 3. なので、レポート中にフィルターコンテキストがあふれている(知 らなくてもね) 4. つまり、いつものレポートを注意深く観察することが、フィルター コンテキストを理解するきっかけに 5. 当たり前にあるけど、理屈がわからないというのはよくあること 10
フィルター コンテキストの前に ? テーブル ビジュアル で明細を出力しよう とすると 11
フィルター コンテキストの前に 集約される 12
フィルター コンテキストの前に 1. 大前提として、ビジュアルは集約された結果を表示 テーブル ビジュアルを使っても明細は出せない(行識別IDがなければ重複するデータ は集約されるため) (しかも、テーブル ビジュアルによる明細出力はCUを大量に消費するので、明細を共有したいならデータフローで) 2. 集約の条件がフィルター コンテキスト 3. なので、レポート中にフィルターコンテキストがあふれている(知 らなくてもね) 4. つまり、いつものレポートを注意深く観察することが、フィルター コンテキストを理解するきっかけに 5. 当たり前にあるけど、理屈がわからないというのはよくあること 13
フィルター コンテキスト例① マトリックス 1. 2015年九州地方いわし類= 182,693 ちょっとずつExcel発想 から抜け出そう 15
フィルター コンテキスト例① マトリックス 1. 2015年九州地方いわし類= 182,693 ちょっとずつExcel発想 から抜け出そう 16
フィルター コンテキスト例① マトリックス 1. 2015年九州地方いわし類= 182,693 ちょっとずつExcel発想 から抜け出そう ①絞り込んで 17
フィルター コンテキスト例① マトリックス 1. 2015年九州地方いわし類= 182,693 ちょっとずつExcel発想 から抜け出そう ①絞り込んで ②集計する 18
フィルター コンテキスト例② マトリックス 1. 2015年いわし類= 319,705 ここでしっかりExcel発想 から抜け出すこと 20
フィルター コンテキスト例② マトリックス 1. 2015年いわし類= 319,705 ここでしっかりExcel発想 から抜け出すこと 21
フィルター コンテキスト例② マトリックス 1. 2015年いわし類= 319,705 ここでしっかりExcel発想 から抜け出すこと ①絞り込んで 22
フィルター コンテキスト例② マトリックス 1. 2015年いわし類= 319,705 ここでしっかりExcel発想 から抜け出すこと ①絞り込んで ②集計する 23
フィルター コンテキスト例③ 折れ線グラフ 1. 1991年いわし類= 2,057,512 フィルター コンテキスト 完璧理解! 25
フィルター コンテキスト例③ 折れ線グラフ 1. 1991年いわし類= 2,057,512 フィルター コンテキスト 完璧理解! 26
フィルター コンテキスト例③ 折れ線グラフ 1. 1991年いわし類= 2,057,512 フィルター コンテキスト 完璧理解! ①絞り込んで 27
フィルター コンテキスト例③ 折れ線グラフ 1. 1991年いわし類= 2,057,512 フィルター コンテキスト 完璧理解! ①絞り込んで ②集計する 28
フィルター コンテキストとメジャー ①絞り込んで ②集計する 29
3. CALCULATE関数の機能 30
CALCULATE関数の重要性 1. コンテキストを変更することができる唯一の関数(CALCULATETABLEも) 2. コンテキストの変更により、モデル内のあらゆるデータを集計可能 3. BI的な発想へ:データポイントの横とかではなく、データポイント のコンテキストを変更して欲しい結果を取得する(ビジュアル計算 もあるけど) 31
CALCULATE関数の機能 1. シンタックス: CALCULATE(集計関数, フィルター引数1, フィルター引数2, …) 2. パラメーターの説明: a. 第一引数(集計関数): 集計関数のためのDAX関数(SUM、MAX、 COUNTROWS等)を設定 b. 第二引数以降(以下、フィルター引数と呼ぶ): ブール式またはフィルターを 生成するDAX関数を設定 ⇒ 既存のフィルター コンテキストとフィルター引数の相互作用で、新しいフィ ルター コンテキストを生成する(「コンテキスト変換」と呼ぶことにするが、MS公 式表現ではないことに注意) 32
CALCULATE関数の機能 明示的な引数以外に、既存のフィルター コンテキストも 計算要素となっていることに注意(わかりにくい) 33
コンテキスト変換の分類 34
4. CALCULATE関数の例 35
例① カテゴリー指定 ??? 37
例① カテゴリー指定 コンテキスト 変換 38
例① カテゴリー指定 集計関数 コンテキスト 変換 39
例② カテゴリー別の割合 1. CALCULATE関数を使って地方別漁獲量割合を計算する 2. 使用するメジャーは以下: 補足:VARは変数宣言、RETURNは戻り値の宣言 3. 九州、イワシ類の57%がどのように 計算されるかを確認しよう 40
例② カテゴリー別の割合 1. 2行目を確認 [漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) 集計関数 182,693 41
例② カテゴリー別の割合 1. 3行目を確認 [漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) ???
例② カテゴリー別の割合 1. 3行目を確認 [漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) コンテキスト 変換 ???
例② カテゴリー別の割合 1. 3行目を確認 [漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) コンテキスト 変換 集計関数 319,705
例② カテゴリー別の割合 1. 4行目を確認 182,693 / 319,705 = 0.571… 46
例③ 期初で正規化 1. CALCULATE関数を使って漁獲量の期初来割合を計算する 2. 使用するメジャーは以下: (# ^ω^) CALCULATEが2つもあるんですけどwww 3. 1991年、イワシ類の74が どのように計算されるかを 確認しよう 47
例③ 期初で正規化 1. 2行目を確認 [漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) 集計関数 2,057,512 48
例③ 期初で正規化 1. 3行目を確認 スライサーによるフィルター ビジュアル(のX軸)によるフィルター ??? 50
例③ 期初で正規化 1. 3行目を確認 スライサーによるフィルター コンテキスト 変換 ビジュアル(のX軸)によるフィルター ??? 51
例③ 期初で正規化 1. 3行目を確認 スライサーによるフィルター コンテキスト 変換 ビジュアル(のX軸)によるフィルター 集計関数 1986 52
例③ 期初で正規化 1. 4行目を確認 ??? 54
例③ 期初で正規化 1. 4行目を確認 コンテキスト 変換 ??? 55
例③ 期初で正規化 1. 4行目を確認 集計関数 コンテキスト 変換 2,788,861 56
例③ 期初で正規化 1. 5行目を確認 2,057,512 / 2,788,861 × 100 = 0.737… 57
5. CALCULATE関数の真価 58
CALCULATE関数の真価 1. 頑張ればExcelの関数でもできる? 覚えるのメンドクサイという意見もあるが。。。 2. 単純なメジャー動的な値となるのと同様、CALCULATE関数による メジャーも動的な値となる a. フィルター ウィンドウ、スライサーによる動的な分析が可能 b. ビジュアルの項目(X軸、凡例、見出し等)に合わせて値が変わる 3. セマンティック モデル作成者が使いやすいメジャーを用意すれば、 レポート作成者が分析しやすくなる(より深く、より自由に) この辺がデータ モデリングの醍醐味かも 59
真価① スライサーに応じて変化 1. スライサーの変化によるフィルター コンテキストの変化に応じて値 が変化 60
真価② ビジュアルの項目に応じて変化 1. 項目の変更によるフィルター コンテキストの変化に応じて値が変化 61
6. 次のステップ 62
アンチパターン 1. CALCULATE関数の理解を避けて、SUMX関数とFILTER関数でどう にかしようとすると失敗するかもね 漁獲量_いか類 = CALCULATE( SUM('F_漁獲量'[_漁獲量]), 'D_魚種'[魚種]="いか類“ ) 漁獲量_いか類NG1 = SUMX( FILTER('F_漁獲量', RELATED('D_魚種'[魚種])="いか類"), 'F_漁獲量'[_漁獲量] ) 漁獲量_いか類NG2 = SUMX( FILTER('F_漁獲量', RELATED('D_魚種'[魚種])="いか類"), SUM('F_漁獲量'[_漁獲量]) ) 漁獲量_いか類NG3 = SUMX( FILTER('F_漁獲量', RELATED('D_魚種'[魚種])="いか類"), [漁獲量] ) ?[漁獲量] = SUM(‘F_漁獲量’[_漁獲量]) 63
次のステップ 1. かがたさんの記事 a. メジャーがうまく書けないの?ぇ?なんで?Power BI 勉強会 #19 で話した こと #PBIJP #PowerBI – Qiita b. CALCULATE 関数 の ベストプラクティスなど - Power BI 勉強会 #23 で話し たいこと #PowerBI – Qiita 2. SQLBIの記事 a. Filter context in DAX explained visually – SQLBI b. Row context in DAX explained visually - SQLBI c. Understanding Context Transition – SQLBI 3. Power BI 勉強会 Power BI 勉強会 - connpass 64
THANK YOU