Top Insights (Snowflake ML Functions)

Top Insights é uma ML Function para análise de driver chave, ajudando você a identificar os drivers de mudança de uma métrica ao longo do tempo ou a explicar diferenças em uma métrica entre vários setores. O Top Insights é alimentado por um modelo de árvore de decisão que separa um conjunto de dados em segmentos que têm comportamento diferente em relação à métrica que você deseja analisar. Com algumas linhas de SQL, você pode integrar o Top Insights aos seus fluxos de trabalho de BI para monitorar automaticamente os segmentos responsáveis por alterações em qualquer métrica.

Os casos de uso do Top Insights incluem:

  • Análise de séries temporais: identifique os fatores que determinam a mudança de uma métrica ao longo do tempo. Por exemplo, identifique automaticamente os locais, vendedores, clientes, setores e outros fatores responsáveis por uma queda recente na receita.

  • Análise vertical: identifique os motivadores das diferenças em uma métrica entre vários setores verticais. Por exemplo, para entender quais segmentos de usuário são responsáveis pelas diferenças no crescimento de novos usuário entre os Estados Unidos e outros países EMEA, para ajudar a moldar campanhas de marketing direcionadas.

Sobre Top Insights

O Top Insights usa um modelo de árvore de decisão que separa um conjunto de dados em segmentos que têm comportamento diferente em relação à métrica que você deseja analisar. O algoritmo analisa as diferenças entre os segmentos entre a métrica no grupo de controle e o grupo de teste.

  • O grupo de controle consiste nos pontos de dados que o modelo usará como linha de base.

  • O grupo de teste consiste em pontos de interesse a serem analisados.

O Top Insights então produz uma série de possíveis combinações de colaboradores, que são filtradas com base em sua importância e distinção. O Top Insights não retorna segmentos redundantes.

Os conjuntos de dados bons para análise com o Top Insights geralmente têm um grande número de colunas ou dimensões usadas para segmentar dados, o que dificulta a identificação intuitiva de quais segmentos influenciam uma métrica. As dimensões podem ser categóricas (local, segmento de mercado etc.) ou contínuas (ou seja, quantitativas, como temperatura ou frequência).

Um modelo Top Insights é um objeto de nível de esquema. Você só precisa de uma instância, já que instância não contém nenhum estado.

Dica

As dimensões são inferidas como categóricas ou contínuas com base em seu tipo. Os valores numéricos são considerados dimensões contínuas, enquanto os valores de cadeia de caracteres e booliano são considerados categóricos. Para usar um valor numérico como uma dimensão categórica, converta-o em uma cadeia de caracteres.

Privilégios obrigatórios

Uma instância TOP_INSIGHTS é um objeto de nível de esquema. Portanto, a função que você usa para criar a instância deve ter o privilégio CREATE SNOWFLAKE.ML.TOP_INSIGHTS no esquema onde a instância é criada. Este privilégio é semelhante a outros privilégios de esquema como CREATE TABLE ou CREATE VIEW.

Se você não for o proprietário da instância, precisará ter privilégio USAGE sobre ela para poder chamar seu método GET_DRIVERS.

Como usar o Top Insights

Para usar o Top Insights em suas consultas e pipelines, primeiro crie uma instância da classe TOP_INSIGHTS (SNOWFLAKE.ML). A instrução SQL abaixo cria uma instância chamada my_insights. A criação da instância não requer nenhum argumento.

CREATE SNOWFLAKE.ML.TOP_INSIGHTS IF NOT EXISTS my_insights();
Copy

Depois de criar uma instância, você pode usar o método GET_DRIVERS para extrair os principais drivers do conjunto de dados em que deseja realizar a análise de driver principal. Você passa os dados de entrada de uma só vez (uma referência a uma única tabela, exibição ou consulta) e fornece os nomes das colunas de métrica e rótulo nos dados de entrada como argumentos adicionais. Dimensões categóricas e contínuas são inferidas por seu tipo e não precisam ser especificadas explicitamente.

CALL my_insights!get_drivers (
  INPUT_DATA => TABLE(my_table),
  LABEL_COLNAME => 'label',
  METRIC_COLNAMe => 'sales');
