[python] 데이터 평활화(Smoothing) 방법

데이터 평활화는 시계열 데이터에서 잡음을 제거하고 데이터의 전반적인 추세와 패턴을 파악하기 위한 중요한 기법입니다. 이번 포스트에서는 파이썬에서 사용할 수 있는 몇 가지 데이터 평활화 방법을 알아보겠습니다.

이동평균(Moving Average)

이동평균은 가장 기본적인 데이터 평활화 방법 중 하나입니다. 이동평균은 일정한 윈도우(window) 크기 내에서 데이터를 평균하여 스무딩하는 방법입니다. 예를 들어, 윈도우 크기가 5일 경우, 현재 데이터 포인트와 그 이전 4개의 데이터 포인트를 평균하여 스무딩한 결과를 얻을 수 있습니다.

import pandas as pd

def moving_average(data, window_size):
    return data.rolling(window=window_size).mean()

# 예시 데이터셋
dataset = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
df = pd.DataFrame(dataset, columns=['Value'])

# 이동평균 적용 (윈도우 크기=3)
ma = moving_average(df['Value'], window_size=3)

print(ma)

결과:

0          NaN
1          NaN
2    20.000000
3    30.000000
4    40.000000
5    50.000000
6    60.000000
7    70.000000
8    80.000000
9    90.000000
Name: Value, dtype: float64

지수평활법(Exponential Smoothing)

지수평활법은 가중치를 이용하여 이전 데이터와 현재 데이터 사이의 관계를 고려하는 방법입니다. 지수평활법은 지수감소 가중치를 사용하여 최근 데이터에 보다 높은 가중치를 부여하고, 이전 데이터에는 지수적으로 감소하는 가중치를 부여합니다.

import pandas as pd

def exponential_smoothing(data, alpha):
    result = [data[0]]
    for i in range(1, len(data)):
        result.append(alpha * data[i] + (1 - alpha) * result[i-1])
    return result

# 예시 데이터셋
dataset = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 지수평활법 적용 (alpha=0.5)
smoothed_data = exponential_smoothing(dataset, alpha=0.5)

print(smoothed_data)

결과:

[10, 15.0, 22.5, 31.25, 40.625, 50.3125, 60.15625, 70.078125, 80.0390625, 90.01953125]

로우패스 필터(Lowpass Filtering)

로우패스 필터는 고주파 잡음을 제거하여 낮은 주파수 구성 요소만을 남기는 필터링 방법입니다. 주로 주파수 도메인에서 FFT(Fast Fourier Transform)을 사용하여 구현됩니다.

import numpy as np
import matplotlib.pyplot as plt

# 예시 데이터셋
time = np.arange(0, 5, 0.1)
data = np.sin(2 * np.pi * 1.5 * time) + 0.2 * np.random.randn(len(time))

# 로우패스 필터링
from scipy.signal import butter, filtfilt

def lowpass_filter(data, cutoff_freq, sample_rate, order=5):
    nyquist_freq = 0.5 * sample_rate
    normal_cutoff_freq = cutoff_freq / nyquist_freq
    b, a = butter(order, normal_cutoff_freq, btype='low', analog=False)
    return filtfilt(b, a, data)

filtered_data = lowpass_filter(data, cutoff_freq=2, sample_rate=10)

# 결과 시각화
plt.plot(time, data, label='Original Data')
plt.plot(time, filtered_data, label='Filtered Data')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.show()

결과:

로우패스 필터링 결과 그래프

이렇게 파이썬에서 간단하게 데이터 평활화를 위한 몇 가지 방법을 소개했습니다. 데이터 평활화는 시계열 데이터 분석과 예측에 매우 중요한 기법이니 다양한 방법을 익혀 활용해보세요.

참고 자료