【PowerBI】KPI達成率がひと目でわかるビジュアルデザイン

完成イメージ

ポイント

  • ドーナツグラフで進捗率を表示
  • 実績のラベルを表示
  • KPIの進捗率をラベルで表示、未達成の場合は赤色で強調

準備するメジャー

目標:[Target Sales]

実績:[Total Sales]

目標 - 実績の差:[Diff Sales - Target]

Diff Sales - Target = 
VAR targetdiff =
    [Target Sales] - [Total Sales]
RETURN 
    IF(targetdiff < 0 , 0,targetdiff)

目標達成率:[% Diff Sales Target]

VAR target = 
    [Target Sales]

VAR targetdiff =
    [Total Sales] - target

RETURN 
    DIVIDE(targetdiff, target)

ドーナツグラフの追加とデザイン調整

  1. ドーナツグラフを追加し、値に[Total Sales]、[Diff Sales - Target]を追加

  2. ドーナツグラフ以外の装飾を削除

  3. [Diff Sales - Target]の色をグレーなど薄い色を指定する

  4. 間隔>内側の半径(%) >85% で真ん中のKPI ラベルの場所を確保

実績KPIカードの追加とデザイン調整

  1. カードビジュアルを追加し、値に[Total Sales]を追加

  2. 吹き出しの値とカテゴリラベルのフォントを調整

例:吹き出しの値: 14pt  カテゴリラベル: 10pt

  1. サイズとスタイル>背景 のチェックを外し、背景を透明化

  2. KPIカードの位置を調整

進捗率カードの追加とデザイン調整

  1. カードビジュアルを追加し、値に[% Diff Sales Target]を追加

  2. 吹き出しの値のフォントサイズを調整し、カテゴリラベルは非表示

  3. サイズとスタイル>背景 のチェックを外し、背景を透明化

  4. KPIカードの位置を調整

  5. 吹き出しの値>フォント>色>条件付き書式 で目標を下回っているとき警告色を設定

データ形式スタイル>ルール、値が0以下のとき赤色になるよう設定

  1. 図形>線より仕切り棒シェイプを作成し、配置

※フィルのチェックを外しておく

完成

参考

www.youtube.com

【PowerBI】KPIをとりまとめてPowerAutomate で自動メール送信する

複数のKPI をOutlookメールとして送信

複数のDAX式が組み合わさったKPIの一覧、特にPowerBIでは別々のメジャーとして管理している実績と計画を横並びにしたものを、Outlookメールで送信できるようにします。

KPI(実績/計画)

売上: ¥1,000,000 / ¥1,000,000
粗利: ¥1,000,000 / ¥150,000
固定費: ¥1,200,000 / ¥1,500,000
損失: ¥1,000,000 / ¥1,000,000

ポイント

  • DAX 側(PowerBI側)でフォーマットを含めて文章を準備します。
  • DAX側で文字列を予め生成するので、JSON から値を抽出する処理が複雑になりません。
  • 途中でKPIをプラスしたくなっても、PowerBI 側の編集だけでことたります。

【PowerBI】KPIのメジャーを準備

売上・粗利など、それそれぞれのKPI 用DAXを準備

まず、KPI に必要なDAX をまとめます。今回は実績・計画それぞれの[売上]、[粗利]、[固定費]、[損失]のDAX を利用します。

それぞれのKPI が 計画 / 実績 になるように計画のDAXと実績のDAX を結合したDAX を作成します。

売上KPI DAX

  • FORMAT 関数で結果を通貨表示のStringに変更する。
  • & で文字列を結合する
売上 = 
FORMAT([実績売上], "Currency") &
" / " &
FORMAT([計画売上], "Currency")

個数のKPI

¥マークではなく、シンプルに整数が必要なケースと、[blank]の場合でも0を入力したいケース

個数 = 
FORMAT([実績個数], "#,0;#,0") &
" / " &
FORMAT( [計画個数] , "#,0;#,0")

dax.guide