Copy

Preparação de dados para o Top Insights

Para usar o Top Insights, certifique-se de ter uma coluna de rótulo booliano que diferencie as linhas que fazem parte do grupo de controle (rotuladas como FALSE) das linhas do grupo de teste (rotuladas como TRUE). Essa coluna geralmente é derivada de outros valores no conjunto de dados, como um carimbo de data/hora ou o nome de uma vertical, portanto, é comum criar uma visualização para fazer isso. A exibição também é um bom lugar para filtrar colunas que não fazem parte de sua análise.

O exemplo abaixo, para análise de séries temporais, cria uma exibição com uma coluna de rótulo baseada em um intervalo de datas. Especificamente, ele rotula os registros do último mês como TRUE (dados de teste) e todos os registros anteriores como FALSE (dados de controle). O Top Insights pode então analisar as dimensões contínuas e categóricas que explicam as diferenças nas mudanças mês a mês para a métrica especificada.

CREATE VIEW input_table_time_series_label (
  ds, metric, dim_country, dim_vertical, label ) AS
  SELECT
    ds,
    metric,
    dim_country,
    dim_vertical,
    ds >= dateadd(month, -1, current_date) AS label
  FROM input_table;
Copy

O exemplo a seguir, para análise vertical, cria uma visualização com uma coluna de rótulo baseada no país. Especificamente, ele rotula os registros em países que não são US como TRUE, e rotula os registros nos USA como FALSE. Em seguida, a Top Insights analisará as dimensões contínuas e categóricas que explicam as diferenças em uma métrica entre esses grupos populacionais.

CREATE VIEW input_table_vertical_label (
  ds, metric,  dim_country, dim_vertical, label ) AS
  SELECT
    ds,
    metric,
    dim_country,
    dim_vertical,
    dim_country <> 'USA' as label
  FROM input_table;
Copy

Interpretação dos resultados

O Top Insights retorna uma linha para cada segmento de interesse encontrado em seus dados. Cada linha contém uma descrição em inglês simples do segmento, que pode conter vários critérios (por exemplo, “COUNTRY = frança, não VERTICAL = moda, não VERTICAL = tecnologia” pode descrever um único segmento). Para cada segmento, a Top Insights fornece os seguintes valores que quantificam o quanto o segmento contribui para as mudanças entre o grupo de controle e o grupo de teste.

Coluna de saída

Descrição

METRIC_CONTROL

O valor total da métrica no período de controle em um segmento específico.

METRIC_TEST

O valor total da métrica no período de teste em um segmento específico.

CONTRIBUTION

O impacto absoluto do segmento na mudança na métrica.

RELATIVE_CONTRIBUTION

O impacto do segmento como proporção da mudança geral na métrica entre teste e controle.

GROWTH_RATE

A mudança na métrica no segmento como uma proporção da métrica no grupo de controle no segmento.

A contribuição, a contribuição relativa e a taxa de crescimento podem ser negativas, indicando que um segmento tem um impacto negativo.

Considerações sobre custo

O uso do Top Insights gera custos de computação. O tempo de execução é escalonado com o número de linhas e dimensões processadas. Consulte Explicação dos custos de computação para obter informações gerais sobre os custos de computação do Snowflake.

O desempenho do Top Insights geralmente não se beneficia do uso de um warehouse maior do que o necessário para carregar todos os dados que estão sendo analisados, que devem caber na memória. Conjuntos de dados que ultrapassam cerca de 1.000.000 de linhas e 1.000 de colunas podem esgotar a memória. A Snowflake recomenda usar um warehouse otimizado para Snowpark em vez de um warehouse padrão maior. Os warehouses otimizados para Snowpark têm mais memória do que os warehouses padrão do tamanho correspondente.

Embora as instâncias da classe Top Insights sejam objetos no nível do esquema, elas não armazenam dados e têm um impacto insignificante nos custos de armazenamento.

Exemplos

Os exemplos a seguir demonstram como usar o Top Insights para análise de séries temporais e análise vertical.

Exemplo de análise de séries temporais

Esse exemplo encontra os segmentos que contribuem para as diferenças na métrica entre dois períodos de tempo, especificamente como o país e as dimensões verticais afetam a métrica após 2021.

