🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Auto ARIMA로 모델 자동 선택하기 - 슬라이드 1/9
A

AI Generated

2025. 12. 3. · 10 Views

Auto ARIMA로 모델 자동 선택하기

시계열 예측에서 가장 까다로운 ARIMA 파라미터 선택을 자동화하는 Auto ARIMA를 학습합니다. 복잡한 수학적 배경 없이도 실무에서 바로 활용할 수 있는 방법을 알아봅니다.


목차

  1. ARIMA_기초_이해하기
  2. Auto_ARIMA_설치와_기본_사용법
  3. 계절성_데이터_다루기
  4. 예측_수행하기
  5. 모델_업데이트하기
  6. 모델_성능_평가하기
  7. 하이퍼파라미터_튜닝하기
  8. 실전_프로젝트_구조

1. ARIMA 기초 이해하기

김개발 씨는 이커머스 회사의 데이터 분석팀에 배치된 지 한 달이 되었습니다. 어느 날 팀장님이 다가와 말했습니다.

"다음 분기 매출을 예측해볼 수 있겠어요?" 김개발 씨는 시계열 예측이라는 단어를 처음 들어봤지만, 일단 해보겠다고 대답했습니다.

ARIMA는 Auto-Regressive Integrated Moving Average의 약자로, 시계열 데이터를 예측하는 가장 전통적인 통계 모델입니다. 마치 과거의 발자국을 따라가며 앞으로 나아갈 방향을 예측하는 것과 같습니다.

ARIMA를 이해하면 주가, 매출, 기온 등 시간에 따라 변하는 모든 데이터를 예측할 수 있게 됩니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA

# 샘플 매출 데이터 생성
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
sales = 1000 + np.cumsum(np.random.randn(100) * 10)
data = pd.Series(sales, index=dates)

# ARIMA 모델 생성 (p=1, d=1, q=1)
model = ARIMA(data, order=(1, 1, 1))
fitted_model = model.fit()

# 향후 7일 예측
forecast = fitted_model.forecast(steps=7)
print("다음 7일 매출 예측:", forecast.values)

김개발 씨는 입사 한 달 차 주니어 데이터 분석가입니다. 팀장님의 매출 예측 요청을 받고 구글링을 시작했습니다.

검색 결과에서 가장 많이 등장하는 단어가 바로 ARIMA였습니다. "ARIMA가 뭐지?" 김개발 씨는 옆자리 선배 박시니어 씨에게 물었습니다.

박시니어 씨는 커피잔을 내려놓으며 설명을 시작했습니다. "ARIMA는 쉽게 말해서 과거를 보고 미래를 예측하는 방법이야.

마치 매일 아침 같은 시간에 출근하는 사람의 패턴을 보면, 내일도 그 시간에 나타날 거라고 예측할 수 있잖아? 그런 원리야." 그렇다면 ARIMA라는 이름은 무슨 뜻일까요?

**AR(Auto-Regressive)**은 자기 자신의 과거 값을 참조한다는 뜻입니다. 어제 매출이 높았으면 오늘도 높을 가능성이 있다는 것이죠.

**I(Integrated)**는 데이터를 안정화시키는 과정입니다. 계속 오르기만 하는 주가 그래프를 평평하게 만드는 작업이라고 생각하면 됩니다.

**MA(Moving Average)**는 과거의 예측 오차를 반영합니다. ARIMA 모델에는 세 가지 중요한 숫자가 있습니다.

바로 p, d, q입니다. p는 AR 부분의 차수로, 며칠 전까지의 데이터를 볼 것인지 결정합니다.

d는 차분 횟수로, 데이터를 몇 번 안정화시킬지 정합니다. q는 MA 부분의 차수로, 며칠 전까지의 오차를 반영할지 결정합니다.

위의 코드를 살펴보면, order=(1, 1, 1)이라고 적혀 있습니다. 이것은 p=1, d=1, q=1이라는 뜻입니다.

하루 전 데이터를 참조하고, 한 번 차분하며, 하루 전 오차를 반영하겠다는 의미입니다. 하지만 여기서 문제가 생깁니다.

p, d, q를 몇으로 설정해야 할까요? 김개발 씨는 머리가 아파지기 시작했습니다.

"선배님, 이 숫자들을 어떻게 정해요?" 박시니어 씨가 웃으며 대답했습니다. "그게 바로 ARIMA의 어려운 점이야.

