ラベル メジャー の投稿を表示しています。 すべての投稿を表示
ラベル メジャー の投稿を表示しています。 すべての投稿を表示

2019/09/30

[Excel BI]ピボットテーブルで予算と実績を管理する

先日、ある方がPower BIで予算額と実績明細の比較と分析を行うにはどうやればいいか難しい、という話題がありました。ワークシートとセルを扱って計算する Excel ユーザーが Power BIを使い始めるときによく直面する「Excel ならできるのに Power BIだとうまくいかないケース」の一つでもあります。

ひとつ、Power BI の前に慣れ親しんだ Excel の Pivot Table だけで予算と実績を比較するピボットテーブル レポートを作ってみましょう。ワークシート関数は使いません。ただし、ピボットテーブルで「メジャー」を使ってみます。
Excelでなんでそんなに面倒なことするの?と思うかもしれませんが、Power BIとExcelを双方使えるようになるための頭の体操みたいなものです。ある意味 Power BIの世界ではワークシートでセルを自由に編集(セルに数式を埋め込む)することができる「エクセル脳」は結構邪魔になります。とはいえ Excel は使うことが多いので、ちょっとだけデータ処理の考え方を柔軟にしてみてください。

最終的に以下のようなピボットテーブル レポートを作ることを目的とします。
最終的に作成する予算と実績のピボットテーブル
単純なサンプルから目的のピボットテーブル レポートを作ってみます。

予算と明細テーブル

おおよそ、ワークシートで予算と実績を管理する場合、割り当てられた予算額の表(テーブル)があると思います。
予算テーブルのサンプル
もっと細かくても構わないのですが、まずはシンプルなケースで考えましょう。上の予算テーブルからは、事業部Aの前期(2019/1/1)の予算は100、後期(2019/7/1)の予算は50、事業部Bは前期のみ50、事業部Cは前期に10、後期に20の予算が割り当てられています。

これが、縦に部門、横に月があるクロス集計表は分析に使えません。おおよそ人間向けの確認・印刷用にクロス集計表をワークシートに作っていることが多いのですが、クロス集計表はビジネス分析では「結果の表」であって、分析用のデータではないことを肝に銘じてください。(クロス集計表変換方法はこちらを参照してください)

実績明細テーブルは以下のようなものです。明細レコードが追加されていくようなものです。
実績明細テーブルのサンプル

複数のテーブルからピボットテーブル レポートを作成する

SUMIFSなどを使わない、セルに関数式を入力しないで、ピボットテーブル レポートのみで目標の予実対比表を作るには、Excel 2013以降に導入されたリレーションシップとデータモデルを使った複数テーブルからピボットテーブルを作成する機能を使います。ちなみに「範囲」は使いません。必ずテーブルに変換してください。(ここが?と思う方は、過去のブログ投稿などを参照ください)

まずピボットテーブルは「集計が簡単」というのがメリットです。実績明細テーブルからピボットテーブル レポートを作るとすぐに以下のような集計表が作れます。
ピボットテーブル機能で集計表を作成する
同様に予算テーブルも以下のような集計表を作成することができます。
ピボットテーブル レポートによる予算集計表
この2つのピボットテーブルから予算額と実績額を比較できる表の作成ができれば、目的となる表になります。残念ながらピボットテーブルを結合する機能は(私の知る範囲)ありません。予算テーブルと実績テーブルの2つのテーブルから、両方のデータを使ったピボットテーブル レポートを作ります。

