Przejdź do głównej treści
Data Science

ARIMAX: jak prognozować szeregi czasowe z zmiennymi zewnętrznymi

Dowiedz się, jak ARIMAX rozszerza ARIMA o zewnętrzne predyktory, poznaj jego parametry i założenia oraz zbuduj model prognozowania w Pythonie z użyciem statsmodels.
Vinod Chugani's photo
Vinod Chugani
Zaktualizowano · 9 min przeczytaj

Odkryj z AI

ChatGPTClaudePerplexity

Utwórz bezpłatne konto

Ćwicz i monitoruj swoje postępy.

Kontynuuj Z Google
Kontynuując, akceptujesz nasze Warunki korzystania, naszą Politykę prywatności i fakt, że twoje dane są przechowywane w USA.

Załóżmy, że prognozujesz miesięczny popyt na energię elektryczną. Masz solidny model ARIMA, który wychwytuje autokorelację i trend szeregu. Nagle nadchodzi fala upałów i twoja prognoza myli się o 15%. Szereg się nie zmienił; zmieniła się pogoda. To dokładnie sytuacja, do której stworzono ARIMAX: prognozowanie szeregów czasowych, gdy czynniki zewnętrzne napędzają tyle samo zmienności, co sama historia szeregu.

Omówimy, czym jest ARIMAX, czym różni się od ARIMA i SARIMAX oraz kiedy ma sens użyć jednego zamiast drugiego. Przejdziemy też przez pełną implementację w Pythonie: przygotowanie danych, dopasowanie modelu, diagnostykę i ocenę prognoz, żebyś mógł zastosować to w praktyce.

Czym jest ARIMAX?

ARIMAX to skrót od AutoRegressive Integrated Moving Average with eXogenous variables. To model ARIMA, który akceptuje też wejścia zewnętrzne, czyli predyktory spoza samego szeregu docelowego. Przykłady: wydatki na reklamę, temperatura, flagi promocji, stopy procentowe.

Ogólna notacja to ARIMAX(p, d, q) z jednym lub kilkoma regresorami egzogenicznymi. Parametry p, d i q mają to samo znaczenie co w ARIMA: rząd autoregresji, stopień różnicowania i rząd średniej ruchomej. „X” oznacza, że możesz przekazać dodatkowe kolumny, które twoim zdaniem wpływają na cel. Warto od razu zaznaczyć: niektóre pakiety implementują ARIMAX jako model regresji z błędami ARIMA, a nie traktują zmienne zewnętrzne jako bezpośrednie wejścia AR. Różnica matematycznie jest subtelna, ale ma znaczenie dla interpretacji współczynników. Wrócimy do tego przy omawianiu wyników statsmodels.

Jak działa ARIMAX

ARIMAX łączy dwie rzeczy: „pamięć” samego szeregu oraz siłę wyjaśniającą zmiennych zewnętrznych.

Składowe AR, I i MA

Składowa AR (autoregresyjna) używa opóźnionych wartości zmiennej docelowej do przewidywania wartości bieżącej. Jeśli w zeszłym miesiącu sprzedaż była wysoka, ma to znaczenie.

Składowa I (zintegrowana) różnicuje szereg, by usunąć trendy lub pierwiastki jednostkowe, czyniąc go stacjonarnym.

Składowa MA (średniej ruchomej) używa przeszłych błędów prognoz do korygowania systematycznych pomyłek popełnianych przez model.

Razem te trzy elementy obsługują większość czynników napędzających typowy szereg czasowy: trendy, cykle i autokorelację w resztach.

Gdzie wchodzą zmienne egzogeniczne

Zmienne egzogeniczne dostarczają informacji, których sama historia szeregu nie jest w stanie zapewnić. Jeśli prognozujesz sprzedaż, przeszła sprzedaż mówi o typowych wzorcach. Ale obniżka ceny lub wejście konkurenta na rynek to nowa informacja. Model estymuje współczynnik dla każdego zewnętrznego predyktora, jednocześnie uwzględniając autokorelację w błędach.

