본문 바로가기

IT/AI

[통계] Day 4-2 시계열 데이터 전처리

728x90

 

 

1. 결측치 처리의 중요성
   시계열 데이터 분석에서 결측치 처리는 데이터 왜곡 방지와 예측 정확도 향상을 위해 매우 중요한 단계입니다. 결측치가 존재하면 실제 데이터의 패턴과 특성을 왜곡시킬 수 있으며, 이로 인해 예측 모델의 성능에도 부정적인 영향을 미칠 수 있습니다.

2. 결측치 위치 확인 방법
   결측치 처리에 앞서 데이터셋에서 결측치가 어느 위치에 있는지 확인하는 것이 필요합니다. 이를 위해 다음과 같은 방법들을 사용할 수 있습니다:
   - 데이터셋 요약 정보 확인: info$($$)$, describe$($$)$ 메소드를 사용하여 각 열의 결측치 여부와 데이터 형식 확인
   - 시각화: 히트맵이나 누락 데이터 플롯을 활용하여 결측치가 어떤 패턴으로 분포하는지 시각적으로 확인
   - 조건식을 활용한 필터링: Pandas의 isnull$($$)$, isna$($$)$ 메소드를 활용하여 결측치가 있는 행을 필터링하여 확인
   - 결측치 개수 확인: Pandas의 isnull$($$)$.sum$($$)$을 사용하여 각 열별 결측치 개수 확인

더보기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = pd.DataFrame({
    "A": [1, 2, np.nan, 4, 5],
    "B": [6, np.nan, 8, 9, 10],
    "C": [11, 12, 13, np.nan, 15]
})

print(data.isnull())
print(f"결측치 개수: \n{data.isnull().sum()}")

sns.heatmap(data.isnull())
plt.show()

>>>

       A      B      C
0  False  False  False
1  False   True  False
2   True  False  False
3  False  False   True
4  False  False  False
결측치 개수: 
A    1
B    1
C    1
dtype: int64
결측치 히트맵


3. 결측치의 빈도 및 패턴
   결측치의 개수와 위치뿐만 아니라 결측치의 빈도와 패턴을 파악하는 것도 중요합니다. 이를 통해 결측치가 어느 정도 집중되어 있는지, 특정 시간대나 주기에서 결측치가 더 많은지 등을 확인할 수 있습니다. 이를 위해 다음과 같은 단계를 수행할 수 있습니다:
   - 결측치 개수 및 위치 확인
   - 시각화: 히트맵이나 라인 그래프를 사용하여 시간에 따른 결측치 패턴 파악
   - 시계열 분석: 자기 상관 함수$($ACF, Autocorrelation Function$)$나 계절성 분해를 통해 결측치의 영향 파악

4. 결측치의 삭제
   결측치 처리 방법 중 하나로, 시계열 데이터에서는 신중하게 사용해야 합니다. 

장점 단점
간단하고 직관적인 방법 데이터 손실
시계열 특성 유지 결측치가 많을 경우 데이터셋 크기 축소
시간적 흐름 유지 해당 시점의 데이터 패턴이나 특성 파악 어려움


5. 주로 사용되는 보간법
   결측치 처리에 사용되는 주요 보간법은 다음과 같습니다:
   - 선형 보간$($Linear Interpolation$)$: 주어진 두 점을 직선으로 연결하여 결측치를 채우는 방법으로, 직선의 방정식을 활용합니다.

 

더보기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range(start="2023-08-17", periods=10)
values = [1, np.nan, 3, np.nan, 5, 6, np.nan, 8, 9, np.nan]

data = pd.DataFrame({
    "Date": dates,
    "Value": values
})

print(data)

data["Value_linear"] = data["Value"].interpolate(method="linear")
plt.plot(data["Date"],data["Value"])
plt.show()
plt.plot(data["Date"],data["Value_linear"])
plt.show()

>>>

        Date  Value
0 2023-08-17    1.0
1 2023-08-18    NaN
2 2023-08-19    3.0
3 2023-08-20    NaN
4 2023-08-21    5.0
5 2023-08-22    6.0
6 2023-08-23    NaN
7 2023-08-24    8.0
8 2023-08-25    9.0
9 2023-08-26    NaN
결측치가 있는 Value
Value_linear

 


   - 스플라인 보간$($Spline Interpolation$)$: 주어진 데이터를 부드러운 곡선으로 근사화하여 결측치를 채우는 방법으로, 다항식이나 조각적 다항식 함수를 사용합니다.
   - 최근접 이웃 보간$($Nearest Neighbor Interpolation$)$: 데이터가 이산적이거나 이상치에 민감하지 않을 때 사용되며, 결측치를 가장 가까운 이웃의 값으로 채웁니다.

6. 평균값 대처
   결측치를 처리하는 또 다른 방법으로는 평균값을 사용하는 것입니다.

장점 단점
간편하고 쉽게 적용 가능 정보 손실 가능성
데이터의 중심 경향 유지 변동성 왜곡
표본 편향 감소 상관관계 왜곡

 

7. 결측치 예측 방법
   결측치 예측은 시계열 데이터의 복잡한 패턴을 반영하기 위해 예측 모델을 활용하여 결측치를 추정하는 방법입니다. 주요 단계는 다음과 같습니다:
   - 결측치 예측 모델 구축: ARIMA, Prophet, LSTM 등의 모델을 사용하여 결측치를 예측할 수 있는 모델을 구축합니다.
   - 모델 학습: 기존 데이터로 모델을 학습시킵니다.
   - 결측치 예측: 학습된 모델을 사용하여 결측치를 예측합니다.
   - 결측치 대체: 예측된 값으로 결측치를 대체합니다.

 