예전에는 ACF, PACF 그래프를 그려서 직접 판단했거든." 이런 복잡한 과정 때문에 많은 초보자들이 시계열 예측에서 좌절합니다. 하지만 걱정하지 마세요.

다음 카드에서 배울 Auto ARIMA가 이 문제를 해결해줍니다.

실전 팁

💡 - ARIMA는 정상성(stationarity)을 가정하므로, 데이터가 일정한 패턴을 가져야 합니다

  • p, d, q 값은 보통 0에서 5 사이의 작은 숫자를 사용합니다

2. Auto ARIMA 설치와 기본 사용법

김개발 씨는 ARIMA의 p, d, q를 어떻게 정해야 할지 막막했습니다. ACF, PACF 그래프를 그려봤지만 해석하는 방법을 몰랐습니다.

그때 박시니어 씨가 말했습니다. "요즘은 그런 거 직접 안 해도 돼.

pmdarima 라이브러리를 써봐."

Auto ARIMA는 최적의 p, d, q 파라미터를 자동으로 찾아주는 도구입니다. 마치 자동차의 자동 기어처럼, 복잡한 조작 없이도 최적의 설정을 알아서 찾아줍니다.

Python에서는 pmdarima 라이브러리를 통해 Auto ARIMA를 사용할 수 있습니다.

다음 코드를 살펴봅시다.

# pmdarima 설치: pip install pmdarima
from pmdarima import auto_arima
import pandas as pd
import numpy as np

# 샘플 데이터 준비
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
sales = 1000 + np.cumsum(np.random.randn(100) * 10)
data = pd.Series(sales, index=dates)

# Auto ARIMA로 최적 모델 자동 선택
model = auto_arima(data, seasonal=False, trace=True)

# 최적 파라미터 확인
print(f"최적 모델: ARIMA{model.order}")
print(model.summary())

박시니어 씨의 조언을 들은 김개발 씨는 바로 터미널을 열었습니다. pip install pmdarima 명령어를 입력하고 설치가 완료되길 기다렸습니다.

"pmdarima가 뭐예요?" 김개발 씨가 물었습니다. "pmdarima는 Python에서 Auto ARIMA를 사용할 수 있게 해주는 라이브러리야.

원래 R 언어에 있던 auto.arima 함수를 Python으로 가져온 거지." Auto ARIMA의 작동 원리는 생각보다 단순합니다. 마치 신발 가게에서 여러 사이즈를 신어보고 가장 잘 맞는 걸 고르는 것과 같습니다.

auto_arima 함수는 다양한 p, d, q 조합을 시도합니다. 각 조합으로 모델을 만들고, 어떤 조합이 가장 좋은 성능을 내는지 비교합니다.

그리고 최종적으로 가장 좋은 모델을 반환합니다. 위 코드에서 trace=True를 설정하면 어떤 조합을 테스트하고 있는지 실시간으로 볼 수 있습니다.

화면에 ARIMA(0,1,0), ARIMA(1,1,0), ARIMA(0,1,1) 같은 결과가 쭉 출력됩니다. 각 모델 옆에는 AIC라는 숫자가 함께 표시됩니다.

AIC는 모델의 품질을 나타내는 지표로, 낮을수록 좋습니다. Auto ARIMA는 AIC가 가장 낮은 모델을 최종 선택합니다.

seasonal=False는 계절성을 고려하지 않겠다는 뜻입니다. 만약 데이터에 매년, 매월 반복되는 패턴이 있다면 seasonal=True로 설정해야 합니다.

이 부분은 뒤에서 더 자세히 다루겠습니다. model.order를 출력하면 (1, 1, 0) 같은 튜플이 나옵니다.

이것이 바로 Auto ARIMA가 찾아낸 최적의 p, d, q 값입니다. 김개발 씨는 감탄했습니다.

"와, 이렇게 쉽게 되는 거였어요?" 박시니어 씨가 웃으며 말했습니다. "도구를 잘 활용하는 것도 실력이야."

실전 팁

💡 - trace=True로 설정하면 모델 선택 과정을 실시간으로 확인할 수 있습니다

  • 처음에는 seasonal=False로 시작하고, 필요하면 나중에 True로 변경하세요

3. 계절성 데이터 다루기

김개발 씨가 매출 데이터를 분석하던 중 이상한 패턴을 발견했습니다. 매년 12월에 매출이 급증하고, 2월에는 급감하는 것이었습니다.

