불규칙성 (시계열 분석)
1. 개요
본 문서는 시계열 분석(Time Series Analysis) 관점에서의 불규칙성(Irregularity)을 다룬다. 시계열 분석에서 불규칙성이란 데이터의 전체적인 흐름을 결정하는 추세(Trend)나 일정한 주기로 반복되는 계절성(Seasonality)으로 설명되지 않는 무작위적인 변동 성분을 의미한다. 시계열 데이터는 일반적으로 $Y_t = T_t + S_t + I_t$ (가법 모델 기준)로 구성되며, 여기서 $I_t$가 불규칙 성분(Irregular component) 또는 잔차(Residual)에 해당한다. 이는 예측 불가능한 외부 충격이나 측정 오차에 의해 발생하며, 분석의 목적에 따라 제거해야 할 '노이즈'가 되기도 하고, 분석해야 할 '이상 징후'가 되기도 한다.
2. 불규칙성의 유형과 원인
불규칙성은 크게 예측 불가능한 미세 변동인 무작위 변동과, 일반적인 패턴에서 크게 벗어난 특이치로 구분할 수 있다.
2.1 무작위 변동과 특이치의 비교
| 구분 |
무작위 변동 (Random Variation) |
특이치 (Outlier) |
| 정의 |
평균 주변에서 작고 불규칙하게 발생하는 변동 |
일반적인 데이터 분포 범위를 크게 벗어난 값 |
| 발생 원인 |
측정 오차, 미세한 환경 변화, 자연적 변동 |
시스템 오류, 갑작스러운 재난, 정책 변경, 사고 |
| 영향력 |
개별 값의 영향력은 낮으나 전체 분산을 높임 |
모델의 평균 및 분산 추정치에 심각한 왜곡 초래 |
| 처리 방법 |
평활화(Smoothing) 또는 필터링 |
제거, 대체(Imputation) 또는 별도 분석 |
2.2 주요 발생 원인
- 측정 오차(Measurement Error): 센서의 정밀도 한계나 데이터 수집 과정에서의 누락 및 기입 오류.
- 외부 충격(External Shocks): 정치적 사건, 자연재해, 갑작스러운 법규 변경 등 예측 불가능한 외부 요인.
- 심리적 요인: 소비자 심리의 일시적 변화나 패닉 바잉(Panic Buying)과 같은 비이성적 행동.
3. 시계열 분해를 통한 추출 방법
불규칙 성분을 추출하기 위해서는 전체 시계열 데이터에서 추세와 계절성을 분리해내는 시계열 분해(Time Series Decomposition) 과정이 필요하다.
3.1 분해 모델의 종류
- 가법 모델 (Additive Model): $Y_t = T_t + S_t + I_t$. 계절 변동의 폭이 시간에 관계없이 일정할 때 사용한다.
- 승법 모델 (Multiplicative Model): $Y_t = T_t \times S_t \times I_t$. 추세가 증가함에 따라 계절 변동의 폭이 함께 커지는 경우에 적합하다. 이 경우 불규칙 성분은 절대적인 값이 아닌, 추세와 계절성에 곱해지는 비율(Percentage/Ratio) 형태로 나타난다.
[모델별 특성 비교 그래프 개념]
* 가법 모델 그래프: 추세선이 상승하더라도 계절적 진폭(Peak-to-Trough)이 일정하게 유지되는 형태.
* 승법 모델 그래프: 추세선이 상승함에 따라 계절적 진폭이 부채꼴 모양으로 점점 커지는 형태.
3.2 Python을 이용한 STL 분해 예시
STL(Seasonal-Trend decomposition using LOESS)은 로컬 회귀(LOESS)를 사용하여 유연하게 추세와 계절성을 분리하는 기법이다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL
# 가상 데이터 생성 (DatetimeIndex 설정 필수)
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=100, freq='M')
values = np.linspace(10, 50, 100) + np.sin(np.linspace(0, 20, 100)) * 10 + np.random.randn(100) * 2
df = pd.DataFrame({'value': values}, index=dates)
# STL 분해 수행
stl = STL(df['value'], period=12) # 월별 데이터 가정
res = stl.fit()
# 성분 추출
trend = res.trend
seasonal = res.seasonal
resid = res.resid # 이것이 불규칙 성분(Irregularity)
# 시각화
res.plot()
plt.show()
4. 불규칙성 분석 및 처리 기법
추출된 불규칙 성분이 단순한 노이즈인지, 아니면 유의미한 정보인지 판별하는 과정이 필수적이다.
4.1 화이트 노이즈(White Noise) 판별
불규칙 성분이 아무런 패턴이 없는 화이트 노이즈(평균이 0이고 분산이 일정하며 서로 독립인 확률 과정)라면, 해당 시계열은 더 이상 예측 가능한 정보가 남아있지 않은 상태이다.
- Ljung-Box 검정: 잔차들이 서로 독립적인지(자기상관이 없는지) 확인하는 검정법이다. $p\text{-value} > 0.05$일 경우 화이트 노이즈로 간주한다.
- ADF 검정 (Augmented Dickey-Fuller): 데이터가 정상성(Stationarity)을 갖는지 확인하여 불규칙 성분의 안정성을 평가한다.
[Ljung-Box 검정 Python 구현]
from statsmodels.stats.diagnostic import acorr_ljungbox
# resid는 STL 분해를 통해 얻은 잔차 데이터
lb_test = acorr_ljungbox(resid, lags=[10], return_df=True)
p_value = lb_test['lb_pvalue'].values[0]
print(f"Ljung-Box test p-value: {p_value}")
if p_value > 0.05:
print("결과: 화이트 노이즈로 판단됨 (귀무가설 채택)")
else:
print("결과: 유의미한 패턴이 남아있음 (귀무가설 기각)")
4.2 데이터 정제 방법
- 이상치 제거 및 보간법(Interpolation): 특이치로 판명된 값은 제거한 후, 선형 보간법(Linear Interpolation)이나 스플라인 보간법(Spline Interpolation)을 통해 주변 값으로 대체한다.
- 이동 평균(Moving Average): 단기적인 무작위 변동을 억제하여 데이터의 흐름을 매끄럽게 만든다.
5. 분석 시 유의점 및 영향
5.1 과도한 제거의 위험성 (Over-smoothing)
불규칙성을 지나치게 제거하면 데이터의 변동성이 사라져 모델이 훈련 데이터에만 과하게 최적화되는 과적합(Overfitting) 위험이 발생한다. 특히 실제 환경에서는 어느 정도의 변동성이 존재하므로, 이를 완전히 제거한 모델은 실제 예측 시 일반화 성능이 떨어질 수 있다.
5.2 구조적 변화(Structural Break) 포착
모든 불규칙성이 제거 대상은 아니다. 불규칙 성분에서 갑작스러운 레벨 변화나 분산의 증가가 관찰된다면, 이는 구조적 변화의 신호일 수 있다.
- Chow Test (차우 검정): 시계열 데이터의 특정 시점을 기준으로 회귀 계수가 유의미하게 변했는지 판별하는 통계적 방법이다. 전체 기간의 잔차 제곱합(RSS)과 분할된 두 기간의 잔차 제곱합의 합을 비교하여, 구조적 변화가 발생했는지 여부를 $F$-검정을 통해 확인한다.
- 의미: 기업의 합병, 새로운 기술의 등장, 법규 변경 등으로 인해 데이터 생성 원리 자체가 바뀌었을 가능성을 시사한다.
[부록] 추가 분석 자료
산업군별 불규칙성 발생 사례
| 산업군 |
불규칙성 발생 사례 |
성격 |
| 이커머스 |
특정 인플루언서의 갑작스러운 제품 추천으로 인한 트래픽 폭증 |
특이치 (Positive Spike) |
| 제조업 |
공정 센서의 일시적 오작동으로 인한 데이터 튀는 현상 |
측정 오차 (Noise) |
| 금융/주식 |
예상치 못한 금리 인상 발표 직후의 주가 급락 |
외부 충격 (Shock) |
| 에너지 |
기록적인 한파/폭염으로 인한 전력 수요의 비정상적 증가 |
특이치 (Seasonal Outlier) |
불규칙성 제거 전후 비교
데이터 정제 과정을 거치면 다음과 같은 변화가 나타난다.
- 제거 전 (Raw Data): $\text{Trend} + \text{Seasonality} + \text{Irregularity}$ $\rightarrow$ 톱니 모양의 심한 변동과 튀는 값들이 포함되어 추세 파악이 어려움.
- 제거 후 (Smoothed Data): $\text{Trend} + \text{Seasonality}$ $\rightarrow$ 불필요한 노이즈와 특이치가 제거되어 매끄러운 곡선 형태를 띠며, 주기적 패턴과 장기적 방향성이 명확히 드러남.
# 불규칙성 (시계열 분석)
## 1. 개요
본 문서는 시계열 분석(Time Series Analysis) 관점에서의 **불규칙성(Irregularity)**을 다룬다. 시계열 분석에서 불규칙성이란 데이터의 전체적인 흐름을 결정하는 추세(Trend)나 일정한 주기로 반복되는 계절성(Seasonality)으로 설명되지 않는 무작위적인 변동 성분을 의미한다. 시계열 데이터는 일반적으로 $Y_t = T_t + S_t + I_t$ (가법 모델 기준)로 구성되며, 여기서 $I_t$가 불규칙 성분(Irregular component) 또는 잔차(Residual)에 해당한다. 이는 예측 불가능한 외부 충격이나 측정 오차에 의해 발생하며, 분석의 목적에 따라 제거해야 할 '노이즈'가 되기도 하고, 분석해야 할 '이상 징후'가 되기도 한다.
## 2. 불규칙성의 유형과 원인
불규칙성은 크게 예측 불가능한 미세 변동인 **무작위 변동**과, 일반적인 패턴에서 크게 벗어난 **특이치**로 구분할 수 있다.
### 2.1 무작위 변동과 특이치의 비교
| 구분 | 무작위 변동 (Random Variation) | 특이치 (Outlier) |
| :--- | :--- | :--- |
| **정의** | 평균 주변에서 작고 불규칙하게 발생하는 변동 | 일반적인 데이터 분포 범위를 크게 벗어난 값 |
| **발생 원인** | 측정 오차, 미세한 환경 변화, 자연적 변동 | 시스템 오류, 갑작스러운 재난, 정책 변경, 사고 |
| **영향력** | 개별 값의 영향력은 낮으나 전체 분산을 높임 | 모델의 평균 및 분산 추정치에 심각한 왜곡 초래 |
| **처리 방법** | 평활화(Smoothing) 또는 필터링 | 제거, 대체(Imputation) 또는 별도 분석 |
### 2.2 주요 발생 원인
1. **측정 오차(Measurement Error):** 센서의 정밀도 한계나 데이터 수집 과정에서의 누락 및 기입 오류.
2. **외부 충격(External Shocks):** 정치적 사건, 자연재해, 갑작스러운 법규 변경 등 예측 불가능한 외부 요인.
3. **심리적 요인:** 소비자 심리의 일시적 변화나 패닉 바잉(Panic Buying)과 같은 비이성적 행동.
## 3. 시계열 분해를 통한 추출 방법
불규칙 성분을 추출하기 위해서는 전체 시계열 데이터에서 추세와 계절성을 분리해내는 **시계열 분해(Time Series Decomposition)** 과정이 필요하다.
### 3.1 분해 모델의 종류
* **가법 모델 (Additive Model):** $Y_t = T_t + S_t + I_t$. 계절 변동의 폭이 시간에 관계없이 일정할 때 사용한다.
* **승법 모델 (Multiplicative Model):** $Y_t = T_t \times S_t \times I_t$. 추세가 증가함에 따라 계절 변동의 폭이 함께 커지는 경우에 적합하다. 이 경우 불규칙 성분은 절대적인 값이 아닌, 추세와 계절성에 곱해지는 비율(Percentage/Ratio) 형태로 나타난다.
**[모델별 특성 비교 그래프 개념]**
* **가법 모델 그래프:** 추세선이 상승하더라도 계절적 진폭(Peak-to-Trough)이 일정하게 유지되는 형태.
* **승법 모델 그래프:** 추세선이 상승함에 따라 계절적 진폭이 부채꼴 모양으로 점점 커지는 형태.
### 3.2 Python을 이용한 STL 분해 예시
STL(Seasonal-Trend decomposition using LOESS)은 로컬 회귀(LOESS)를 사용하여 유연하게 추세와 계절성을 분리하는 기법이다.
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL
# 가상 데이터 생성 (DatetimeIndex 설정 필수)
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=100, freq='M')
values = np.linspace(10, 50, 100) + np.sin(np.linspace(0, 20, 100)) * 10 + np.random.randn(100) * 2
df = pd.DataFrame({'value': values}, index=dates)
# STL 분해 수행
stl = STL(df['value'], period=12) # 월별 데이터 가정
res = stl.fit()
# 성분 추출
trend = res.trend
seasonal = res.seasonal
resid = res.resid # 이것이 불규칙 성분(Irregularity)
# 시각화
res.plot()
plt.show()
```
## 4. 불규칙성 분석 및 처리 기법
추출된 불규칙 성분이 단순한 노이즈인지, 아니면 유의미한 정보인지 판별하는 과정이 필수적이다.
### 4.1 화이트 노이즈(White Noise) 판별
불규칙 성분이 아무런 패턴이 없는 **화이트 노이즈**(평균이 0이고 분산이 일정하며 서로 독립인 확률 과정)라면, 해당 시계열은 더 이상 예측 가능한 정보가 남아있지 않은 상태이다.
* **Ljung-Box 검정:** 잔차들이 서로 독립적인지(자기상관이 없는지) 확인하는 검정법이다. $p\text{-value} > 0.05$일 경우 화이트 노이즈로 간주한다.
* **ADF 검정 (Augmented Dickey-Fuller):** 데이터가 정상성(Stationarity)을 갖는지 확인하여 불규칙 성분의 안정성을 평가한다.
**[Ljung-Box 검정 Python 구현]**
```python
from statsmodels.stats.diagnostic import acorr_ljungbox
# resid는 STL 분해를 통해 얻은 잔차 데이터
lb_test = acorr_ljungbox(resid, lags=[10], return_df=True)
p_value = lb_test['lb_pvalue'].values[0]
print(f"Ljung-Box test p-value: {p_value}")
if p_value > 0.05:
print("결과: 화이트 노이즈로 판단됨 (귀무가설 채택)")
else:
print("결과: 유의미한 패턴이 남아있음 (귀무가설 기각)")
```
### 4.2 데이터 정제 방법
* **이상치 제거 및 보간법(Interpolation):** 특이치로 판명된 값은 제거한 후, 선형 보간법(Linear Interpolation)이나 스플라인 보간법(Spline Interpolation)을 통해 주변 값으로 대체한다.
* **이동 평균(Moving Average):** 단기적인 무작위 변동을 억제하여 데이터의 흐름을 매끄럽게 만든다.
## 5. 분석 시 유의점 및 영향
### 5.1 과도한 제거의 위험성 (Over-smoothing)
불규칙성을 지나치게 제거하면 데이터의 변동성이 사라져 모델이 훈련 데이터에만 과하게 최적화되는 **과적합(Overfitting)** 위험이 발생한다. 특히 실제 환경에서는 어느 정도의 변동성이 존재하므로, 이를 완전히 제거한 모델은 실제 예측 시 일반화 성능이 떨어질 수 있다.
### 5.2 구조적 변화(Structural Break) 포착
모든 불규칙성이 제거 대상은 아니다. 불규칙 성분에서 갑작스러운 레벨 변화나 분산의 증가가 관찰된다면, 이는 **구조적 변화**의 신호일 수 있다.
* **Chow Test (차우 검정):** 시계열 데이터의 특정 시점을 기준으로 회귀 계수가 유의미하게 변했는지 판별하는 통계적 방법이다. 전체 기간의 잔차 제곱합(RSS)과 분할된 두 기간의 잔차 제곱합의 합을 비교하여, 구조적 변화가 발생했는지 여부를 $F$-검정을 통해 확인한다.
* **의미:** 기업의 합병, 새로운 기술의 등장, 법규 변경 등으로 인해 데이터 생성 원리 자체가 바뀌었을 가능성을 시사한다.
## [부록] 추가 분석 자료
### 산업군별 불규칙성 발생 사례
| 산업군 | 불규칙성 발생 사례 | 성격 |
| :--- | :--- | :--- |
| **이커머스** | 특정 인플루언서의 갑작스러운 제품 추천으로 인한 트래픽 폭증 | 특이치 (Positive Spike) |
| **제조업** | 공정 센서의 일시적 오작동으로 인한 데이터 튀는 현상 | 측정 오차 (Noise) |
| **금융/주식** | 예상치 못한 금리 인상 발표 직후의 주가 급락 | 외부 충격 (Shock) |
| **에너지** | 기록적인 한파/폭염으로 인한 전력 수요의 비정상적 증가 | 특이치 (Seasonal Outlier) |
### 불규칙성 제거 전후 비교
데이터 정제 과정을 거치면 다음과 같은 변화가 나타난다.
* **제거 전 (Raw Data):** $\text{Trend} + \text{Seasonality} + \text{Irregularity}$ $\rightarrow$ 톱니 모양의 심한 변동과 튀는 값들이 포함되어 추세 파악이 어려움.
* **제거 후 (Smoothed Data):** $\text{Trend} + \text{Seasonality}$ $\rightarrow$ 불필요한 노이즈와 특이치가 제거되어 매끄러운 곡선 형태를 띠며, 주기적 패턴과 장기적 방향성이 명확히 드러남.