概要(目的・背景)
日々の食事作りで「何を作ろうか?」と悩むことはありませんか?特に、食材の価格が日々変動する中、家計に配慮しながら美味しい料理を提供するのは容易ではありません。そこで、東京都中央卸売市場の日報データを活用し、現在の食材価格を把握することで、コストパフォーマンスの高いメニューを提案できるのではないか?と考えました。さらに、楽天レシピAPIを組み合わせることで、選択した食材に基づいたレシピを自動取得し、具体的なメニューを効率的に選ぶことが可能になります。このダッシュボードを通じて、日々の食事作りの負担を軽減し、家計にも優しい食生活をサポートしたいと考えています。
本記事はカレンダーテーブルの設定と、前回までに取り込んだ京都中央卸売市場の日報データに対して前月売上比のDAXを設定していきます。
カレンダーテーブルの設定は「データ分析の第1歩~カレンダーテーブル作成入門~(Day3)」をカスタマイズして設定をします。
■GOALイメージ

読み手(誰に向けた記事か?)
この記事は、Power BIを使ったデータ分析に興味がある初学者の方や、データの可視化・分析の効率化を図りたいと考えている方にも参考にしていただければと思います。
ブログの目標設定(具体的な目標)
本記事の目標は、以下の通りです。
・Power BI でカレンダーテーブルを作成する具体的な手順を復習する
・カレンダーテーブル作成に必要なDAX関数の使い方を理解し、実践する
これらを通じて、今後、読者の皆さんがPower BIでの時系列データ分析をより効果的に行えるようになることを目指しています。
方法(アプローチ・使用技術)
まずはカレンダーテーブルの設定を行います。
1.「モデリング」タブより「新しいテーブル」ボタンを押下する。

2.以下のカレンダーテーブルを構成するコードを入力する。
Calendar =
//鮮魚(PricesFreshFish)・青果(PricesFruitAndVegetable)・食肉(PricesMeat)のテーブルをUnionで結合して、最小の値を取得する。
VAR StartDate =
MINX(
UNION(
SELECTCOLUMNS('PricesFreshFish', "日付", 'PricesFreshFish'[日付]),
SELECTCOLUMNS('PricesFruitAndVegetable', "日付", 'PricesFruitAndVegetable'[日付]),
SELECTCOLUMNS('PricesMeat', "日付", 'PricesMeat'[日付])
),
[日付]
)
//鮮魚(PricesFreshFish)・青果(PricesFruitAndVegetable)・食肉(PricesMeat)のテーブルをUnionで結合して、最大の値を取得する。
VAR EndDate =
MAXX(
UNION(
SELECTCOLUMNS('PricesFreshFish', "日付", 'PricesFreshFish'[日付]),
SELECTCOLUMNS('PricesFruitAndVegetable', "日付", 'PricesFruitAndVegetable'[日付]),
SELECTCOLUMNS('PricesMeat', "日付", 'PricesMeat'[日付])
),
[日付]
)
VAR BaseCalendar =CALENDAR (StartDate,EndDate)
RETURN
ADDCOLUMNS(
BaseCalendar,
"年月日", FORMAT([Date], "yyyy/MM/DD" ),
"yyyy年",FORMAT([Date],"yyyy年"),
"yyyy年度",FORMAT(if(MONTH([Date])>3,YEAR([Date]),YEAR([Date])-1),"0年度"),
"MM月", FORMAT ([Date], "MM月" ),
"DD日", FORMAT([Date],"DD日"),
"Q四半期", if(MONTH([Date])<4,"4Q",if(MONTH([Date])<7,"1Q",if(MONTH([Date])<10,"2Q","3Q"))),
"曜日_aaa", FORMAT([Date],"aaa")
)