Praktycznie rzecz biorąc: jeśli twój szereg docelowy jest dobrze wyjaśniony przez własne wartości z przeszłości i nie masz wiarygodnych predyktorów zewnętrznych, zwykła ARIMA prawdopodobnie wystarczy. Ale gdy wiesz, że działają czynniki zewnętrzne i będziesz mieć dostępne ich przyszłe wartości, ARIMAX zwykle daje dokładniejsze prognozy.

ARIMA vs. ARIMAX vs. SARIMAX

SARIMAX rozbudowuje SARIMA o zewnętrzne zmienne. W praktyce większość implementacji ARIMAX w Pythonie korzysta z SARIMAX() ze statsmodels, z zerowym rzędem sezonowym.

To nie jest obejście. To standardowe podejście. SARIMAX to dobry pierwszy wybór, gdy twój szereg ma wyraźną sezonowość lub gdy potrzebujesz zewnętrznych regresorów; radzi sobie z jednym i drugim. Jedno zastrzeżenie: „ARIMAX” i „SARIMAX” nie są zamienne w każdej bibliotece. W niektórych pakietach SARIMAX bez składników sezonowych i ARIMAX są funkcjonalnie identyczne. W innych różnią się sposobem, w jaki zmienne zewnętrzne wchodzą do funkcji wiarygodności. Sprawdź dokumentację narzędzia, którego używasz.

Kiedy używać ARIMAX

Zwykle sprowadza się to do jednego: czy masz zewnętrzne predyktory, które wiarygodnie wpływają na cel i czy będziesz mieć ich przyszłe wartości w momencie prognozowania?

Sytuacje, w których ARIMAX dodaje wartość

Dobre przykłady to prognozowanie sprzedaży z flagami promocji lub zmianami cen, zapotrzebowanie na energię z temperaturą jako wejściem, ruch na stronie z wydatkami kampanijnymi oraz wskaźniki makro wraz z danymi o stopach procentowych. W każdym z tych przypadków zmienna zewnętrzna dostarcza informacji, których szereg sam nie wygeneruje.

Zwykła ARIMA może wystarczyć, gdy predyktory zewnętrzne są niedostępne, niewiarygodne lub po prostu nie poprawiają trafności poza próbą. Dodawanie predyktorów, które wprowadzają szum bez sygnału, nie pomaga. Więcej wejść nie gwarantuje lepszych prognoz. Oceń każdy proponowany predyktor na wydzielonych danych, zanim się na niego zdecydujesz.

Słowo o przyczynowości

Zależność między predyktorem a celem nie ustanawia przyczynowości. ARIMAX to framework prognostyczny; estymuje współzależności. Jeśli wydatki reklamowe korelują ze sprzedażą, bo obie rosną w grudniu, model może to wychwycić, ale nie powie ci, że to reklama spowodowała wzrost. To rozróżnienie ma znaczenie, jeśli używasz prognoz do podejmowania decyzji, a nie tylko do przewidywania wyników. Warto być w tym explicite przy prezentowaniu rezultatów.

Jak zbudować model ARIMAX w Pythonie

Czas na implementację.

Użyjemy odtwarzalnego przykładu: miesięczna sprzedaż lodów (sztuki) z temperaturą (°C) i flagą promocji jako predyktorami egzogenicznymi. Zbiór obejmuje 48 miesięcy, podzielonych na 36 miesięcy treningu i 12 ewaluacji.

Przygotuj dane

Zacznij od wczytania lub zbudowania DataFrame z konsekwentnym miesięcznym indeksem dat. Wskaż zmienną docelową i kolumny egzogeniczne, a następnie wyrównaj wszystko po dacie. Obsłuż braki danych przed podziałem. Nie imputuj przez granicę train/test, bo to wprowadza przeciek.

Zasada do szybkiego przyswojenia: jakiekolwiek wartości egzogeniczne podasz podczas treningu, będziesz potrzebować ich odpowiedników w przyszłości przy prognozowaniu. Jeśli nie możesz zdobyć prognoz temperatury, nie możesz użyć temperatury jako predyktora. To nie drobna uwaga; wyklucza wielu kandydatów.

