Contribution Explorer (funções baseadas em ML do Snowflake Cortex)

O Contribution Explorer foi concebido para simplificar e melhorar o processo de análise de causa raiz em torno de mudanças nas métricas observadas. Registrando os valores de alguma métrica ao longo do tempo, o Contribution Explorer analisa mudanças nos dados em relação a essa métrica para determinar quais segmentos de dados estão impulsionando cada mudança.

Nota

O Contribution Explorer faz parte do Snowflake Cortex, o serviço de ML e AI inteligente e totalmente gerenciado do Snowflake. Este recurso faz parte do conjunto de funções baseadas em ML do Snowflake Cortex.

Por exemplo, se você estiver acompanhando as vendas, o Contribution Explorer pode ajudar você a identificar os locais, vendedores, clientes, indústrias verticais e outros fatores que estão gerando uma queda na receita. Então você pode tomar medidas corretivas imediatas e direcionadas.

Bons conjuntos de dados candidatos para análise com o Contribution Explorer têm as seguintes características:

  • Uma ou mais métricas estritamente não negativas. A mudança na métrica de uma linha para a próxima pode ser negativa, mas a própria métrica nunca deve ser.

  • Um ou mais carimbos de data/hora.

  • Colunas ou dimensões que podem ser usadas para segmentar os dados. Geralmente são categóricos (localização, segmento de mercado etc.), mas podem ser contínuos (ou seja, quantitativos, como temperatura ou atendimento).

Para usar o Contribution Explorer diretamente em suas consultas e pipelines, chame a função de tabela TOP_INSIGHTS. Esta função encontra as dimensões mais importantes em um conjunto de dados, cria segmentos a partir dessas dimensões e, em seguida, detecta quais desses segmentos influenciaram a métrica.

Dica

Para usar o Contribution Explorer para analisar uma consulta de painel, pode ser necessário adicionar colunas dimensionais que você normalmente não incluiria em sua consulta ao agregar uma métrica em todas as dimensões.

TOP_INSIGHTS é adequado para extrair causas raiz de conjuntos de dados com um grande número de dimensões. Dimensões contínuas também são suportadas e os resultados podem indicar dimensões com condições negativas (por exemplo, “a região não é a América do Norte”).

Os resultados de TOP_INSIGHTS são as dimensões que contribuem para a variação nos dados.

Importante

Aviso legal. Esta função baseada em ML do Snowflake Cortex é alimentada por tecnologia de aprendizado de máquina. A tecnologia de aprendizado de máquina e os resultados fornecidos podem ser imprecisos, inadequados ou tendenciosos. As decisões baseadas em resultados de aprendizado de máquina, incluindo aquelas incorporadas em pipelines automáticos, devem ter supervisão humana e processos de revisão para garantir que o conteúdo gerado pelo modelo seja preciso. As consultas de função baseadas em ML do Snowflake Cortex serão tratadas como qualquer outra consulta SQL e podem ser consideradas metadados.

Metadados. Quando você usa funções baseadas em ML do Snowflake Cortex, o Snowflake registra mensagens de erro genéricas retornadas por uma função ML, além do que é mencionado em campos de metadados. Esses logs de erros nos ajudam a solucionar problemas que surgem e a melhorar essas funções para melhor atender você.

Atualização de seu caminho de pesquisa

Se você adicionar SNOWFLAKE.ML ao seu caminho de pesquisa, basta escrever TOP_INSIGHTS em vez de SNOWFLAKE.ML.TOP_INSIGHTS em suas consultas. As instruções abaixo mostram a diferença:

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

Para adicionar SNOWFLAKE.ML ao seu caminho de pesquisa, execute o seguinte:

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

A alteração do caminho de pesquisa permanece em vigor durante a sessão do Snowflake. Para alterar seu caminho de pesquisa persistentemente, defina-o no nível da conta:

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

Exemplo

Este exemplo de consulta usa a tabela input_table. Um grupo de controle é usado para treinar o modelo, e o grupo de teste são os dados sobre os quais você deseja obter insights.

  1. Crie a tabela:

    CREATE OR REPLACE TABLE input_table(
      ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);
    
    Copy
  2. Insira os registros do grupo de controle e teste na tabela:

    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

Consulta de exemplo

A consulta de exemplo abaixo gera os principais insights da tabela input_table definida acima.

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

Nota

Para obter informações sobre os argumentos da função TOP_INSIGHTS, consulte TOP_INSIGHTS.

Detalhes da consulta de exemplo:

  • As colunas dim_country e dim_vertical da tabela de entrada tornam-se as dimensões 'country' e 'vertical'.

  • Uma dimensão contínua é derivada do comprimento do valor na coluna vertical na tabela de entrada. Esta coluna torna-se a dimensão length_of_vertical.

  • O valor da métrica está na coluna 'metric'.

  • O rótulo (que define se uma determinada linha é de dados de teste ou de controle) é uma expressão booleana que é TRUE somente para datas de 1 de agosto de 2020 até 20 de agosto de 2020.

  • A cláusula WHERE restringe as linhas consideradas aos intervalos de controle e teste.

  • A cláusula OVER (PARTITION BY 0) garante que a entrada tabular seja processada em conjunto.

  • O resultado da consulta recebe o nome res.

  • Os resultados são classificados por sua surpresa, que representa o quanto a métrica de teste no segmento excede seu valor esperado com base na alteração da métrica no segmento pai.

Resultados da consulta:

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

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

Considerações sobre custo

O uso da função TOP_INSIGHTS gera custos de computação. O tempo de execução é dimensionado com o número de dimensões e a cardinalidade dessas dimensões. (A cardinalidade é reduzida automaticamente se uma dimensão tiver cardinalidade maior que 5.)

Consulte Explicação dos custos de computação para obter informações gerais sobre os custos de computação do Snowflake.