"선배님, 이건 왜 이런 패턴이 있는 거예요?" 박시니어 씨가 대답했습니다. "그게 바로 계절성이야.

연말 쇼핑 시즌 때문이지."

**계절성(Seasonality)**은 일정 주기로 반복되는 패턴을 말합니다. 아이스크림 판매량이 여름에 높고 겨울에 낮은 것처럼, 많은 데이터에는 계절적 패턴이 존재합니다.

Auto ARIMA의 SARIMAX 모델은 이러한 계절성을 효과적으로 처리할 수 있습니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
import pandas as pd
import numpy as np

# 계절성이 있는 샘플 데이터 생성
np.random.seed(42)
months = 36  # 3년치 월간 데이터
trend = np.linspace(100, 200, months)
seasonal = 30 * np.sin(np.linspace(0, 6*np.pi, months))
noise = np.random.randn(months) * 5
sales = trend + seasonal + noise

# 계절성을 고려한 Auto ARIMA
model = auto_arima(
    sales,
    seasonal=True,      # 계절성 활성화
    m=12,               # 계절 주기 (월간 데이터는 12)
    trace=True,
    suppress_warnings=True
)

print(f"최적 모델: ARIMA{model.order} x {model.seasonal_order}")

계절성이란 무엇일까요? 쉽게 말해 일정 주기로 반복되는 패턴입니다.

커피숍을 운영한다고 생각해봅시다. 아침 출근 시간에 손님이 많고, 오후 3시경에 또 손님이 늘어납니다.

이것이 일간 계절성입니다. 비슷하게 매달 월급날 직후에 매출이 오르는 것은 월간 계절성이고, 연말에 선물 수요가 늘어나는 것은 연간 계절성입니다.

박시니어 씨가 설명을 이어갔습니다. "일반 ARIMA로는 이런 계절성 패턴을 잡아내기 어려워.

그래서 SARIMA라는 확장 모델을 사용해야 해." SARIMA는 Seasonal ARIMA의 약자입니다. 기존 ARIMA의 p, d, q에 더해 P, D, Q, m이라는 계절성 파라미터가 추가됩니다.

위 코드에서 m=12라고 설정한 부분을 주목해주세요. 이것은 계절 주기가 12라는 뜻입니다.

월간 데이터라면 12개월마다 패턴이 반복되므로 m=12를 사용합니다. 만약 분기별 데이터라면 m=4, 일간 데이터에서 주간 패턴을 잡으려면 m=7을 사용합니다.

model.seasonal_order를 출력하면 (1, 0, 1, 12) 같은 결과가 나옵니다. 앞의 세 숫자가 P, D, Q이고, 마지막 숫자가 m입니다.

김개발 씨가 질문했습니다. "그럼 m값은 어떻게 정하는 거예요?" "데이터의 특성을 보면 돼.

시간별 데이터면 m=24, 일별 데이터에서 주간 패턴이면 m=7, 월별 데이터에서 연간 패턴이면 m=12야." 실무에서 주의할 점이 있습니다. 계절성 모델은 계산량이 많아서 시간이 오래 걸립니다.

데이터가 많거나 m값이 크면 몇 분에서 몇 시간까지 걸릴 수 있습니다. 이럴 때는 stepwise=True(기본값)를 유지하는 것이 좋습니다.

이 옵션은 모든 조합을 다 시도하지 않고, 효율적인 탐색 방법을 사용합니다.

실전 팁

💡 - 일별 데이터의 주간 패턴: m=7, 월별 데이터의 연간 패턴: m=12

  • 계절성 모델은 계산 시간이 오래 걸리므로 stepwise=True를 유지하세요

4. 예측 수행하기

김개발 씨는 드디어 Auto ARIMA로 최적의 모델을 찾았습니다. 이제 진짜 중요한 단계가 남았습니다.

바로 미래 매출을 예측하는 것입니다. "모델은 만들었는데, 이걸로 어떻게 예측을 해요?" 팀장님이 기다리고 있다는 생각에 김개발 씨는 조급해졌습니다.

Auto ARIMA로 학습된 모델은 predictpredict_in_sample 메서드를 제공합니다. predict는 미래 시점을 예측하고, predict_in_sample은 학습 데이터 구간의 적합값을 반환합니다.

