Contents
시계열(Time-Series) 데이터에서 전처리 과정에서 수행하는 일은 결측치를 제거하는 것과 노이즈(Noise)를 제거하는 것이다. 결측치와 노이즈는 예측 성능을 떨어뜨리는 녀석들 중 하나이기에 사전에 전처리 과정을 수행하여 처리한 후 작업을 수행하는 것이 옳다.
결측치 (Missing Values)
결측치는 말 그대로 값이 존재하지 않는 값을 의미한다. 예를 들어, 식당의 매출을 예측하는 경우 식당의 휴무일에는 매출이 존재하지 않을 것이다. 이와 같은 경우 이를 제거하고 예측하는 형태로 진행할 수 있을 것이다. 실제 데이터를 다룰 때 휴무일과 같은 경우로 데이터가 없을 수도 있고, 단순히 누락되었을 수도 있다.
일반적인 데이터의 구성에서는 큰 문제가 되지 않는다면 결측치를 제거하면 된다. 그러나, 시계열 데이터에서 결측치를 제거하게 되는 경우 그 시점의 평균과 분산의 왜곡을 가져오게 되고 이는 분석 결과에 치명적인 영향을 미칠 수 있다. 휴무일과 같은 데이터는 제거하면 되지만, 누락된 값인 경우 대체함으로써 평균과 분산에 왜곡을 가져오기 때문이다.
그러나 현실에서 접하는 대부분의 데이터는 항상 결측치가 발생한다. 특히 시계열은 시간의 흐름에 따라 그 시기에 데이터를 직접 수집하는 것이기 때문에 그 시기에 네트워크 이슈 혹은 센서 에러 등의 이유로 수집이 불가하면 결측치가 발생하게 되는 것이다.
시계열 데이터가 아닌 경우에는 일반적으로 평균이나 분산으로 대체하거나 결측치를 제거하면 그만이다. 그러나 시계열 데이터는 그렇게 처리할 경우 문제가 발생한다. 그렇다면 시계열 데이터에서의 결측치는 어떻게 처리할 수 있을까? 시계열 데이터는 시간의 흐름에 따라 데이터의 평균과 분산이 변하기에 이러한 특징을 잘 반영하는 방법론을 활용해야 성공적으로 결측치를 대체할 수 있다. 대체하는 방법은 다음과 같다.
- Last observation carried Forward (LOCF): 직전에 관측된 값으로 결측치를 대체
- Next observation carried backwrd (NOCB): 직후에 관측된 값으로 결측치를 대체
- Moving Average / Median: 직전 N의 time window의 평균치/중앙값으로 결측치를 대체
그러나 결측치 전후의 패턴이 변화하는 구간인 경우에는 이와 같은 방식으로 처리할 경우 문제가 발생한다. 예를 들어, 주가를 예측하는 경우 상승 구간이거나 하락 구간에 결측치가 존재할 때는 이전 값의 평균으로 대체하게 되면 실제 값과 차이가 발생하게 된다. 이런 경우에는 선형 보간법(Linear interpolation)을 통해 해당 값을 찾을 수 있다.
선형 보간법(Linear interpolation)
선형 보간법은 통계적으로 이미 구해진 데이터들로부터 t시점과 t+1시점 사이의 값을 유추하는 형태를 의미힌다. 예를 들어 끝점 $(x_0, y_0)$와 $(x_1, y_1)$가 주어졌을 때, 그 사이에 위치한 $(x,y)$의 값을 추정하기 위해 다음과 같은 수식을 세울 수 있다.
\[ \frac{y-y_0}{x-x_0} = \frac{y_1 - y_0}{x_1 - x_0} \]
\[ y= y_0 + (y_1 - y_0) \cdot \frac{x-x_0}{x_1 - x_0} \]
위 경우에는 선형 보간법에 대해서만 다루었으나, 선형 보간법 외에도 비선형, 스플라인 보간법 등 다양한 보간법이 존재한다. 필요에 따라 다양한 형태로 사잇값을 보간할 수 있다. 비선형 보간법은 선형 함수가 아닌 비선형 함수를 근사 함수로 사용하는 것을 의미하고, 스플라인(Spline) 보간법은 전체 구간을 근사하는 것이 아닌, 소구간으로 분할하여 보간하는 방법을 의미한다.
만약 누락된 값이 너무 많은 경우에는 위와 같은 방법으로 처리를 할 수 없다. 이때는 모델링을 통해 해당 부분을 예측하는 형태로 진행하여야 한다. 일반적인 데이터라면 기존에 수집된 데이터로 결측치를 잘 설명할 수 있으나, 시계열 데이터는 시간에 따라 변화하기에 이를 모델링하는 것은 어렵다. 그러나 최근에는 GAN에 기반한 시계열 생성 알고리즘으로 이 부분을 채우고자 하는 연구가 많이 진행되고 있다.
노이즈(Noise)
노이즈는 잡음을 의미하며, 의도하지 않은 데이터의 왜곡을 불러오는 모든 것들을 칭한다. 예를 들어, 음성 처리의 경우 주변의 소음으로 인해 음성 인식이 제대로 되지 않는다면 이때 소음을 노이즈로 판단한다. 시계열 데이터에서는 원래 분포를 왜곡하는 모든 요인을 칭한다.
최근 주식 시장에서는 코로나 사태로 인해 주가가 엄청나게 하락을 하게 되었다. 이 때 해당 부분을 노이즈로 볼 것인지, 아닌지를 판단함에 따라 제거할수도, 제거하지 않을수도 있다. 시계열 데이터에서 노이즈를 제거하는 방법을 Denosing이라고 한다.
가장 간단한 Denosing 방법으로는 Moving Average가 있다. Moving Average는 평균값으로 관측치를 대체하는 방식이며, 이를 통해 이상하게 튀는 값을 평할화(Smoothing)할 수 있다. 노이즈가 정말 많은 환경에서는 노이즈 자체가 평균이 되어버리는 경우가 있으나, 노이즈가 간혹 발생하는 경우에는 매우 효과적이다. 그렇다면 노이즈가 많은 환경에는 어떻게 처리를 해야할까?
노이즈가 많은 환경에서는 노이즈를 Smoothing 혹은 Filtering 하는 법이 있다. 현재 시계열에 발생하는 노이즈가 어떤 특정한 분포를 따른다고 가정하고 해당 분포의 값을 시계열에서 제거하는 형태로 진행한다.
\[ x_{n+1} + \xi = Ax_{n}\]
여기서 $\xi$가 어떤 특정한 분포를 따른다고 가정하고, 이를 근사한 값을 제거함으로써 원래 값을 복원할 수 있다. 따라서, $Ax_n$를 구한다음 $\xi$를 빼서 원래 시계열 구조를 찾는 것이다. 특정한 분포는 일반적으로 가우시안(Gaussian) 분포를 많이 사용한다.
필터링(Filtering)
노이즈를 제거하는 대표적인 필터링 방법은 가우시안 필터링(Gaussian Filtering), 쌍방 필터(Bilateral Filter), 칼만 필터(Kalman Filter)가 있다. 가우시안 필터링은 노이즈가 정규분포를 따른다고 가정하는 것을 의미하고, 쌍방 필터는 변곡점이 큰 지점을 뭉개버리는 특징을 갖는 가우시안 필터링의 단점을 보완해 데이터의 원 분포에 따라 발생하는 엣지(Edge)들을 더 잘 보존하는 방법이다.
가우시안 필터링(Gaussian Filtering)
가우시안 필터링은 시계열 데이터 뿐만 아니라 이미지 처리에서도 많이 사용하는 Filter 중 하나이며, 수식은 다음과 같다.
\[ G(x,y) = \frac{1}{2 \pi \sigma^2} \exp(-\frac{x^2 + y^2}{2 \sigma^2}) \]
위 수식을 살펴보면 가우시안 필터에서 결정해야할 파라미터는 $\sigma$이다. 일반적으로 $1\sigma$는 68%, $2\sigma$는 95%, $3\sigma$는 99.7%를 설명한다고 알려져있기 때문에 $3\sigma$까지 고려할 때 정확도가 가장 높다고 한다.
경제학에서는 기본적으로 세상의 모든 현상을 가우시안 분포로 설명한다. 그러나 이러한 분포는 주식과 같은 경제 분야에서는 전혀 들어맞지 않는 상황이 발생할 수 있다. 일반적으로 주식 시장에서는 극단적인 경우가 많이 발생하기에 이러한 경우를 팻 테일(Fat Tail)이라 부른다. 이는 정규분포의 양 끝 모양이 더 뚱뚱한 것을 의미한다.
쌍방 필터(Bilateral Filter)
가우시안 필터링은 노이즈를 제거하는데 있어 효과적이지만, 경계성이 뭉개지는 현상이 있다. 이러한 문제점을 보완한 필터링이 바로 쌍방 필터링이며, 수식은 다음과 같다.
\[ \text{BF}[I]_p = \frac{1}{W_p} \sum_{q\in S} G_{\sigma_s} (||p-q||) \cdot G_{\sigma_r} (||I_p - I_q||) I_q \]
칼만 필터(Kalmal Filter)
칼만 필터는 잡음이 포함된 과거 측정값에서 현재 상태의 결합분포를 추정하는 알고리즘이다. 어떠한 정보가 있을 때 해당 데이터는 mixture 모델임(GMM과 같이)을 가정한다. 즉, 다른 분포들의 결합이라는 것을 가정한다. 일반화된 분포를 가정하는 것이 아닌 데이터의 특정에 맞는 분포를 모델링할 수 있어 상당히 많이 사용되며 특히 이미지 트래킹 분야에서 많이 사용되는 필터링 중 하나이다. 수식은 다음과 같다.
\[ \mu_{\text{new}} = \frac{\mu_2 \sigma^2_1 + \mu_1 \sigma^2_2}{\sigma^2_1 + \sigma^2_2} \]
\[ \sigma^2_{\text{new}} = \frac{\sigma^2_1 \sigma^2_2}{\sigma^2_1 + \sigma^2_2} \]
'Time-Series' 카테고리의 다른 글
[Time-Series] Time-Series with Machine Learning (0) | 2022.06.01 |
---|---|
[Time-Series] 시계열 데이터에서의 교차검증(Cross-Validation) (1) | 2022.05.25 |
Time-Series 시계열 입문하기. (0) | 2022.05.14 |