시계열 데이터 스파이크 검출 #1
시계열 데이터(time series data)에서 발생할 수 있는 스파이크(spike) 신호를 검출하는 방법을 알아보겠습니다. ECG(electrocardiogram, 심전도) 데이터나 기온, 습도와 같은 기후데이터 혹은 주가와 같이 시간에 따라 변하는 데이터에서는 다양한 이유로 이러한 국부적인 극대값(local maxima, 스파이크 현상)이 발생할 수 있습니다. 경우에 따라 이 스파이크 신호는 특이값(outlier)으로 분류되어 검출되어야하거나 혹은 제거, 보간(interpolation) 등의 방법으로 데이터가 수정되어야 될 필요가 있습니다.
SciPy의 signal processing 모듈중 find_peaks 함수를 사용하면, 시계열 데이터에서 스파이크에 해당하는 값을 검출할 수 있습니다.
♣ 실습 ♣
* SciPy 공식문서에는 ECG데이터를 이용한 예제가 있으니 참고하시면 좋을 것 같습니다.
0) 필요한 라이브러리 호출
1) 임의의 스파이크 데이터 생성
2) "find_peaks" 함수를 사용하여 스파이크 검출
find_peaks 함수는 'peaks'와 'properties' 두 개의 결과값을 반환합니다. 위의 예시에서는 'peaks' 값만 peaks 변수에 반환받았고, 'properties' 값은 여러 속성 중 'height'에 해당하는 값만 반환하였습니다. 'properties'에 해당되는 속성에는 'peak_height', 'left or right thresholds', 'prominnences' 등 다양한 속성이 있는데요, 자세한 사항은 SciPy 공식문서를 참조하시면 좋을 것 같습니다. 위에서 반환된 'peaks' 값은 데이터에서 peak의 위치에 해당하는 x 좌표를 반환하며, 'properties["peak_height"]' 값은 각 peak의 높이에 해당하는 y 좌표를 반환합니다.
3) 스파이크의 크기 한계값 설정(height thresholding)
'find_peaks' 함수 파라미터중 'height' 속성에 값을 입력하면 반환되는 'peak'는 입력된 값보다 큰 값을 가지는 스파이크만 반환됩니다. 위의 그림에서 볼 수 있는 것처럼 'height=32'로 값을 입력하였을때, 32보다 큰 값을 가지는 스파이크 1개만 검출되는 것을 확인할 수 있습니다. 이처럼 'find_peaks' 함수의 'height' 파라미터를 조정하면 입력데이터에서 지정하는 값보다 큰 스파이크를 검출할 수 있습니다.
3-1) 스파이크의 구간 한계값 설정(height bound thresholding)
'height' 파라미터에는 최소값 뿐만 아니라 구간으로도 값을 추출할 수 있습니다. 위의 그림에서 처럼 'height' 파라미터에 [30.5, 31]의 값을 넣어주면, 30.5~31 사이이의 크기를 가지는 peak 값을 반환합니다. 이같은 특성을 이용하여 입력데이터에서 특정 구간에 속하는 스파이크를 추출할 수도 있습니다.
<Reference>
- docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html
- https://docs.scipy.org/doc/scipy/reference/signal.html
- https://en.wikipedia.org/wiki/Electrocardiography
'통계, 신호처리, 알고리즘 > Signal processing' 카테고리의 다른 글
SciPy의 'curve_fit'을 이용한 커브 피팅 (0) | 2020.04.22 |
---|