더보기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

dates = pd.date_range("2023-08-17", periods=1000)
values = np.random.randn(1000).cumsum()
data = pd.DataFrame({"Date": dates, "Values": values})

plt.plot(data["Date"], data["Values"])
plt.show()

>>>

원본
# 결측치 생성
data.loc[100:200, "Values"] = np.nan
print(data.loc[100:200])

>>>

          Date  Values
100 2023-11-25     NaN
101 2023-11-26     NaN
102 2023-11-27     NaN
103 2023-11-28     NaN
104 2023-11-29     NaN
..         ...     ...
196 2024-02-29     NaN
197 2024-03-01     NaN
198 2024-03-02     NaN
199 2024-03-03     NaN
200 2024-03-04     NaN

[101 rows x 2 columns]



# ARIMA 모델 생성
model = ARIMA(data['Values'].dropna(), order=(1, 1, 1)).fit()

# 모델로 결측치 예측, end=200인 경우 모델이 결측치 구간을 모르기 때문에 NaN 값만 뱉음
predicted_values = model.predict(start=100, end=1000)
# 결측치 대체
data.loc[100:200, "Values_ARIMA"] = predicted_values
print(data.loc[100:200])

>>>
          Date  Values  Values_ARIMA
100 2023-11-25     NaN     -6.835466
101 2023-11-26     NaN    -12.306002
102 2023-11-27     NaN    -12.739411
103 2023-11-28     NaN    -13.706428
104 2023-11-29     NaN    -12.303330
..         ...     ...           ...
196 2024-02-29     NaN    -11.025442
197 2024-03-01     NaN     -9.211955
198 2024-03-02     NaN     -9.936607
199 2024-03-03     NaN     -9.555099
200 2024-03-04     NaN    -10.666199

[101 rows x 3 columns]



# 시각화
plt.plot(data["Date"], data["Values"])
plt.show()

plt.plot(data["Date"], data["Values"])
plt.plot(data["Date"], data["Values_ARIMA"])
plt.show()

>>>

결측치
ARIMA

 


8. 주의사항
   결측치 처리 과정에서 주의해야 할 몇 가지 사항은 다음과 같습니다:
   - 예측 범위를 넘어선 시간대의 정확한 예측 어려움
   - 시간 의존성 필요: 시계열 데이터 특성을 고려한 모델 선택 필요
   - 예측 변수의 품질과 결측치 분포에 따른 성능 저하 가능성
   - 신뢰구간 결정 필요: 예측 결과의 신뢰성 평가를 위해 신뢰구간 고려
   - 하이퍼파라미터 조정에 주의: 모델 성능 향상을 위해 하이퍼파라미터 조정에 신경 써야 함

9. 결측치 처리 전후 데이터 품질 평가
   결측치 처리 후 데이터의 품질을 평가하는 과정은 결측치 처리의 효과를 확인하고 예측 모델의 성능을 평가하기 위해 중요합니다. 주요 평가 방법은 다음과 같습니다:
   - 결측치 비율 확인: 데이터셋 내 결측치의 비율을 확인하여 처리 효과를 파악합니다.
   - 기술 통계량 비교: 평균, 중앙값, 표준편차 등의 기술 통계량을 이용하여 처리 전후 데이터의 특성을 비교합니다.
   - 시각화: 선 그래프, 히스토그램, 박스 플롯 등을 통해 데이터의 분포와 패턴을 시각적으로 비교합니다.
   - 예측 성능 평가: 결측치 처리가 예측 모델의 성능 향상에 어떤 영향을 미치는지 평가합니다. 평가 지표로는 예측 정확도나 평균 제곱 오차$($MSE$)$ 등을 활용할 수 있습니다.

10. 결측치 처리의 중요성
    결측치 처리는 데이터 완성도를 유지하고 예측 모델의 성능을 향상시키는데 중요한 역할을 합니다. 다음은 결측치 처리의 중요성에 대한 몇 가지 관점입니다:
    - 데이터 완성도 유지: 결측치가 많은 데이터는 분석 결과의 신뢰성을 저해할 수 있습니다. 따라서 결측치를 적절히 처리하여 데이터의 완성도를 유지하는 것이 중요합니다.
    - 예측 모델 성능 향상: 결측치 처리를 통해 예측 모델의 성능을 향상시킬 수 있습니다. 결측치로 인해 모델이 부정확한 예측을 수행하는 것을 방지하고 정확한 예측을 가능하게 합니다.
    - 데이터 편향 방지: 결측치가 데이터의 특정 부분에 집중되거나 편향을 야기할 수 있습니다. 이를 방지하기 위해 결측치 처리를 통해 데이터 분포의 왜곡을 줄이는 것이 중요합니다.

11. 실제 응용 사례
    결측치 처리는 다양한 분야에서 중요한 역할을 합니다. 몇 가지 실제 응용 사례를 살펴보겠습니다:
    - 금융 분석: 주가 예측, 금융 시계열 데이터 분석에서 결측치 처리는 예측 정확도를 높이는데 기여합니다.
    - 의료 연구: 환자 데이터에서 결측치 처리를 통해 질병 예측, 치료 효과 분석 등의 연구에 신뢰성을 제공합니다.
    - 고객 분석: 고객의 행동 데이터에서 결측치 처리를 통해 고객 성향 분석, 맞춤형 마케팅 전략 수립에 활용됩니다.