第17回 DAXの理解に必要となる、コンテキストとイテレーター

「DAX」の基本を理解するには、「コンテキスト」という概念を知る必要があります。

二つの「コンテキスト」

コンテキストとは、そもそも「文脈」という意味ですが、ITの世界ではプログラムが実行される状況によって違った動作をすることを指します。

ピボットテーブルを例に説明します。
売上高という項目があり、得意先ごとや販売地域別に合計する場合、これらを切り口=ディメンションとして、目的に応じデータの見せ方を変化させるツールがピボットテーブルです。

つまり、同一データに対し、目的に応じて異なる計算結果をピボットテーブル上に算出する状況が「コンテキスト」だと考えると良いでしょう。

そもそもDAXは、Power Pivot for Excel(以下、パワーピボットと呼びます)で使う計算式であり関数です。

その原型のピボットテーブルは、列データを対象に、ピボットテーブの要素である「行」や「フィルター」という切り口を変えながら、目的に沿ってデータを分析し、結果をピボットテーブルに表示しているわけです。

例えば、「001」という「ID」の「商品」だけの「売上合計」を計算するという具合です。

つまり、DAXには大別して二つのコンテキストがあることになります。

それが、「行コンテキスト」と「フィルターコンテキスト」

ごく簡単に説明すると、行コンテキストは「現在の行」であり、フィルターコンテキストは行コンテキストに追加して適用する「フィルター」を指します。

この「2つのコンテキスト」については、拙著「モダンExcel入門」161ページ「ワンポイント」も参考にしてみてください。

簡単な事例で「DAX」を考える

TotalSales = SUM(Sales[SalesPQ])

このDAX式は、SUMという関数を使い、SalesというテーブルのSalesPQという列を対象に、TotalSalesという名称で売上合計を算出します。

このDAX式は、行コンテキストを有していますが、フィルターなしで計算していますのでフィルターコンテキストはありません。

DAX式は、他のDAX式で使うことができます。

ここでは、このTotalSalesというDAX式を使い、次のように定義してみます。

IdSales = CALCULATE( [TotalSales], SalesRep[ID] = “001” )

このDAX式は、CALCULATEというフィルター関数を使い、先に定義したTotalSalesという売上合計を求めるDAX式(これが、行コンテキスト)において、SalesRepテーブルのID列が“001”のデータだけ(これが、フィルターコンテキスト)を抽出します。

図表1をご覧ください。A列・B列の「Salesテーブル」と、D列の「SalesRepテーブル」のうち、「ID001」の分だけを抽出した結果が、F列に先に定義したDAX式の「IdSales」により「3500」として計算結果が表示されているのがわかります。

これは、ピボットテーブルでA列の001に「フィルター」した結果と同じです。

図表1IdSales = CALCULATE( [TotalSales], SalesRep[ID] = “001” )の結果

拙著「モダンExcel入門」、第2章、PART4「ピボットテーブルで、DAXの基本を理解する」157ページ以降も参照してみると、より理解を深められると思います。

Xが目印の「イテレーター」という「反復子」

DAXでよく使うのが、SUMXなど末尾にX(エックス)のついた「イテレーター」と呼ぶ「反復子」です。
最大値を計算するMAXXなど、イテレーターというDAX関数はよく用います。

図表1の結果をPower PivotでIDごとに表示すると、図表2右上(F列・G列)のようになります。
どのIDの「IdSales」ともに「3500」で、総計も3500になっています。
これは、先のDAXで定義した際に用いたSUMによる影響です。

末尾にXのつかないSUMというDAX関数は、ファクトテーブル(ここでは、Salesテーブル)全体で集計値を計算する関数です。
先の定義では、IDが001という「フィルター」をかけたので、001の売上合計「3500」をすべての行に表示しています。

これに対して、末尾にXのつくSUMXは、行ごとに計算するDAX関数です。
ピボットテーブルの行ラベルにIDがある場合、IDごとに値を集計することは、ピボットテーブルを使ったことがあればわかると思います。
これと同じことをSUMXのような「X」が末尾についたイテレーターが実行します。

SUMX:= CALCULATE( SUMX( Sales, (Sales[SalesPQ] ) ))

図表2 SUMX:= CALCULATE( SUMX( Sales, (Sales[SalesPQ] ) ))の結果(F列・G列の下図)

「正しい1次情報」に基づく「2次情報」の簡単な見分け方(その1)