import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import mean_absolute_error

# Construct a sample monthly dataset
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="MS")
temperature = 15 + 10 * np.sin(np.linspace(0, 4 * np.pi, 48)) + np.random.normal(0, 1, 48)
promotion = np.where((np.arange(48) % 6 == 0), 1, 0)
sales = (
    500
    + 8 * temperature
    + 150 * promotion
    + np.cumsum(np.random.normal(0, 10, 48))
)

df = pd.DataFrame({"sales": sales, "temperature": temperature, "promotion": promotion}, index=dates)

# Train/test split
train = df.iloc[:36]
test = df.iloc[36:]

Skalowanie zwykle nie jest wymagane do estymacji w statsmodels, ale pomaga stabilności numerycznej, gdy predyktory mają bardzo różne skale. To kwestia uznaniowa.

Sprawdź szereg i predyktory

Zanim wybierzesz parametry modelu, obejrzyj wizualnie szereg docelowy i wykonaj test stacjonarności. Standardem jest test rozszerzonego Dickeya-Fullera (ADF). Wartość p poniżej 0,05 sugeruje stacjonarność szeregu i prawdopodobnie brak potrzeby różnicowania (d=0). Jeśli szereg ma wyraźny trend, typowo ustawisz d=1. Testy to jedno ze źródeł; liczy się też wiedza domenowa i oględziny wykresu.

Sprawdź też predyktory: czy są wyrównane z celem? Czy istnieje ryzyko, że predyktor jest mierzony po dacie prognozy? Flaga promocji ustawiona przed rozpoczęciem miesiąca jest OK. Przychód z tego miesiąca już nie.

Wybierz kandydatów parametrów i dopasuj model

Wykresy ACF i PACF pomagają zasugerować kandydatów dla p i q. Istotny pik dla opóźnienia 1 w PACF przy wygasającym ACF często sugeruje AR(1); odwrotny wzorzec sugeruje MA(1). Porównaj niewielki zestaw kandydatów używając AIC lub BIC na danych treningowych, a zbiór testowy zostaw wyłącznie do końcowej ewaluacji.

# Fit ARIMAX(1,1,1) via SARIMAX with no seasonal order
exog_train = train[["temperature", "promotion"]]
exog_test = test[["temperature", "promotion"]]

model = SARIMAX(
    train["sales"],
    exog=exog_train,
    order=(1, 1, 1),
    seasonal_order=(0, 0, 0, 0),
    trend="n"
)
result = model.fit(disp=False)
print(result.summary())

Wynik summary() pokazuje współczynniki ARIMA obok współczynników zmiennych zewnętrznych. Ten współczynnik temperatury mówi, o ile przeciętnie zmienia się poziom sprzedaży przy wzroście temperatury o jeden stopień, po uwzględnieniu przez strukturę autoregresyjną „pędu” szeregu. Ważna uwaga: statsmodels stosuje formułę regresji z błędami ARIMA, co oznacza, że różnicowanie (d=1) stosuje się do procesu błędu, a nie do samego równania regresji. Współczynnik reprezentuje wpływ na poziom sprzedaży niezależnie od d. W ujęciu ARIMAX z funkcją przejścia (transfer-function), stosowanym w niektórych innych pakietach, d=1 oznaczałoby, że współczynniki odzwierciedlają wpływ na zmiany, a nie poziomy. To często myli, więc warto zajrzeć do dokumentacji używanego narzędzia.

Sprawdź reszty i oceń prognozy

Reszty powinny wyglądać jak biały szum. Sprawdź wykres ACF reszt pod kątem pozostałej autokorelacji. Istotne piki oznaczają, że model pomija jakąś strukturę. Jeśli widzisz systematyczne wzorce na opóźnieniach sezonowych, przejdź na SARIMAX ze składnikami sezonowymi.

# Generate out-of-sample predictions
predictions = result.forecast(steps=12, exog=exog_test)

# Evaluate
mae = mean_absolute_error(test["sales"], predictions)