まずは、予算合計に対して、実績合計の比較表を作成してみます。複数のテーブルからピボットテーブルを作成する方法は過去に手順をおったブログを投稿していますので、こちらも参照ください。
以下は、総額を比較する手順をアニメーションGIFでとったものです。
予算と実績の合計を比較したピポットテーブルを作る
上のアニメーションGIFの最後のフレームが短いのですが、最終的には以下のピボットテーブル レポートを作成しました。予算の合計は230、それに対して実績の合計は218という表です。
予算・実績の合計の比較表
ここからがちょっとエクセル脳から「考え方」を変える必要があります。
上の表は予算額の合計と、実績額の合計を並べている表ですが、次にこれを「部門別」に分ける、と考えます。事業部Aの予算と実績、事業部Bの予算と実績、事業部Cの予算と実績にわけます。ピボットテーブルの経験のある人は、行ラベルに「事業部」をもってくると出来る!と思うでしょう。このピボットはデータモデルに追加しているので、予算と実績の両方のテーブルが使えます。そのテーブルから「部門」を行に追加すればできそうですが、思った通りの結果にはなりません。
部門を行に追加するも思った結果にならない
実績テーブルの[部門]を選ぶと、実績額は部門別になりますが、予算は全合計のままです。言い換えると実績テーブルの部門を選んで、部門別のフィルターをかけて、実績金額を分けることができたのですが、予算額はフィルターがかかっていない全合計のまま、と言えます。その逆もしかり、です。
実績は部門でフィルタがかかるが、予算はフィルタがかからない
予算を部門でフィルタすると実績は全合計のまま

マスターテーブル/DIMENSIONテーブルの追加

この予算テーブルも明細テーブルも、どちらもFactテーブルです。予算をとった部門や実績をあげている部門は事業部A,B,Cですが、もしかすると事業部Dがあるかもしれません。実績明細で予算をもっている部門がまだ実績がなく明細データがないケースは容易に考えられます。注意しなければならないのは、予算テーブルと実績テーブルの部門をリレーションシップで関連付けるのはまったく意味のないことです。
そこで部門のDimensionテーブル(マスターテーブル)を追加・作成して、各FACTテーブルとリレーションシップを貼り、Dimensionテーブルの項目でフィルターをかけてみます。
追加したシンプルな部門マスター
この部門マスターの部門名と、予算、実績テーブルの部門名でリレーションシップを作成します。
部門マスターと予算・実績テーブルとの間でリレーションシップを作成する
このリレーションシップを作成することで、予算テーブルおよび実績テーブルの集計を、部門マスターの[部門名]でフィルターをかけることが可能になります。
部門マスターの部門名で合計金額をフィルタリングする
次にやりたいのは、月別にする、四半期別に集計する、か、予算と実績から達成率や消化率といった計算結果を出す、のどちらかでしょう。今回は実績/予算で消化・達成率を出す方法をみてみます。ちなみにこれがメジャーをExcelで使うことになります。

ピボットテーブルでメジャーを追加する

Excelのピボットテーブルに詳しい人であれば「ん?メジャー?そこは集計フィールドじゃない?」と思うでしょう。ただ、複数テーブルを処理するためにデータモデルを使うと集計フィールドが使えなくなるのです。(リボンでグレイアウトされます)そのかわりにメジャーを使うことになります。なお、セルに関数式を使って消化・達成率の計算はできますが、その誘惑に負けないようがんばりましょう。(これがエクセル脳の弊害のひとつです)

すでに以下のように部門別の予算・実績テーブルができています。ここに実績合計を予算合計で割った、消化・実績の割合を計算するフィールドを追加します。
ピボットテーブルでメジャーを追加する
メジャーの数式入力欄では "[" を入力すると、計算に利用できるフィールドのリストが表示されます。表示形式もセル範囲指定の書式変更でなく[値フィールドの設定]から書式設定を行ってください。メジャーによる消化・達成率を使って、以下のピボットテーブル レポートが作成できました。
消化・達成率のメジャーを追加した予実管理表
日にち・時間はExcelやPower BIでは重要でかつ難しいエリアです。特にExcelは内部で暗黙的にカレンダーをもっているので、通常ExcelユーザーはカレンダーをDimensionテーブルとして意識していません。
先の部門別のフィルターが予算合計と実績合計に適用するときのように、日付についてもFactテーブル(予算と実績のテーブル)にある日付を使うとうまくいきません。Dimensionテーブルとしてのカレンダーテーブルを作成し、そこからFactテーブルの予算、実績テーブルの日付と関連づけて、カレンダーテーブルのフィールドを使ってフィルターします。
最終的には以下のようなピボットテーブル レポートの作成が可能です。
四半期別にした予実管理ピボットテーブル レポート
ピボットテーブル レポートなので、行ラベルの入れ替えも瞬時に可能です。
行ラベルの順序の入れ替えも容易
#NUMが気に入らない、、、とはいえ分母(予算)が0なので、計算式的にはエラーですので、このあたりは「決め」の問題で対応を考えるしかありませんね。