欧米では10年以上も前に「モダンExcel」という概念が登場しているのですが、日本で「モダンExcel」はまだまだ黎明期といえるでしょう。

それゆえ、「モダンExcel」という耳目を引く単語に興味を持ち、「モダンExcel」でググり、さまざまなWEBや書籍などを通じ「モダンExcelとは、なんぞ?」と、なっているように見受けますが、そうした情報の中には残念ながら「間違った2次情報」も含まれています。

「間違った2次情報」をうのみにすれば、「間違った計算結果」しか出ません。
もしも、仕事で「間違った計算結果」を基に経営判断するということを考えると、非常に恐ろしいことが容易に想像できます。
くれぐれも、「間違った2次情報」に踊らされることがないようにしてほしいと思います。

ここで「間違った2次情報」とは、「マイクロソフトの公式情報で定義していることを、無視した情報」を指します。
マイクロソフトの公式情報、つまり「正しい1次情報」とは、第一義的には「MSLearn」や「Docs」などを指します。
マイクロソフトで働く(元を含む)開発者などが発信する情報も「1次情報」といってよいと思います。

では「間違った2次情報」かどうか、どのように見分ければよいのでしょう?
「モダンExcel」のように初めて見る概念の場合、どれが正しく、どれが間違っているか、ということを初心者が識別するのは、なかなか至難の業だと思います。
そこで、最も簡単で、単純な見分け方をご紹介します。

「正しい1次情報」に基づく「2次情報」の簡単な見分け方(その2)

みなさんの業界にも「業界用語」「共通用語」と呼ばれるようなものがあるはずです。

例えば、「会計」の世界では、右側を「貸方」、左側を「借方」と呼ぶのが一般的です。

「借方、売りかけ100、貸方、売り上げ100ね、了解!」
⇩ ⇩ ⇩
(借方)売掛金 100 (貸方)売上高 100 ☚ 「掛け(未収)で、売り上げを100計上した」、という意味

こうした会話が、当たり前に成り立つのは、「会計」業界にいれば当然です。
なぜなら、「借方」「貸方」という表現は、業界人にとって「共通用語」であり、当然「周知の事実」に他ならないからです。

同様に、「データベース」の世界に生きる人たちであれば、「末尾X」のことを「イテレーター」というのが一般的であり、常識的な表現だと思います。
少なくとも私の周りに「イテレーター」以外の言いまわしをする方を見つけることは、できませんでした。

「正しい1次情報」に基づく「2次情報」の簡単な見分け方(その3)

「真実は細部に宿る」とも言います。

言葉尻を捕らえる、重箱の隅を楊枝でほじくるようなことしているようで、非常に恐縮ではあるのですが、専門家という人種は、結構こだわりがあるので「共通用語」「業界用語」を大切にすることが多いのです。
これは、恩師の一人、野々川幸雄先生に小生が伝授していただいた「異常点監査技法」の根本原理でもあります。
したがって、「末尾X」のDAX関数を「イテレーター」という、こうしたSQLをはじめとする「データベース」の世界では常識の「共通用語」に注目してみると、その「情報の真偽」を把握することができると思います。
なお、拙著「モダンExcel入門」は、「1次情報」+マイクロソフトでの学習成果を踏まえた見解=「1次情報をベースとした2次情報」です。

ということは、1次情報をベースにしている「モダンExcel入門」にないような表現をしている情報だとすると、もしかすれば「間違った2次情報」である可能性高いという疑念が生じることになります。
こうした情報は、「モダンExcel」のような初心者が、参考にすべき最適な情報源であることは保証できないので、避けなければなりません。

一方、「正しい1次情報」を知っている方であれば、こうした「2次情報」が参考になることもあると思います。
「2次情報」の中には、「1次情報」にない、斬新なアイデアが含まれていることがあるからです。
ただし、実務での適用にあたっては、慎重になるべきでしょう。

ちなみに、「イテレーター」という「データベース」界隈の「共通用語」は、当然ですがマイクロソフトの公式ページにも出てきます。
これは、公認会計士や弁護士など、いわゆる専門家といわれる人が最も重視する「エビデンス」「直接証拠」「外部証拠」です。

データベースを少しでもかじったことのある人であれば、「反復子」について「イテレーター」以外の表現をすることはまずいないと思います。
小生も、マイクロソフトで3年以上「パワークエリ」「DAX」など「モダンExcel」の肝になる部分を学んでいますが、「末尾X」の「反復子」のことを「イテレーター」以外の言いまわしで説明するマスタープロのMVPに接したことは、これまでただの1度も遭遇したことがありません。
これが「ファクト」「事実」です。
そして、それを示すマイクロソフトが示す「エビデンス」も上記のようにあります。

