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
- 스플라인 보간$($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()
>>>
8. 주의사항
결측치 처리 과정에서 주의해야 할 몇 가지 사항은 다음과 같습니다:
- 예측 범위를 넘어선 시간대의 정확한 예측 어려움
- 시간 의존성 필요: 시계열 데이터 특성을 고려한 모델 선택 필요
- 예측 변수의 품질과 결측치 분포에 따른 성능 저하 가능성
- 신뢰구간 결정 필요: 예측 결과의 신뢰성 평가를 위해 신뢰구간 고려
- 하이퍼파라미터 조정에 주의: 모델 성능 향상을 위해 하이퍼파라미터 조정에 신경 써야 함
9. 결측치 처리 전후 데이터 품질 평가
결측치 처리 후 데이터의 품질을 평가하는 과정은 결측치 처리의 효과를 확인하고 예측 모델의 성능을 평가하기 위해 중요합니다. 주요 평가 방법은 다음과 같습니다:
- 결측치 비율 확인: 데이터셋 내 결측치의 비율을 확인하여 처리 효과를 파악합니다.
- 기술 통계량 비교: 평균, 중앙값, 표준편차 등의 기술 통계량을 이용하여 처리 전후 데이터의 특성을 비교합니다.
- 시각화: 선 그래프, 히스토그램, 박스 플롯 등을 통해 데이터의 분포와 패턴을 시각적으로 비교합니다.
- 예측 성능 평가: 결측치 처리가 예측 모델의 성능 향상에 어떤 영향을 미치는지 평가합니다. 평가 지표로는 예측 정확도나 평균 제곱 오차$($MSE$)$ 등을 활용할 수 있습니다.
10. 결측치 처리의 중요성
결측치 처리는 데이터 완성도를 유지하고 예측 모델의 성능을 향상시키는데 중요한 역할을 합니다. 다음은 결측치 처리의 중요성에 대한 몇 가지 관점입니다:
- 데이터 완성도 유지: 결측치가 많은 데이터는 분석 결과의 신뢰성을 저해할 수 있습니다. 따라서 결측치를 적절히 처리하여 데이터의 완성도를 유지하는 것이 중요합니다.
- 예측 모델 성능 향상: 결측치 처리를 통해 예측 모델의 성능을 향상시킬 수 있습니다. 결측치로 인해 모델이 부정확한 예측을 수행하는 것을 방지하고 정확한 예측을 가능하게 합니다.
- 데이터 편향 방지: 결측치가 데이터의 특정 부분에 집중되거나 편향을 야기할 수 있습니다. 이를 방지하기 위해 결측치 처리를 통해 데이터 분포의 왜곡을 줄이는 것이 중요합니다.
11. 실제 응용 사례
결측치 처리는 다양한 분야에서 중요한 역할을 합니다. 몇 가지 실제 응용 사례를 살펴보겠습니다:
- 금융 분석: 주가 예측, 금융 시계열 데이터 분석에서 결측치 처리는 예측 정확도를 높이는데 기여합니다.
- 의료 연구: 환자 데이터에서 결측치 처리를 통해 질병 예측, 치료 효과 분석 등의 연구에 신뢰성을 제공합니다.
- 고객 분석: 고객의 행동 데이터에서 결측치 처리를 통해 고객 성향 분석, 맞춤형 마케팅 전략 수립에 활용됩니다.
'IT > AI' 카테고리의 다른 글
[통계] Day 5-1 시계열 데이터의 정규화 (0) | 2023.08.18 |
---|---|
[통계] Day 4-3 시계열 데이터의 이상치 (0) | 2023.08.17 |
[통계] Day 4-1 시계열 데이터 분석 (0) | 2023.08.17 |
[NLP] Word Embedding 기법 [기초] (0) | 2023.08.16 |