KPI それぞれに対してメジャーを作成します。

作成したメジャーをマトリックスに入れると、計画 / 実績 の一覧として表示できます。

Outlookメール用にひとつのDAXに集約

作成した「実績 / 計画メジャー」をOutlookメール用に一つに集約します。

KPI(実績 / 計画) = 
"売上: " & [売上] & "<br>" &
"粗利: " & [粗利] & "<br>" &
"固定費: " & [固定費] & "<br>" &
"損失: " & [売上] & "<br>" 

PowerBI 上での改行は普通、UNICHAR(10)を使用します。

ただ、PowerAutomate でOutlookメールを作成する場合、改行記号では改行が行われません。そのため<br>を利用して改行を行います

もしOutlookメール以外を通知に使用する場合は、改行記号にUNICHAR(10)を使用する必要があるかもしれません。

PowerAutomate 用のDAX クエリをコピー

PowerAutomate で使用するDAX クエリを生成するため、前のステップで作成したメジャーをビジュアルに割り当てます。今回はわかりやすいようにテキストボックスビジュアルを使用します。

DAX クエリの取得は、最適化>パフォーマンスアナライザーから取得することができます。

記録の開始→ビジュアルを更新します から、作成したテキストボックスの「クエリをコピー」します。

コピーしたクエリ

// DAX Query
DEFINE VAR __SubqueryTableSQDS0 = 
    ROW(
        "KPI_実績___計画_", 'KPIs'[KPI(実績 / 計画)]
    )

EVALUATE
    GROUPBY(
        __SubqueryTableSQDS0,
        "MinKPI_実績___計画_", MINX(CURRENTGROUP(), [KPI_実績___計画_], TRUE)
    )

PowerBI側の準備は完了ですが、PowerAutomate から値を取得するため「発行」を完了させます。

【PowerAutomate 】KPIのOutlookメールを送信

「カードビジュアル」の結果をメール送信するのとほとんど同じです。

oneum.hatenablog.com

PowerBI の値を取得するアクションを追加

PowerBI>「データセットに対してクエリを実行する」を追加する。

クエリテキストには、PowerBIからコピーしたクエリを貼り付ける。

アクションの名称は後で使用するので、入力・識別しやすい名称に変更する。(ここでは"Get-KPI")としました。

この時点でテスト実行し、結果を取得しておきます。

Body:

{
  "results": [
    {
      "tables": [
        {
          "rows": [
            {
              "[MinKPI_実績___計画_]": "売上: ¥1,000,000 / ¥1,000,000<br>粗利: ¥1,000,000 / ¥150,000<br>固定費: ¥1,200,000 / ¥1,500,000<br>損失: ¥1,000,000 / ¥1,000,000<br>"
            }
          ]
        }
      ]
    }
  ],
  "firstTableRows": [
    {
      "[MinKPI_実績___計画_]": "売上: ¥1,000,000 / ¥1,000,000<br>粗利: ¥1,000,000 / ¥150,000<br>固定費: ¥1,200,000 / ¥1,500,000<br>損失: ¥1,000,000 / ¥1,000,000<br>"
    }
  ]
}
テキスト変数として初期化

メジャーの値をPowerAutomate で取得することができたので、Outlookメールで使用するために変数化します。

「変数を初期化する」アクションを追加します。

Type は「String」を設定します。

Valueは「データセットに対してクエリを実行する」のアクション名と取得したBodyの結果によって調整します。

テンプレート:

outputs('アクション名')?['body/firstTableRows'][0]?['[アクションで取得したときのメジャー名]']

例の場合:

