정상성 (Stationarity)
1. 개요
정상성(Stationarity)이란 시계열 데이터의 통계적 특성(평균, 분산 등)이 시간이 경과해도 변하지 않고 일정하게 유지되는 성질을 의미한다. 시계열 분석의 핵심 목적은 과거의 패턴을 통해 미래를 예측하는 것인데, 데이터의 통계적 특성이 시간에 따라 계속 변한다면 과거의 데이터로 학습한 모델을 미래에 적용하는 것이 불가능하기 때문에 정상성 확보는 분석의 필수 전제 조건이 된다.
2. 정상성의 조건과 종류
정상성은 엄격함의 정도에 따라 강정상성과 약정상성으로 구분된다. 실제 데이터 분석에서는 주로 약정상성을 기준으로 판단한다.
2.1 강정상성 (Strong Stationarity)
강정상성은 시계열의 전체 확률 분포가 시간에 관계없이 동일한 상태를 말한다. 즉, 임의의 시간 시점 $t$와 $t+k$에서 데이터의 분포가 완전히 일치해야 하므로, 현실 세계의 데이터에서 이를 만족하는 경우는 매우 드물다.
2.2 약정상성 (Weak Stationarity)
약정상성은 분포 전체가 아닌 주요 통계량(1차, 2차 모멘트)이 일정함을 요구한다. 다음 세 가지 조건을 모두 만족해야 한다.
1. 평균의 일정함: $E[y_t] = \mu$ (시간 $t$에 관계없이 평균이 일정함)
2. 분산의 일정함: $Var(y_t) = \sigma^2$ (시간 $t$에 관계없이 분산이 일정함)
3. 자기공분산의 일정함: $\gamma(k) = Cov(y_t, y_{t+k}) = E[(y_t - \mu)(y_{t+k} - \mu)]$ (시간 $t$에 무관하고 시차 $k$에만 의존함)
[표] 약정상성 vs 강정상성 비교
| 구분 |
약정상성 (Weak) |
강정상성 (Strong) |
| 핵심 조건 |
평균, 분산, 자기공분산이 일정 |
전체 확률 분포가 일정 |
| 요구 수준 |
상대적으로 낮음 (실용적) |
매우 높음 (이론적) |
| 분석 활용 |
ARIMA 등 대부분의 시계열 모델 |
수학적 증명 및 이론적 분석 |
| 판단 기준 |
모멘트(Moment) 기반 |
분포(Distribution) 기반 |
3. 정상성 확인 방법
데이터가 정상성을 띠는지 확인하기 위해서는 시각적 분석과 통계적 검정을 병행한다.
3.1 시각적 확인 (Line Plot)
시계열 그래프를 그려 다음 사항을 체크한다.
- 평균: 데이터가 특정 값 주변에서 일정하게 진동하는가? (우상향/우하향 추세가 없는가?)
- 분산: 시간의 흐름에 따라 변동 폭이 일정하게 유지되는가? (폭이 넓어지거나 좁아지지 않는가?)
3.2 통계적 검정 방법
시각적 분석은 주관적일 수 있으므로 단위근 검정(Unit Root Test)을 통해 객관적으로 판단한다.
- ADF 검정 (Augmented Dickey-Fuller Test):
- 원리: 시계열에 단위근(Unit Root)이 존재하는지 검정한다. 단위근이 있다면 비정상 시계열로 간주한다.
- 해석: 귀무가설($H_0$)은 "단위근이 존재한다(비정상적이다)"이다. p-value가 유의수준(보통 0.05)보다 작으면 귀무가설을 기각하고 정상 시계열로 판단한다.
- KPSS 검정 (Kwiatkowski-Phillips-Schmidt-Shin Test):
- 원리: ADF와 반대로 정상성을 귀무가설로 설정한다.
- 해석: 귀무가설($H_0$)은 "정상 시계열이다"이다. p-value가 유의수준보다 크면 귀무가설을 채택하여 정상 시계열로 판단한다.
[검정 결과의 종합적 해석]
두 검정을 동시에 수행하면 더욱 정밀한 판단이 가능하다.
- ADF 기각(정상) $\cap$ KPSS 채택(정상) $\rightarrow$ 확실한 정상성
- ADF 채택(비정상) $\cap$ KPSS 기각(비정상) $\rightarrow$ 확실한 비정상성
- 결과가 엇갈릴 경우 $\rightarrow$ 추세 정상성(Trend Stationarity) 가능성 검토 필요
[체크리스트] 정상성 확인 단계
- [ ] 시계열 그래프에서 뚜렷한 상승/하강 추세(Trend)가 보이지 않는가?
- [ ] 시간 흐름에 따라 변동성(Volatility)의 크기가 일정하게 유지되는가?
- [ ] ADF 검정의 p-value가 0.05 미만으로 나타나는가?
- [ ] KPSS 검정의 p-value가 0.05 이상으로 나타나는가?
4. 비정상성 시계열의 특징과 원인
대부분의 실제 데이터는 비정상성(Non-stationarity)을 띤다. 주요 원인은 다음과 같다.
- 추세 (Trend): 시간이 지남에 따라 데이터의 평균값이 지속적으로 증가하거나 감소하는 경향. (예: 경제 성장으로 인한 GDP 증가)
- 계절성 (Seasonality): 특정 주기(일, 주, 월, 분기 등)마다 반복되는 패턴. (예: 여름철 에어컨 판매량 증가)
- 구조적 변화 (Structural Break): 정책 변경, 재난, 팬데믹 등 외부 충격으로 인해 데이터의 성질이 갑자기 변하는 경우.
5. 정상성 확보 방법 (데이터 변환)
비정상 시계열을 정상 시계열로 변환하는 과정은 모델의 예측 성능을 높이는 핵심 단계이다.
5.1 주요 변환 기법
- 차분 (Differencing): 현재 시점의 값에서 이전 시점의 값을 빼는 방법. 추세를 제거하는 데 효과적이다.
- 1차 차분: $y'_t = y_t - y_{t-1}$
- 계절 차분: $y'_t = y_t - y_{t-s}$ ($s$는 주기)
- 주의: 과도한 차분(Over-differencing)은 데이터의 유용한 정보를 손실시키고 인위적인 상관관계를 생성할 수 있으므로 주의가 필요함.
- 로그 변환 (Log Transform): 데이터에 로그를 취해 분산을 일정하게 만드는 방법. 지수적으로 증가하는 변동성을 완화할 때 사용한다.
- 추세 제거 (Detrending): 회귀 분석을 통해 추세선을 구한 뒤, 원본 데이터에서 추세 성분을 빼는 방법.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
# 샘플 비정상 데이터 생성 (추세 + 지수적 변동성)
np.random.seed(42)
time = np.arange(100)
# 추세와 시간이 갈수록 커지는 분산을 가진 데이터 생성
data = 0.5 * time + np.random.randn(100) * (time / 10 + 1)
ts = pd.Series(data)
# 1. 로그 변환 (분산 안정화)
ts_log = np.log(ts + 1)
# 2. 차분 (평균 안정화)
ts_diff = ts.diff().dropna()
ts_log_diff = ts_log.diff().dropna()
# ADF 검정 함수
def check_stationarity(series, name):
result = adfuller(series)
print(f'[{name}] ADF Statistic: {result[0]:.4f}, p-value: {result[1]:.4f}')
# 검정 수행
check_stationarity(ts, "원본 데이터")
check_stationarity(ts_log, "로그 변환 데이터")
check_stationarity(ts_diff, "차분 데이터")
check_stationarity(ts_log_diff, "로그 변환 후 차분 데이터")
# 시각화 비교 그래프
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(ts)
plt.title("Original (Non-stationary)")
plt.subplot(2, 2, 2)
plt.plot(ts_log)
plt.title("Log Transformed (Variance Stabilized)")
plt.subplot(2, 2, 3)
plt.plot(ts_diff)
plt.title("Differenced (Mean Stabilized)")
plt.subplot(2, 2, 4)
plt.plot(ts_log_diff)
plt.title("Log + Differenced (Stationary)")
plt.tight_layout()
plt.show()
[시각화 예시] 변환 전후 비교 (개념도)
| 상태 |
시각적 특징 |
변환 방법 |
결과 |
| 비정상 (추세) |
$\nearrow$ (우상향 직선 형태) |
$\rightarrow$ 차분 $\rightarrow$ |
$\sim$ (0을 중심으로 진동, 평균 안정화) |
| 비정상 (분산 증가) |
$\text{V}$ (시간 갈수록 진폭 확대) |
$\rightarrow$ 로그 변환 $\rightarrow$ |
$\approx$ (진폭이 일정함, 분산 안정화) |
| 비정상 (계절성) |
$\text{M}\text{M}\text{M}$ (반복적 파형) |
$\rightarrow$ 계절 차분 $\rightarrow$ |
$\sim$ (주기성 제거됨, 평균 안정화) |
6. 정상성이 분석 모델에 미치는 영향
데이터의 정상성을 확보했다면, 이제 이를 바탕으로 시계열 예측 모델을 구축할 수 있다. 특히 가장 대표적인 모델인 ARIMA 모델은 데이터의 정상성 여부에 따라 모델의 구조가 결정된다.
6.1 ARIMA 모델의 전제 조건
ARIMA(Auto-Regressive Integrated Moving Average) 모델에서 'I(Integrated)'는 차분을 의미한다. AR(자기회귀)과 MA(이동평균) 모델은 데이터가 정상적이라는 가정하에 수학적으로 유도되었기 때문에, 비정상 데이터를 그대로 입력하면 모델의 계수가 수렴하지 않거나 잘못된 예측 결과를 도출한다. 따라서 분석가는 데이터를 정상화(Stationarize)한 후 적절한 $p, d, q$ 파라미터를 설정하여 모델을 학습시켜야 한다.
6.2 가짜 회귀 (Spurious Regression) 문제
두 시계열 데이터가 서로 아무런 인과관계가 없음에도 불구하고, 단순히 둘 다 강한 추세(Trend)를 가지고 있다는 이유만으로 통계적으로 유의미한 상관관계가 있는 것처럼 나타나는 현상을 가짜 회귀라고 한다. 이는 결정계수($R^2$)는 매우 높게 나오지만 실제로는 아무런 의미가 없는 분석 결과이며, 이를 방지하기 위해 반드시 정상성 검토 후 분석을 진행해야 한다.
[부록] 정상성 관련 주요 용어 사전
- 단위근 (Unit Root): 시계열의 특성 결정 방정식에서 특성 방정식의 해가 1인 경우를 말하며, 단위근이 존재하면 시계열은 비정상성을 띤다.
- 자기공분산 (Autocovariance): 서로 다른 시점의 두 값 사이의 공분산으로, 시계열 데이터 내의 시간적 상관관계를 측정한다.
- 시차 (Lag): 현재 시점과 과거 시점 사이의 시간 간격.
- 백색 잡음 (White Noise): 평균이 0이고 분산이 일정하며, 서로 독립적인 무작위 변수들의 시계열. 가장 완벽한 형태의 정상 시계열이다.
# 정상성 (Stationarity)
## 1. 개요
**정상성(Stationarity)**이란 시계열 데이터의 통계적 특성(평균, 분산 등)이 시간이 경과해도 변하지 않고 일정하게 유지되는 성질을 의미한다. 시계열 분석의 핵심 목적은 과거의 패턴을 통해 미래를 예측하는 것인데, 데이터의 통계적 특성이 시간에 따라 계속 변한다면 과거의 데이터로 학습한 모델을 미래에 적용하는 것이 불가능하기 때문에 정상성 확보는 분석의 필수 전제 조건이 된다.
## 2. 정상성의 조건과 종류
정상성은 엄격함의 정도에 따라 강정상성과 약정상성으로 구분된다. 실제 데이터 분석에서는 주로 약정상성을 기준으로 판단한다.
### 2.1 강정상성 (Strong Stationarity)
강정상성은 시계열의 전체 확률 분포가 시간에 관계없이 동일한 상태를 말한다. 즉, 임의의 시간 시점 $t$와 $t+k$에서 데이터의 분포가 완전히 일치해야 하므로, 현실 세계의 데이터에서 이를 만족하는 경우는 매우 드물다.
### 2.2 약정상성 (Weak Stationarity)
약정상성은 분포 전체가 아닌 주요 통계량(1차, 2차 모멘트)이 일정함을 요구한다. 다음 세 가지 조건을 모두 만족해야 한다.
1. **평균의 일정함**: $E[y_t] = \mu$ (시간 $t$에 관계없이 평균이 일정함)
2. **분산의 일정함**: $Var(y_t) = \sigma^2$ (시간 $t$에 관계없이 분산이 일정함)
3. **자기공분산의 일정함**: $\gamma(k) = Cov(y_t, y_{t+k}) = E[(y_t - \mu)(y_{t+k} - \mu)]$ (시간 $t$에 무관하고 시차 $k$에만 의존함)
### [표] 약정상성 vs 강정상성 비교
| 구분 | 약정상성 (Weak) | 강정상성 (Strong) |
| :--- | :--- | :--- |
| **핵심 조건** | 평균, 분산, 자기공분산이 일정 | 전체 확률 분포가 일정 |
| **요구 수준** | 상대적으로 낮음 (실용적) | 매우 높음 (이론적) |
| **분석 활용** | ARIMA 등 대부분의 시계열 모델 | 수학적 증명 및 이론적 분석 |
| **판단 기준** | 모멘트(Moment) 기반 | 분포(Distribution) 기반 |
## 3. 정상성 확인 방법
데이터가 정상성을 띠는지 확인하기 위해서는 시각적 분석과 통계적 검정을 병행한다.
### 3.1 시각적 확인 (Line Plot)
시계열 그래프를 그려 다음 사항을 체크한다.
- **평균**: 데이터가 특정 값 주변에서 일정하게 진동하는가? (우상향/우하향 추세가 없는가?)
- **분산**: 시간의 흐름에 따라 변동 폭이 일정하게 유지되는가? (폭이 넓어지거나 좁아지지 않는가?)
### 3.2 통계적 검정 방법
시각적 분석은 주관적일 수 있으므로 단위근 검정(Unit Root Test)을 통해 객관적으로 판단한다.
* **ADF 검정 (Augmented Dickey-Fuller Test)**:
* **원리**: 시계열에 단위근(Unit Root)이 존재하는지 검정한다. 단위근이 있다면 비정상 시계열로 간주한다.
* **해석**: 귀무가설($H_0$)은 "단위근이 존재한다(비정상적이다)"이다. p-value가 유의수준(보통 0.05)보다 작으면 귀무가설을 기각하고 **정상 시계열**로 판단한다.
* **KPSS 검정 (Kwiatkowski-Phillips-Schmidt-Shin Test)**:
* **원리**: ADF와 반대로 정상성을 귀무가설로 설정한다.
* **해석**: 귀무가설($H_0$)은 "정상 시계열이다"이다. p-value가 유의수준보다 크면 귀무가설을 채택하여 **정상 시계열**로 판단한다.
**[검정 결과의 종합적 해석]**
두 검정을 동시에 수행하면 더욱 정밀한 판단이 가능하다.
- **ADF 기각(정상) $\cap$ KPSS 채택(정상)** $\rightarrow$ 확실한 정상성
- **ADF 채택(비정상) $\cap$ KPSS 기각(비정상)** $\rightarrow$ 확실한 비정상성
- **결과가 엇갈릴 경우** $\rightarrow$ 추세 정상성(Trend Stationarity) 가능성 검토 필요
### [체크리스트] 정상성 확인 단계
- [ ] 시계열 그래프에서 뚜렷한 상승/하강 추세(Trend)가 보이지 않는가?
- [ ] 시간 흐름에 따라 변동성(Volatility)의 크기가 일정하게 유지되는가?
- [ ] ADF 검정의 p-value가 0.05 미만으로 나타나는가?
- [ ] KPSS 검정의 p-value가 0.05 이상으로 나타나는가?
## 4. 비정상성 시계열의 특징과 원인
대부분의 실제 데이터는 비정상성(Non-stationarity)을 띤다. 주요 원인은 다음과 같다.
1. **추세 (Trend)**: 시간이 지남에 따라 데이터의 평균값이 지속적으로 증가하거나 감소하는 경향. (예: 경제 성장으로 인한 GDP 증가)
2. **계절성 (Seasonality)**: 특정 주기(일, 주, 월, 분기 등)마다 반복되는 패턴. (예: 여름철 에어컨 판매량 증가)
3. **구조적 변화 (Structural Break)**: 정책 변경, 재난, 팬데믹 등 외부 충격으로 인해 데이터의 성질이 갑자기 변하는 경우.
## 5. 정상성 확보 방법 (데이터 변환)
비정상 시계열을 정상 시계열로 변환하는 과정은 모델의 예측 성능을 높이는 핵심 단계이다.
### 5.1 주요 변환 기법
- **차분 (Differencing)**: 현재 시점의 값에서 이전 시점의 값을 빼는 방법. 추세를 제거하는 데 효과적이다.
- 1차 차분: $y'_t = y_t - y_{t-1}$
- 계절 차분: $y'_t = y_t - y_{t-s}$ ($s$는 주기)
- **주의**: 과도한 차분(Over-differencing)은 데이터의 유용한 정보를 손실시키고 인위적인 상관관계를 생성할 수 있으므로 주의가 필요함.
- **로그 변환 (Log Transform)**: 데이터에 로그를 취해 분산을 일정하게 만드는 방법. 지수적으로 증가하는 변동성을 완화할 때 사용한다.
- **추세 제거 (Detrending)**: 회귀 분석을 통해 추세선을 구한 뒤, 원본 데이터에서 추세 성분을 빼는 방법.
### 5.2 Python 구현 예시
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
# 샘플 비정상 데이터 생성 (추세 + 지수적 변동성)
np.random.seed(42)
time = np.arange(100)
# 추세와 시간이 갈수록 커지는 분산을 가진 데이터 생성
data = 0.5 * time + np.random.randn(100) * (time / 10 + 1)
ts = pd.Series(data)
# 1. 로그 변환 (분산 안정화)
ts_log = np.log(ts + 1)
# 2. 차분 (평균 안정화)
ts_diff = ts.diff().dropna()
ts_log_diff = ts_log.diff().dropna()
# ADF 검정 함수
def check_stationarity(series, name):
result = adfuller(series)
print(f'[{name}] ADF Statistic: {result[0]:.4f}, p-value: {result[1]:.4f}')
# 검정 수행
check_stationarity(ts, "원본 데이터")
check_stationarity(ts_log, "로그 변환 데이터")
check_stationarity(ts_diff, "차분 데이터")
check_stationarity(ts_log_diff, "로그 변환 후 차분 데이터")
# 시각화 비교 그래프
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(ts)
plt.title("Original (Non-stationary)")
plt.subplot(2, 2, 2)
plt.plot(ts_log)
plt.title("Log Transformed (Variance Stabilized)")
plt.subplot(2, 2, 3)
plt.plot(ts_diff)
plt.title("Differenced (Mean Stabilized)")
plt.subplot(2, 2, 4)
plt.plot(ts_log_diff)
plt.title("Log + Differenced (Stationary)")
plt.tight_layout()
plt.show()
```
### [시각화 예시] 변환 전후 비교 (개념도)
| 상태 | 시각적 특징 | 변환 방법 | 결과 |
| :--- | :--- | :--- | :--- |
| **비정상 (추세)** | $\nearrow$ (우상향 직선 형태) | $\rightarrow$ **차분** $\rightarrow$ | $\sim$ (0을 중심으로 진동, 평균 안정화) |
| **비정상 (분산 증가)** | $\text{V}$ (시간 갈수록 진폭 확대) | $\rightarrow$ **로그 변환** $\rightarrow$ | $\approx$ (진폭이 일정함, 분산 안정화) |
| **비정상 (계절성)** | $\text{M}\text{M}\text{M}$ (반복적 파형) | $\rightarrow$ **계절 차분** $\rightarrow$ | $\sim$ (주기성 제거됨, 평균 안정화) |
## 6. 정상성이 분석 모델에 미치는 영향
데이터의 정상성을 확보했다면, 이제 이를 바탕으로 시계열 예측 모델을 구축할 수 있다. 특히 가장 대표적인 모델인 ARIMA 모델은 데이터의 정상성 여부에 따라 모델의 구조가 결정된다.
### 6.1 ARIMA 모델의 전제 조건
ARIMA(Auto-Regressive Integrated Moving Average) 모델에서 'I(Integrated)'는 차분을 의미한다. AR(자기회귀)과 MA(이동평균) 모델은 데이터가 정상적이라는 가정하에 수학적으로 유도되었기 때문에, 비정상 데이터를 그대로 입력하면 모델의 계수가 수렴하지 않거나 잘못된 예측 결과를 도출한다. 따라서 분석가는 데이터를 정상화(Stationarize)한 후 적절한 $p, d, q$ 파라미터를 설정하여 모델을 학습시켜야 한다.
### 6.2 가짜 회귀 (Spurious Regression) 문제
두 시계열 데이터가 서로 아무런 인과관계가 없음에도 불구하고, 단순히 둘 다 강한 추세(Trend)를 가지고 있다는 이유만으로 통계적으로 유의미한 상관관계가 있는 것처럼 나타나는 현상을 **가짜 회귀**라고 한다. 이는 결정계수($R^2$)는 매우 높게 나오지만 실제로는 아무런 의미가 없는 분석 결과이며, 이를 방지하기 위해 반드시 정상성 검토 후 분석을 진행해야 한다.
## [부록] 정상성 관련 주요 용어 사전
- **단위근 (Unit Root)**: 시계열의 특성 결정 방정식에서 특성 방정식의 해가 1인 경우를 말하며, 단위근이 존재하면 시계열은 비정상성을 띤다.
- **자기공분산 (Autocovariance)**: 서로 다른 시점의 두 값 사이의 공분산으로, 시계열 데이터 내의 시간적 상관관계를 측정한다.
- **시차 (Lag)**: 현재 시점과 과거 시점 사이의 시간 간격.
- **백색 잡음 (White Noise)**: 평균이 0이고 분산이 일정하며, 서로 독립적인 무작위 변수들의 시계열. 가장 완벽한 형태의 정상 시계열이다.