計算列
- テーブルに新しい列を追加する
メジャー
- 計算列のようにデータをモデルにインポートせず動的に計算する
- 計算列とメジャーの違い
暗黙的なメジャー
- 合計・平均・最大・最小などビジュアルが自動計算する
明示的なメジャー
- DAX式を用いて複雑な式を記述できる
反復子関数
- SUM、COUNT、MIN、MAX などの単一列の集計関数に接尾辞 "X" がついた関数
- 複数列を計算することができる
Revenue =
SUMX(
Sales,
Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)
DAX関数
- DAX関数において、列を参照する際にテーブル名は省略することができる
Revenue = SUM([Sales Amount])
が、列名は必ずしも一意とは限らないので、曖昧さを避けるため列参照の前にはテーブル名を明示することを推奨
Revenue = SUM(Sales[Sales Amount]) # SalesテーブルのSales Amount列を参照
同様にメジャー参照の前にテーブル名を記載することもできるが、メジャーはデータペインでメジャーを論理的に整理するための表面的な関係にすぎず、混乱避けるためメジャー参照の前にはテーブル名は記載しないことを推奨
- スペース・タブ・キャリッジリターンを適切に使用し、可読性の高い式を書く
❌ NG
Revenue YoY % = DIVIDE([Revenue] - CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date])), CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date])))
✅ OK
Revenue YoY % =
DIVIDE(
[Revenue]
- CALCULATE(
[Revenue],
SAMEPERIODLASTYEAR('Date'[Date])
),
CALCULATE(
[Revenue],
SAMEPERIODLASTYEAR('Date'[Date])
)
)
数式バーからフォーマットすることが可能なほか、外部サービスで DAX Formatter も用意されている
- 除算は
DIVIDE関数か除算演算子 (/)で行う- 通常は
DIVIDEを使用することで値が0だった場合のIF分岐を書く必要がなくなり、可読性が向上する - 0が存在しないことが保証される場合には除算演算子で行うことで不要なテストが省略されパフォーマンスが向上する
- 通常は
- 厳密比較演算子
- 厳密比較演算子
==以外の全ての比較演算子はBLANK を、数値のゼロ、空の文字列 ("")、1899 年 12 月 30 日の日付、または FALSE に等しいものとして扱う - 0 = BLANK は True となり、 0 == BLANK は False となる
- 厳密比較演算子
パフォーマンス
-
クエリフォールディング
- Power Queryで行った処理をネイティブクエリに変換し実行することでパフォーマンスが向上する
- 使用できるのはGROUP BY、SORT BY、WHERE、UNION ALL、JOIN などの演算子や句を含む Select SQL ステートメントに変換できる場合のみに限られる
-
クエリの診断でパフォーマンス上のボトルネックを分析
- ホーム -> ツール -> 診断の開始
-
元のデータ ソースでできるだけ多くのデータを処理する
- Power Query で処理するより、できるだけ元のデータソースの時点で処理しておく
-
ネイティブ SQL クエリを使用する
- SQL データベースに DirectQuery を使用する場合 は、ストアド プロシージャや共通テーブル式 (CTE) からデータを取得せずネイティブSQLクエリを使用する
-
日付と時刻が結合されている場合は、分割する
- 日付と時刻が結合された列を含むテーブルがある場合は、それらを別個の列に分割してから Power BI にインポートする
- この方法により、圧縮機能が向上する
-
列の削除はデータ処理プロセスのできるだけ早い段階で行う
- SQLで取り込んでいる場合、その時点で不要な列は除外する
-
カーディナリティを低くする
- カーディナリティが低い(列内に一意の値が少ない)ほどパフォーマンスが最適化されるため、モデル内にカーディナリティが高い列を少なくする
-
自動日付/時刻オプションを無効化する
- Power BI ではデフォルトで自動日付/時刻オプション(日付列ごとに非表示の計算テーブルを自動的に作成する)がグローバルに有効化されている
- カレンダーの期間をフィルター処理、グループ化、ドリルダウンするときにタイム インテリジェンスを使用して操作する要件がある場合のみ有効化する
- データソースに既に日付ディメンションテーブルを定義している場合は、そのテーブルを使用し、自動日付/時刻オプションは無効化することでパフォーマンスが向上する
Power Query
ストレージモード
- インポート
- 規定の選択肢
- データソースをPowerBI内部(セマンティックモデル)にコピー
- データ更新はスケジュール or オンデマンドで可能
- DirectQuery
- データ ソース内のデータを直接クエリでき、コピーを Power BI にインポートせずにすむ
- パフォーマンス向上・常に最新データの表示を保証などのメリット
- データをコピーできないなどのセキュリティ要件に対応
- デュアル (複合)
- インポートとDirectQueryをPowerBIが判断して使い分ける
プロファイリング
- 異常値(null, empty, 想定する最大値・最小値を超える値...etc)を調べることができる
- デフォルトでは最初の1000行をサンプリングしてプロファイリングするが、ステータスバーから全体をプロファイリングさせることも可能
フィルター
- フィルターは非表示 or ロックして削除されることを防ぐことができる
- ユーザーがフィルターを操作する必要がない場合、それらを使用することを推奨
スライサーとの使い分け
- フィルターのメリット
- レイアウト領域を占有しない
- 複雑なフィルタ条件が使用可能
- ビジュアルレンダリングが不要なのでレンダリングが高速
- スライサーのメリット
- 視覚的にわかりやすくユーザーフレンドリー
- ビジュアル対話を使用することで特定のビジュアルにのみフィルタを適用できる(フィルタはレポート上の全てのビジュアルに適用される)
- スライサーのデメリット
- レイアウト領域を占有する
- レンダリングのためパフォーマンスに影響を与える可能性がある
- 推奨事項
- スライサーとフィルターはユーザーの混乱を招くので共存させない
- スライサーが多くなる場合は、スライサーのみのページを作成し、レポートページ上のスライサーを非表示にした上でスライサーページと同期する
推奨事項
- 利用者が簡単に分析情報を得られるよう、各ページを関連データのみでシンプルに保つことが理想的
- テーブル、列、値の名前付けに関するベスト プラクティス
ベスト プラクティスは、テーブル、列、メジャーに説明的なビジネス用語で名前を付け、アンダースコア ("_") をスペースに置き換えることです。 略語、接頭辞、および "番号" や "ID" などの単語は一貫性を持たせてください。組織内で一般的に使用されていない場合、短すぎる略語は混乱を招く可能性があります。
- ❌ vProductFactTable
- ✅ Products
- ❌ sub_category
- ✅ Sub Category
UX に優れたレポートデザイン
- 表示状態をブックマークすることでビジュアル切り替え機能を実装
- オーバーレイを重ねた状態をブックマークし、レポートの使い方をツアーのように表示
- ユーザーにとってボタンがボタンと理解できるよう、ホバー時にエフェクトをつける(カーソルを指に、文字色を変化させる)
-
ユーザーの操作を想定しない場合は、ビジュアルヘッダーを非表示にする、あるいは特定のアイコンを非表示にすることで、ユーザーの気を散らさないようにする
-
使い方のみで構成された「レポートの使い方ページ」を作成し、各ページにインフォアイコンボタンを設置して遷移できるようにする
https://learn.microsoft.com/ja-jp/training/modules/power-bi-effective-user-experience/7-design-built-in-assistance -
パフォーマンスアナライザーを使って各ヴィジュアルの操作に要する時間を計測する(正確に計測するため、事前にビジュアルキャッシュとデータエンジンキャッシュをクリアしておく)
- 表示 > パフォーマンスアナライザー > 記録の開始
スケジュールされた更新
- 更新頻度はPower BIのプランによって異なり、Proは8/日、Premiumは48/日のタイムスロットを構成できる
スケジュール実行タイミング
スケジュール実行タイミングはベストエフォートであり、指定時刻の15分以内を目標として実行される。
リソースの状況次第では1時間程度遅延が発生する可能性がある。
https://learn.microsoft.com/ja-jp/training/modules/manage-datasets-power-bi/5-dataset-refresh
スケジュールの無効化
レポートにユーザーがアクセスしない場合、2ヶ月間の非アクティベート後にスケジュールは無効化される。また、認証エラーなどなんらかの原因で更新が4回連続して失敗した場合にも無効化される。
試してみたい
- Play Axis アニメーション ビジュアル
- 時系列データなどをアニメーションすることができる






