Qlikのピボットテーブルのヒートマップ表示をDimensionality関数で仕上げる

こんにちは!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列目を対象外とする

というような方法をとることで、本来意図したヒートマップ表示が実現します。

以前から、同じ問題にぶち当たると、その場で何とかテキトーにやってきましたが、ブログでまとめておくと考えが整理できていいですよね。

ではまた!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次