신뢰 구간과 함께 예측하면 불확실성까지 파악할 수 있습니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
import numpy as np
import pandas as pd

# 데이터 준비
np.random.seed(42)
data = 1000 + np.cumsum(np.random.randn(100) * 10)

# 모델 학습
model = auto_arima(data, seasonal=False, suppress_warnings=True)

# 미래 10일 예측
n_periods = 10
forecast, conf_int = model.predict(
    n_periods=n_periods,
    return_conf_int=True,   # 신뢰구간 반환
    alpha=0.05              # 95% 신뢰구간
)

# 결과 출력
for i in range(n_periods):
    lower, upper = conf_int[i]
    print(f"Day {i+1}: {forecast[i]:.1f} (범위: {lower:.1f} ~ {upper:.1f})")

모델 학습이 끝났다면, 이제 실제로 예측을 수행할 차례입니다. 박시니어 씨가 설명을 시작했습니다.

"예측에는 두 가지 종류가 있어. 첫째는 미래 예측이고, 둘째는 학습 구간 적합이야." 미래 예측은 말 그대로 아직 일어나지 않은 시점의 값을 예측하는 것입니다.

내일 매출, 다음 주 방문자 수 같은 것들이죠. 학습 구간 적합은 이미 알고 있는 과거 데이터에 모델이 얼마나 잘 맞는지 확인하는 것입니다.

위 코드에서 n_periods=10은 앞으로 10개 시점을 예측하라는 뜻입니다. 일별 데이터라면 10일, 월별 데이터라면 10개월을 예측합니다.

return_conf_int=True를 설정하면 예측값과 함께 신뢰 구간을 반환합니다. 신뢰 구간은 예측의 불확실성을 나타냅니다.

"신뢰 구간이 뭐예요?" 김개발 씨가 물었습니다. "날씨 예보를 생각해봐.

'내일 비 올 확률 70%'라고 하잖아. 신뢰 구간도 비슷해.

예측값이 1000이고 신뢰 구간이 950에서 1050이라면, 실제 값이 그 범위 안에 있을 확률이 95%라는 뜻이야." alpha=0.05는 95% 신뢰 구간을 의미합니다. alpha=0.01로 바꾸면 99% 신뢰 구간이 됩니다.

신뢰 수준이 높을수록 구간이 더 넓어집니다. 예측을 할 때 주의할 점이 있습니다.

예측 기간이 길어질수록 신뢰 구간이 넓어집니다. 내일 매출은 비교적 정확하게 예측할 수 있지만, 1년 후 매출은 불확실성이 매우 큽니다.

실무에서는 보통 단기 예측(1주~1개월)에 ARIMA를 많이 사용합니다. 장기 예측에는 다른 방법론을 함께 고려해야 합니다.

김개발 씨는 코드를 실행하고 결과를 확인했습니다. 깔끔하게 정리된 예측 결과를 보며 팀장님께 보고서를 작성할 준비를 했습니다.

실전 팁

💡 - 예측 기간이 길어질수록 불확실성이 커지므로, 단기 예측에 집중하세요

  • 신뢰 구간을 함께 보고하면 예측의 신뢰도를 전달할 수 있습니다

5. 모델 업데이트하기

한 달이 지났습니다. 김개발 씨의 예측 모델은 처음에는 잘 맞았지만, 시간이 지나면서 점점 오차가 커졌습니다.

"왜 예측이 안 맞는 거지?" 박시니어 씨가 지나가다 한마디 했습니다. "모델을 업데이트 안 했구나?"

시계열 모델은 새로운 데이터가 들어오면 업데이트해야 합니다. pmdarima는 update 메서드를 제공하여 전체 재학습 없이도 효율적으로 모델을 갱신할 수 있습니다.

이를 통해 실시간으로 변화하는 패턴에 대응할 수 있습니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
import numpy as np

# 초기 데이터로 모델 학습
np.random.seed(42)
initial_data = 1000 + np.cumsum(np.random.randn(100) * 10)
model = auto_arima(initial_data, seasonal=False, suppress_warnings=True)

print(f"초기 모델 차수: {model.order}")

# 새로운 데이터가 들어올 때마다 업데이트
new_observations = [1050, 1060, 1055, 1070, 1065]

for obs in new_observations:
    # 기존 모델에 새 데이터 추가
    model.update(obs)

    # 업데이트된 모델로 다음 예측
    next_forecast = model.predict(n_periods=1)[0]
    print(f"실제: {obs}, 다음 예측: {next_forecast:.1f}")

