Amazon QuickSight で「個別の値をカウント」をしつつパーセント表示してみた

2023.09.11

いわさです。

QuickSight のメジャーの集計で「個別の値をカウント」を選択した際に、カウントではなく全体に対する割合をパーセンテージで表示したいシーンがあったのですが、少し戸惑ったので備忘録として残しておきたいと思います。

前提

前提となるデータについてはじめに少し触れておきたいと思います。
ユーザーなどのマスターデータに対して、1 対多のトランザクションデータのようなものが存在しています。

ピボットテーブルで表示すると次のような感じですね。
user_id と blood_type がマスターのフィールドで、answer がトランザクションレコードのフィールドです。

この時、いずれかのディメンションで集計や分類を行うことは出来ると思いますが、今回のケースだと user_id つまりユーザー数をカウントしたい場合は、集計方法に通常のカウントを使うと、トランザクションテーブルと結合している関係で重複したユーザーがカウントされてしまいます。

合計で 6 人としてカウントされてほしいのですが、9 人になってしまいます。

そこでメジャーの集計方法で「個別の値をカウント」を選択することで重複を排除した上でカウントしてくれるようになります。6 人になりましたね。

この時、人数を表示したいのであればこのままで良いのですが、総人数に対するパーセンテージを表示したい場合に少し手間取りました。

「個別の値をカウント」では percentOfTotal が使えない

個別の値をカウントするカスタム集計フィールドを作成

分析上でデフォルトで使える集計オプションでは実現出来ないので、計算フィールドを追加してカスタム集計を行いたいと思います。

パーセンテージを計算する前に、まずは先程と同様に個別の値をカウントしてみます。
user_id をカウントしつつ、重複を除外するカスタム集計なので、次のようにdistinct_countを使います。

参考:distinct_count - Amazon QuickSight

ためしに分析のメジャーフィールドへ作成した計算フィールドを設定してみると、カスタム集計の結果は正しそうなことが確認出来ると思います。

パーセンテージを計算する percentOfTotal が使えない

では続いて、全体のユーザー数に対するパーセンテージを計算してみましょう。
QuickSight には便利な関数があって、合計を母数にしたパーセントを計算する関数percentOfTotalを使うことが出来ます。

参考:percentOfTotal - Amazon QuickSight

ただ、percentOfTotal を distinct_count で使おうとすると次のエラーが発生します。

個別のカウント集計への合計の追加は、現在サポートされていません

percentOfTotalのドキュメントにも記載されているのですが、現在 percentOfTotal では distinct_count がメジャーでサポートされていません。なんと。

ちなみに、普通の count であれば次のように使うことが出来ます。

ただし、前述のように重複の除いて計算する必要があるので今回はこの方法を取ることが出来ません。
「現在サポートされていません」ということなので将来的には使えそうな雰囲気は感じますが。

普通に計算しよう。ただちょっと注意が

ということで、自力で計算してみましょう。
distinct_countした結果は既にありますので、総ユーザー数を取得する必要があります。

総ユーザー数が固定であれば次のような感じです。

分析で表示すると次のようになります。

ただしフィルタなどによって母数は変わるのでこのまま総ユーザー数を固定で計算することは出来ません。

distinctCountOver で総数を取得出来るのだが...

distinct_countだとビジュアルのディメンションごとのユーザー数が重複を除外してカウントされます。
先程の分析ではビジュアルで blood_type をディメンションに指定しているので blood_type ごとのユーザー数をカウントしています。

そこでdistinctCountOverでレベルアウェア計算を使って、表示ディメンションに関係なくユーザーの総数を取得してみましょう。レベルアウェア計算については次の記事が参考になります。

集計が一致していません。カスタム集計には、集計フィールド xxx と非集計フィールド xxx の両方を...

ただし、この時次のようなエラーメッセージが表示されてしまいます。

集計が一致していません。カスタム集計には、集計フィールド “distinctCountOver” と非集計フィールド “DISTINCTCOUNTOVER(“user_id”,, PRE_AGG)” の両方をいずれの組み合わせでも含めることはできません。

ちょっとややこしいのですが QuickSight ではカスタム集計内で集計フィールドと非集計フィールドを組み合わせることが出来ません。次の公式ドキュメントにも記述されています。

今回であればdistinct_countが集計フィールドで、distinctCountOverが非集計フィールドになるようです。

適当な集計関数を追加した

今回distinctCountOverの結果は全レコード同一となります。
そこで上記問題の回避策として、それを前提に結果の変わらない適当な集計関数を使うことが出来ます。

下記ではminを使っていますが、maxavgでも良いと思います。sumは多分ダメです。

分析で表示してみると期待どおりの表示になりました。

フィルターも効いてる

計算フィールドを使ってカスタム集計を行っているので、フィルターなどに応じて対象ユーザーなども動的に切り替わるはずです。試してみましょうか。

次のようにフィルターを使って A 型のユーザーを 1 名除外してみましょう。

母数が 5 に変わって計算されていそうですね。
良さそうです。フィルターも効いていることが確認出来ました。

さいごに

本日は Amazon QuickSight で「個別の値をカウント」をしつつパーセント表示してみました。

QuickSight の本日時点の制限があり、意外に詰まりました。
それでもいくつかの回避策は取れるので、手詰まりにならずにまぁ色々やりようあるなとも思いました。