テクテク日記

テクテク=テクノロジー&一歩ずつ(テクテク)

DAX / Data Modelのデモ

DAX / Data Model*1のデモを今回の記事にしますが、そもそもなぜ、Power QueryやDAX / Data Modelを習得するのでしょうか?このスキルはMicrosoft社が開発したテクノロジーですが、これらを習得することは、

情報(データ)を可視化し、人間にとって有益な情報を得るため

が回答になります。当然ですが、有益な情報をどのように活用するかが最終的な目標ですが、かつてIT部門が担当していたデータ解析作業をビジネス・アナリストやユーザー自身がオンデマンドでデータの加工・モデリング・可視化を行うことが可能になったのです。そう、DAX / Data Modelを習得することはこれを可能にするためのステップであり、IT技術の進歩やツールの進化、現代ビジネスを取り巻く競争環境の不確実性等によって、人間も”機械”と同じく賢くならないといけない時代となったのです。

私の経験上、Power Queryを習得するよりもDAX / Data Modelを習得するほうが遥かに時間がかかり、難しいと思います。なぜなら、DAX / Data Modelは数式及び計算エンジンの動作等、細部にまで理解しないと期待する結果が得られないことがあるからです。

例えば、DAX式で以下2つを記述した場合、結果が同じでもデータ量やカーディナリティ*2によってパフォーマンスが大きく異なってしまう可能性があります。

店舗A売上1 = 
 CALCULATE ( SUM ( Sales[売上金額] ), Dim店舗[店舗名] = "店舗A" )

店舗A売上2 = 
 CALCULATE ( SUM ( Sales[売上金額] ), FILTER ( Sales, Sales[店舗名] = "店舗A" ) )

Excelとは異なり、DAX / Data ModelはDAXクエリやデータモデルの最適化という概念を常に念頭に置く必要があります。

Power Queryの概念はデータ整備でしたが、 DAX / Data Modelの概念は

最適なData Modelを構築し、正しいDAXコードを記述する

ことです。

上の例の場合、店舗A売上1が正しいDAXで、店舗A売上2が避けなければいけない記述となります(詳細は別記事にて)。

さて、後工程であるDAX / Data Modelのデモですが、コードの書き方ではなく、最終アウトプットであるBIレポートをお見せするのが最も手っ取り早いかと思います。

直リンク(別ウィンドウで開いてください)
https://bit.ly/2RSAMWe

上記BIレポートは損益計算書の主要項目の中に、在庫等の指標を入れて、分類別・品目別の詳細(「+」ボタンを展開)を年・四半期・月別に見られるようにしたものです。 また、今後使うであろうビジュアルをページ2では暫定的に置いています。

金融機関や事業会社の経営層であれば、このような書式で詳細を見たいという要望も根強いことから、あえてBS/PL*3形式でレポートを作っています。

このレポートがユニークなのは、通常のBS/PLはハイレベル*4な数字しか見ることができないが、BIレポートではそのハイレベルな数字を構成する詳細までドリルダウン(掘り下げ)できることです。更に、在庫回転期間*5を計算し、ダイナミックな指標として、長期在庫をあえて定義せず、「週数ベンチマーク」というパラメーターを右上にあるスライダーで調整することで各観測時点における長期在庫をDAXが計算してくれます(下図)。

f:id:marshal115:20200425192517p:plain

パラメーターを26と設定した場合、長期在庫でない品目は26週間未満で1回転する在庫として算出される一方、長期在庫となる回転期間が26週以上の在庫品目は2019Q1で60,094(Q1在庫金額の17.4%)、Q2で78,940(Q2在庫金額の21.7%)を占めることになります。

企業によって、長期在庫の定義は異なりますが、サンプルデモでは平均的な在庫回転が16~17週(在庫回転_週の数字)になりますので、長期在庫を13週以上と定義(週数ベンチマークを13として設定)すると、下図によりQ1では全体の75.5%、Q2では77.1%と、殆どが長期在庫扱いとなってしまうことになります。

f:id:marshal115:20200425192455p:plain

このように、企業特有のシナリオや定義次第でダイナミックに数字を算出することが可能になるため、レポートを消費するユーザーはいろいろシミュレーションができて有難いわけです。ちなみに、このレポートのデータモデルは非常にシンプルであり、下図のようになっています。

f:id:marshal115:20200425194822p:plain

なお、上記Salesというテーブルには販売実績データが入っていますが、Invテーブルには在庫明細が入っています。販売実績のメジャー(例:Sales等)はDAXでSUMやSUMXといった関数を使用することになりますが、在庫明細のメジャー(例:InvAmt等)で同じSUMだけで記述すると間違った結果になってしまいます。これについては別途記事にしますが、今回はここまでにしておきます。

 

*1:DAX / Data Model: Data Analysis eXpressionの略で、データ分析用言語。Data Model: データセットをリレーションで定義付けしたもので、この作業の後にDAXを記載する

*2:データ濃度。列に存在する一意(ユニーク)の項目数。例:100万行の列がある場合、男と女の2つしかデータがない場合、カーディナリティは2で低いことになるが、ユニークな項目が10万だった場合、カーディナリティは高いことになります

*3:BS:貸借対照表, PL:損益計算書

*4:大雑把な

*5:対象在庫が1回転するのに必要な期間。ここでは「週」として算出