왜 모델을 업데이트해야 할까요? 세상은 계속 변하기 때문입니다.

박시니어 씨가 비유를 들어 설명했습니다. "네비게이션을 생각해봐.

지도가 5년 전 거라면 새로 생긴 도로를 모르잖아. 시계열 모델도 마찬가지야.

새로운 데이터를 반영해야 정확한 예측이 가능해." 모델을 업데이트하는 방법에는 두 가지가 있습니다. 첫 번째는 전체 재학습입니다.

모든 데이터를 처음부터 다시 학습하는 방법입니다. 가장 정확하지만, 데이터가 많으면 시간이 오래 걸립니다.

두 번째는 점진적 업데이트입니다. 기존 모델에 새 데이터만 추가하는 방법입니다.

빠르지만, 오래 사용하면 정확도가 떨어질 수 있습니다. 위 코드의 update 메서드는 점진적 업데이트를 수행합니다.

새로운 관측치가 들어올 때마다 model.update(obs)를 호출하면 됩니다. 실무에서는 보통 두 방법을 병행합니다.

매일 들어오는 데이터는 update로 빠르게 반영하고, 주간이나 월간으로 전체 재학습을 수행합니다. "그럼 언제 전체 재학습을 해야 해요?" 김개발 씨가 물었습니다.

"예측 오차가 갑자기 커질 때, 비즈니스 환경이 크게 바뀔 때, 아니면 정기적으로 스케줄을 정해서 하면 돼." 코로나19 팬데믹 같은 큰 변화가 있으면 과거 데이터로 학습한 모델은 무용지물이 됩니다. 이럴 때는 새로운 패턴에 맞게 전체 재학습이 필요합니다.

김개발 씨는 주간 배치 작업을 설정하기로 했습니다. 매주 월요일 새벽에 지난 한 주 데이터를 모아 모델을 업데이트하는 스케줄러를 만들었습니다.

실전 팁

💡 - 실시간 예측이 필요하면 update 메서드를 사용하세요

  • 정기적으로 전체 재학습을 수행하여 모델 품질을 유지하세요

6. 모델 성능 평가하기

팀장님이 김개발 씨에게 물었습니다. "그 예측 모델, 얼마나 정확해요?" 김개발 씨는 말문이 막혔습니다.

정확도를 어떻게 측정해야 하는지 몰랐기 때문입니다. 박시니어 씨가 다가와 말했습니다.

"모델 평가 지표에 대해 알아볼 때가 됐네."

시계열 모델의 성능은 다양한 지표로 평가할 수 있습니다. MAE(평균 절대 오차), RMSE(평균 제곱근 오차), MAPE(평균 절대 백분율 오차) 등이 대표적입니다.

또한 학습 데이터와 테스트 데이터를 분리하여 실제 예측 성능을 측정해야 합니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np

# 데이터 준비
np.random.seed(42)
data = 1000 + np.cumsum(np.random.randn(100) * 10)

# 학습/테스트 분할 (마지막 20개를 테스트용으로)
train, test = data[:-20], data[-20:]

# 모델 학습
model = auto_arima(train, seasonal=False, suppress_warnings=True)

# 테스트 기간 예측
predictions = model.predict(n_periods=len(test))

# 성능 지표 계산
mae = mean_absolute_error(test, predictions)
rmse = np.sqrt(mean_squared_error(test, predictions))
mape = np.mean(np.abs((test - predictions) / test)) * 100

print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")

모델이 좋은지 나쁜지 어떻게 알 수 있을까요? 박시니어 씨가 설명을 시작했습니다.

"가장 기본적인 방법은 학습 데이터와 테스트 데이터를 분리하는 거야. 모델을 학습할 때 일부 데이터는 숨겨두고, 나중에 그 숨겨둔 데이터로 예측해보는 거지." 위 코드에서 전체 100개 데이터 중 앞의 80개로 학습하고, 뒤의 20개로 테스트합니다.

이렇게 하면 모델이 본 적 없는 데이터에서 얼마나 잘 예측하는지 확인할 수 있습니다. "그럼 그 지표들은 뭐예요?" 김개발 씨가 물었습니다.

**MAE(Mean Absolute Error)**는 예측값과 실제값의 차이를 절대값으로 평균낸 것입니다. MAE가 10이라면, 평균적으로 10 정도 틀린다는 뜻입니다.

