시계열 데이터 전처리와 통계적 진단
시계열 데이터(Time Series Data)는
시간의 흐름에 따라 순차적으로 관측된 데이터를 의미한다.
수학적으로는 시간 ( t )에 대해 정의된 확률 변수 ( X_t )의 집합으로 표현된다.

이 정의에서 중요한 점은 다음 두 가지다.
일반적인 머신러닝 데이터는 다음 가정을 암묵적으로 가진다.
시계열 데이터는 이 가정을 모두 위반한다.
따라서 시계열 데이터는
별도의 전처리와 분석 체계가 필요하다.
시계열 전처리는 단순히 데이터를 깨끗하게 만드는 작업이 아니다.
시계열 전처리의 목적은 다음과 같다.
시간 구조를 유지한 채
데이터 생성 과정을 단순한 통계적 구조로 변환하여
모델이 학습 가능한 형태로 만드는 것
시계열 데이터에서 시간 인덱스는
단순한 컬럼이 아니라 좌표계에 해당한다.
df = df.sort_index()
이 작업은 모든 시계열 분석의 전제 조건이다.
현실 데이터에서는 다음과 같은 상황이 빈번하다.
이 경우 모델은 실제 현상이 아니라
샘플링 간격의 불규칙성을 학습하게 된다.
이를 해결하기 위해 시간 단위를 명시적으로 통일해야 한다.
Resampling은
시간 단위를 기준으로 데이터를 재집계하는 과정이다.
df = df.resample("1H").mean()
Resampling은 항상
결측치 처리 전략과 함께 설계되어야 한다.
시계열에서 결측은
“값이 0”이 아니라
해당 시점에 관측이 이루어지지 않았음을 의미한다.
따라서 단순 삭제는
시간 구조를 붕괴시킨다.
df['value'] = df['value'].interpolate(method='linear')
df['value'] = df['value'].ffill()
시계열 이상치는 다음 중 하나일 수 있다.
따라서 이상치는
무조건 제거 대상이 아니다.
IQR, z-score는
시간 순서를 고려하지 않는다.
실무에서는 이상치를 제거하기보다
이상치 여부를 피처로 활용하는 경우가 많다.
정상성이란
시계열의 통계적 성질이 시간에 따라 변하지 않는 상태를 의미한다.
from statsmodels.tsa.stattools import adfuller
adfuller(df['value'])[1]
차분은
시계열을 값의 문제에서
변화량의 문제로 변환한다.
df['diff'] = df['value'].diff()
시계열은 일반적으로 다음으로 구성된다.
from statsmodels.tsa.seasonal import seasonal_decompose
seasonal_decompose(df['value'], period=24)
이를 통해
시계열 구조를 시각적으로 확인할 수 있다.
자기상관은 현재 값과 과거 값 사이의 상관 관계다.
이는 Lag Feature 설계의 기준이 된다.
df['lag_1'] = df['value'].shift(1)
과거 정보를
명시적 입력 변수로 변환한다.
df['rolling_mean'] = df['value'].rolling(7).mean()
최근 구간의 상태를 요약한다.
이 장에서 다룬 시계열 전처리는
다음 흐름으로 정리된다.