「共通用語」の言い回しという細かい点ではありますが、こうした点は「正しい1次情報」を基にした情報なのか、という判断基準の一つになると思います。

マイクロソフト製品をご利用になる際は、「1次情報」を見るようにしてください。
なぜなら、「1次情報」に「正しい情報」があるからです。
「間違った2次情報」では、とんでもないミスにもつながるので、その適用にあたっては細心の注意が必要です。

「正しい1次情報」に基づく「2次情報」の簡単な見分け方(その4)

Excelの達人の中には「習うより、慣れろだよ!」という方もいます。

私も以前は、そうでした。
でも、やっぱりこれも違うな、そう思うようになったきっかけがありました。
それは、「Excelの達人」と称される方が、大きなミスを、書籍でも、WEBでも、異口同音に主張されていることを何度も見かけたからです。
しかも、複数の方が、同じような論点で、同じような大きなミスをしているのです。
偶然とはいえ、これほどまで同じように大きなミスの記述を見かけると???
ここでその議論は割愛しますが、こうしたミスも、マイクソフトの公式ページを見れば、何が正しいのか分かります。

「モダンExcel」や「Power BI」など、ソフトウェアを動かすには、「基本的な仕組み」や「根本の原理」を知っておく必要があります。
それは、マイクソフトが公表する「1次情報」を知ることと同義なのです。

繰り返しになりますが、「モダンExcel」に限らず、マイクソフトの「1次情報」は、DocsやMSLearnなどで、マイクロソフトの開発者・技術者・エンジニアの方々のブログだったりします。
残念ながら、そのほとんどは英語です。
日本語の「1次情報」は、まだまだ少ないと思ってください。

「1次情報」が分からない、見つけられない、そもそも英語が分からない、ということであれば、信頼のおける日本語による「2次情報」でも良いと思います。取っ掛かりは、それでも良いでしょう。
ただし、その場合でも参考にする「2次情報」が信頼できるか、見極める必要はあります。
その「2次情報」が信頼できるか、判断基準の一つが、上記「イテレーター」のような、ちょっとした言い回しの違いなどに現れることがあります。「真実は細部に宿る」。

「共通用語」「業界用語」の言い回しの違いなどに気を付けていれば、簡易的にその「情報の真偽」を判断できると思います。
簡易的なので、PCR検査のように「擬陽性」となることもありますが、少なくとも「モダンExcel」における「異常点」としてグレーな情報であることを認識することは可能だと思いますので、こうした知識も参考にしてみてください。

「正しい1次情報」に基づく「正しいモダンExcel」、そしてその先にある「Power BI」にも影響を及ぼす「正しいパワークエリ」「正しいパワーピボット」「正しいDAX」などに関する「正しい知識」が広まることを、私だけではなく、マイクロソフトの関係者も期待しています。

健全な「モダンExcel」の利活用、そしてその先にある「Power BI」の正しい理解促進、こうしたことに「モダンExcel研究所」、そして拙著「モダンExcel入門」が、微力ながら一役を担えればと日夜研鑽を積んでおります。

今回のポイント
・DAXには、「行コンテキスト」と「フィルターコンテキスト」の二つがある。
・SUMとSUMXでは、結果が異なる。
・「末尾X」のDAX関数は「イテレーター」という「反復子」で、行ごとに計算する。
・情報の真偽は、「業界用語」「共通用語」との違いに着目してみるとよい。

■■■■■

「正しいモダンExcel」の使い方の基本を学ぶには、Power Query(パワークエリ)とPower Pivot for Excel(パワーピボット)の両者を「一体理解」する必要があります。
ぜひ、拙著「モダンExcel入門」(日経BP)で学んでみて欲しいと思います。
サンプルデータで、実際に手を動かしながら、理解を深めることもできます。参考にしてください。

■■■■■

「モダンExcel研究所」を楽しむ際の【注意事項】

コンテンツコピー、スクレイピングなど【厳禁】 ☚【検知ツール設置済】☚悪質な場合【法的措置】を講じます

(過負荷によるサーバー障害が生じた経験上、ご協力お願いいたします!)

モダンExcel研究所

フォローお待ちしてます!

4件のピンバック

コメントは現在停止中です。

error: Content is protected !!