# Naive baseline: forecast each period using the previous period's actual value
naive_forecast = np.concatenate([[train["sales"].iloc[-1]], test["sales"].values[:-1]])
naive_mae = mean_absolute_error(test["sales"], naive_forecast)

print(f"ARIMAX MAE: {mae:.1f}")
print(f"Naive MAE:  {naive_mae:.1f}")

Porównaj MAE ARIMAX z naiwną bazą (użycie wartości z poprzedniego okresu jako prognozy). Jeśli ARIMAX nie pokonuje modelu naiwnego na twoim zbiorze testowym, to znaczący wynik. Dodatkowa złożoność nie jest uzasadniona. Widziałem to częściej, niż byś się spodziewał, zwłaszcza gdy predyktory egzogeniczne są bardziej hałaśliwe, niż wyglądają w próbie.

Prognozuj wartości w przyszłości

Prognozowanie poza okresem treningowym działa tak samo jak ewaluacja poza próbą: przekaż przyszłe wartości egzogeniczne wraz z wywołaniem forecast(). Dla flag promocji zwykle jest to proste, bo znasz kalendarz z wyprzedzeniem. Dla temperatury typowo użyjesz prognozy pogody lub historycznych średnich sezonowych.

Zapamiętaj: przedziały ufności zwracane przez statsmodels są warunkowe względem dostarczonych wartości predyktorów. Nie uwzględniają niepewności tych predyktorów. Jeśli prognoza temperatury jest niepewna, rzeczywista niepewność prognozy jest szersza, niż sugerują przedziały. Warto to komunikować, jeśli prezentujesz wyniki komuś, kto ma na ich podstawie działać.

Typowe wyzwania i ograniczenia

Powyższa implementacja to scenariusz idealny. Oto gdzie zwykle zaczyna się sypać.

  • Przyszłe predyktory mogą być nieznane: To najczęstsza praktyczna bariera. Jeśli nie możesz wiarygodnie pozyskać przyszłych wartości zmiennych egzogenicznych, nie możesz ich użyć. Prognozowanie zapotrzebowania na energię z jutrzejszą temperaturą wymaga prognozy temperatury, nie wczorajszej.
  • Predyktory mogą powodować przeciek informacji: Zmienna mierzona po dacie prognozy może sprawić, że twoja ewaluacja w próbie będzie wyglądać znacznie lepiej, niż jest w rzeczywistości. Uważaj, do jakich znaczników czasu faktycznie odnoszą się twoje predyktory.
  • Relacje mogą się zmieniać: Współczynniki oszacowane na danych historycznych mogą nie obowiązywać w przyszłości. Elastyczność cenowa stabilna przez dwa lata może się zmienić po szoku rynkowym, a lata 2024 i 2025 dostarczyły ich dość, by to przestało brzmieć teoretycznie. Dobre praktyki to okresowa reestymacja modelu.
  • Skorelowane predyktory utrudniają interpretację: Silnie współliniowe wejścia mogą czynić pojedyncze oszacowania współczynników niestabilnymi. Nie zawsze szkodzi to trafności prognoz, ale utrudnia stwierdzenie, który predyktor „robi robotę”.
  • Więcej wejść nie gwarantuje lepszych prognoz: Każdy proponowany predyktor oceniaj względem bazy na wydzielonych danych. Niektóre cechy, które wyglądają na informatywne w próbie, dodają szumu poza próbą.
  • Sezonowość wymaga składników sezonowych: Jeśli twój szereg ma stały wzorzec sezonowy, jak miesięczna sprzedaż z grudniowym skokiem, właściwym wyborem jest SARIMAX z rzędem sezonowym. Sam ARIMAX tego nie uchwyci.
  • Przyczynowość nie jest ustalona: Warto powtórzyć: ARIMAX to framework prognostyczny, a nie metoda wnioskowania przyczynowego. Nie używaj znaków współczynników do formułowania tez o przyczynowości bez dodatkowych analiz.

Wnioski

