공부/AIFFEL

FUNDAMENTAL 17. 어라, 이 시계열 데이터 이상한데? - Anomaly Detection

dong_dong_2 2021. 2. 5. 19:52

1. 이상한 데이터는 어떻게 생겨났을까?
    - 데이터를 100% 믿는 건 굉장히 위험한 행동이다. 다음의 가능성이 있기 때문이다.
       1) 생성 / 측정 단계 : 관측자의 실수 (휴먼에러), 측정 장비의 오류
       2) 수집 / 전달 단계 : 데이터 수집 프로그램의 오류 (버그), 데이터 관리자의 실수 (휴먼에러), 데이터 전달 프로그램의 오류 (Open API)
    - 실무에서 가장 흔한 데이터 오염은 데이터 관리자에 의해 발생한다.
    - 이상한 데이터를 찾아내는 방법 (Anomaly Detection)
       1) 다시 측정한다.
       2) 같은 데이터의 다른 출처를 찾아서 비교한다. (Supervised)
       3) 데이터 스스로의 특징을 활용하여 찾아낸다. (Unsupervised)
    - 만약 같은 데이터를 제공하는 다른 출처가 있다면 Supervised 방법을 쓸 수 있다.
       1) 각 데이터를 비교해서 다른 데이터를 찾는다. 서로 같은 데이터는 정상으로 분류한다.
       2) 서로 다른 데이터 중에서 "더 이상한" 데이터를 이상치로 분류한다.
       3) 라벨링 된 분류 결과로 이상치 탐색 모델을 학습한다.
    - 대부분의 경우에는, 다른 출처가 없어서 Unsupervised 방법을 써야 한다.
       1) 대부분의 데이터는 참이라는 전제하에 이상한 데이터를 찾는 방법이다.
       2) 데이터 스스로의 특징을 분석한다.
       3) 특정 기준보다 "더 이상한" 데이터를 이상치로 분류한다.
2. 신입 데이터 분석가가 되어보자
    - 신입 분석가가 되었다는 가정하에 노드가 진행된다.
    - 데이터를 불러오고, 데이터를 이해한다(각 칼럼은 무엇을 의미하는지와 같은), 결측치를 확인하고, 시각화를 해본다.
    - 여기서는 주식데이터를 이용한다.
3. Outlier / Novelties 구분하기
    - 이상치(Anomalies)를 찾는 방법을 Anomaly Detection이라 하고, 이상치는 크게 Outlier와 Novelties로 구분한다.
    - Outlier(극단치) : 통계적 자료 분석의 결과를 왜곡시키거나, 자료 분석의 적절성을 위협하는 변숫값 또는 사례
       1) 일반적으로 단변량 분석의 결과로 찾아낼 수 있으며, 교정하지 않으면 자료 분석에 방해가 된다는 특징이 있다.
       2) 대응 방법 : 참값으로 대체하거나 보간으로 대체하거나 삭제를 한다.
    - Novelties(특이치) : 정상적인 수집과정에 의한 이상치를 의미한다.
       1) 이전까지 보지 못한 패턴이나 데이터가 여기에 해당한다.
       2) 특이치는 일반적으로 다변량 분석의 결과로 탐색할 수 있다.
       3) 대응 방법 : 특이치는 극단치와 다르게 원본 데이터를 수정하지 않는다, 나중에 특이치가 또 발생하면 모델이 대처해야 하기 때문이다.
    - 정상적인 범주에서 벗어나는 이상 데이터라고 해도 엄밀히는 같은 것이 아니다. ex) 극단치와 특이치
    - 세줄 요약
       1) 이상치(Anomailies) = 극단치(Outlier) + 특이치(Novelites)
       2) 극단치는 제거해야 모형에 좋다.
       3) 특이치는 남겨둬야 모형에 좋다.
4. 전통적인 방법으로 이상데이터를 찾아보자!
    - 정규분포, 신뢰구간을 생각해서 신뢰구간 밖에 있는 데이터를 이상치로 생각해도 되지 않을까?
    - Package는 statsmodels를 쓴다.
    - 정규분포, 신뢰구간을 떠올려 보면
       1) 데이터가 정규분포를 따를 때, 표준편차의 배수로 신뢰구간의 상한과 하한을 결정할 수 있다.
       2) 평균을 기준으로 양쪽에 2배의 표준편차 구간에서 정상데이터는 약 95.5%가 있다. 나머지 4.5%는 이상치로 볼 수 있다.
       3) 평균을 기준으로 양쪽에 3배의 표준편차 구간에서 정상데이터는 약 99.7%가 있다. 나머지 0.27%는 이상치로 볼 수 있다.
    - 신뢰구간 분석을 통한 이상치를 찾아내는 방법은 정규분포를 따를 때만 사용할 수 있는 것은 아니다. 데이터가 t-분포 등 특정 확률분포를 따르면 가능하다.
    - 이상치를 찾는 통계적 방법은 다양하지만, 두 가지 방법을 알아보겠다.
       1) 정규분포를 따르는지 확인하는 방법 : z-test
       2) 시계열 데이터 중에서 정규분포에 가까운 데이터를 뽑아내는 방법 : Time series decomposition
    - z-test
       1) statsmodels.stats.weightstats 안의 ztest를 로딩한다.

       2) ztest(data.column)를 통해 정규분포인지 확인할 수 있다.

    - Time series decomposition
       1) 시계열 데이터의 3가지 성분 : trend, seasonal, residual
       2) 시계열을 Stationary(정상성 또는 안정성) 컴포넌트와 Non-Stationary 컴포넌트로 나누어 분석하기 위해 주로 사용하는 기법이다.
       3) Time series decomposition을 사용하면 시계열 데이터는 3가지 성분으로 분리된다.
       4) 그 중 Residual 성분의 데이터가 Stationary에 가까운 형태를 가진다. 이 때 Stationary에 가까운 데이터는 정규분포를 따른다.
       5) Time series decomposition에는 additive 방법과 multiplicative 방법이 있다. 이 노드에서는 additive를 썼다.
5. 클러스터링으로  이상치 찾기 : K-means와 DBSCAN
    - 대표적인 unsupervised clustering 알고리즘이다.
    - 입력된 데이터들을 유사한 몇개의 그룹으로 분류해준다.
    - k-means은 몇 개의 그룹으로 묶는지 미리 지정해 주는 반면, DBSCAN은 지정해 줄 필요 없다.
    - k-means
       1) 소수 그룹이 형성될 만큼 충분한 그룹수로 클러스터링한다.
       2) 소수 그룹의 특징을 분석한다.
       3) 해당 소수 그룹들이 이상치인지 추론해본다.
    - DBSCAN
       1) 클러스터의 개수를 지정할 필요가 없다.
       2) 핵심벡터와 일정 거리 ε이내인 데이터 벡터들이 군집을 이루게 하는데, 그러한 군집들과 거리상 동떨어져 군집에 들지 못하는 특이한 데이터들을 노이즈(Noise) 벡터라고 부른다.
    - DBSCAN을 통해 이상치를 찾는 것은 바로 이러한 노이즈 벡터를 찾는 것과 같다.
6. Auto-Encoder를 이용한 이상치 탐색
    - 오토인코더는 인코더와 디코더로 구성된다.
    - 인코더는 입력데이터로부터 중요한 정보를 뽑아낸다.
    - 이 과정에서 입력데이터보다 압축된 형태의 데이터를 얻는다.
    - 디코더는 중요한 정보로 입력데이터와유사한 형태를 재생성(Generate)한다.