Amazon Web Services ブログ
Amazon QuickSight のレベルアウェア計算 (LAC) を使用して高度なインサイトを作成する
この記事は “ Create advanced insights using level-aware calculations in Amazon QuickSight” を翻訳したものです。
データ分析を行う際には、常に適切な粒度での計算を注意深く行う必要があります。特に複数のテーブルを結合してデータを生成する場合、データセットの非正規化によって複雑さが増し、正確な計算が困難になる可能性があります。Amazon QuickSight は最近、レベルアウェア計算 (LAC) と呼ばれる新機能をリリースしました。これにより、集計関数 (どのレベルでグループ化するか) またはウィンドウ関数 (どのウィンドウでパーティションを分割するか) を任意の精度で指定できます。これにより、高度な計算や強力な分析を柔軟かつ簡単に構築することができます。LAC を使用しない場合、元のデータソースにあらかじめ集計されたテーブルを用意するか、データ準備の段階でクエリを実行する必要があります。
この記事では、QuickSight の LAC を使用して高度なインサイトを作成する方法を紹介します。この機能の説明を始める前に、まず QuickSight において重要な概念である評価の順序について紹介し、次に LAC について詳しく説明します。
QuickSight における評価の順序
分析を開いたり更新したりするたびに、QuickSight は分析で設定されたすべての内容を特定の順序で評価し、その構成をデータベースエンジンが実行できるクエリに変換します。これが評価の順序です。複雑さの度合いは、ビジュアルに埋め込まれている要素の数に、ビジュアル数とビジュアル間の相互連携を掛け合わせたものに依存しますが、この概念を抽象化すると評価順番のロジックは次のようなチャートで示すことができます。
最初の DEFAULT ルートでは、QuickSight が元のデータセットに対して行レベルで簡単な計算を評価し、次に WHERE 句フィルターを適用します。その後、QuickSight はビジュアルに追加されたディメンションに基づいて、選択したメジャーの集計をビジュアル側に適用されたディメンションで評価し、HAVING 句フィルターを適用します。累計や合計に対するパーセントなどの表計算はビジュアルが作成された後に評価され、小計と合計が最後に計算されます。
場合によっては、分析ステップを異なる順序で実行したいことがあるかもしれません。たとえばデータをフィルタリングする前に集計を行ったり、最初に特定のディメンションで集計してから、ビジュアル側に適用されたディメンションについて再度集計したりすることができます。QuickSight では、こうしたさまざまなニーズに基づいて3 種類の評価順序を用意しています (前の図を参照)。具体的には、PRE_FILTER のキーワードを使用して WHERE 句フィルターの前に計算ステップを追加したり、PRE_AGG を使用してビジュアル側での集計の前に計算ステップを追加したり、あるいはレベルアウェア計算 – 集計関数の一式を使用して独立したディメンションで集計を定義し、それらをビジュアルディメンションで集計することができます (入れ子になった集計)。
ほとんどの場合、ビジュアルには複数の計算フィールドが含まれます。それぞれを注意深く定義し、ビジュアルや様々なフィルターとどのように相互作用するかを理解する必要があります。ウィンドウ関数の前後にフィルターを適用すると、まったく異なる結果やビジネス上の意味を生み出す可能性があります。
すべての背景を紹介したところで、ここからは新しい LAC の機能とメリットについて説明し、いくつかの典型的なユースケースをご紹介します。
レベルアウェア計算 (LAC)
LAC には次の 2 つのグループがあります。
- レベルアウェア計算 – 集計関数 (LAC-A) – これらは新しくリリースされた関数です。既存の集計関数 (
sum ()
、max ()
、count ()
など ) に引数を 1 つ追加することで、集計に必要な任意の Group by ディメンションを定義できます。LAC-A の一般的な構文はsum (measure, [group_field_A])
です。LAC-A を使うことで、ビジュアル集計が行われる前に集計ステップを追加できます。追加したレイヤーは固定できますが、ビジュアルのディメンションには依存しません。また、ビジュアルのディメンションと動的に相互作用することもできます。この記事の後半で、いくつかの具体的な例を紹介します。サポートされている集計関数の一覧については、レベルアウェア計算 – 集計 (LAC-A) 関数を参照してください。 - レベルアウェア計算-ウィンドウ関数 (LAC-W) – こちらは既存の機能で、以前は Level Aware Aggregation (LAA) と呼ばれていました。ウィンドウ関数と集計関数の根本的な違いから、関数の性質をよりよく反映させるために最近この名称を変更しました。LAC-W はウィンドウ関数 (
sumover ()
、maxover ()
、denseRank ()
など) のグループで、3 番目のパラメーターを使用して、計算を PRE_FILTER ステージで実行するか PRE_AGG ステージで実行するかを選択できます。LAC-W の一般的な構文はsumOver (measure, [Partition_field_A], pre_agg)
です。サポートされているウィンドウ関数の一覧については、レベルアウェア計算-ウィンドウ (LAC-W) 関数を参照してください。
次の概要図は LAC のさまざまな分岐を示しています。このブログでは、主に新しい LAC-A の機能に焦点を当てます。
新しい LAC-A 関数では、2 種類の集計計算を実行できます。これには以下のメリットがあります。
- ビジュアルの Group by フィールドとは独立して集計計算を実行する
- ビジュアルにないディメンションの集計計算を実行する
- 計算を実行する前に未処理のデータの重複を排除する
- Group byフィールドで集計計算を実行し、さらにビジュアルの Group by フィールドを動的に適用するネストされた集計計算を実行する
ここからはいくつかのユースケースを示しながら、上記のメリットを実現する方法を探ってみましょう。
ユースケース #1: 商品の注文数量が平均よりも多い注文を特定する
このケースではビジュアルは注文単位で表示されていますが、商品の平均数量を計算し、それぞれの行/注文ごとの差を表示したいと考えています。LAC-A 関数を使用すると、ビジュアルの表示単位に依存しない集計を簡単に作成できます。
まず、avg (Quantity, [Product])
という式を使用して、商品ごとの平均販売数量を計算します。そのため、ビジュアルレベルの集計を Average (平均) に変更します。この場合、 product
( 商品 ) は列として存在しており、LAC-Aも同じレベルであるため、ビジュアルレベルで指定している集計は考慮されません。結果テーブルでは、product
( 商品 ) の平均数量は商品単位で計算されるため、すべての注文にわたって繰り返されます。
商品単位での平均数量を計算できたので、これを拡張して sum (Quantity)-avg (avg (Quantity, [Product]))
という式を使用し、実際に注文した数量と商品の平均数量の差を計算します。次に、この差分を使用して商品の平均数量よりも数量が多い注文を強調するように条件付き書式を設定することができます。
この例から分かるように、ビジュアルは注文単位で表示されていましたが、ビジュアルの単位とは関係なく商品の平均数量といった集計を作成し、簡単に個々の行/注文ごとの差分を表示することができました。
ユースケース #2: 国別の総売上高の平均をリージョン別に特定する
ここでは、国ごとの売上高を集計し、同じデータセットを使って国別の売上高の平均をリージョン単位で計算したいと思います。
LAC-A 関数を使用することで、ビジュアルにはないディメンションの単位で集計を簡単に作成できます。この例では、country
( 国 ) はビジュアルに含まれていませんが、LAC-A 関数は最初に国単位での売上を集計し、次にビジュアルレベルの計算によって各リージョンの平均値を生成します。QuickSight ではこれを 2 つの方法で実現できます。
オプション 1: LAC-A をビジュアルレベルの集計関数でネストする
sum(Sales,[Country])
の式を使用して国ごとの売上を計算する計算フィールドを作成し、そのフィールドをビジュアルに追加し、次のスクリーンショットに示すように集計を Average (平均) に変更します。LAC-A を使用して集計単位を指定しないと、平均の売上高 ( Avg (Sales) ) は最も下位の単位(データセットの行レベル)でリージョンにて集計計算されるという点に注意してください。そのため、 sales
列の数値は大幅に少なくなっています。
オプション 2: LAC-A を他の集計関数と組み合わせて使用し、計算列にネストする
sum(Sales,[Country])
という式を使用して国ごとの売上を計算する計算フィールドのカラムを作成し、そのカラムに avg(sum(Sales,[Country]))
という式を使用して追加の集計 (この場合は Average ) をネストします。
ユースケース #3: 重複のある非正規化データセットの合計と平均を計算する
LAC-A 計算は、計算の実行中にデータ内の重複を効果的に処理するように設計されています。これにより、データ内の重複を明示的に処理しなくても平均値のような計算を実行できます。
従業員とプロジェクトの詳細、および各従業員の給与を含むデータセットについて考えてみましょう。次の例に示すように、従業員は複数のプロジェクトに紐づけることができます。
次に、このサンプルデータセットを使用して、従業員の給与合計、従業員の平均給与、最低給与、および最高給与を計算してみましょう。
一人の従業員が複数のプロジェクトに所属でき、給与が複数プロジェクトで重複している場合でも、合計と平均を計算するためには各従業員の給与は1回のみ考慮する必要があります。これは、LAC-A を使用して従業員ごとの給与の最大値を計算し、その結果を使用して合計と平均を計算することで簡単に実現できます。
sum(max(Salary,[{Employee Name}]))
という式を使用して Total Salary (給与合計) という計算列を作成し、avg(max(Salary,[{Employee Name}]))
という式を使用してAverage Salary (平均給与) という名前の計算列を作成します。 Min Salary (最小給与) はmin(Salary)
、Max Salary (最大給与) は max(Salary)
という式を使用して簡単に計算できます。
LAC-Aを使わずにこれを解決しようとすると、給与の重複を計算で明示的に処理する必要があり、最終的な結果を得るには複数のステップを踏む必要があります。同様のユースケースについては、QuickSight Community のブログを参照してください。
LAC-A の動的なグループキー
前の例で示したような静的な集計単位を定義する以外に、ビジュアルのGroup by フィールドのディメンションを動的に追加または削除することもできます。動的レベルの構文例を以下に示します。
sum(cost, [$VisualDimensions, LevelA, LevelB])
でビジュアルにディメンションを追加sum(cost, [$VisualDimensions, !LevelC, !LevelD])
でビジュアルからディメンジョンを削除
この機能により柔軟性と拡張性が大幅に向上し、LAC をさらに強力にすることができます。最初に LAC 計算フィールドを 1 つ定義すると、ビジネス上の利用目的が類似している複数のビジュアルで再利用できます。さらに、ビジュアル作成時にフィールドの追加や削除を続ける場合にLAC-A 計算フィールドを毎回編集する必要もありません。LAC-A はビジュアルのディメンションに合わせて自動的に調整され、適切な出力が得られます。
ユースケース #4: リージョンまたは国ごとの顧客の平均売上を特定する
こちらのケースでは、sum(Sales, [$VisualDimensions, Customers])
という動的な計算式を使用できます。顧客は複数のリージョンで購入しているため、それぞれのリージョンにおける顧客の平均売上高を計算する必要があります。国ごとの顧客の平均売上を計算したい場合は、country
(国)をビジュアルのディメンションで表現した別のビジュアルで再利用できます。
ビジュアルレベルの集計に Average (平均) を使用し、Region で Group by することでリージョンごとの平均が得られます。この場合、"$visualDimensions"
はリージョンに適用されます。つまり、このビジュアルにおいては sum(Sales, [Region, Customers])
と同じ表現となります。
Country
ディメンジョンを使った同様のビジュアルがある場合、動的な式は sum(Sales, [Country, Customers])
と同等になります。特にビジネスコンテキストが少し異なる類似のビジュアルを作成したい場合には、同じ表現をさまざまなビジュアルで再利用することで時間を大幅に節約できます。
ユースケース #5: リージョンに対するサブリージョンの売上比率を確認する
この例では、各リージョンの売上総額に対する各サブリージョンの売上の割合を計算したいと思います。前述のように固定されたディメンションを使用することもできますが、商品、年、サプライヤーなど、より多くのディメンションをビジュアルに含めたい場合を想像してみてください。動的グループキーを使用して {subregion} のみをビジュアルのディメンションから削除することで、探索プロセスをより簡単かつ迅速に行うことができます。
まず、sum(Sales, [$visualDimensions, !subregion])
を使って、サブリージョンレベルを除いた売上の合計を計算する式を作成します。次に sum(Sales) / sum(sum(Sales, [$visualDimensions, !subregion]))
を使ってリージョンに対する売上の比率を計算します。
まとめ
この記事では、新しくアップデートされた QuickSight LAC-A 関数を紹介しました。LAC-A は、ユーザーが定義できるディメンションを使って強力で高度な集計を可能にすることができます。まずはじめに QuickSight の評価順序を紹介し、LAC-A 静的キーの 3 つのユースケースと LAC-A 動的キーの 2 つのユースケースについて説明しました。現在レベルアウェア計算は、サポートされているすべての QuickSight リージョンで一般利用できるようになりました。
これらの計算をどのようにビジネスニーズに適用させたか、みなさまのフィードバックやストーリーをお待ちしています。
著者について
この記事は、Karthik Tharmarajan, Emily Zhu, Feng Hanによって投稿された記事を翻訳したものです。
翻訳は Solutions Architect 原田 江海咲 が担当しました。原文はこちらです。