いかがだったでしょうか。
唯一、計算式を記入したのはメジャーの数式の部分でした。Excelのピボットテーブル機能は、オリジナルのExcelと、将来メインになるだろうPower BIとちょうど中間にあるような感じだと思います。いきなり Power BI 脳になるのも難しく、かといって Excel 脳だとなかなか Power BI の世界が異質に見えるのも確かです。

これらの機能を使ったほうがいいのは、やはりデータが動いている状況でのレポートが欲しい時です。ピボットテーブル レポートなので、実績明細が常に追加される状況では「更新」を押すだけで最新データを使ったレポートに更新されるからです。日々レポートを更新しなければならない人にとっては、これほど素晴らしい機能はありません。
さらにセルに直接数式を入力していないため、実績明細のレコードが増えて予実比較表の行数が増えても、数式を入れ直すことなく表の更新が可能になります。

ここから他の人とレポートを共有しなければならない場合は、Excelではなく Power BI を使うことを検討したほうがいいでしょう。Enterprise BI は常に他の人とのデータおよびレポートの共有が必須ですから、エンタープライズでの BI は Power BI に向かうのは必然だと考えます。

これが少しでもみなさんの参考になれば幸いです。

2017/05/23

[Excel BI] ピボット テーブルとメジャー

先日、Power BI 勉強会で「使える!クイック メジャー」というお題でお時間をいただき、メジャーの紹介をいたしました。勉強会にご参加いただいたみなさま、ありがとうございました。また、このブログで「Excel ユーザーにとってのメジャーとは?」というタイトルの記事を過去に投稿しています。参照数などから、この話題は興味のある人が多いようで、エクセル ユーザーも「メジャー」や Power BI といったキーワードが気になっているようですね。

Office 製品は、機能はもう十分です、追加は要りません、と言われた時期もありましたが、現在、Excel はちょっとした改善ではなく、ガラリと使い勝手が変わる機能強化が押し寄せてきているように感じます。

そのような機能強化の中で「これは・・・」と私も驚いた機能をご紹介します。先日の勉強会では、メジャーを理解するにはいったんExcelを(セルを基本とするワークシートを)忘れたほうがいいかもしれない、という紹介をしたのですが、実は、Excel のピボット テーブルで「メジャー」を使う、というお話です。

データ モデル利用のデメリット

VLOOKUP関数などを使わず、いわゆる「表引き」を実現する「リレーションシップ」の機能は、Excel 2013から標準機能として搭載されました。

[ブログ] テーブルのすすめ ピボット テーブルとリレーションシップ
https://road2cloudoffice.blogspot.jp/2014/11/blog-post_7.html

[Office Support] Excel のテーブル間にリレーションシップを作成する
https://support.office.com/ja-jp/article/fe1b6be7-1d85-4add-a629-8a3848820be3

このリレーションシップ機能は、分析するデータを「データ モデル」に格納して、ピボット テーブルを作成しますが、当初、データ モデルにより使えなくなる機能がいくつかありました。その代表が「日付のグループ化ができない」と「集計フィールドが使えない」でした。
データ モデル利用によりグレイアウトされた集計フィールド
日付のグループ化などは機能拡張で後日対応しましたが、集計フィールドは日付のグループ化のような後日対応はありませんでした。集計フィールド同等の機能は、Power Pivot のメジャーや計算列で対応が可能だったからだと思います。

