이상 탐지

이상 탐지 (Anomaly Detection) (Anomaly Detection (Snowflake ML Functions))

이 문서는 Snowflake ML 함수의 이상 탐지(Anomaly Detection) 기능을 설명해요.

출처: Anomaly Detection (Snowflake ML Functions)

본문

개요

이상 탐지(Anomaly Detection)는 시계열 데이터에서 정상적인 패턴에서 크게 벗어난 이상값(anomaly)을 식별하는 ML 기능이에요. Snowflake의 이상 탐지 함수(DETECT_ANOMALIES)는 별도의 ML 인프라 없이 SQL로 직접 이상 탐지를 수행할 수 있게 해줘요.

이상 탐지는 시스템 모니터링, 사기 탐지, 품질 관리, 잘못된 측정 감지 등에 유용해요.

DETECT_ANOMALIES 함수

DETECT_ANOMALIES는 시계열 데이터를 학습해 정상 패턴을 모델링하고, 새 데이터 또는 학습 데이터에서 이상값을 식별해요. 기본 구조:

SELECT DETECT_ANOMALIES(
  over (ORDER BY ts),
  input_data => TABLE(mytable),
  timestamp_col => 'ts',
  target_col => 'value'
);
  • over (ORDER BY ...): 시계열 정렬.
  • input_data: 분석할 데이터.
  • timestamp_col: 타임스탬프 컬럼.
  • target_col: 이상을 탐지할 대상(측정) 컬럼.

출력

이상 탐지 함수는 다음 정보를 반환할 수 있어요:

  • FORECAST: 정상 패턴 기반의 예측값.
  • LOWER_BOUND / UPPER_BOUND: 정상 범위(신뢰 구간) 경계.
  • IS_ANOMALY: 해당 시점이 이상인지 여부 (TRUE/FALSE).
  • ANOMALY_LEVEL: 이상의 심각도 (High, Medium, Low).

탐지된 이상값은 IS_ANOMALY가 TRUE이고, 그 값이 정상 범위 밖에 있는 시점을 뜻해요.

그룹별 이상 탐지

여러 시계열을 그룹으로 나누어 이상 탐지를 수행하려면 grouping_cols를 지정해요:

SELECT DETECT_ANOMALIES(
  over (partition by sensor ORDER BY ts),
  input_data => TABLE(readings),
  timestamp_col => 'ts',
  target_col => 'value',
  grouping_cols => ['sensor']
);

전처리와 매개변수

실제 세계 데이터를 처리하기 위한 매개변수를 지원해요:

  • missing_data_behavior: 결측값 처리 방식. 결측값을 채워 분석할 수 있어요.
  • ignore_fluctuations: 외래값(이상치) 처리. FALSE로 설정하면 학습 데이터의 외래값을 처리해요.
  • smoothing_factor: 데이터 평활화 수준.

자세한 내용은 시계열 예측에서 실제 세계 데이터 다루기를 참고하세요.

이상 탐지 동작 방식

DETECT_ANOMALIES는 학습 데이터에서 정상 패턴(수준, 추세, 계절성 등)을 모델링하고, 각 시점에 대해 정상 범위(신뢰 구간)를 계산해요. 관측값이 이 범위를 벗어나면 이상으로 표시돼요.

고려 사항

  • 충분한 이력 데이터로 정상 패턴을 학습해야 해요. 데이터가 적으면 판단 정확도가 떨어져요.
  • 이상값이 지속되면(예: 수요 증가로 인한 수준 변화) 정상 패턴이 갱신되어야 이상으로 감지되지 않을 수 있어요.
  • 탐지 결과는 통계적 모델 기반이며, 컨텍스트상의 판단과 다를 수 있어요.

예시

시계열에서 이상값을 탐지하고 이상 여부를 확인하는 쿼리:

SELECT ts, value, is_anomaly, anomaly_level
FROM TABLE(
  DETECT_ANOMALIES(
    over (ORDER BY ts),
    input_data => TABLE(metrics),
    timestamp_col => 'ts',
    target_col => 'value'
  )
);

더 알아보기 (Learn more)