Contribution Explorer (Snowflake Cortex ML ベースの関数)

Contribution Explorerは、観測されたメトリックの変化に関する根本原因分析のプロセスを合理化し、改善するように設計されています。Contribution Explorerは、あるメトリックの経時的な値を取り、そのメトリックに関してデータのシフトを分析し、どのデータセグメントが各シフトを促進しているかを判断します。

注釈

Contribution Explorerは、Snowflakeのインテリジェントなフルマネージド AI および ML サービスであるSnowflake Cortexの一部です。この機能は、Snowflake Cortex ML ベースの関数スイートの一部です。

たとえば、売上を追跡している場合、Contribution Explorerは、収益不足を引き起こしている拠点、営業担当者、顧客、業種、その他の要因を特定するのに役立ちます。それにより、即座に的を絞った是正措置を取ることができます。

Contribution Explorerでの分析に適したデータセットの候補には、次のような特徴があります。

  • 1つ以上の厳密に負ではないメトリック。ある行から次の行におけるメトリックの変化は負であってもかまいませんが、メトリックの変化そのものが負であってはなりません。

  • 1つ以上のタイムスタンプ。

  • データをセグメント化するために使用する列またはディメンション。これらは多くの場合、カテゴリ別(場所、市場セグメントなど)ですが、連続的(つまり、気温や入場者数など定量的)な場合もあります。

クエリやパイプラインでContribution Explorerを直接使用するには、 TOP_INSIGHTS テーブル関数を呼び出します。この関数は、データセットで最も重要なディメンションを見つけ、これらのディメンションからセグメントを作成して、メトリックに影響を与えたセグメントを検出します。

ちなみに

ダッシュボードのクエリを分析するためにContribution Explorerを使用するには、すべてのディメンションにわたってメトリックを集計するときに、通常はクエリに含めないディメンション列を追加することが必要になる場合があります。

TOP_INSIGHTS は、ディメンションの数が多いデータセットから根本原因を抽出するのに適しています。連続ディメンションもサポートされ、結果は負の条件を持つディメンションを示すことができます(例: 「北米以外のリージョン」)。

TOP_INSIGHTS の結果は、データのばらつきに寄与するディメンションです。

重要

法律上の注意点。 このSnowflake Cortex ML ベースの機能は、機械学習技術によって実現されています。機械学習技術と提供される結果は、不正確、不適切であったり、偏っていたりする可能性があります。自動パイプラインに組み込まれたものも含め、機械学習の出力に基づく決定には、モデルが生成したコンテンツが正確であることを保証するために、人間によるモニタリングとレビュープロセスが必要です。Snowflake Cortexの ML ベースの関数クエリは、他の SQL クエリと同様に扱われ、 メタデータ と見なされる可能性があります。

メタデータ。 Snowflake Cortex ML ベース関数を使用する場合、Snowflakeのログは メタデータフィールド に述べられている内容に加えて、 ML 関数によって返される一般的なエラーメッセージを記録します。これらのエラーログは、発生した問題のトラブルシューティングや、お客様により良いサービスを提供するための機能改善に役立ちます。

検索パスの更新

SNOWFLAKE.ML を検索パスに追加すると、クエリでは SNOWFLAKE.ML.TOP_INSIGHTS の代わりに TOP_INSIGHTS と記述するだけでよくなります。以下のステートメントはその違いを示しています。

SELECT SNOWFLAKE.ML.TOP_INSIGHTS(...);
SELECT TOP_INSIGHTS(...);
Copy

SNOWFLAKE.ML を検索パスに追加するには、以下を実行します。

ALTER SESSION SET SEARCH_PATH='$current, $public, SNOWFLAKE.ML';
Copy

検索パスの変更は、Snowflakeセッションの間、有効です。検索パスを永続的に変更するには、代わりにアカウントレベルで設定します。

USE ROLE ACCOUNTADMIN;
ALTER ACCOUNT SET SEARCH_PATH='$current, $public, SNOWFLAKE.ML';
Copy

このクエリ例では、テーブル input_table を使用します。管理グループはモデルのトレーニングに使用され、テストグループは洞察を取得するデータです。

  1. テーブルを作成します。

    CREATE OR REPLACE TABLE input_table(
      ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);
    
    Copy
  2. 管理グループとテストグループの記録をテーブルに挿入します。

    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'usa' AS dim_country,
        'tech' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'usa' AS dim_country,
        'auto' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, seq4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'usa' AS dim_country,
        'fashion' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'usa' AS dim_country,
        'finance' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'canada' AS dim_country,
        'fashion' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'canada' AS dim_country,
        'finance' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'canada' AS dim_country,
        'tech' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'canada' AS dim_country,
        'auto' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'france' AS dim_country,
        'fashion' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'france' AS dim_country,
        'finance' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'france' AS dim_country,
        'tech' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
        UNIFORM(1, 10, RANDOM()) AS metric,
        'france' AS dim_country,
        'auto' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    -- Data for the test group
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1)) AS ds,
        UNIFORM(300, 320, RANDOM()) AS metric,
        'usa' AS dim_country,
        'auto' AS dim_vertica
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    INSERT INTO input_table
      SELECT
        DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1))  AS ds,
        UNIFORM(400, 420, RANDOM()) AS metric,
        'usa' AS dim_country,
        'finance' AS dim_vertical
      FROM TABLE(GENERATOR(ROWCOUNT => 365));
    
    Copy