しかし、Power Pivot はすべてのエディションで利用可能ではありません。一部古いバージョン用を除いて、ダウンロードセンターから Power Pivot アドインのダウンロードもできなくなりました。
例えば、Office 365 Business の Excel で Power Pivot を利用することはできません。Office 365 ProPlus と Excel 2016 の Professional Plus のエディションに限られ、このエディションにはアドインとして最初から同梱されてます。つまり、所有している Excel のアドインに同梱されていなければ利用できない、ということです。

Excel 2016 のデータ モデルのピボット テーブル

では、Power Pivot を利用できないエディションでメジャーの作成ができないのか、ということです。
Excel でメジャーの作成を検索すると Power Pivot を使う情報がほとんどですが、Excel 2016 以降、Power Pivot アドインを含んでいない Office 365 Business 含め、いずれのエディションでも、ピボット テーブルでデータ モデルを利用すると、Power Pivot なしでも「メジャー」の作成が可能になっています。

以下のようなシンプルな列で構成されるテーブルを使って検証してみます。


このような表やテーブルからピボット テーブルを作成する時、[ピボットテーブルの作成] ダイアログ ウィンドウの [このデータをデータ モデルに追加する] のチェックを入れて、データ モデルにテーブルを追加します。ピボットテーブルは「データ モデル」に追加され、そこから作成されます。


複数テーブルの分析をしなくても、このチェックをオンにしてデータ モデルからピボットテーブルを作ることができます。
ピポット テーブル作成後、フィールド リスト ウィンドウに表示されるテーブル(サンプルでは [Table01])上で右クリックをすると、[メジャーの追加] を含むコンテキストメニューが表示されます。


[メジャーの追加] をクリックすると、メジャー のダイアログ ウィンドウが表示されます。ここで DAX を使ってメジャーの数式を作成・編集することが可能です。


集計フィールドの代替でメジャーを利用

Excel の集計フィールドの説明や解説では、テーブルの列の数値から消費税を計算したり、売上から原価を引いて粗利を計算したり、といった例が紹介されます。
データ モデルを使ったピボット テーブル レポートでは、集計フィールドのかわりにメジャーを使うことができますが、数式に相当する表記方法はメジャーの表記方法(=DAX数式)を使う必要があります。

たとえば、数値A列の数値に 0.08 を乗算する消費税の計算のようなものだと、集計フィールドを使うと以下のような数式になります。
集計フィールドによる消費税計算
メジャーでそのまま同じ式を使うと以下のようになります。

これは本物のメジャーなんですね。ですから、ワークシート上の構造化参照式のような数式はエラーになるんですね。='table01'[数値A]*0.08 という数式を入れた時のエラーは以下です。

この数式は無効または不完全です: 'Calculation error in measure 'table01'[mj2]: A single value for column '数値A' in table 'table01' cannot be determined. This can happen when a measure formula refers to a column that contains many values without specifying an aggregation such as min, max, count, or sum to get a single result.'。

'table01' の数値Aは単一の値として定義されていない(列で複数の行を持っている)から計算できません。min や max、count や sum などの集計関数を使って、単一の結果を取得して、それを使いなさい、というような内容です。

ピボット テーブル レポートの基本的な「動き」は、レポートの行ラベルまたは列ラベルとして設定された要素でグループ化をして集計するものです。よくあるのは行は製品区分、列は年度、のようなマトリクス表です。また、集計対象の要素が数値データで構成されていれば「合計」を計算し、数値以外を含んでいるデータであれば「個数」を集計します。これがいわゆる「暗黙のメジャー」というわけです。


ピボット テーブル レポートで計算が合わない原因

暗黙といわれるせいか、あまり意識されていないかもしれませんが、ピボット テーブルにおける数値列の計算は、まずは合計を計算します。たとえそれが列に対するパーセンテージを計算するものであっても、行ラベルのグループで「合計」をしてから、列合計を分母として、行ラベル合計を分子にして割合を計算、という順序です。(それゆえ実務では、サンプルとして使っている消費税の計算は、メジャーではなく、元のテーブルに列を追加して各行にて端数処理を行い合計すべきか、合計してから消費税を計算し、端数処理を行うかは注意しなければなりません)

