Każdego grudnia sprzedawcy uzupełniają stany magazynowe na święta. Każde lato to dla sieci energetycznych przygotowania na szczyty klimatyzacyjne. Te wzorce powtarzają się rok w rok, a jeśli budujesz prognozę szeregu czasowego, która je ignoruje, oddajesz dokładność za darmo.
Sezonowe modele autoregresyjno-różnicowo-średnioruchome (w skrócie SARIMA) rozszerzają szeroko stosowane ramy ARIMA, aby uchwycić powtarzalne wzorce sezonowe obok zwykłych trendów. W tym artykule poznasz, czym jest SARIMA, jak działają jej komponenty, kiedy wybrać ją zamiast ARIMA oraz jak krok po kroku zbudować model w Pythonie.
Czym jest SARIMA?
SARIMA to model prognozowania szeregów czasowych, który obsługuje jednocześnie wzorce niesezonowe i sezonowe w danych. Bazuje bezpośrednio na ARIMA, więc jeśli masz już doświadczenie z ARIMA, rozpoznasz większość mechaniki. Kluczowa różnica polega na tym, że SARIMA dodaje drugą warstwę parametrów zaprojektowanych specjalnie do modelowania zachowań powtarzających się w stałych odstępach, takich jak cykle miesięczne, kwartalne czy tygodniowe.
Formalnie model zapisuje się jako SARIMA(p, d, q)(P, D, Q)[S]. Pierwszy zestaw parametrów (p, d, q) opisuje strukturę niesezonową, identycznie jak w standardowym ARIMA. Drugi zestaw, (P, D, Q)[S], odpowiada za wzorce sezonowe, gdzie S to długość cyklu sezonowego. Dla danych miesięcznych z roczną sezonowością S = 12. Dla danych kwartalnych S = 4.
Kluczowe komponenty SARIMA
Siedem parametrów SARIMA może na początku przytłaczać. Pomaga myślenie o nich w dwóch grupach: znane trio ARIMA (p, d, q) oraz sezonowe odpowiedniki (P, D, Q, S), które je odzwierciedlają w skali sezonowej. Każdy parametr sezonowy robi dokładnie to samo co jego niesezonowy odpowiednik, tylko stosowany przez luki sezonowe zamiast sąsiednich kroków czasowych.
Część autoregresyjna (AR)
Komponent AR wykorzystuje przeszłe wartości szeregu do przewidywania przyszłych. Parametr p określa, ile opóźnionych wartości uwzględnić. Jeśli p = 2, model używa dwóch poprzednich kroków czasowych jako predyktory bieżącej wartości.
Po stronie sezonowej P robi to samo, ale na opóźnieniach sezonowych. Jeśli P = 1 i S = 12, model patrzy na wartość sprzed 12 okresów, ten sam miesiąc, poprzedni rok, jako predyktor. To bezpośrednio wychwytuje wzorce rok do roku.
Część zróżnicowana (I)
Parametr d kontroluje, ile razy różnicujemy szereg, aby usunąć trendy i uczynić go stacjonarnym. Różnicowanie polega na odejmowaniu poprzedniej obserwacji od każdej obserwacji, co usuwa trend liniowy. Jeśli d = 1, bierzesz pierwsze różnice; jeśli d = 2, różnicujesz już zróżnicowany szereg.
Różnicowanie sezonowe działa tak samo, ale na opóźnieniach sezonowych. Parametr D określa, ile różnic sezonowych zastosować. Przy D = 1 i S = 12 odejmujesz od każdej obserwacji wartość sprzed 12 okresów. Jednoczesne użycie d = 1 i D = 1 jest powszechne, gdy szereg ma zarówno ogólny trend wzrostowy, jak i powtarzalny wzorzec sezonowy.
Część średniej ruchomej (MA)
W odróżnieniu od komponentu AR, który patrzy na przeszłe wartości, komponent MA modeluje zależność między bieżącą obserwacją a błędami resztowymi z przeszłych prognoz. Parametr q ustawia, ile opóźnionych składników błędu uwzględnić. Jeśli q = 1, model używa błędu prognozy z poprzedniego kroku do korekty bieżącej prognozy.
Sezonowy odpowiednik Q stosuje tę samą logikę na opóźnieniach sezonowych. Przy Q = 1 i S = 12 model uwzględnia błąd prognozy sprzed 12 okresów. Ma to znaczenie, gdy sezonowe wstrząsy, jak wyjątkowo gorące lato napędzające popyt na energię, mają tendencję do utrzymywania się w tym samym okresie w kolejnym roku.
Komponent sezonowy (S)
Parametr S definiuje długość cyklu sezonowego i spina trzy parametry sezonowe (P, D, Q). Dobrze dobrane S ma znaczenie: jeśli twoje dane są miesięczne z rocznym wzorcem, S = 12. Dane tygodniowe z rocznym cyklem dają S w przybliżeniu 52.
Tu sezonowość bywa czasem podchwytliwa. Rok to nie dokładnie 52 tygodnie; bliżej mu do 52,18. Do większości zastosowań praktycznych zaokrąglenie do S = 52 sprawdza się dobrze. Jednak niektóre zbiory danych mają wiele okresów sezonowych: dzienne zapotrzebowanie na energię często wykazuje zarówno cykl tygodniowy (S = 7), jak i roczny (S = 365). Standardowa SARIMA obsługuje jeden okres sezonowy, więc wielokrotne sezonowości wymagają bardziej zaawansowanych metod, takich jak TBATS czy Facebook Prophet.
Gdy S nie jest oczywiste, pomaga dekompozycja szeregu. Rozłożenie szeregu na trend, komponent sezonowy i resztę wizualnie uwidacznia dominujący okres powtarzalny. Możesz też sprawdzić wykresy autokorelacji pod kątem pików w regularnych opóźnieniach.
ARIMA vs. SARIMA: jaka jest różnica?
Pewnie już się zastanawiasz: kiedy faktycznie użyć SARIMA zamiast prostszej ARIMA?
Krótka odpowiedź: używaj ARIMA, gdy twoje dane nie mają istotnego wzorca sezonowego, a SARIMA, gdy taki wzorzec występuje.
ARIMA modeluje trzy rzeczy: autokorelację w samym szeregu (AR), liczbę różnic potrzebnych do stacjonarności (I) oraz utrzymujący się wpływ przeszłych błędów prognoz na bieżącą wartość (MA). Dobrze radzi sobie z trendami, cyklami i nieregularnym szumem. Czego nie potrafi, to modelować wzorców powtarzających się z ustaloną częstotliwością sezonową. Te uciekają jako niewyjaśniona wariancja.
SARIMA dodaje dokładnie tę możliwość. Gdy w danych pojawiają się wyraźne sezonowe szczyty i dołki, dopasowanie zwykłego ARIMA upycha te wzorce w resztach, co skutkuje gorszymi prognozami i resztami, które nie są białym szumem. Model SARIMA wychwytuje je bezpośrednio.
Praktyczna zasada: narysuj dane i poszukaj wzorców powtarzających się w stałych odstępach. Jeśli je widzisz, świąteczne skoki sprzedaży, zimowe wzrosty zapotrzebowania na energię, kwartalne wzorce wyników, sięgnij po SARIMA. Jeśli szereg jest nieregularny lub napędzany trendem bez regularnego cyklu, ARIMA jest prostsza i wystarczająca.
Nasz kurs ARIMA Models in Python obejmuje oba podejścia z ćwiczeniami praktycznymi, które wyostrzą twoją intuicję, kiedy które stosować.
Jak zbudować model SARIMA w Pythonie
Budowa modelu SARIMA przebiega logicznie: zbierz dane, sprawdź stacjonarność, zidentyfikuj parametry, dopasuj model, przeprowadź diagnostykę i prognozuj. Oto jak każdy krok wygląda w praktyce z użyciem biblioteki statsmodels w Pythonie.
Zbieranie danych
Aby uchwycić sezonowość, potrzebujesz wystarczającej historii, by zaobserwować wzorzec co najmniej dwukrotnie, a najlepiej kilka cykli. Klasyczne przykłady to miesięczna sprzedaż detaliczna, zapisy temperatur, zużycie energii i liczby pasażerów. Dobrymi źródłami publicznymi są Federal Reserve Economic Data (FRED), US Census Bureau czy Kaggle.
Standardowy zbiór dydaktyczny dla tego workflow to liczby pasażerów linii lotniczych: dane miesięczne z lat 1949–1960 z wyraźnym trendem wzrostowym i silną roczną sezonowością. Jest dostępny w statsmodels przez get_rdataset(), które pobiera go z kolekcji Rdatasets. Przećwicz workflow na tym zbiorze, zanim zastosujesz go do własnych danych.
Przetwarzanie danych
Przed dopasowaniem jakiegokolwiek modelu SARIMA potrzebujesz szeregu stacjonarnego, w którym średnia i wariancja nie zmieniają się w czasie. Test rozszerzony Dickeya-Fullera (ADF) sprawdza to formalnie: wartość p poniżej 0,05 sugeruje stacjonarność szeregu.
Jeśli nie jest stacjonarny, naprawia to różnicowanie. Zastosuj różnicowanie zwykłe (d = 1) dla trendu, różnicowanie sezonowe (D = 1 przy opóźnieniu S) dla niestacjonarności sezonowej lub oba, jeśli potrzeba. Obsłuż braki danych przed tym krokiem. W szeregach czasowych standardem są uzupełnianie do przodu lub interpolacja, ponieważ usuwanie wierszy zaburza strukturę czasową.
Identyfikacja modelu
Mając szereg stacjonarny, używasz wykresów funkcji autokorelacji (ACF) i cząstkowej autokorelacji (PACF) do identyfikacji parametrów modelu. Oto na co zwracać uwagę:
- ACF pokazuje korelację między szeregiem a jego opóźnieniami. Gwałtowne odcięcie po opóźnieniu q sugeruje rząd MA. Piki w opóźnieniach sezonowych (12, 24, 36 dla danych miesięcznych) informują o Q.
- PACF pokazuje korelacje cząstkowe z usuniętym wpływem pośrednich opóźnień. Gwałtowne odcięcie po opóźnieniu p sugeruje rząd AR. Piki sezonowe informują o P.
W praktyce wykresy dają wartości kandydujące, a kilka modeli porównujesz za pomocą kryteriów informacyjnych (więcej o tym w diagnostyce). Jeśli wolisz zautomatyzować wyszukiwanie, auto_arima() z pakietu pmdarima wykonuje przeszukiwanie siatki kombinacji parametrów i wybiera najlepiej dopasowany model.
Estymacja parametrów
Gdy zidentyfikujesz parametry kandydujące, statsmodels estymuje je metodą największej wiarygodności (MLE), znajdując takie wartości współczynników, które czynią zaobserwowane dane najbardziej prawdopodobnymi w modelu. Estymacja SARIMA jest bardziej obciążająca obliczeniowo niż zwykła ARIMA, ponieważ optymalizator musi jednocześnie dopasować komponenty niesezonowe i sezonowe.
Proces dopasowania może czasem zbiec do optimum lokalnego zamiast globalnego, więc warto spróbować kilku różnych wartości początkowych lub kombinacji parametrów, gdy wyniki wyglądają podejrzanie.
Dopasowanie modelu
Oto jak dopasować model SARIMA w Pythonie, korzystając ze zbioru pasażerów linii lotniczych:
import pandas as pd
import statsmodels.api as sm
# Load the classic airline dataset
airline_data = sm.datasets.get_rdataset("AirPassengers", "datasets").data
airline_data.index = pd.date_range(start="1949-01", periods=len(airline_data), freq="MS")
passengers = airline_data["value"]
# Fit SARIMA(1,1,1)(1,1,1)[12]
sarima_model = sm.tsa.statespace.SARIMAX(
passengers,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False,
enforce_invertibility=False
)
sarima_result = sarima_model.fit(disp=False)
print(sarima_result.summary())
Argument order przyjmuje (p, d, q) dla części niesezonowej; seasonal_order przyjmuje (P, D, Q, S). Ustawienie enforce_stationarity=False i enforce_invertibility=False daje optymalizatorowi więcej swobody, co często pomaga w zbieżności na danych rzeczywistych.
Statystyki i diagnostyka modelu
Po dopasowaniu uruchom wbudowane wykresy diagnostyczne przez sarima_result.plot_diagnostics(). Szukasz czterech rzeczy:
- Zestandaryzowane reszty: Powinny wyglądać jak biały szum bez oczywistych wzorców.
- Histogram reszt: Powinien być w przybliżeniu normalny.
- Wykres Q-Q: Punkty powinny leżeć blisko linii przekątnej.
- Korelogram (ACF reszt): Brak istotnych pików, które wskazywałyby na niewyjaśnioną autokorelację.
Zwracaj szczególną uwagę na opóźnienia sezonowe w korelogramie. Piki przy opóźnieniach 12, 24 itd. sugerują, że komponent sezonowy nie jest w pełni uchwycony. Porównuj alternatywne specyfikacje za pomocą AIC (kryterium informacyjne Akaike’a) i BIC (Bayesowskie kryterium informacyjne): niższe wartości oznaczają lepsze dopasowanie, przy czym BIC mocniej karze złożoność.
Prognozowanie
Mając zweryfikowany model, generowanie prognoz jest proste. Podziel dane na zbiory treningowy i testowy, aby rzetelnie ocenić dokładność prognoz:
# Train on first 11 years, test on final year
train = passengers[:"1959"]
test = passengers["1960":]
# Refit on training data and forecast
sarima_train = sm.tsa.statespace.SARIMAX(
train,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False, # add this
enforce_invertibility=False # add this
).fit(disp=False)
forecast = sarima_train.get_forecast(steps=12)
forecast_mean = forecast.predicted_mean
conf_int = forecast.conf_int()
Metoda get_forecast() zwraca prognozy punktowe wraz z przedziałami ufności, które rozszerzają się im dalej prognozujesz. To nie wada; model po prostu uczciwie komunikuje niepewność. Oceniaj dokładność przy pomocy RMSE (pierwiastek z błędu średniokwadratowego) lub MAPE (średni bezwzględny błąd procentowy) na wydzielonym zbiorze testowym.
Praktyczne zastosowania SARIMA
Tak wiele sygnałów ze świata rzeczywistego jest sezonowych, że SARIMA na stałe wchodzi do każdego zestawu narzędzi do szeregów czasowych. Kilka przykładów z różnych branż:
- Handel detaliczny: Prognozowanie miesięcznych wolumenów sprzedaży do planowania stanów magazynowych, zwłaszcza wokół okresów świątecznych, gdzie skoki popytu są przewidywalne, ale różnią się skalą rok do roku.
- Zużycie energii: Prognozowanie zapotrzebowania na energię elektryczną i gaz, które podąża zarówno za cyklami dobowymi, jak i rocznymi, napędzanymi temperaturą i wzorcami aktywności.
- Finanse: Modelowanie kwartalnych wyników lub wzorców wolumenów obrotu, które powtarzają się wraz z kalendarzami fiskalnymi.
- Prognozowanie pogody: Projekcja temperatury, opadów i innych zmiennych klimatycznych, które podążają za silnymi cyklami rocznymi.
W każdym przypadku powtarzalna struktura jest sygnałem, a SARIMA jest stworzona, by go uchwycić.
Ograniczenia SARIMA
Wiedzieć, gdzie narzędzie działa dobrze, to tylko połowa obrazu. SARIMA to solidna baza dla sezonowych szeregów czasowych, ale świadomość jej ograniczeń odróżnia tych, którzy dobrze używają modeli, od tych, którzy robią to bezrefleksyjnie.
Obsługuje dokładnie jeden okres sezonowy. Jeśli twoje dane mają wiele sezonowości, dzienne, tygodniowe i roczne wzorce nałożone na siebie, SARIMA nie zamodeluje ich wszystkich jednocześnie. Metody takie jak TBATS, Prophet czy sieci LSTM naturalniej radzą sobie z wieloma częstotliwościami sezonowymi.
SARIMA zakłada też liniowość. Modeluje liniowe relacje między przeszłymi wartościami, przeszłymi błędami a przyszłymi obserwacjami. Nieliniowe dynamiki, częste w szeregach finansowych czy systemach chaotycznych, wymagają innych narzędzi. I podobnie jak ARIMA, SARIMA opiera się wyłącznie na historii samego szeregu. Jeśli masz zewnętrzne czynniki wpływające na prognozy, promocje, zjawiska pogodowe, wskaźniki gospodarcze, rozważ SARIMAX, który dodaje zmienne egzogeniczne do ram SARIMA.
Wreszcie, dobór parametrów bywa naprawdę trudny. Przy siedmiu parametrach do strojenia przestrzeń poszukiwań jest duża, a dopasowanie może być wolne dla długich szeregów. auto_arima() z pmdarima pomaga to zautomatyzować. Ale nie ma drogi na skróty bez zrozumienia, co parametry faktycznie oznaczają, dlatego omówiliśmy komponenty, zanim dotknęliśmy jakiegokolwiek kodu.
Wnioski
Zawsze uważałem, że SARIMA jest niedoceniana w kursach wprowadzających do prognozowania. Uczy się jej jako „ARIMA, tylko z sezonowością”, co brzmi jak drobne rozszerzenie. Nie jest. Parametry sezonowe nie są doczepione; wykonują realną pracę strukturalną, wychwytując warstwę zachowania twoich danych, do której ARIMA po prostu nie sięga.
Co sprawia, że SARIMA klika w praktyce, to uświadomienie sobie, że komponenty niesezonowe i sezonowe nie są oddzielnymi modelami działającymi równolegle. One współdziałają. Składniki AR i MA pracują obok swoich sezonowych bliźniaków, każdy obsługuje inny horyzont czasowy autokorelacji. Gdy to zaskoczy, czytanie wykresów ACF i PACF przestaje być dopasowywaniem wzorców, a zaczyna być prawdziwym rozumieniem danych.
Jeśli pracujesz z danymi miesięcznymi, kwartalnymi lub jakimikolwiek o regularnym cyklu, SARIMA to właściwy punkt startowy, nie dlatego, że zawsze jest ostateczną odpowiedzią, ale dlatego, że zmusza do jasnego myślenia o strukturze twojego szeregu. Dalej, SARIMAX dodaje zewnętrzne predyktory, a metody takie jak TBATS czy Prophet obsługują bardziej złożone przypadki wielosezonowe. Nasz Time Series Forecasting Tutorial oraz kurs ARIMA Models in Python to dobre kolejne kroki.
FAQ dotyczące SARIMA
Co oznacza skrót SARIMA?
SARIMA to skrót od Seasonal AutoRegressive Integrated Moving Average. Rozszerza standardowy model ARIMA, dodając parametry sezonowe—(P, D, Q) oraz okres sezonowy S—które uchwytują powtarzalne wzorce w szeregach czasowych, na przykład cykle miesięczne lub kwartalne.
Jaka jest różnica między ARIMA a SARIMA?
ARIMA modeluje wzorce niesezonowe: trend, autokorelację i efekty średniej ruchomej. SARIMA dodaje drugą warstwę parametrów (P, D, Q, S), które modelują te same efekty na opóźnieniach sezonowych. Jeśli twoje dane wykazują powtarzalne wzorce w stałym interwale—na przykład wyższą sprzedaż każdego grudnia—SARIMA uchwyci je bezpośrednio, podczas gdy ARIMA pozostawi je jako niewyjaśnioną wariancję reszt.
Jak dobrać odpowiednie parametry SARIMA?
Zacznij od sprawdzenia, czy szereg jest stacjonarny, używając testu rozszerzonego Dickeya-Fullera. Następnie obejrzyj wykresy ACF i PACF: rzędy niesezonowe AR (p) i MA (q) wynikają z wzorców odcięć przy opóźnieniach niesezonowych, natomiast rzędy sezonowe P i Q wynikają z pików przy opóźnieniach sezonowych. Możesz też użyć auto_arima() z pakietu pmdarima, aby automatycznie przeszukać kombinacje parametrów, wybierając najlepszy model na podstawie AIC lub BIC.
Jak określić okres sezonowy S dla mojego modelu SARIMA?
Okres sezonowy S odzwierciedla, jak często wzorzec się powtarza. Dla danych miesięcznych z roczną sezonowością S = 12. Dla danych kwartalnych S = 4. Dla danych tygodniowych S = 52 (lub zaokrąglone 52,18). Jeśli okres nie jest oczywisty, użyj dekompozycji szeregu lub obejrzyj wykres ACF pod kątem regularnie rozmieszczonych pików—te piki ujawniają dominującą częstotliwość sezonową.
Czy SARIMA potrafi obsłużyć wiele okresów sezonowych?
Standardowa SARIMA obsługuje jeden okres sezonowy naraz. Jeśli twoje dane mają kilka nałożonych sezonowości—na przykład dzienne zapotrzebowanie na energię z cyklami tygodniowymi i rocznymi—potrzebujesz alternatyw, takich jak TBATS, Facebook Prophet czy sieci LSTM, które są zaprojektowane do modelowania wielu nakładających się struktur sezonowych jednocześnie.
Która biblioteka Pythona jest najlepsza do dopasowania modeli SARIMA?
Standardowym wyborem jest biblioteka statsmodels w Pythonie, oferująca SARIMAX() (wystarczająco elastyczną, by dopasować modele SARIMA bez zmiennych egzogenicznych). Do automatycznego doboru parametrów warto dodać do workflow funkcję auto_arima() z biblioteki pmdarima, która wykonuje przeszukiwanie siatki.
Jak ocenić, czy mój model SARIMA jest dobrze dopasowany?
Po dopasowaniu uruchom plot_diagnostics() na obiekcie wynikowym i sprawdź, czy reszty wyglądają jak biały szum bez struktury—w szczególności bez pików przy opóźnieniach sezonowych w ACF. Porównuj konkurencyjne specyfikacje modeli za pomocą AIC lub BIC (im niższe, tym lepiej). Do oceny dokładności prognoz na wydzielonych danych najczęściej używa się RMSE i MAPE.
Czym jest SARIMAX i kiedy używać go zamiast SARIMA?
SARIMAX dodaje zmienne egzogeniczne—zewnętrzne predyktory—do ram SARIMA. Używaj go, gdy masz mierzalne czynniki wpływające na twój szereg poza jego własną historią: wydatki promocyjne wpływające na sprzedaż detaliczną, temperatura wpływająca na popyt na energię czy wskaźniki makroekonomiczne wpływające na kwartalne przychody. Jeśli masz tylko sam szereg, SARIMA jest wystarczająca; gdy pojawiają się istotni zewnętrzni sterownicy, SARIMAX pozwala włączyć ich bezpośrednio.