Contribution Explorer (fonctions basées sur Cortex Snowflake ML)

Contribution Explorer est conçu pour rationaliser et améliorer le processus d’analyse des causes profondes des changements dans les métriques observées. En prenant les valeurs d’une certaine métrique dans le temps, Contribution Explorer analyse les changements dans les données par rapport à cette métrique, pour déterminer quels segments de données sont à l’origine de chaque changement.

Note

Contribution Explorer fait partie de Cortex de Snowflake, le service AI et ML intelligent et entièrement géré de Snowflake. Cette fonction fait partie de la suite de fonctions basées sur Cortex Snowflake ML.

Par exemple, si vous suivez les ventes, Contribution Explorer peut vous aider à identifier les sites, les vendeurs, les clients, les secteurs verticaux et d’autres facteurs à l’origine d’un manque à gagner. Vous pouvez alors prendre des mesures correctives immédiates et ciblées.

Les ensembles de données susceptibles d’être analysés avec Contribution Explorer présentent les caractéristiques suivantes :

  • Une ou plusieurs métriques strictement non négatives. Le changement de métrique d’une ligne à l’autre peut être négatif, mais la métrique elle-même ne doit jamais l’être.

  • Un ou plusieurs horodatages.

  • Des colonnes ou dimensions pouvant être utilisées pour segmenter les données. Elles sont souvent catégoriques (lieu, segment de marché, etc.) mais peuvent être continues (c’est-à-dire quantitatives, telles que la température ou la fréquentation).

Pour utiliser Contribution Explorer directement dans vos requêtes et pipelines, appelez la fonction de table TOP_INSIGHTS. Cette fonction détermine les dimensions les plus importantes d’un ensemble de données, construit des segments à partir de ces dimensions et détecte lesquels de ces segments ont influencé la métrique.

Astuce

Pour utiliser Contribution Explorer afin d’analyser une requête de tableau de bord, vous devrez peut-être ajouter des colonnes dimensionnelles que vous n’incluriez pas habituellement dans votre requête lors de l’agrégation d’une métrique à travers toutes les dimensions.

TOP_INSIGHTS est bien adapté à l’extraction des causes profondes à partir d’ensembles de données comportant un grand nombre de dimensions. Les dimensions continues sont également prises en charge et les résultats peuvent indiquer des dimensions avec des conditions négatives (par exemple, « la région n’est pas l’Amérique du Nord »).

Les résultats de TOP_INSIGHTS sont les dimensions qui contribuent à la variation des données.

Important

Mention légale. Cette fonction Snowflake Cortex basée sur le ML est alimentée par une technologie de machine learning. La technologie de machine learning et les résultats fournis peuvent être inexacts, incorrects ou biaisés. Les décisions basées sur les résultats du machine learning, y compris celles qui sont intégrées dans des pipelines automatiques, devraient être soumises à une supervision humaine et à des processus d’examen pour s’assurer que le contenu généré par le modèle est exact. Les requêtes de fonctions Snowflake Cortex basées sur le ML seront traitées comme toute autre requête SQL et peuvent être considérées comme des métadonnées.

Métadonnées. Lorsque vous utilisez des fonctions Snowflake Cortex basées sur le ML, Snowflake enregistre les messages d’erreur génériques renvoyés par une fonction ML, en plus de ce qui est mentionné dans les champs de métadonnées. Ces journaux d’erreurs nous aident à résoudre les problèmes qui surviennent et à améliorer ces fonctions pour mieux répondre à vos demandes.

Mise à jour de votre chemin de recherche

Si vous ajoutez SNOWFLAKE.ML à votre chemin de recherche, vous pouvez simplement écrire TOP_INSIGHTS au lieu de SNOWFLAKE.ML.TOP_INSIGHTS dans vos requêtes. Les instructions ci-dessous montrent la différence :

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

Pour ajouter SNOWFLAKE.ML à votre chemin de recherche, procédez comme suit :

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

La modification du chemin de recherche reste en vigueur pendant votre session Snowflake. Pour modifier votre chemin de recherche de manière persistante, définissez-le plutôt au niveau du compte :

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

Exemple

Cet exemple de requête utilise la table input_table. Un groupe de contrôle est utilisé pour entraîner le modèle et le groupe de test est constitué des données sur lesquelles vous souhaitez obtenir des informations.

  1. Créer la table :

    CREATE OR REPLACE TABLE input_table(
      ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);
    
    Copy
  2. Insérez les enregistrements des groupes de contrôle et de test dans la table :

    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

Exemple de requête

L’exemple de requête ci-dessous génère des informations de premier ordre à partir de la table input_table définie ci-dessus.

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

Note

Pour des informations sur les arguments de la fonction TOP_INSIGHTS, voir TOP_INSIGHTS.

Détails de l’exemple de requête :

  • Les colonnes dim_country et dim_vertical de la table d’entrée deviennent les dimensions 'country' et 'vertical'.

  • Une dimension continue est dérivée de la longueur de la valeur dans la colonne vertical de la table d’entrée. Cette colonne devient la dimension length_of_vertical.

  • La valeur de la métrique se trouve dans la colonne 'metric'.

  • La balise (qui détermine si une ligne donnée est une donnée de test ou de contrôle) est une expression booléenne qui est TRUE uniquement pour les dates comprises entre le 1er août 2020 et le 20 août 2020 inclus.

  • La clause WHERE limite les lignes prises en compte aux plages de contrôle et de test.

  • La clause OVER (PARTITION BY 0) assure que les entrées tabulaires sont traitées ensemble.

  • Le résultat de la requête est appelé res.

  • Les résultats sont classés en fonction de leur surprise, qui représente l’ampleur avec laquelle la métrique testée dans le segment dépasse sa valeur attendue sur la base de l’évolution de la métrique dans le segment parent.

Résultats de la requête :

+--------------------------------+----------------+-------------+------------------+-----------------+--------------+----------------------+------------------------+---------------------+----------------------+-------------+-----------------+
| 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) ...

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

Considérations relatives aux clients

L’utilisation de la fonction TOP_INSIGHTS entraîne des frais de calcul. La durée d’exécution augmente avec le nombre de dimensions et la cardinalité de ces dimensions. (La cardinalité est automatiquement réduite si une dimension a une cardinalité supérieure à 5.)

Voir Comprendre le coût du calcul pour obtenir des informations générales sur les coûts de calcul de Snowflake.