クエリ例

以下のクエリ例では、上記で定義したテーブル input_table から上位の洞察を生成します。

WITH input AS (
  SELECT
    {
      'country': input_table.dim_country,
      'vertical': input_table.dim_vertical
    }
    AS categorical_dimensions,
    {
         'length_of_vertical': length(input_table.dim_country)
    }
    AS continuous_dimensions,
    input_table.metric,
    IFF(ds BETWEEN '2020-08-01' AND '2020-08-20', TRUE, FALSE) AS label
  FROM input_table
  WHERE
    (ds BETWEEN '2020-05-01' AND '2020-05-20') OR
    (ds BETWEEN '2020-08-01' AND '2020-08-20')
)
SELECT res.* from input, TABLE(
  SNOWFLAKE.ML.TOP_INSIGHTS(
    input.categorical_dimensions,
    input.continuous_dimensions,
    CAST(input.metric AS FLOAT),
    input.label
  )
  OVER (PARTITION BY 0)
) res ORDER BY res.surprise DESC;
Copy

注釈

TOP_INSIGHTS 関数の引数については、 TOP_INSIGHTS をご参照ください。

クエリ例の詳細:

  • 入力テーブルからの列 dim_countrydim_vertical は、ディメンジョン 'country''vertical' になります。

  • 連続ディメンションは、入力テーブルにある vertical 列の値の長さから導出されます。この列がディメンション length_of_vertical になります。

  • メトリック値は列 'metric' にあります。

  • ラベル(指定された行がテストデータか管理データかを決定する)は、2020年8月1日から2020年8月20日までの日付のみで TRUE のブール式です。

  • WHERE 句は、考慮する行を管理範囲とテスト範囲に制限します。

  • OVER (PARTITION BY 0) 句は、表形式入力が一緒に処理されることを保証します。

  • クエリの結果には res という名前が与えられます。

  • 結果は、サプライズ順にランク付けされます。サプライズは、親セグメントのメトリックの変化に基づいて、セグメント内のテストメトリックが期待値を超える量を表します。

クエリの結果:

+--------------------------------+----------------+-------------+------------------+-----------------+--------------+----------------------+------------------------+---------------------+----------------------+-------------+-----------------+
| CONTRIBUTOR                    | METRIC_CONTROL | METRIC_TEST |         SURPRISE | RELATIVE_CHANGE | GROWTH_RATE  | EXPECTED_METRIC_TEST | OVERALL_METRIC_CONTROL | OVERALL_METRIC_TEST | OVERALL_GROWTH_RATE  | NEW_IN_TEST | MISSING_IN_TEST |
|--------------------------------+----------------+-------------+------------------+-----------------+--------------+----------------------+------------------------+---------------------+----------------------+-------------+-----------------|
| [                              |            105 |        8327 |   7022.967741935 |     6.385578231 | 79.304761905 |       1304.032258065 |                   1271 |               15785 |         79.304761905 | False       | False           |
|   "country = usa",             |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
|   "vertical = finance"         |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
| ]                              |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
| [                              |            105 |        8327 |   7022.967741935 |     6.385578231 | 79.304761905 |       1304.032258065 |                   1271 |               15785 |         79.304761905 | False       | False           |
|   "not country = canada",      |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
|   "length_of_vertical <= 4.5", |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
|   "vertical = finance"         |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |
| ]                              |                |             |                  |                 |              |                      |                        |                     |                      |             |                 |

... (additional rows of output) ...

+--------------------------------+----------------+-------------+------------------+-----------------+--------------+----------------------+------------------------+---------------------+----------------------+-------------+-----------------+

コストの考慮事項

TOP_INSIGHTS 関数の使用にはコンピューティングコストがかかります。ランタイムは、ディメンションの数とそれらのディメンションのカーディナリティによって変化します。(ディメンションのカーディナリティが5より大きい場合、カーディナリティは自動的に小さくなります。)

Snowflakeのコンピューティングコストに関する一般的な情報については、 コンピューティングコストについて をご参照ください。