outlier - 그룹내 이상치 탐지

  • 여러 그룹을 대상으로 하며 outlier 에 해당하는 그룹을 찾는 명령어 입니다.

목차

  • 설명
  • 데이터 탐색
  • outlier 를 위한 데이터 전처리
  • 실행 결과
  • 결과 해석

설명

3개 이상의 그룹(여기서는 HOST별 데이터) 을 대상으로 outlier 에 해당하는 그룹을 찾아 냅니다.

outlier 에 해당하는 그룹 선정 방식은 알고리즘 옵션에 따라 두가지로 나뉩니다.

outlier 옵션
알고리즘 default description
dbscan default 데이터를 clustering 하여 어느 cluster 에도 포함이 되지 않는 그룹을 찾아내는 알고리즘
mad   madian(중간값)을 기반으로 anomal 데이터로 판정된 비율이 임계치 이상인 그룹을 찾아내는 알고리즘

SYSLOG는 수치 측정값이 없는 로그 데이터이므로 1분, 10분 등 단위 시간동안의 집계 count 를 대상으로 이상탐지를 판단합니다.

기본적인 과정은

10분 단위 집계 데이터 생성합니다.

빠진 단위 시간(10분)은 0 으로 값을 채웁니다.

outlier 명령어를 실행합니다.

데이터 탐색

검색 데이터 -1

데이터 전처리

SYSLOG 는 로그데이터 이므로 outlier 탐지를 위해서 각 그룹별로 동일한 단위 시간(10분, 1시간 등) 의 집계 데이터를 생성해야 합니다.

SQL 로 표현하면

select A, B, COUNT(*) from …. GROUP BY A, B

해당 시간에 HOST 별로 SYSLOG COUNT 가 이상 증가 또는 감소한 것이 있는지 파악하고자 합니다.

먼저 검색명령어 창에서 10분 집계 데이터를 HOST 별로 생성하는 명령어를 입력합니다.

* LEVEL!='info' |  stats  COUNT(*)  as CNT  by  date_group(DATETIME, "10M") , HOST  | sort +dategroup

stats 명령어 구문이 검색명령어에 포함되면 결과는 통계탭에 출력됩니다.

검색 데이터 -2

HOST 별로 SYSLOG 가 없는 시간(10분단위)은 값을 0 으로 채워야 합니다.

이 때 사용되는 명령어는 fill_zero 입니다.

fill_zero freq=600 stime=20191210090000  etime=20191210120000  time_column=dategroup group_key=HOST value=CNT

    freq : 집계 시간 단위. .  freq=600   600.
    stime : 집계시작시간
    etime : 집계종료시간
    time_column : 시간 컬럼
    group_key : group 컬럼

검색명령어 사용 예

* LEVEL!='info' |  stats  COUNT(*)  as CNT  by  date_group(DATETIME, "10M") , HOST
| sort +dategroup
| sql "select dategroup as NEW_DATE,  HOST, CNT from angora"
| fill_zero freq=600 stime=20191210090000  etime=20191210115959  time_column=NEW_DATE  group_key=HOST value=CNT
검색 데이터 -3

실행 결과

dbscan 알고리즘(default)

검색 메뉴에서 outlier 실행 하기

검색 데이터 -6

명령어 구문

* LEVEL!='info' |  stats  COUNT(*)  as CNT  by  date_group(DATETIME, "10M") , HOST
| sort +dategroup
| sql "select dategroup as NEW_DATE,  HOST, CNT from angora"
| fill_zero freq=600 stime=20191210090000  etime=20191210115959  time_column=NEW_DATE  group_key=HOST value=CNT
| outlier CNT by=HOST

실행 결과

검색 데이터 -4

결과 해석

dbscan 알고리즘은 밀도기반 알고리즘으로 데이터를 클러스터링합니다.

클러스터링 결과 클러스터(결과에서 label 컬럼)별로 다양한 HOST 데이터가 존재하는 것이 일반적인데

오직 1개의 HOST 데이터만 있는 클러스터가 있다면 해당 HOST 데이터가 outlier 라고 판정하는 알고리즘입니다.

시각적으로 HOST, outlier, label 3개 데이터의 관계를 파악해보기 위해 sankey챠트를 그려봅니다.

결과 해석 데이터 sankey

HOST 중에서 tsdnsvr1 이 outlier = true 인 데이터를 가지고 있으며,

label = -1 에 있는 1개의 HOST 가 tsdnsvr1 임을 알 수 있습니다.

결과 해석 데이터 bar

그럼 tsdnsvr1이 다른 HOST 와 비교하여, 어떤 트랜드를 가지고 있는지 파악하기 위해

HOST 별 시계열 라인 챠트를 그려봅니다.

챠트를 보면 특정 시간에 tsdnsvr1 이 다른 HOST 보다 큰 CNT 값을 가지고 있다는 걸 알 수 있습니다.

검색 데이터 -13

mad 알고리즘

* LEVEL!='info' |  stats  COUNT(*)  as CNT  by  date_group(DATETIME, "10M") , HOST
| sort +dategroup
| sql "select dategroup as NEW_DATE,  HOST, CNT from angora"
| fill_zero freq=600 stime=20191210090000  etime=20191210115959  time_column=NEW_DATE  group_key=HOST value=CNT
| outlier CNT by=HOST alg=mad tolerance=2.5 pct=0.1