Crie a tabela de entrada contendo dados sintéticos para este exemplo usando as seguintes instruções SQL.

CREATE OR REPLACE TABLE input_table(
  ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);

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

Crie uma exibição com uma coluna de rótulo com base no carimbo de data/hora.

CREATE OR REPLACE VIEW input_view AS (
    SELECT
        metric,
        dim_country as country,
        dim_vertical as vertical,
        ds >= '2021-01-01' AS label
    FROM input_table
);
Copy

Agora analise esses dados chamando o método GET_DRIVERS de uma instância TOP_INSIGHTS.

CREATE OR REPLACE SNOWFLAKE.ML.TOP_INSIGHTS my_insights_model()

CALL my_insights_model!GET_DRIVERS(
  INPUT_DATA => TABLE(input_view),
  LABEL_COLNAME => 'label',
  METRIC_COLNAME => 'metric'
)
Copy

A saída é semelhante à seguinte:

+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+
| CONTRIBUTOR                                                         | METRIC_CONTROL | METRIC_TEST | CONTRIBUTION | RELATIVE_CONTRIBUTION |   GROWTH_RATE |
|---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------|
| ["Overall"]                                                         |         128445 |      158456 |        30011 |         1             |  0.2336486434 |
| ["COUNTRY = usa"]                                                   |         116238 |      154574 |        38336 |         1.277398287   |  0.3298060875 |
| ["COUNTRY = usa","VERTICAL = finance"]                              |          64281 |       87423 |        23142 |         0.771117257   |  0.3600130676 |
| ["COUNTRY = usa","VERTICAL = auto"]                                 |          48930 |       66131 |        17201 |         0.5731565093  |  0.3515430206 |
| ["COUNTRY = usa","VERTICAL = tech"]                                 |           1543 |         503 |        -1040 |        -0.03465396021 | -0.6740116656 |
| ["COUNTRY = canada","VERTICAL = finance"]                           |           1538 |         482 |        -1056 |        -0.03518709806 | -0.6866059818 |
| ["COUNTRY = canada","VERTICAL = fashion"]                           |           1519 |         446 |        -1073 |        -0.03575355703 | -0.7063857801 |
| ["COUNTRY = france","VERTICAL = auto"]                              |           1534 |         460 |        -1074 |        -0.03578687814 | -0.7001303781 |
| ["COUNTRY = usa","not VERTICAL = auto","not VERTICAL = finance"]    |           3027 |        1020 |        -2007 |        -0.06687547899 | -0.6630327056 |
| ["COUNTRY = france","not VERTICAL = fashion","not VERTICAL = tech"] |           3100 |         962 |        -2138 |        -0.07124054513 | -0.6896774194 |
| ["COUNTRY = france","not VERTICAL = fashion"]                       |           4687 |        1456 |        -3231 |        -0.1076605245  | -0.689353531  |
| ["COUNTRY = france"]                                                |           6202 |        1947 |        -4255 |        -0.1417813468  | -0.68606901   |
| ["not COUNTRY = usa"]                                               |          12207 |        3882 |        -8325 |        -0.2773982873  | -0.6819857459 |
+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+

Nota

Como os dados de entrada são gerados aleatoriamente, seus resultados serão diferentes dos resultados acima.

A saída é ordenada por CONTRIBUTION, com o segmento Geral sempre no topo. A coluna CONTRIBUTOR contém uma matriz de cadeias de caracteres que descrevem o segmento; o restante das colunas quantifica como esse segmento contribui para o valor da métrica. Para obter mais detalhes, consulte Interpretação dos resultados.

No exemplo de saída acima, o simples fato de estar nos Estados Unidos tem o maior impacto sobre a métrica. Dois outros segmentos, baseados nas verticais financeira e automotiva nos Estados Unidos, também têm um impacto enorme. Depois disso, a contribuição dos segmentos se torna negativa.

Exemplo de análise vertical

Este exemplo compara o uso de crédito de empresas em duas regiões, USA e EMEA, com o objetivo de entender como o uso de crédito em cada segmento difere entre as regiões.

Crie a tabela de entrada contendo dados sintéticos para este exemplo usando as seguintes instruções SQL.

