【Power BI 中級編】今の体重は何歳何か月相当? 〜DAXによる基準線との比較〜

Power BI

今回は、「ある数値が、基準となる曲線のどの時点と等しいか?」をDAX式で求めて可視化する方法をご紹介します。前回に続き、我が子の成長データを使い、「現在の体重が全国的に見て何歳何か月相当なのか?」を可視化してみます。

ビジネスの場でもよく使う「基準値との比較になります。例えば・・・

  • 季節変動のある品質データ:現在の値は、いつ頃の水準に近いのか?
  • 経年劣化する製品:今の性能は、使い始めて何年相当の性能なのか?

では、さっそく一緒に作ってみましょう。

この記事でできるようになること
  • グラフ上で選択した体重データを取得し、「カード」で表示
  • その体重が発育曲線のどの時点(月齢)に最も近いかDAXで算出
  • 「〇歳△か月ごろ」といった視覚的にわかりやすい表示を作成

Power BI記事を体系的に学びたい方はこちらもご参照!
👉【Power BI 初級〜中級向け まとめ】ビジネス&育児を可視化しよう!

仮想ケース

前回、長男の体重と国の発育曲線を相対的に把握するグラフを作成したところ、妻からこんなコメントがあった。

妻

今1歳11か月の烈(長男)の体重って、全国的にみると何歳何か月相当なのかしら?

ということで今回は、「今の体重基準曲線(中央値)と比べて何歳何か月に相当するか?」の可視化に挑戦します。

  • この記事の目的は、成長の善し悪しを判断することではなく、「データの相対的な位置をDAXで表現する方法を学ぶ」ことです。

使用データと前提条件

今回も前回、前々回と同じデータを使用しますが、以下の前提で進めます。

  • 子どもの体重データは 1つの月に1件のみ1つの月に複数件データがある or 1つの月にデータが全くない場合はエラーとなる可能性があるため、今後扱います。

過去記事はこちら
👉 他の子たちと比較してみよう
👉 子どもの成長を見える化しよう

可視化のステップ

以下のステップで、徐々にビジュアルを作っていきます。

  • Step 1選択した体重カードに表示する
  • Step 2:その体重が、生後何日目相当か計算する
  • Step 3:生後日数を月齢に変換して表示

Step 1:選択した体重をカードに表示する

まず、グラフ上で選択された体重の値を取得するメジャーを作成します。

コピペ用

選択された体重 = 
SELECTEDVALUE('身長体重_1子'[体重])

カード」ビジュアルにこのメジャーを配置すると、グラフ上で選んだ月の体重が表示されます。

  • 体重を選択していないと「 (空白)」 と表示されます。

(空白)にメッセージを表示する

値が選択されていないときは「(空白)」ではなく「メッセージ」を表示してみましょう。

コピペ用

選択された体重(表示用) = 
VAR sonweight = SELECTEDVALUE('身長体重_1子'[体重])
RETURN 
    IF(
        ISBLANK(sonweight),
        "グラフ上で体重を選択して!",
        FORMAT(sonweight, "0.0") & " kg"
    )

DAX式の中身を分解して理解しましょう。

VAR sonweight = SELECTEDVALUE('身長体重_1子'[体重])
  • VARで一時的な変数を定義します。
  • ここでは選択された体重を一時的に「sonweightという名の変数に格納します。
  • 変数名に予約語(例:weight)を用いるとエラーとなることがあります。予約語とは、Power BIにあらかじめ登録されている「変数に指定できない文字列」のことです。一般的な名称や関数名などと重なる単語は予約語となっているようです
    value, type, weight, count, date, min, max などは注意
  • そのため、ここでは weight」 ではなく、 「sonweight」 としています。
RETURN
IF(ISBLANK(sonweight),
"グラフ上で体重を選択して!",
FORMAT(sonweight, "0.0") & " kg"
)
  • RETURNは、「最終的に返す値(表示する値)」を指定します。
  • IF関数は Excel でもおなじみの「条件分岐」です。
    IF条件, 条件が成立する場合の値, 条件が成立しない場合の値)となります。
  • ISBLANKは sonweight が(空白)かを判定する関数です。

カードに表示されるのは、

  • 体重が選択されていない場合👉 「グラフ上で体重を選択して!」と表示されます。
  • 体重が選択されている場合👉小数1桁で〇.〇 kg」と表示されます。

Step 2:その体重が、生後何日目相当か計算する(⚠中級レベル)

選択した体重と、発育曲線(中央値)を比較し、「選択した体重は、生後何日目の中央値に最も近いか?」をDAXで求めます。

コピペ用

相当する日数 = 
VAR target = SELECTEDVALUE('身長体重_1子'[体重])
VAR filteredTable =
    ADDCOLUMNS(
        ALL('体重目安'),
        "差",ABS('体重目安'[中央値] - target)
    )
VAR minDiff =
    MINX(filteredTable, [差])