「Power BIでインサイトを抽出!データ分析の第一歩~カレンダーテーブル作成入門~(Day3)」のコードに1点カスタマイズを入れています。
◆カスタマイズ箇所
カレンダーテーブルの開始日と終了日は、鮮魚(PricesFreshFish)・青果(PricesFruitAndVegetable)・食肉(PricesMeat)の各テーブルを参照し、最小の値と最大の値をもとに、構成しています。
次にリレーションシップの設定を行います。
3.モデルビューを選択します。

4.PricesFreshFishテーブルの「日付」とCalendarテーブルの「Date」間でリレーションシップを設定します。

5.PricesMeatテーブルの「日付」とCalendarテーブルの「Date」間でリレーションシップを設定します。

6.PricesFruitAndVegetableテーブルの「日付」とCalendarテーブルの「Date」間でリレーションシップを設定します。

※リレーションシップ設定後のイメージはこちらです。

最後に各テーブルへメジャーの設定を行います。
7.鮮魚の前月同月比の価格を算出するため、DAX関数で計算式を入れます。
PricesFreshFishテーブルから、「新しいメジャー」を選択する。

8.以下のコードを入力する。
%_average_PriceFish =
VAR average_fish_pre_month =
CALCULATE(
AVERAGE('PricesFreshFish'[中値(円)]),
DATEADD('Calendar'[Date], -1, MONTH)
)
VAR average_fish_month = AVERAGE(PricesFreshFish[中値(円)])
VAR temp = DIVIDE(average_fish_month,average_fish_pre_month)
RETURN temp

前月の平均中値(円)をCALCULATE関数で算出しています。
前月は「DATEADD」関数を用いて、Calendarテーブルの[Date]から1か月前を取得しています。
当月はAVERAGE関数を用いて算出しています。
前月と当月を除算して、前月比を算出しています。
9.青果の前月同月比の価格を算出するため、DAX関数で計算式を入れます。
PricesFruitAndVegetableテーブルから、「新しいメジャー」を選択する。

10.以下のコードを入力する。
%_average_PricesFruitAndVegetable =
VAR average_PricesFruitAndVegetable_pre_month =
CALCULATE(
AVERAGE('PricesFruitAndVegetable'[中値(円)]),
DATEADD('Calendar'[Date], -1, MONTH)
)
VAR average_PricesFruitAndVegetable_month = AVERAGE('PricesFruitAndVegetable'[中値(円)])
VAR temp = DIVIDE(average_PricesFruitAndVegetable_month,average_PricesFruitAndVegetable_pre_month)
RETURN temp

11.食肉の前月同月比の価格を算出するため、DAX関数で計算式を入れます。
PricesFruitAndVegetableテーブルから、「新しいメジャー」を選択する。

12.以下のコードを入力する。
%_average_PricesMeat =
VAR average_meat_pre_month =
CALCULATE(
AVERAGE('PricesMeat'[中値(円)]),
DATEADD('Calendar'[Date], -1, MONTH)
)
VAR average_meat_month = AVERAGE('PricesMeat'[中値(円)])
VAR temp = DIVIDE(average_meat_month,average_meat_pre_month)
RETURN temp

テーブルとリレーションの各種設定は以上です。
結果(成果と評価)
本記事にてDAXコードは、複数のテーブルから最小と最大の日付を取得して、その範囲から基本的なカレンダーテーブルを作成しています。またCALCULATE関数から前月比の価格を算出するメジャー設定も設定しました。カレンダーテーブルは、「データ分析の第1歩~カレンダーテーブル作成入門~(Day3)」から1歩踏み込んだメジャー設定となっています。
まとめ(結論と今後の展望)
この記事を通じて、カレンダーテーブルの必要性やDAX関数を用いた効率的な作成方法を学ぶことができました。特に、CALENDAR関数やADDCOLUMNS関数、CALCULATE関数を活用することで、柔軟なカスタマイズできる点が大きな利点です。今後は、特定のビジネスニーズに応じて、さらに高度なカスタマイズにも挑戦してみてください。
次回は、ビジュアル(表やグラフ)の設定を行います。