직관적이어서 이해하기 쉽습니다. **RMSE(Root Mean Squared Error)**는 오차를 제곱해서 평균내고 다시 제곱근을 취한 값입니다.

큰 오차에 더 민감하게 반응합니다. 가끔 크게 틀리는 것보다 일관되게 작게 틀리는 것이 더 좋다면 RMSE를 봐야 합니다.

**MAPE(Mean Absolute Percentage Error)**는 오차를 백분율로 표현합니다. MAPE가 5%라면, 평균적으로 5% 정도 틀린다는 뜻입니다.

매출 규모가 다른 여러 매장을 비교할 때 유용합니다. "어떤 지표가 가장 좋아요?" 김개발 씨의 질문에 박시니어 씨가 대답했습니다.

"상황에 따라 달라. 보고서에는 MAPE가 직관적이고, 모델 개선할 때는 RMSE를 많이 봐.

중요한 건 일관되게 같은 지표를 사용하는 거야." 실무에서는 보통 여러 지표를 함께 확인합니다. 하나의 지표만 보면 놓치는 정보가 있을 수 있기 때문입니다.

김개발 씨는 팀장님께 보고할 때 MAE와 MAPE를 함께 제시하기로 했습니다.

실전 팁

💡 - 시계열 데이터는 반드시 시간 순서대로 분할해야 합니다 (랜덤 분할 금지)

  • 여러 지표를 함께 확인하여 모델을 다각도로 평가하세요

7. 하이퍼파라미터 튜닝하기

김개발 씨의 모델은 어느 정도 잘 작동했지만, 팀장님은 더 높은 정확도를 원했습니다. "조금만 더 개선할 수 없을까요?" 김개발 씨는 박시니어 씨에게 다시 도움을 청했습니다.

"auto_arima에도 세부 설정이 있어. 그걸 조정해보자."

auto_arima 함수는 다양한 하이퍼파라미터를 제공합니다. 탐색 범위, 정보 기준, 검증 방식 등을 조정하여 더 좋은 모델을 찾을 수 있습니다.

하지만 탐색 범위가 넓어지면 계산 시간도 늘어나므로 균형을 잡아야 합니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
import numpy as np

np.random.seed(42)
data = 1000 + np.cumsum(np.random.randn(100) * 10)

# 세부 파라미터를 조정한 Auto ARIMA
model = auto_arima(
    data,
    start_p=0, max_p=5,      # AR 차수 탐색 범위
    start_q=0, max_q=5,      # MA 차수 탐색 범위
    d=None, max_d=2,         # 차분 차수 (None이면 자동)
    information_criterion='aic',  # 'aic', 'bic', 'hqic' 중 선택
    stepwise=True,           # 단계적 탐색 (빠름)
    n_fits=50,               # 최대 모델 피팅 횟수
    suppress_warnings=True,
    trace=True
)

print(f"최적 모델: {model.order}")
print(f"AIC: {model.aic():.2f}")

Auto ARIMA가 자동으로 찾아준다고 해서 만능은 아닙니다. 탐색 범위나 기준을 어떻게 설정하느냐에 따라 결과가 달라집니다.

박시니어 씨가 설명했습니다. "auto_arima는 기본적으로 p와 q를 0에서 5까지 탐색해.

하지만 데이터 특성에 따라 이 범위를 조정할 수 있어." start_pmax_p는 AR 차수의 탐색 범위를 설정합니다. 비슷하게 start_qmax_q는 MA 차수의 범위입니다.

범위가 넓을수록 더 좋은 모델을 찾을 가능성이 높지만, 시간이 오래 걸립니다. d를 None으로 설정하면 차분 횟수를 자동으로 결정합니다.

데이터의 정상성을 검정하여 적절한 d값을 찾아줍니다. 만약 d값을 알고 있다면 직접 지정하여 시간을 절약할 수 있습니다.

information_criterion은 모델 선택 기준입니다. AIC(Akaike Information Criterion)가 기본값이고, BIC(Bayesian Information Criterion)도 많이 사용됩니다.

BIC는 AIC보다 더 간단한 모델을 선호하는 경향이 있습니다. "어떤 기준을 써야 해요?" 김개발 씨가 물었습니다.