CREATE OR REPLACE TABLE vertical_input_table(
  region VARCHAR, industry VARCHAR, num_employee NUMBER, credits FLOAT);

INSERT INTO vertical_input_table
  SELECT
    'USA' as region,
    ['technology', 'finance', 'healthcare', 'consumer'][MOD(ABS(RANDOM()), 4)] as industry,
    UNIFORM(100, 10000, RANDOM()) as num_employee,
    UNIFORM(1000, 3000, RANDOM()) AS credits,
  FROM TABLE(GENERATOR(ROWCOUNT => 450));

INSERT INTO vertical_input_table
  SELECT
    'EMEA' as region,
    ['technology', 'finance', 'healthcare', 'consumer'][MOD(ABS(RANDOM()), 4)] as industry,
    UNIFORM(100, 10000, RANDOM()) as num_employee,
    UNIFORM(100, 5000, RANDOM()) AS credits,
  FROM TABLE(GENERATOR(ROWCOUNT => 350));
Copy

Crie uma exibição com uma coluna de rótulo baseada na região.

CREATE OR REPLACE VIEW vertical_input_view AS (
    SELECT
        credits,
        industry,
        num_employee,
        region = 'EMEA' AS label
    FROM vertical_input_table
);
Copy

Agora analise esses dados chamando o método GET_DRIVERS de uma instância TOP_INSIGHTS.

CREATE OR REPLACE SNOWFLAKE.ML.TOP_INSIGHTS my_insights_model();

CALL my_insights_model!get_drivers(
  INPUT_DATA => TABLE(vertical_input_view),
  LABEL_COLNAME => 'label',
  METRIC_COLNAME => 'credits'
);
Copy

A saída é semelhante à seguinte:

+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+|
| CONTRIBUTOR                                                                                           | METRIC_CONTROL | METRIC_TEST | CONTRIBUTION | RELATIVE_CONTRIBUTION |      GROWTH_RATE |
|-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------|
| ["Overall"]                                                                                           |         896672 |      895326 |        -1346 |           1           |  -0.001501106313 |
| ["not INDUSTRY = consumer","NUM_EMPLOYEE <= 6248.0","NUM_EMPLOYEE > 4235.0"]                          |         141138 |       70337 |       -70801 |          52.601040119 |  -0.5016437813   |
| ["NUM_EMPLOYEE <= 6248.0","NUM_EMPLOYEE > 4235.0"]                                                    |         188770 |      127320 |       -61450 |          45.653789004 |  -0.3255284208   |
| ["not INDUSTRY = technology","NUM_EMPLOYEE <= 8670.0","NUM_EMPLOYEE > 7582.5"]                        |         100533 |       42925 |       -57608 |          42.799405646 |  -0.5730257726   |
| ["not INDUSTRY = consumer","NUM_EMPLOYEE <= 5562.5","NUM_EMPLOYEE > 4235.0"]                          |         103851 |       47052 |       -56799 |          42.198365527 |  -0.54692781     |
+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+

Nota

Como os dados de entrada são gerados aleatoriamente, seus resultados serão diferentes dos resultados acima.

A saída é ordenada por CONTRIBUTION, com o segmento Geral sempre no topo. A coluna CONTRIBUTOR contém uma matriz de cadeias de caracteres que descrevem o segmento; o restante das colunas descreve como esse segmento contribui para o valor da métrica. Para obter mais detalhes, consulte <instance_name>!GET_DRIVERS.

No exemplo de saída acima, você pode ver que os segmentos são baseados no setor e no número de funcionários que o cliente possui. O Top Insights seleciona automaticamente esses intervalos para dimensões contínuas. Clientes de um certo tamanho (entre 4.000 e 6.000 funcionários) parecem ter um impacto negativo descomunal.

Limitações atuais

  • A métrica de entrada deve ser uma observação individual ou uma agregação.

  • Para recursos categóricos com mais de 25 valores, o Top Insights usa apenas os 25 valores mais influentes para criar segmentos.

  • Processar mais de 100 milhões de linhas em um único trabalho pode esgotar a memória, mesmo com warehouses otimizados para Snowpark.