ARIMAX zasługuje na użycie, gdy masz czynniki zewnętrzne, które realnie wpływają na cel i możesz dostarczyć ich przyszłe wartości w momencie prognozowania. To naturalne rozszerzenie ARIMA, a nie zamiennik. Jeśli twój szereg jest „grzeczny” i nie masz wiarygodnych predyktorów, zwykła ARIMA to zwykle lepszy punkt startowy. Dodawanie zmiennych może się wydawać postępem. Czasem tak nie jest.

Workflow sprowadza się do czterech rzeczy zrobionych dobrze:

  1. prawidłowo wyrównaj predyktory,
  2. sprawdź przeciek przed ewaluacją,
  3. waliduj na naprawdę wydzielonych danych oraz
  4. zawsze porównuj z prostą bazą.

Model ARIMAX, który ledwie pokonuje naiwną prognozę, nie jest lepszy od naiwnej prognozy. Jest tylko droższy.

Jeśli chcesz wejść głębiej w podstawy szeregów czasu, nasz kurs Time Series Analysis in Python szczegółowo omawia ARIMA, stacjonarność i diagnostykę. Jeśli chodzi o statsmodels, nasz kurs Introduction to Regression with statsmodels in Python buduje intuicję statystyczną potrzebną przy interpretacji podsumowań modeli i sprawdzaniu reszt.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani rozpoczął karierę w Tokio jako najmłodszy w JPMorgan szef działu sprzedaży funduszy hedgingowych, a następnie ustanowił indywidualny rekord sprzedaży w Lehman Brothers, po czym zbudował działającą w 30 krajach firmę dystrybucji elektroniki z przychodami przekraczającymi 100 mln SGD, zanim przeszedł do pracy z danymi. Absolwent ekonomii na Duke i alumn NYC Data Science Academy, był jednym z trzech stypendystów wybranych spośród ponad 100 kandydatów do kursu Hugo Bowne-Andersona Building AI Applications na platformie Maven. Dziś pisze dla DataCamp, KDnuggets, Machine Learning Mastery i Statology na tematy od statystyki po agentową AI oraz mentoruje specjalistów danych w NYC Data Science Academy, mając na koncie ponad 1000 indywidualnych sesji.

 

FAQs

Jaka jest różnica między ARIMAX a ARIMA?

ARIMA prognozuje szereg docelowy wyłącznie na podstawie jego własnych wartości z przeszłości i przeszłych błędów prognoz. ARIMAX rozszerza to, uwzględniając zmienne egzogeniczne — zewnętrzne wejścia, takie jak temperatura, promocje czy stopy procentowe — które uważa się za wpływające na cel. Jeśli te czynniki zewnętrzne rzeczywiście napędzają zmienność w twoim szeregu i możesz dostarczyć ich przyszłe wartości, ARIMAX zazwyczaj da lepsze prognozy niż sama ARIMA.

Czym ARIMAX różni się od SARIMAX?

ARIMAX obsługuje zmienne zewnętrzne, ale nie wzorce sezonowe. SARIMAX dodaje sezonowe składniki AR, różnicowanie i MA ponad ARIMAX, co czyni go właściwym wyborem, gdy twój szereg ma powtarzalną sezonowość. W statsmodels dla Pythona ARIMAX jest zwykle implementowany przez SARIMAX() z rzędem sezonowym ustawionym na (0, 0, 0, 0). Funkcjonalnie to ten sam model w tej konfiguracji.

Czy muszę podawać przyszłe wartości zmiennych egzogenicznych, żeby prognozować ARIMAX?

Tak — to jedno z najważniejszych praktycznych ograniczeń. Przy generowaniu prognoz poza okresem treningowym musisz dostarczyć wartości dla każdej zmiennej egzogenicznej w każdym przyszłym kroku czasowym. Dla flag promocji lub wskaźników świąt zwykle jest to proste. Dla zmiennych takich jak temperatura czy ceny surowców będziesz potrzebować prognozowanych wartości lub rozsądnych założeń, co wprowadza dodatkową niepewność.

