Top Insights (Snowflake ML 함수)¶
Top Insights는 주요 동인 분석을 위한 ML 함수 로, 시간에 따른 메트릭 변화의 동인을 파악하거나 다양한 업종 간 메트릭의 차이를 설명할 수 있도록 도와줍니다. Top Insights는 데이터 세트를 분석할 메트릭과 관련하여 서로 다른 동작을 하는 세그먼트로 분리하는 의사 결정 트리 모델을 기반으로 합니다. 몇 줄의 SQL만 입력하면 Top Insights를 BI 워크플로에 통합하여 모든 지표의 변경에 기여한 세그먼트를 자동으로 모니터링할 수 있습니다.
Top Insights의 사용 사례는 다음과 같습니다.
시계열 분석: 시간 경과에 따른 메트릭 변화의 동인을 파악할 수 있습니다. 예를 들어, 최근 매출 부족의 원인이 되는 위치, 영업 담당자, 고객, 업종 및 기타 요소를 자동으로 식별합니다.
산업 분석: 다양한 산업 간 메트릭 차이의 원인을 파악할 수 있습니다. 예를 들어, 미국과 EMEA 국가 간의 신규 사용자 증가율 차이의 원인이 되는 사용자 세그먼트를 파악하여 타겟팅 마케팅 캠페인을 구성하는 데 도움이 됩니다.
Top Insights 정보¶
Top Insights는 의사 결정 트리 모델을 사용하여 데이터 세트를 분석하려는 메트릭과 관련하여 서로 다른 동작을 가진 세그먼트로 분리합니다. 이 알고리즘은 대조 그룹과 테스트 그룹의 메트릭 간의 세그먼트 간 차이를 분석합니다.
대조군은 모델이 기준으로 사용할 데이터 요소로 구성됩니다.
테스트 그룹은 분석할 관심 지점으로 구성됩니다.
그런 다음 Top Insights는 여러 가지 가능한 기여자 조합을 생성하고, 중요도와 차별성을 기준으로 필터링합니다. Top Insights는 중복된 세그먼트를 반환하지 않습니다.
Top Insights로 분석하기에 적합한 후보 데이터 세트는 일반적으로 데이터를 세분화하는 데 사용되는 열이나 차원이 많아서 어떤 세그먼트가 메트릭에 영향을 미치는지 직관적으로 식별하기 어렵습니다. 차원은 범주형(위치, 시장 세분화 등)이거나 연속형(즉, 온도나 참석과 같은 양적 차원)일 수 있습니다.
Top Insights 모델은 스키마 수준 오브젝트입니다. 인스턴스는 어떤 상태도 저장하지 않으므로 인스턴스는 하나만 필요합니다.
팁
차원은 유형에 따라 범주형 또는 연속형으로 추론됩니다. 숫자 값은 연속적인 차원으로 간주되는 반면, 문자열과 부울 값은 범주형으로 간주됩니다. 숫자 값을 범주형 차원으로 사용하려면 문자열로 변환합니다.
필수 권한¶
TOP_INSIGHTS 인스턴스는 스키마 수준 오브젝트입니다. 따라서 인스턴스를 생성하는 데 사용하는 역할은 인스턴스가 생성되는 스키마에 대한 CREATE SNOWFLAKE.ML.TOP_INSIGHTS 권한이 있어야 합니다. 이 권한은 CREATE TABLE 또는 CREATE VIEW와 같은 다른 스키마 권한과 유사합니다.
인스턴스의 소유자가 아닌 경우 인스턴스에 대한 USAGE 권한이 있어야 해당 인스턴스의 GET_DRIVERS 메서드를 호출할 수 있습니다.
Top Insights 사용하기¶
쿼리 및 파이프라인에서 Top Insights를 사용하려면 먼저 TOP_INSIGHTS (SNOWFLAKE.ML) 클래스의 인스턴스를 생성하십시오. 아래 SQL 문은 my_insights
라는 인스턴스를 생성합니다. 인스턴스를 생성하기 위해서는 인자가 필요하지 않습니다.
CREATE SNOWFLAKE.ML.TOP_INSIGHTS IF NOT EXISTS my_insights();
인스턴스를 생성한 후 GET_DRIVERS 메서드를 사용하여 주요 드라이버 분석을 수행하려는 데이터 세트에서 주요 드라이버를 추출할 수 있습니다. 입력 데이터를 한꺼번에 전달(단일 테이블, 뷰 또는 쿼리에 대한 참조)하고 입력 데이터 내의 메트릭 및 레이블 열의 이름을 추가 인자로 제공합니다. 범주형 차원과 연속형 차원은 유형에 따라 추론되므로 명시적으로 지정할 필요가 없습니다.
CALL my_insights!get_drivers (
INPUT_DATA => TABLE(my_table),
LABEL_COLNAME => 'label',
METRIC_COLNAMe => 'sales');
Top Insights를 위한 데이터 준비¶
Top Insights를 사용하려면 제어 그룹(레이블 FALSE)에 속하는 행과 테스트 그룹(레이블 TRUE)의 행을 구분하는 부울 레이블 열이 있는지 확인합니다. 이 열은 일반적으로 타임스탬프나 세로 이름 등 데이터 세트의 다른 값에서 파생되므로 이를 수행하기 위한 뷰를 생성하는 것이 일반적입니다. 또한 이 뷰는 분석에 포함되지 않는 열을 필터링하는 데도 좋습니다.
아래 예에서는 시계열 분석을 위해 날짜 범위를 기반으로 하는 레이블 열이 있는 뷰를 생성합니다. 구체적으로 최근 달의 기록은 TRUE(테스트 데이터)로, 그 이전의 모든 기록은 FALSE(대조 데이터)로 레이블을 지정합니다. 그런 다음 Top Insights는 지정된 메트릭에 대한 월별 변화의 차이를 설명하는 연속 및 범주형 차원을 분석할 수 있습니다.
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;
다음 예에서는 수직 분석을 위해 국가를 기반으로 하는 레이블 열이 있는 뷰를 생성합니다. 구체적으로 US가 아닌 국가에 있는 레코드는 TRUE로, USA에 있는 레코드는 FALSE로 레이블을 지정합니다. 그런 다음 Top Insights는 이러한 인구 집단 간의 메트릭 차이를 설명하는 연속형 및 범주형 차원을 분석합니다.
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;
결과 해석하기¶
Top Insights는 데이터에서 찾은 관심 있는 각 세그먼트에 대한 행을 반환합니다. 각 행에는 세그먼트에 대한 일반 영어 설명이 포함되며, 여러 기준을 포함할 수 있습니다(예: “COUNTRY = france, not VERTICAL = fashion, not VERTICAL = tech”은 단일 세그먼트를 설명할 수 있음). 각 세그먼트에 대해 Top Insights는 세그먼트가 대조군과 테스트 그룹 간의 변화에 기여하는 정도를 정량화한 다음 값을 제공합니다.
출력 열 |
설명 |
---|---|
METRIC_CONTROL |
특정 세그먼트의 제어 기간에 메트릭의 값 총계입니다. |
METRIC_TEST |
특정 세그먼트의 테스트 기간에 메트릭의 값 총계입니다. |
CONTRIBUTION |
세그먼트가 메트릭의 변화에 미치는 절대적인 영향입니다. |
RELATIVE_CONTRIBUTION |
테스트와 대조군 사이의 메트릭 테이블에서 전반적인 변화에 대한 세그먼트의 영향 비율입니다. |
GROWTH_RATE |
세그먼트에서 메트릭의 변화를 세그먼트에서 대조군의 메트릭 비율로 나타낸 것입니다. |
기여도, 상대적 기여도 및 성장률은 음수일 수 있으며, 이는 세그먼트가 부정적인 영향을 미치고 있음을 나타냅니다.
비용 고려 사항¶
Top Insights를 사용하면 컴퓨팅 비용이 발생합니다. 실행 시간은 처리되는 행과 차원 수에 따라 달라집니다. Snowflake 컴퓨팅 비용에 대한 일반 정보는 컴퓨팅 비용 이해하기 섹션을 참조하십시오.
일반적으로 분석 대상인 모든 데이터를 메모리에 적재하는 데 필요한 것보다 더 큰 웨어하우스를 사용하는 것은 Top Insights 성능에 도움이 되지 않습니다. 행이 약 1,000,000개, 열이 1,000개를 넘는 데이터 세트는 메모리를 소진할 수 있습니다. Snowflake는 더 큰 표준 웨어하우스보다 Snowpark에 최적화된 웨어하우스를 사용할 것을 권장합니다. Snowpark에 최적화된 웨어하우스는 해당 규모의 표준 웨어하우스보다 더 많은 메모리를 보유합니다.
Top Insights 클래스의 인스턴스는 스키마 수준 오브젝트이지만, 어떤 데이터도 저장하지 않으며 저장 비용에 미치는 영향도 미미합니다.
예¶
다음 예는 Top Insights를 시계열 분석 및 수직 분석에 사용하는 방법을 보여줍니다.
시계열 분석 예¶
이 예제에서는 두 기간 간의 메트릭 차이에 기여하는 세그먼트, 특히 2021년 이후 국가 및 산업 차원이 메트릭에 어떤 영향을 미치는지 살펴봅니다.
다음 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));
날짜 스탬프를 기준으로 레이블 열이 있는 뷰를 생성합니다.
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
);
이제 TOP_INSIGHTS 인스턴스의 GET_DRIVERS 메서드를 호출하여 이 데이터를 분석합니다.
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'
)
출력은 다음과 같습니다.
+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+
| 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 |
+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+
참고
입력 데이터가 무작위로 생성되므로 사용자의 결과는 위의 결과와 다릅니다.
출력은 CONTRIBUTION순으로 정렬되며, 전체 세그먼트는 항상 맨 위에 있습니다. CONTRIBUTOR 열에는 세그먼트를 설명하는 문자열 배열이 포함되어 있으며, 나머지 열은 해당 세그먼트가 지표 값에 기여하는 방식을 정량화합니다. 자세한 내용은 결과 해석하기 섹션을 참조하십시오.
위의 예제 출력에서는 단순히 미국에 있다는 것이 메트릭에 가장 큰 영향을 미칩니다. 미국 내 금융과 자동차 부문을 기반으로 하는 2개의 추가 세그먼트도 엄청난 영향을 미칩니다. 그 이후에는 세그먼트의 기여도가 음수로 바뀝니다.
산업 분석 예¶
이 예제는 USA 및 EMEA의 두 지역에 있는 기업의 크레딧 사용을 비교한 것으로, 각 지역의 크레딧 사용이 리전별로 어떻게 다른지 파악하기 위한 것입니다.
다음 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));
리전을 기준으로 레이블 열이 있는 뷰를 생성합니다.
CREATE OR REPLACE VIEW vertical_input_view AS (
SELECT
credits,
industry,
num_employee,
region = 'EMEA' AS label
FROM vertical_input_table
);
이제 TOP_INSIGHTS 인스턴스의 GET_DRIVERS 메서드를 호출하여 이 데이터를 분석합니다.
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'
);
출력은 다음과 같습니다.
+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+|
| 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 |
+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+
참고
입력 데이터가 무작위로 생성되므로 사용자의 결과는 위의 결과와 다릅니다.
출력은 CONTRIBUTION순으로 정렬되며, 전체 세그먼트는 항상 맨 위에 있습니다. CONTRIBUTOR 열에는 세그먼트를 설명하는 문자열 배열이 포함되어 있으며, 나머지 열은 해당 세그먼트가 지표 값에 기여하는 방식을 설명합니다. 자세한 내용은 <instance_name>!GET_DRIVERS 섹션을 참조하십시오.
위의 출력 예시에서 세그먼트는 업계와 고객이 보유한 직원 수에 따라 구성되어 있음을 확인할 수 있습니다. Top Insights는 연속 차원에 대해 이러한 범위를 자동으로 선택합니다. 일정 규모(직원 4,000명에서 6,000명 사이)의 고객은 상당히 부정적인 영향을 미치는 것으로 나타났습니다.
현재 제한 사항¶
입력 메트릭은 개별 관찰 값이거나 집계 값이어야 합니다.
25개 이상의 값을 갖는 카테고리형 특성의 경우 Top Insights는 가장 영향력 있는 상위 25개 값만 사용하여 세그먼트를 생성합니다.
Snowpark에 최적화된 웨어하우스에서도 단일 작업에서 1억 개가 넘는 행을 처리하면 메모리가 소진될 수 있습니다.
법적 고지¶
중요
법적 고지. 이 Snowflake ML 함수는 머신 러닝 기술을 기반으로 합니다. 제공된 머신 러닝 기술 및 결과는 부정확하거나 부적절하거나 편향될 수 있습니다. 자동 파이프라인에 내장된 결과를 포함하여 머신 러닝 출력을 기반으로 한 의사 결정에는 모델 생성 콘텐츠가 정확하도록 보장하기 위해 사람의 감독 및 검토 프로세스가 있어야 합니다. Snowflake Cortex ML 함수 쿼리는 다른 SQL 쿼리로 처리되며 메타데이터 로 간주될 수 있습니다.
메타데이터. Snowflake Cortex ML 함수를 사용하면 Snowflake는 ML 함수가 반환하는 일반 오류 메시지를 기록합니다. 이러한 오류 로그는 발생하는 문제를 해결하고 이러한 함수를 개선하여 더 나은 서비스를 제공하는 데 도움이 됩니다.
자세한 내용은 Snowflake AI 신뢰 및 안전 FAQ 를 참조하십시오.