VAR closestRow =
    FILTER(filteredTable, [差] = minDiff)
RETURN
     MINX(closestRow, '体重目安'[生後日数])

2行目:選択された体重を変数 target に格納。

グラフ上で選ばれた体重を SELECTEDVALUE(‘身長体重_1子'[体重]) で取得します。これを 変数target に格納します。(Step 1と同様)

3〜7行目:体重差を追加した一時的な表を作成

ここでは、仮想テーブル filteredTable を定義し、仮想テーブルに1列追加します。追加する列は「選択した体重と中央値との差(の絶対値)」であり、列名を「」と定義します。

たとえば、選択された体重が 11.85 kg の場合、以下の仮想テーブルが一時的に生成されます

8〜9行目:もっとも「」が小さい値(minDiff)を求める

次に、仮想テーブル filteredTable 内の「」のうち最小値を minDiff として取得します。

VAR minDiff = MINX(filteredTable, [])

10〜11行目:最も差が小さい行を抽出

FILTER関数を使い、「」がminDiffと一致する行のみを取り出したテーブル closestRow を定義します。例示した表の中では、差がちょうど0.00だった 生後日数:804日、中央値11.85 の行が該当します。
VAR closestRow = FILTER(filteredTable, [] = minDiff)
このように、DAXでは FILTER関数を使って“条件に一致する行”だけを取り出すことができます。

12〜13行目:最も近い生後日数を返す

仮想テーブル closestRow の中から、生後日数を取得します。

RETURN
=MINX(closestRow, ‘体重目安'[生後日数])

closestRowに複数行があったとしても、生後日数の最小値(=一番若い生後日数)を返す設計にしています。

このようにして、選択された体重にもっとも近い中央値の「生後日数」が計算され、カードなどのビジュアルに表示できるようになります。

ではこちらを「カード」で表示しましょう。表示用にメジャーを作成します。

先程の「相当する日数」の最終行のみ、IF関数を使って、グラフ上で体重が選択されていない場合に「」を表示するようにしておきます(Step 1と同様の考え方)。

コピペ用

相当する日数(表示用) = 
VAR target = SELECTEDVALUE('身長体重_1子'[体重])
VAR filteredTable =
    ADDCOLUMNS(
        ALL('体重目安'),
        "差", ABS('体重目安'[中央値] - target)
    )
VAR minDiff =
    MINX(filteredTable, [差])
VAR closestRow =
    FILTER(filteredTable, [差] = minDiff)
RETURN
    IF(ISBLANK(target),"-", MINX(closestRow, '体重目安'[生後日数])&"ごろ")

Step 3:生後日数を月齢に変換して表示

Step 2の「相当する日数」をベースに計算して、〇歳△か月」と表示させます。

  • ここは概算です。うるう年などを考慮した厳密なカレンダー換算ではありません。
コピペ用

相当する年齢 = 
VAR days = [相当する日数]
VAR years = INT(days / 365)
VAR months = INT(MOD(days, 365) / 30.41)
RETURN
    years & "歳" & months & "か月"
  • 変数 days を定義し、Step 2で計算した「相当する日数」を格納します。
  • 変数 years を定義し、days365[日/年] で割り、INT関数を使い整数で表します
  • 変数 months を定義し、days365[日/年] で割った余りをMOD関数で表し、30.41[日/月] で割り、整数で表します。
  • yearsmonthsか月」をReturnで返します。

ではこちらも「カード」で表示しましょう。表示用にメジャーを作成します。

コピペ用

相当する年齢(表示用) = 
VAR days = [相当する日数]
VAR years = INT(days / 365)
VAR months = INT(MOD(days, 365) / 30.41)
RETURN
    IF(ISBLANK([選択された体重]),"-", years & "歳" & months & "か月ごろ"
)

Step2と同様にIF関数を使い、体重が選択されていない場合は「」と表示されるよう数式を記載します。

完成イメージ

グラフ上の体重をクリックすると、一般的に何歳何か月ごろの体重かが表示されるようになりました。

まとめ

今回は、以下を学びました。

  • グラフ上で選択した体重をDAXで取得し、カード」で表示
  • その体重が発育曲線のどの時点(月齢)に最も近いかDAXで算出
  • 「〇歳△か月ごろ」といった視覚的にわかりやすい表示を作成
妻

なるほど。烈(長男)は今1歳11か月だけれども、全国の子たちと比べると2歳2か月相当だったのね。結構大きいわね! 少し大きいってことは、来年はこの服着られないかもね。来年の今ごろの体重って予測できるかしら?

ということで、次回は、現状の成長度合いから将来の体重を予測して可視化する方法をご紹介します。ビジネスにも応用できる回帰分析的な視点で進めていきます。お楽しみに!

他のPower BI記事が気になる方はこちらもチェック!
👉【Power BI 初級〜中級向け まとめ】ビジネス&育児を可視化しよう!

コメント

タイトルとURLをコピーしました