ちょっと話がそれますが、ピボット テーブル機能が今ひとつ一般的にならず、人気がない、もしくは難しいといって避ける人が多いのは、個人的に上述の「まず、行・列のラベルのグループで合計しているんだよ」という暗黙の計算を意識していないせいではないかと思います。

ピボットあるあるの話で、かつ、間違った解説をしている記事がネット上にいくつかあるのですが、集計フィールドの解説で「受注金額は、単価*数量 で求められるので、ピボット テーブル レポートで 単価*数量 の数式の集計フィールドを追加すればいいんですよ。」と紹介しているものがあるのですが、これは完全な誤情報です。それ、本当に間違いです。Google での検索で結構上位にくるものでも、このような説明をしている記事を見ることができます。本当に注意してください。以下その解説です。

単純に以下を考えてみましょう。佐藤さんは、5月に、単価 100円のものを1個、単価1000円のものを1個売りました。佐藤さんの5月の売上はいくらでしょう?

100円*1個で100円と、1000円*1個で1000円、合計は 1,100円ですよね。

これをピボット テーブルの集計フィールドで、受注は 単価*数量 だからといって、受注の集計フィールドを作って計算すると、2,200円になります。2件しかありませんからすぐに間違いに気が付きますが、もし、件数が多い場合などすぐには気が付かないでしょう。

この計算は、まず、佐藤さんというレコード(行)を集めます。その次に、単価の列で合計します。単価は 100 と1000 が1つづつあるので 1100 です。次に数量の列で合計をします。1が2つあるので 2 になります。最後に集計フィールドで指定されている数式による演算を行います。1100 * 2 なので結果は 2200 です。

つまり、集計フィールドの例としてあげている数式の、受注金額=単価*数量 は、

受注金額 = SUM(テーブル[単価]) * SUM(テーブル[数量])

を計算しています。

これは、利益のような加算、減算であれば問題ありません。利益 = 売上 - 原価 の数式は、1行ごとに計算したものを最後に合計しても、総売上から総原価を引いても同じです。

ピボット テーブル レポートの計算結果が間違っていることがあるので使いたくない、という話を聞きます。「元データが汚いよね」というのも現実ですが、この行・列ラベルでの小計が優先されることを意識していない場合もあるかもしれません。

ここでメジャーに話が戻るのですが、その意味で、ピボット テーブルのメジャーの数式では、=[単価] * [数量] という数式を記入すると上述のエラーになります。明確に以下のように数式を書かなければなりません。そして、その段階で数式がおかしいことに気が付いてほしいわけです。

= SUM('テーブル'[単価]) * SUM('テーブル'[数量])

なお、受注金額の合計を求めたいのであれば、元データに単価*数量の列を追加するか、Power Query/取得と変換 のクエリエディターで計算列を追加し、あらかじめデータ モデルに計算データを取り込むことになります。Power BI Desktop の場合はデータを取り込んだ後で、計算列の追加を使ってもいいでしょう。
Powered by Blogger.

自己紹介

自分の写真
1989年新卒で日本IBMに入社しダウンサイジング担当としてホストコンピュータと繋げるオフコン、UNIX、PCサーバーのプロジェクトを担当。1997年 MSKK(現日本マイクロソフト)入社、NT4出荷に伴い企業向けサポート部門のビジネスマネージャーとして Excel 使いとなり、2002年 にMSMVPなどをサポートするユーザーコミュ二ティ部門を設立、部門をリード。2006年にMSKK退職後、企業向けのITトレーニング会社・団体に携わり、2014年頃よりPowerBI勉強会主催メンバーの一人として参画、そのコミュニティ活動で MSMVP for Data Platform PowerBI 2017受賞。https://mvp.microsoft.com/ja-jp/PublicProfile/5002635 同年にMVP Awardを返上し、アマゾン ウェブ サービス ジャパンに入社、コミュニティプログラム担当として現在に至る。