"대부분의 경우 AIC면 충분해. 하지만 모델이 너무 복잡해지는 것 같으면 BIC를 써봐." stepwise=True는 단계적 탐색을 사용합니다.

모든 조합을 다 시도하지 않고, 효율적인 방법으로 좋은 모델을 찾습니다. False로 설정하면 전수 탐색을 하는데, 시간이 매우 오래 걸립니다.

n_fits는 최대 피팅 횟수를 제한합니다. 탐색이 너무 오래 걸리는 것을 방지합니다.

김개발 씨는 여러 설정을 시도해보며 최적의 조합을 찾았습니다. MAPE가 2% 정도 개선되었고, 팀장님도 만족해했습니다.

실전 팁

💡 - 먼저 기본 설정으로 빠르게 결과를 확인하고, 필요하면 범위를 조정하세요

  • stepwise=False는 시간이 매우 오래 걸리므로 신중하게 사용하세요

8. 실전 프로젝트 구조

김개발 씨의 예측 모델이 성공적으로 운영된 지 3개월이 지났습니다. 이제 다른 팀에서도 비슷한 모델을 원했습니다.

"코드를 재사용할 수 있게 정리해줄 수 있어요?" 박시니어 씨가 말했습니다. "실무에서 쓸 수 있는 구조로 만들어보자."

실무에서는 단순히 예측하는 것을 넘어 파이프라인을 구축해야 합니다. 데이터 로딩, 전처리, 모델 학습, 예측, 저장까지 일련의 과정을 자동화하면 재사용성과 유지보수성이 높아집니다.

다음 코드를 살펴봅시다.

from pmdarima import auto_arima
import pandas as pd
import numpy as np
import pickle

class SalesForecastPipeline:
    def __init__(self, seasonal=False, m=1):
        self.model = None
        self.seasonal = seasonal
        self.m = m

    def fit(self, data):
        """모델 학습"""
        self.model = auto_arima(
            data, seasonal=self.seasonal, m=self.m,
            suppress_warnings=True
        )
        return self

    def predict(self, periods, return_conf_int=True):
        """미래 예측"""
        return self.model.predict(
            n_periods=periods, return_conf_int=return_conf_int
        )

    def save(self, path):
        """모델 저장"""
        with open(path, 'wb') as f:
            pickle.dump(self.model, f)

    def load(self, path):
        """모델 로드"""
        with open(path, 'rb') as f:
            self.model = pickle.load(f)
        return self

실무에서는 주피터 노트북에서 한 번 실행하고 끝나는 것이 아닙니다. 매일, 매주 예측을 수행하고 결과를 저장해야 합니다.

박시니어 씨가 화이트보드에 그림을 그리며 설명했습니다. "좋은 코드는 재사용할 수 있어야 해.

클래스로 감싸면 다른 팀에서도 쉽게 사용할 수 있지." 위 코드의 SalesForecastPipeline 클래스는 네 가지 핵심 기능을 제공합니다. fit 메서드는 데이터를 받아 모델을 학습합니다.

내부적으로 auto_arima를 호출하여 최적의 파라미터를 찾습니다. predict 메서드는 학습된 모델로 미래를 예측합니다.

예측 기간과 신뢰 구간 반환 여부를 인자로 받습니다. saveload 메서드는 모델을 파일로 저장하고 불러옵니다.

pickle을 사용하여 Python 객체를 직렬화합니다. "왜 저장해야 해요?" 김개발 씨가 물었습니다.

"모델 학습에 시간이 걸리잖아. 매번 학습하면 비효율적이지.

한 번 학습한 모델을 저장해두고, 예측할 때는 불러와서 쓰면 돼." 실무에서는 이 파이프라인을 더 확장합니다. 데이터 검증, 로깅, 모니터링, 알림 기능 등을 추가합니다.

예측 결과를 데이터베이스에 저장하거나, API로 서빙하기도 합니다. 김개발 씨는 이 구조를 기반으로 여러 팀의 요청을 처리했습니다.

매출 예측, 방문자 예측, 재고 예측 등 다양한 프로젝트에 같은 파이프라인을 재사용했습니다.

실전 팁

💡 - 모델 파일명에 날짜를 포함하여 버전 관리를 하세요 (예: model_20240115.pkl)

  • 프로덕션 환경에서는 pickle 대신 joblib 사용을 고려하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#AutoARIMA#TimeSeries#Forecasting#pmdarima#Data Science

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.