Skip to main content

윈도우 함수

윈도우 함수(Window Function)는 데이터의 일정 범위(윈도우)를 이동시키면서 통계량을 계산합니다. 시계열 데이터의 추세 파악, 노이즈 제거, 피처 생성에 핵심적으로 사용됩니다.

학습 목표

  • rolling으로 이동평균, 이동표준편차를 계산할 수 있다
  • expanding으로 누적 통계를 계산할 수 있다
  • ewm으로 지수가중 이동평균을 계산할 수 있다
  • 윈도우 함수로 시계열 피처를 생성할 수 있다

왜 중요한가

시계열 데이터의 단기 노이즈를 제거하고 장기 추세를 파악하는 것은 데이터 분석의 기본입니다. 또한 rolling 통계량(이동평균, 이동표준편차)은 시계열 ML 모델의 핵심 피처입니다.

rolling — 이동 윈도우

import pandas as pd
import numpy as np

# 일별 매출 데이터
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({
    'date': dates,
    'sales': np.random.normal(1000, 200, 90).cumsum() / 90 + 500
})
df = df.set_index('date')

# 7일 이동평균
df['ma_7'] = df['sales'].rolling(window=7).mean()

# 30일 이동평균
df['ma_30'] = df['sales'].rolling(window=30).mean()

# 이동표준편차 (변동성)
df['std_7'] = df['sales'].rolling(window=7).std()

# 이동 최솟값/최댓값
df['min_7'] = df['sales'].rolling(window=7).min()
df['max_7'] = df['sales'].rolling(window=7).max()

rolling 옵션

# 최소 관측치 수 설정 (기본: window 크기)
df['ma_7_min3'] = df['sales'].rolling(window=7, min_periods=3).mean()
# 처음 3개부터 계산 시작 (NaN이 줄어듦)

# 중심 이동평균 (미래값 포함 — 분석용)
df['ma_center'] = df['sales'].rolling(window=7, center=True).mean()

expanding — 누적 윈도우

# 누적 평균 (전체 기간의 평균)
df['cum_mean'] = df['sales'].expanding().mean()

# 누적 합
df['cum_sum'] = df['sales'].expanding().sum()

# 누적 최댓값
df['cum_max'] = df['sales'].expanding().max()

# 누적 표준편차
df['cum_std'] = df['sales'].expanding().std()

ewm — 지수가중 이동평균

최근 값에 더 큰 가중치를 부여하는 이동평균입니다. 금융 데이터 분석에서 특히 많이 사용됩니다.
# 지수가중 이동평균 (span 기반)
df['ewm_12'] = df['sales'].ewm(span=12).mean()

# alpha 직접 지정 (가중치 감쇠율)
df['ewm_alpha'] = df['sales'].ewm(alpha=0.3).mean()

# halflife 기반 (반감기)
df['ewm_half'] = df['sales'].ewm(halflife=7).mean()
파라미터설명관계
span윈도우 크기에 대응alpha = 2 / (span + 1)
alpha가중치 감쇠율 (0~1)클수록 최근 데이터 반영
halflife가중치가 반으로 줄어드는 기간alpha = 1 - exp(-ln(2)/halflife)

윈도우 함수 비교

함수윈도우 크기특징용도
rolling고정최근 N개만 사용단기 추세, 노이즈 제거
expanding증가처음부터 현재까지누적 통계
ewm전체 (가중치 감쇠)최근 값에 높은 가중치추세 추종, 금융

AI/ML에서의 활용

  • 시계열 피처: 이동평균, 이동표준편차를 lag 피처와 함께 사용합니다
  • 추세/계절성 분리: 이동평균으로 추세를 추출하고, 원본 - 추세 = 잔차를 계산합니다
  • 이상 탐지: 이동 표준편차를 기반으로 볼린저 밴드를 구성하여 이상치를 탐지합니다
  • 스무딩: 노이즈가 많은 데이터를 ewm으로 평활화합니다
분석 시 과거와 미래 데이터를 동시에 참조하여 현재 시점의 추세를 파악할 때 사용합니다. 예측 모델에서는 미래 데이터를 사용할 수 없으므로 center=False(기본값)를 사용해야 합니다.
완전히 동등하지는 않습니다. rolling은 윈도우 밖의 데이터를 완전히 무시하지만, ewm은 먼 과거 데이터도 작은 가중치로 반영합니다. span=7과 window=7은 유사한 smoothing 효과를 내지만, ewm이 더 부드러운 곡선을 생성합니다.

체크리스트

  • rolling으로 이동평균과 이동표준편차를 계산할 수 있다
  • min_periods로 초기 NaN을 줄일 수 있다
  • expanding으로 누적 통계를 계산할 수 있다
  • ewm의 span, alpha, halflife 파라미터를 이해한다
  • 윈도우 함수로 시계열 피처를 생성할 수 있다

다음 문서