アクション名:Get-KPI@ アクションで取得したときのメジャー名:MinKPI実績_計画`

outputs('Get-KPI')?['body/firstTableRows'][0]?['[MinKPI_実績___計画_]']

テストがうまくいけば、"value"にメジャーの結果が入っていることを確認できます。

Outlookメールを作成

Outlookのメールアクションを追加します。

文中に初期化した変数である「KPIs」を入れ込んで送信すれば完了です。

送信結果:

さいごに

本当はマトリックスに入れたメジャー一覧をテーブル表示したいのですが、うまくJSON を抽出できなかったので諦めていました。

一つ結果を抽出する方法さえあれば、全部入りのメジャーを作成すればほうりこめるかという妥協案です。

メジャーの一覧を装飾したテーブルで表示するには、PowerAutomate の変数の抽出の仕方や、SELECT の仕方を勉強する必要がありそうです。。。

【Power BI】外資系にありがちな10月始まりの日付テーブル

日本語で外資系の会計年度に対応

FisicalYear -> Quater -> Month(Eng) の階段をうまく使用したいときに活用できる日付テーブルです。

Fisical Year > Quater > Month

日付テーブルの作成は、ホーム>新しいテーブルから

  1. ホーム>新しいテーブル を選択し、日付テーブルのコードをコピペする
  2. 日付テーブルとしてチェックする

10月年度はじまりと、英語月に対応

  1. 年度の始まりが10月になっている
  2. FY、Quater、FY&Quaterなどの表示をすることができる
  3. 相対月、相対年度を設定しておくことで、過去3年などの範囲のフィルタをかけやすくしている。
  4. 英語の月表示に対応
日付テーブル = 
VAR StartDate="2012/04/01"
VAR EndDate="2025/3/31" 
VAR Today=UTCTODAY()+9/24
VAR ThisFY=if(MONTH(Today)>9,YEAR(Today),YEAR(Today)-1)
VAR BaseCalendar =CALENDAR (StartDate,EndDate)
RETURN
ADDCOLUMNS(
    BaseCalendar,
    "年_数値", YEAR ( [Date] ),
    "年_yyyy年",FORMAT([Date],"yyyy年"),
    "月_数値", MONTH ([Date]),
    "月_MM月", FORMAT ([Date], "MM月" ),
    "月_MMM", FORMAT ([Date], "MMM" ),
    "日_数値", DAY ([Date]),
    "日_DD日", FORMAT([Date],"DD日"),
    "年月_数値", VALUE(FORMAT([Date], "yyyyMM" )),
    "年月_yy年MM月", FORMAT ( [Date], "yy年MM月" ),
    "yy-MMM", FORMAT ( [Date], "yy-MMM" ),
    "年度_数値",if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1),
    "FY_FYxxyy", "FY" & RIGHT(VALUE(if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1)),2) & RIGHT(VALUE(if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1)+ 1),2) ,
    "年度_0年度",FORMAT(if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1),"0年度"),
    "年度四半期_数値", if(MONTH([Date])<4,2,if(MONTH([Date])<7,3,if(MONTH([Date])<10,4,1))),
    "年度四半期_0Q", if(MONTH([Date])<4,"2Q",if(MONTH([Date])<7,"3Q",if(MONTH([Date])<10,"4Q","1Q"))),
    "FY_0Q", "FY" & RIGHT(VALUE(if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1)),2) & RIGHT(VALUE(if(MONTH([Date])>9,YEAR([Date]),YEAR([Date])-1)+ 1),2) & if(MONTH([Date])<4,"2Q",if(MONTH([Date])<7,"3Q",if(MONTH([Date])<10,"4Q","1Q"))),
    "年度半期_数値", If(MONTH([Date])<4,1, IF(MONTH([DATE])<10,2,1)),
    "年度半期_0stHalf", If(MONTH([Date])<4,"1st Half", IF(MONTH([DATE])<10,"2nd Half","1st Half")),
    "週_数値", WEEKNUM ( [Date], 1 ),
    "週_第00週", FORMAT ( WEEKNUM ( [Date], 1 ), "第00週" ),
    "曜日番号月曜から_数値", WEEKDAY ( [Date], 2 ),
    "曜日_aaa", FORMAT([Date],"aaa"),
    "日と曜日", FORMAT ( [Date], "DDaaa" ),
    "相対日付",DATEDIFF(Today,[Date],DAY),
    "相対月",DATEDIFF(Today,[Date],MONTH),
    "相対年度",if(MONTH([Date])>9,YEAR([Date])-ThisFY,YEAR([Date])-1-ThisFY)
)

【PowerBI】「カードビジュアル」の結果をPowerAutomate でメール送信

カードビジュアルの値をそのまま自動メール送信したい

「データセットに対してクエリを実行する」アクションを使用すると、PowerBI 上のデータをPowerAutomate で利用することができる。 PowerBI 上のKPIをメール送信したり、KPIが基準値以上・以下のときにアラートを発したりというフローを組むことができる。

PowerAutomate でPowerBI のカードビジュアルの値を表示

[PowerBI] パフォーマンスアナライザーからクエリをコピー

PowerAutomate からPowerBI コネクタでDAXクエリを実行し、計算結果を取得することができる。DAXクエリはPowerBI のパフォーマンスアナライザーからコピーしたDAXクエリをそのまま使用すると便利。

最適化タブ>パフォーマンスアナライザーを選択し、パフォーマンスアナライザーのペインを開く。 記録の開始を押し、ビジュアルを更新する。 各ビジュアルの結果が表示されるので、使用したいデータのカードビジュアルを選択する。その後、「クエリのコピー」からDAXクエリを取得する。

パフォーマンスアナライザからDAXのクエリを取得する

「クエリのコピー」で取得したDAXクエリ

// DAX Query
EVALUATE
    ROW(
    "total_sales", 'financials'[total sales]
)

[PowerAutomate]PowerBI から(カード)データを取得するアクション

PowerAutomate で新しいフローを作成する。 アクションの追加でPower BI >「データセットに対してクエリを実行する」アクションを追加する。

データセットに対してクエリを実行する

パラメータとして、ワークスペース・データセットを指定する必要があるので、予めワークスペースに発行しておく必要がある。 クエリテキストは、パフォーマンスアナライザーから取得したDAXクエリをペーストする。 ビジュアルの名前は後続の処理で使用するので、識別・入力が容易な命名をしておく。

実行して結果を確認する。 カードビジュアルの内容をPowerAutomate で取り出すことができる。JSON形式で出力されるので、「118726350.26000008」を利用するためには少し工夫をする必要がある。

OUTPUTS>Body

{
  "results": [
    {
      "tables": [
        {
          "rows": [
            {
              "[total_sales]": 118726350.26000008
            }
          ]
        }
      ]
    }
  ],
  "firstTableRows": [
    {
      "[total_sales]": 118726350.26000008
    }
  ]
}

[PowerAutomate] 取得したデータを変数として初期化する

OutlookやTeamsで取得した値を再利用するため、「変数」として初期化する。

Variable>変数を初期化するアクションを追加する。

Type: 数値の値を取得する場合、[Type]は基本的にFloatにしておく。整数のはずなのにInterger型でエラーが発生することがあった。

Value: 'Get-Card-Value' > 「データセットに対してクエリを実行する」アクションの名前を入力する。 [total_sales] > 「データセットに対してクエリを実行する」アクションのOUTPUTS>Bodyから名前を入力する。 "[total_sales]": 118726350.26000008 の部分のこと。

outputs('Get-Card-Value')?['body/firstTableRows'][0]?['[total_sales]']

variables 実行結果

[
  {
    "name": "CardValue",
    "type": "Float",
    "value": 118726350.26000008
  }
]

変数の初期化

[PowerAutomate] メールの送信(V2)アクションでメールを送信する

メール送信のときにはformatNumber 関数を使用して、表示形式をフォーマットする。 Reference guide for expression functions - Azure Logic Apps | Microsoft Learn

%表示の場合:

formatNumber(variables('GetByDataset'), 'p')

円表示の場合:

formatNumber(variables('CardValue'), 'C','ja-jp')

カンマ区切り表示の場合:

formatNumber(variables('CardValue'),'N')

メール送信アクション

実行結果:メール本文

​
% :11,872,635,026.00 %
円:¥118,726,350
カンマ:118,726,350.26

参考

www.youtube.com

【Power BI】数値の差を強調するダンベルチャートをデフォルトビジュアルで表現する

ダンベルチャートとは

2つの値の比較を可視化するチャートで、Tableauでは一般的な表現方法のようです。 目標と結果をならべて表示するよりも、2つの値の差として表現する。カテゴリごとに並べることで、2つの値のトレンドを把握することができる。

Power BI での表現と参考Youtube

Power BI のデフォルトビジュアル「折れ線グラフ」だけで表現する。外部ビジュアルのインポートが不要です。 DAX の考え方や順序だてて理解するには、How to Power BI を参考にする。

www.youtube.com

準備

Power BI のサンプルデータセットを利用する。 目標と実績のデータはふくまれていないので、便宜的に[Profit] と [Discount] の合計値を比較として採用する。

比較対象のDAX

Total Discout = 
SUM(financials[Discounts])
Total Profit = 
SUM(financials[Profit])

DAX / テーブル

ダンベルチャートの折れ線グラフのX軸を定義するテーブル「」

新しいテーブルから作成: それぞれの値から動的に軸の範囲を決定する。 DAX式は最終的な完成形なので、最初はパラメータから使用する。

パラメータからXAxisテーブルを作成

XAxis = 
GENERATESERIES(
    ROUND(
        MINX(ALLSELECTED( financials[Product] ),
        MIN( [Total Discout] , [Total Profit] )
        ) / 100000 , 0
    ) - 1,
    ROUND(
        MAXX(ALLSELECTED( financials[Product] ),
        MAX( [Total Discout] , [Total Profit] )
        ) / 100000 , 0
    ) +1,
    
    1
)

2つの値と、それらをつなぐ線をあらわすDAX

Dot - Total Discount:
Dot - Total Discount = 
IF(
    SELECTEDVALUE('XAxis'[Xasis]) = ROUND([Total Discout]/100000 , 0),
    1
)
Dot - Total Profit:
Dot - Total Profit = 
IF(
    SELECTEDVALUE('XAxis'[Xasis]) = ROUND([Total Profit]/100000 , 0),
    1
)
Range - Discount to Profit:

2つのDotをつなぐ線のDAX

Range - Discount to Profit = 
VAR _Min =
MIN( 
    ROUND( [Total Discout] / 100000 , 0), ROUND( [Total Profit] /100000 , 0)
)

VAR _Max =
MAX( 
    ROUND( [Total Discout] / 100000 , 0), ROUND( [Total Profit] /100000 , 0)
)

VAR _Range =
IF(
    SELECTEDVALUE( XAxis[Xasis] ) >= _Min
    && SELECTEDVALUE( XAxis[Xasis] ) <= _Max,
    1
)
RETURN
    _Range

\

ビジュアル補助のためのDAX

Labesl Total Profit:
Labesl Total Profit = 
FORMAT( [Total Profit] , "#,##0,,0")
Labesl Total Discount:
Labesl Total Discount = 
FORMAT( [Total Discout] , "#,##0,,0")
YAxis Labels:

カテゴリをタイトルの代わりに表示するためのラベル

YAxis Labels = 
SELECTEDVALUE( financials[Product])
YAxis Item Label Placeholders:

ラベルを「X軸の左端」に配置するための位置DAX

YAxis Item Label Placeholders = 
VAR _Min =
MINX(
    ALLSELECTED( financials[Product] ),
    MIN( ROUND( [Total Discout] / 100000 , 0), ROUND( [CF Total Profit] /100000 , 0)
    )
)
VAR _Label_PlaceHolder =
IF(
    SELECTEDVALUE( XAxis[Xasis] ) = _Min -10,
    1
)
RETURN
    _Label_PlaceHolder

完成

DAXを折れ線グラフに放り込む

ビジュアルを整える

完成キャプチャ