În fiecare decembrie, retailerii își fac stocuri pentru sărbători. În fiecare vară, rețelele electrice se pregătesc pentru vârfurile datorate aerului condiționat. Aceste tipare se repetă an după an, iar dacă îți construiești o prognoză a unei serii temporale care le ignoră, lași acuratețe pe masă.
Modelele Seasonal AutoRegressive Integrated Moving Average (prescurtat SARIMA) extind cadrul ARIMA, folosit pe scară largă, pentru a surprinde tiparele sezoniere repetitive alături de tendințele obișnuite. În acest articol, vei învăța ce este SARIMA, cum funcționează componentele sale, când să-l alegi în locul ARIMA și cum să construiești unul pas cu pas în Python.
Ce este SARIMA?
SARIMA este un model de prognoză pentru serii temporale care gestionează atât tiparele nesezoniere, cât și pe cele sezoniere din date. Se bazează direct pe ARIMA, așa că, dacă ai mai lucrat cu ARIMA, vei recunoaște majoritatea mecanismelor. Diferența cheie este că SARIMA adaugă un al doilea set de parametri, concepuți special pentru a modela comportamentul care se repetă la intervale fixe, precum cicluri lunare, trimestriale sau săptămânale.
Formal, un model SARIMA se notează SARIMA(p, d, q)(P, D, Q)[S]. Primul set de parametri, (p, d, q), gestionează structura nesezonieră, identică cu ARIMA standard. Al doilea set, (P, D, Q)[S], ține cont de tiparele sezoniere, unde S este lungimea ciclului sezonier. Pentru date lunare cu sezonalitate anuală, S = 12. Pentru date trimestriale, S = 4.
Componentele cheie ale SARIMA
Cei șapte parametri ai SARIMA pot părea mulți la început. Ajută să îi gândești în două grupuri: trio-ul ARIMA familiar (p, d, q) și omologii sezonieri (P, D, Q, S) care îi oglindesc la scara sezonieră. Fiecare parametru sezonier face exact ce face și „geamănul” nesezonier, doar că se aplică peste decalaje sezoniere, nu între pași de timp adiacenți.
Partea AutoRegresivă (AR)
Componenta AR folosește valorile trecute ale seriei pentru a le prezice pe cele viitoare. Parametrul p specifică câte valori întârziate sunt incluse. Dacă p = 2, modelul folosește cei doi pași de timp anteriori ca predictori pentru valoarea curentă.
Pe partea sezonieră, P face același lucru, dar la decalaje sezoniere. Dacă P = 1 și S = 12, modelul privește valoarea de acum 12 perioade, aceeași lună, anul anterior, ca predictor. Asta surprinde direct tiparele de la un an la altul.
Partea Integrată (I)
Parametrul d controlează de câte ori seria este diferențiată pentru a elimina trendurile și a o face staționară. Diferențierea înseamnă scăderea observației precedente din fiecare observație, ceea ce elimină un trend liniar. Dacă d = 1, iei primele diferențe; dacă d = 2, diferențiezi seria deja diferențiată.
Diferențierea sezonieră funcționează la fel, dar la decalaje sezoniere. Parametrul D specifică de câte ori aplici diferențiere sezonieră. Cu D = 1 și S = 12, scazi valoarea de acum 12 perioade din fiecare observație. Să folosești împreună d = 1 și D = 1 este frecvent atunci când o serie are atât un trend general ascendent, cât și un tipar sezonier repetitiv.
Partea cu Medii Mobile (MA)
Spre deosebire de componenta AR, care privește valorile trecute, componenta MA modelează relația dintre observația curentă și erorile reziduale din predicțiile trecute. Parametrul q stabilește câți termeni de eroare întârziată sunt incluși. Dacă q = 1, modelul folosește eroarea de predicție de la pasul anterior pentru a-și ajusta prognoza curentă.
Omologul sezonier Q aplică aceeași logică la decalaje sezoniere. Cu Q = 1 și S = 12, modelul încorporează eroarea de prognoză de acum 12 perioade. Asta contează când șocurile sezoniere, cum ar fi o vară neobișnuit de fierbinte care crește cererea de energie, tind să persiste în aceeași perioadă a anului următor.
Componenta sezonieră (S)
Parametrul S definește lungimea ciclului sezonier și leagă cele trei componente sezoniere (P, D, Q). Să potrivești corect S este esențial: dacă datele tale sunt lunare cu un tipar anual, S = 12. Date săptămânale cu ciclu anual dau S aproximativ 52.
Aici sezonalitatea poate deveni uneori dificilă. Un an nu are exact 52 de săptămâni; are mai degrabă 52,18. Pentru majoritatea scopurilor practice, rotunjirea la S = 52 funcționează bine. Dar unele seturi de date au mai multe perioade sezoniere: cererea zilnică de electricitate prezintă adesea atât un ciclu săptămânal (S = 7), cât și unul anual (S = 365). SARIMA standard gestionează o singură perioadă sezonieră, așa că multiple sezonalități necesită metode mai avansate precum TBATS sau Facebook Prophet.
Când S nu este evident, decompunerea seriei temporale ajută. Descompunerea seriei în componentele de trend, sezonalitate și reziduu scoate vizual la iveală perioada repetitivă dominantă. Poți, de asemenea, inspecta graficele de autocorelație pentru vârfuri la decalaje regulate.
ARIMA vs. SARIMA: Care e diferența?
Probabil te întrebi deja: când ar trebui să folosești de fapt SARIMA în locul mai simplului ARIMA?
Răspunsul scurt: folosește ARIMA când datele tale nu au un tipar sezonier semnificativ, și SARIMA când au.
ARIMA modelează trei lucruri: autocorelația în serie (AR), numărul de diferențieri necesare pentru staționaritate (I) și influența persistentă a erorilor de prognoză trecute asupra valorii curente (MA). Gestionează bine trendurile, ciclurile și zgomotul neregulat. Ce nu poate face este să modeleze tipare care se repetă la o frecvență sezonieră fixă. Acestea scapă ca varianță neexplicată.
SARIMA adaugă exact această capabilitate. Când în date apar clar vârfuri și văi sezoniere, potrivirea unui model ARIMA simplu forțează aceste tipare în reziduuri, rezultând prognoze mai slabe și reziduuri care nu sunt „zgomot alb”. Un model SARIMA le surprinde direct.
Regulă practică: plotează-ți datele și caută tipare care se repetă la un interval fix. Dacă le vezi — vârfuri de vânzări de sărbători, creșteri de energie iarna, tipare trimestriale ale veniturilor — apelează la SARIMA. Dacă seria este neregulată sau dominată de trend fără un ciclu regulat, ARIMA este mai simplu și suficient.
Cursul nostru ARIMA Models in Python acoperă ambele cadre cu exerciții practice care îți ascut intuiția pentru când se aplică fiecare.
Cum să construiești un model SARIMA în Python
Construirea unui model SARIMA urmează o secvență logică: colectezi date, verifici staționaritatea, identifici parametrii, potrivești modelul, rulezi diagnosticele și faci prognoze. Iată cum funcționează fiecare pas în practică, folosind biblioteca statsmodels din Python.
Colectarea datelor
Pentru un model care surprinde sezonalitatea, ai nevoie de suficient istoric pentru a observa tiparul de cel puțin două ori, ideal mai multe cicluri. Vânzări lunare în retail, înregistrări de temperatură, consum de energie și număr de pasageri sunt exemple clasice. Surse publice precum Federal Reserve Economic Data (FRED), US Census Bureau sau Kaggle sunt puncte bune de pornire.
Setul de date standard de predare pentru acest flux de lucru este numărul de pasageri aerieni: date lunare din 1949 până în 1960, cu un trend ascendent clar și o sezonalitate anuală puternică. Este disponibil prin statsmodels via get_rdataset(), care îl preia din colecția Rdatasets. Învață fluxul de lucru pe acest set de date înainte de a-l aplica propriilor date.
Preprocesarea datelor
Înainte de a potrivi orice model SARIMA, ai nevoie de o serie staționară, una în care media și varianța nu se schimbă în timp. Testul Augmented Dickey-Fuller (ADF) verifică asta formal: o valoare p sub 0,05 sugerează că seria este staționară.
Dacă nu este, diferențierea rezolvă. Aplică diferențiere obișnuită (d = 1) pentru trend, diferențiere sezonieră (D = 1 la decalajul S) pentru nestoționaritate sezonieră sau ambele, dacă este necesar. Gestionează valorile lipsă înainte de acest pas. „Forward fill” sau interpolarea sunt abordări standard pentru date de tip serie temporală, deoarece eliminarea rândurilor rupe structura temporală.
Identificarea modelului
Cu o serie staționară în mână, folosești graficele Funcției de Autocorelație (ACF) și ale Funcției de Autocorelație Parțială (PACF) pentru a identifica parametrii modelului. Iată ce să cauți:
- ACF arată corelația dintre seria însăși și decalajele ei. O tăiere bruscă după decalajul q sugerează ordinul MA. Vârfurile la decalaje sezoniere (12, 24, 36 pentru date lunare) informează Q.
- PACF arată corelațiile parțiale, cu efectele decalajelor intermediare eliminate. O tăiere bruscă după decalajul p sugerează ordinul AR. Vârfurile sezoniere informează P.
În practică, graficele îți oferă valori candidate, iar tu compari câteva modele folosind criterii informaționale (mai multe despre asta la diagnosticare). Dacă preferi să automatizezi căutarea, auto_arima() din pachetul pmdarima face o căutare pe grilă a combinațiilor de parametri și selectează modelul cu cea mai bună potrivire.
Estimarea parametrilor
După ce ai identificat parametrii candidați, statsmodels îi estimează folosind Estimarea Maximă a Verosimilității (MLE), găsind valorile coeficienților care fac datele observate cele mai probabile sub model. Estimarea SARIMA este mai intensivă computațional decât ARIMA simplu, deoarece optimizatorul trebuie să potrivească simultan componentele nesezoniere și sezoniere.
Procesul de potrivire poate ocazional să convergă la un optim local mai degrabă decât la cel global, așa că merită să încerci câteva valori de start sau combinații de parametri diferite atunci când rezultatele par nepotrivite.
Potrivirea modelului
Iată cum să potrivești un model SARIMA în Python folosind setul de date cu pasageri aerieni:
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())
Argumentul order primește (p, d, q) pentru partea nesezonieră; seasonal_order primește (P, D, Q, S). Setarea enforce_stationarity=False și enforce_invertibility=False oferă mai multă flexibilitate optimizatorului, ceea ce adesea ajută la convergență pe date reale.
Statistici și diagnostice ale modelului
După potrivire, rulează graficele de diagnostic încorporate cu sarima_result.plot_diagnostics(). Cauți patru lucruri:
- Reziduuri standardizate: Ar trebui să arate ca zgomot alb, fără tipare evidente.
- Histograma reziduurilor: Ar trebui să fie aproximativ normală.
- Grafic Q-Q normal: Punctele ar trebui să cadă aproape de linia diagonală.
- Correlogramă (ACF a reziduurilor): Fără vârfuri semnificative, care ar indica autocorelație neexplicată.
Acordă atenție specială decalajelor sezoniere în correlogramă. Vârfurile la decalaje 12, 24 și așa mai departe sugerează că componenta sezonieră nu este surprinsă complet. Compară specificații alternative folosind AIC (Criteriul Informațional Akaike) și BIC (Criteriul Informațional Bayesiano): valori mai mici indică o potrivire mai bună, BIC penalizând mai puternic complexitatea.
Prognozare
Cu un model validat, generarea prognozelor este directă. Împarte-ți datele în seturi de antrenare și test pentru a obține o evaluare onestă a acurateții prognozei:
# 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() returnează predicții punctuale împreună cu intervale de încredere care se lărgesc pe măsură ce prognozezi mai departe în viitor. Acea lărgire nu este un defect; este modelul care este onest în privința incertitudinii. Evaluează acuratețea folosind RMSE (Root Mean Squared Error) sau MAPE (Mean Absolute Percentage Error) pe setul de test reținut.
Aplicații practice ale SARIMA
Atât de multe semnale din lumea reală sunt sezoniere încât SARIMA își câștigă un loc permanent în orice trusă de instrumente pentru serii temporale. Câteva exemple din diverse industrii:
- Retail: Prognozarea volumelor lunare de vânzări pentru planificarea stocurilor, mai ales în jurul perioadelor de sărbători, unde vârfurile de cerere sunt previzibile, dar variază ca magnitudine de la un an la altul.
- Consum de energie: Predicția cererii de electricitate și gaze, care urmează atât cicluri sezoniere zilnice, cât și anuale, determinate de temperatură și tipare de activitate.
- Finanțe: Modelarea veniturilor trimestriale sau a tiparelor volumului de tranzacționare care se repetă odată cu calendarele fiscale.
- Prognoza meteo: Proiectarea temperaturii, precipitațiilor și a altor variabile climatice care urmează cicluri anuale puternice.
În fiecare caz, structura repetitivă este semnalul, iar SARIMA este construit pentru a o surprinde.
Limitările SARIMA
Să știi unde funcționează bine un instrument este doar jumătate din imagine. SARIMA este un reper solid pentru serii temporale sezoniere, dar cunoașterea limitelor sale îi diferențiază pe cei care folosesc bine modelele de cei care le folosesc orbește.
El gestionează exact o singură perioadă sezonieră. Dacă datele tale au multiple sezonalități — tipare zilnice, săptămânale și anuale suprapuse — SARIMA nu le va modela pe toate simultan. Metode precum TBATS, Prophet sau rețele LSTM gestionează mai natural frecvențe sezoniere multiple.
SARIMA presupune, de asemenea, linearitate. Modelează relații liniare între valorile trecute, erorile trecute și observațiile viitoare. Dinamica neliniară, frecventă în serii financiare sau sisteme haotice, necesită instrumente diferite. Și, la fel ca ARIMA, SARIMA se bazează exclusiv pe istoricul seriei în sine. Dacă ai factori externi care îți afectează prognozele — promoții, fenomene meteo, indicatori economici — uită-te la SARIMAX, care adaugă variabile exogene cadrului SARIMA.
În final, selecția parametrilor poate fi cu adevărat dificilă. Cu șapte parametri de ajustat, spațiul de căutare este mare, iar potrivirea poate fi lentă pe serii lungi. auto_arima() din pmdarima ajută la automatizare. Dar nu există scurtături pentru a înțelege ce înseamnă de fapt parametrii, motiv pentru care am acoperit componentele înainte de a atinge orice cod.
Concluzie
Am crezut mereu că SARIMA este subapreciat în cursurile introductive de prognoză. Este predat ca „ARIMA, dar cu chestii sezoniere”, ceea ce îl face să pară o extensie minoră. Nu este. Parametrii sezonieri nu sunt adăugați de formă; ei fac muncă structurală reală, surprinzând un strat al comportamentului datelor tale la care ARIMA pur și simplu nu poate ajunge.
Ceea ce face ca SARIMA să „facă clic” în practică este realizarea faptului că componentele nesezoniere și sezoniere nu sunt modele separate care rulează în paralel. Ele interacționează. Termenii AR și MA lucrează alături de omologii lor sezonieri, fiecare gestionând o scară de timp diferită a autocorelației. Odată ce înțelegi asta, citirea graficelor ACF și PACF încetează să mai pară potrivire de tipare și începe să pară înțelegere reală a datelor tale.
Dacă lucrezi cu date lunare, trimestriale sau cu orice ciclu regulat, SARIMA este punctul de plecare potrivit, nu pentru că este întotdeauna răspunsul final, ci pentru că te obligă să gândești clar la structura seriei tale. De acolo, SARIMAX adaugă predictori externi, iar metode precum TBATS sau Prophet gestionează cazurile mai încâlcite cu multi-sezonalitate. Tutorialul nostru Time Series Forecasting Tutorial și cursul ARIMA Models in Python sunt ambele pași buni în continuare.
Întrebări frecvente despre SARIMA
Ce înseamnă SARIMA?
SARIMA înseamnă Seasonal AutoRegressive Integrated Moving Average. Extinde modelul ARIMA standard prin adăugarea parametrilor sezonieri — (P, D, Q) și a perioadei sezoniere S — care surprind tiparele repetitive în datele de serie temporală, precum ciclurile lunare sau trimestriale.
Care este diferența dintre ARIMA și SARIMA?
ARIMA modelează tipare nesezoniere: trend, autocorelație și efecte de medie mobilă. SARIMA adaugă un al doilea strat de parametri (P, D, Q, S) care modelează aceleași efecte la decalaje sezoniere. Dacă datele tale arată tipare care se repetă la un interval fix — cum ar fi vânzări mai mari în fiecare decembrie — SARIMA le surprinde direct, în timp ce ARIMA le lasă ca varianță reziduală neexplicată.
Cum aleg parametrii potriviți pentru SARIMA?
Începe prin a verifica dacă seria ta este staționară folosind testul Augmented Dickey-Fuller. Apoi inspectează graficele ACF și PACF: ordinele AR (p) și MA (q) nesezoniere provin din tiparul tăierilor la decalaje nesezoniere, în timp ce ordinele sezoniere P și Q provin din vârfurile la decalaje sezoniere. Poți folosi și auto_arima() din pachetul pmdarima pentru a căuta automat combinații de parametri, folosind AIC sau BIC pentru a selecta cel mai bun model.
Cum determin perioada sezonieră S pentru modelul meu SARIMA?
Perioada sezonieră S reflectă cât de des se repetă tiparul. Pentru date lunare cu sezonalitate anuală, S = 12. Pentru date trimestriale, S = 4. Pentru date săptămânale, S = 52 (sau 52,18 rotunjit). Dacă perioada nu este evidentă, folosește decompunerea seriei temporale sau inspectează graficul ACF pentru vârfuri spațiate regulat — acele vârfuri dezvăluie frecvența sezonieră dominantă.
Poate SARIMA să gestioneze mai multe perioade sezoniere?
SARIMA standard gestionează câte o singură perioadă sezonieră. Dacă datele tale au sezonalități stratificate multiple — cum ar fi cererea zilnică de electricitate cu cicluri atât săptămânale, cât și anuale — vei avea nevoie de alternative precum TBATS, Facebook Prophet sau rețele LSTM, care sunt concepute să modeleze simultan structuri sezoniere suprapuse multiple.
Ce bibliotecă Python este cea mai bună pentru a potrivi modele SARIMA?
Biblioteca statsmodels din Python este alegerea standard, oferind SARIMAX() (care este suficient de flexibilă pentru a potrivi modele SARIMA fără variabile exogene). Pentru selecția automată a parametrilor, funcția auto_arima() din biblioteca pmdarima efectuează o căutare pe grilă și merită integrată în fluxul tău de lucru atunci când nu ești sigur de unde să începi cu valorile parametrilor.
Cum evaluez dacă modelul meu SARIMA este o potrivire bună?
După potrivire, rulează plot_diagnostics() pe obiectul rezultat și verifică dacă reziduurile arată ca zgomot alb, fără structură — în special fără vârfuri la decalaje sezoniere în ACF. Compară specificații de model concurente folosind AIC sau BIC (mai mic este mai bun). Pentru acuratețea prognozei pe date reținute, RMSE și MAPE sunt cele mai comune metrici.
Ce este SARIMAX și când ar trebui să-l folosesc în loc de SARIMA?
SARIMAX adaugă variabile exogene — predictori externi — la cadrul SARIMA. Folosește-l când ai factori măsurabili care îți influențează seria dincolo de istoricul ei: cheltuieli promoționale care afectează vânzările din retail, temperatura care afectează cererea de energie sau indicatori macroeconomici care afectează veniturile trimestriale. Dacă singurele tale date sunt seria însăși, SARIMA este suficient; odată ce ai factori externi relevanți, SARIMAX îți permite să-i încorporezi direct.