Jak wybrać p, d i q dla modelu ARIMAX?

Zacznij od wykresów ACF i PACF (zróżnicowanego) szeregu docelowego. Istotny pik na opóźnieniu 1 w PACF i wygasający ACF często sugerują AR(1); odwrotny wzorzec sugeruje MA(1). Użyj wiedzy domenowej i testu ADF do określenia d. Następnie porównaj niewielki zestaw kombinacji (p, d, q) przy użyciu AIC lub BIC na danych treningowych. Unikaj używania zbioru testowego na tym etapie — powinien służyć wyłącznie do końcowej ewaluacji.

Co oznacza współczynnik przy zmiennej egzogenicznej w modelu ARIMAX?

Współczynnik reprezentuje oszacowaną zmianę poziomu szeregu docelowego związaną ze wzrostem tego predyktora o jedną jednostkę, po uwzględnieniu struktury autoregresyjnej. W statsmodels obowiązuje to nawet przy d=1, ponieważ różnicowanie stosuje się do procesu błędu, a nie do równania regresji (to ujęcie regresji z błędami ARIMA). Niektóre inne pakiety używają ujęcia transfer-function, gdzie d=1 sprawia, że współczynniki odzwierciedlają wpływ na zmiany zamiast poziomów, więc sprawdź dokumentację swojego narzędzia. Interpretacja komplikuje się też, gdy predyktory mają różne skale lub są wzajemnie skorelowane, więc warto standaryzować wejścia, jeśli zależy ci na porównywaniu współczynników.

Jak wykrywać i obsługiwać wielokolinearność w zewnętrznych predyktorach?

Przed dopasowaniem oblicz współczynnik inflacji wariancji (VIF) dla każdego predyktora. Wartości powyżej 10 sugerują problematyczną współliniowość. Jeśli ją znajdziesz, spróbuj usunąć najmniej teoretycznie uzasadniony predyktor lub połącz skorelowane zmienne w jedną kompozytową. Wysoka współliniowość niekoniecznie zaszkodzi trafności prognoz, ale sprawia, że pojedyncze współczynniki są niewiarygodne i trudne do interpretacji.

Jak ocenić, czy ARIMAX faktycznie dodaje wartość?

Zawsze porównuj z prostą bazą — naiwną prognozą (użycie wartości z poprzedniego okresu) to dobry punkt wyjścia. Jeśli ARIMAX nie pokonuje jej na wydzielonych danych testowych, model nie zasługuje na swoją złożoność. MAE i RMSE to rozsądne metryki; MAE łatwiej wyjaśnić interesariuszom. Przeprowadzaj porównanie na właściwym zbiorze testowym, który nie był używany do doboru parametrów.

Kiedy użyć SARIMAX zamiast ARIMAX?

Używaj SARIMAX, gdy twój szereg wykazuje spójny wzorzec sezonowy — miesięczna sprzedaż ze szczytem w grudniu, tygodniowy ruch w sieci z poniedziałkowym skokiem itd. SARIMAX dodaje sezonowe składniki AR, różnicowanie i MA, których nie ma ARIMAX. Ponieważ w Pythonie statsmodels i tak implementuje ARIMAX przez SARIMAX(), praktyczne pytanie brzmi tylko: czy ustawić niezerowy rząd sezonowy. Jeśli po dopasowaniu ARIMAX reszty wykazują istotną autokorelację na opóźnieniach sezonowych, to sygnał, by dodać składniki sezonowe.

Tematy
Data Science

Ucz się z DataCamp

Kurs

Prognozowanie w R

5 godz.
52.8K
Naucz się prognozować przyszłość za pomocą prognozowania szeregów czasowych w R, w tym modeli ARIMA i metod wygładzania wykładniczego.
Zobacz szczegółyRozpocznij Kurs

Utwórz bezpłatne konto

Ćwicz i monitoruj swoje postępy.

Kontynuuj Z Google
Kontynuując, akceptujesz nasze Warunki korzystania, naszą Politykę prywatności i fakt, że twoje dane są przechowywane w USA.
Zobacz więcej