こんにちは!Yokoです。
少しご無沙汰してしまいましたが、この間でインフルエンザになってしまって、意識朦朧としながら仕事したり、効率が低下したことで仕事の遅れを取り戻すのに忙しかったり…
そんな悪循環から少し抜け出せたので、ブログ書こうかなと思い立ちまして、パソコンに向かっております。
今回は、僕自身も曖昧にしてきたピボットテーブルのヒートマップ化で発生する合計行問題ついて解説します。
どこかできちんと整理しておきたかったんですよねー
まずはピボットテーブルのヒートマップ化
ピボットテーブルのヒートマップを行うにはColorMix1関数で最大から最小までのグラデーションを表現します。
最小は0で、最大は1ですので、「クロス集計表の各セルの値が、セル全体の最大値と比較するといくらか」というような計算をするんですよね。
よって、典型的なColorMix1を用いた背景色の数式は以下のようになります。
=ColorMix1(
Sum(売上金額)
/
Max(total
Aggr(Sum(売上金額)
,店舗タイプ,店舗名,カテゴリ名
)
),
RGB(255,255,255),
RGB(79,168,212)
)そして、ピボットの表示はこんな風に綺麗に表示されて、数値の大小が一目瞭然で把握できますよね。

ピボットテーブルの合計行(列)にも色がついてしまう….
ピボットテーブルでは、合計行(列)を表示するのが普通ですよね。
ピボットテーブルを上のようにヒートマップ化している時に、合計行(列)を表示するように設定してみるとこんなふうになってしまいます。

どうしてこんな表示になるのかというと、合計行(列)を含まないセルの最大値に対する、各セルの値の比率を求めているわけだから、合計行の値 > セルの最大値 ということがあり得るわけです。その時、ColorMix1の値が1を超えてしまうため、背景色はなくなってしまうという訳です。
しかしながら、合計行(列)はヒートマップの対象としたくないので、固定の色にしておきたい(例えば薄いグレーとか)という要件が普通だと思うんですよね。
そのように割り切ると、方法は見えてきます。
Dimensionality関数って何?
Dimensionality関数は =Dimensionality() というような使い方をするのですが、軸の次元数を返します。
上記のチャートの例でいいますと、店舗タイプが1次元目、店舗名が2次元目、その下に表示される売上は3次元目です。
ここでいう次元は行単位であることに留意して下さいね。列側の軸である「カテゴリ名」は含まれません。
Dimensionality()が2を返してくる場合は売上を表示していますが、Dimensionality() = 0のときは店舗タイプの合計行Dimensionality() = 1の時は店舗の合計行です。
従って、Dimensionality() = Max(Dimensionality())という条件を入れてあげることで、合計行をヒートマップの対象外にすることができます。
さて、上でDimensionality()は、行でしか使えないとお話しました。
では、「カテゴリ名」の合計列はどうすれば対象外にできるでしょうか?
こちらではDimensionality関数が使えませんから、ColumnNo()で列番号を取得します。
Column() = 0は合計列ですので、ヒートマップ化の数式では、Column() > 0 という条件を入れてあげればいいですよね。
最終的な、ヒートマップの数式は以下のようになりました。
=If(Dimensionality() = Max(Dimensionality()) and ColumnNo() > 0,
ColorMix1(
Sum(売上金額)
/
Max(total
Aggr(Sum(売上金額)
,店舗タイプ,店舗名,カテゴリ名
)
)
,RGB(255,255,255)
,RGB(79,168,212)
)
,RGB(192,192,192)
)では、この状態でチャートを表示させてみましょう!
合計行・合計列の背景はグレーに、ヒートマップの対象としたかったセルにはグラデーションが設定されました。

まとめ
ピボットテーブルのヒートマップ化は、数値の大小を色で表現してくれるために、データの理解に役立ちます。
一般には、ColorMix1などの関数を使用してヒートマップ化することが多いわけですが、合計行(列)を表示する設定に変更しただけで破綻してしまいます。
そんな時は、
- Dimensionality関数で、何次元目かを識別
- ColumnNo関数で1列目を対象外とする
というような方法をとることで、本来意図したヒートマップ表示が実現します。
以前から、同じ問題にぶち当たると、その場で何とかテキトーにやってきましたが、ブログでまとめておくと考えが整理できていいですよね。
ではまた!


