Słownik metodologiczny · Regresja

Sezonowość – jak rozpoznać i uwzględnić wzorzec powtarzający się co roku?

Sezonowość to wzorzec, który wraca w stałym okresie: co tydzień, co rok akademicki, co rok kalendarzowy. Pokazujemy, jak go wykryć dekompozycją STL i ACF, jak dodać go do regresji i jak opisać w pracy.

Strona główna / Słownik / Sezonowość
W skrócie: Sezonowość to wzorzec powtarzający się w stałym okresie, np. co 12 miesięcy albo co 7 dni. Rozpoznasz ją na wykresie, w dekompozycji STL i po autokorelacji przy opóźnieniu równym okresowi. W analizie trendu lub interwencji uwzględnij ją zmiennymi okresu albo modelem sezonowym.

Co to jest sezonowość?

Sezonowość (ang. seasonality) to składnik szeregu czasowego, który powtarza się w stałym, znanym okresie. W danych miesięcznych okres wynosi 12, w dziennych często 7. W badaniach studentów sezonowość wyznacza rok akademicki: więcej zgłoszeń w czasie sesji, mniej w wakacje. Jebb i Tay (2017) opisują dekompozycję, która rozdziela szereg na trend, składnik sezonowy i resztę.

Jak rozpoznać i uwzględnić sezonowość?

  • Wykres i dekompozycja. Dekompozycja STL pokazuje, o ile każdy miesiąc odbiega od trendu.
  • ACF. Wyraźna autokorelacja przy opóźnieniu 12 (lub 7) wskazuje na wzorzec sezonowy. Wcześniej usuń trend, np. różnicowaniem.
  • Regresja. Dodaj 11 zmiennych zero-jedynkowych dla miesięcy (dummy coding) albo funkcje sinus i cosinus.
  • Model sezonowy. Sezonowy model ARIMA dobiera automatycznie m.in. algorytm Hyndmana i Khandakar (2008).

Sezonowość łamie stacjonarność, bo średnia zależy od miesiąca. Lopez Bernal i in. (2016) wymieniają korektę na trendy sezonowe wśród głównych problemów analizy przerwanego szeregu czasowego.

Przykład

Poradnia studencka liczyła wizyty co miesiąc przez 6 lat (72 miesiące, dane symulowane). Dekompozycja STL pokazała najwyższy składnik sezonowy w listopadzie (+15.5 wizyty względem trendu) i październiku (+10.1). Najniższe wartości przypadły na lipiec (−21.7), sierpień (−19.3) i grudzień (−18.7). Autokorelacja zróżnicowanego szeregu przy opóźnieniu 12 wyniosła .58. Model z samym trendem wyjaśniał R² = .16 zmienności. Dodanie zmiennych miesięcy podniosło R² do .87, F(11, 59) = 28.32, p < .001.

Jak opisać w pracy

Miesięczna liczba wizyt (72 miesiące) wykazywała wyraźną sezonowość: w dekompozycji STL składnik sezonowy wahał się od −21.7 wizyty w lipcu do +15.5 w listopadzie, a autokorelacja przy opóźnieniu 12 miesięcy wynosiła .58. Dodanie zmiennych miesięcy do modelu z trendem liniowym zwiększyło R² z .16 do .87, F(11, 59) = 28.32, p < .001.

Na co uważać

  • Nieuwzględniona sezonowość udaje efekt. Program wprowadzony we wrześniu „podnosi” liczbę wizyt, bo w październiku rośnie ona co roku.
  • Porównuj te same miesiące. Zestawienie lipca z listopadem mówi o sezonie, nie o zmianie.
  • Kalendarz się przesuwa. Sesja, święta i ferie nie zawsze wypadają w tym samym miesiącu.

Sezonowy model ARIMA krok po kroku pokazuje wpis Szeregi czasowe w praktyce.

Przykład reprodukowalny

Sezonowość w R

Kod symuluje 6 lat danych miesięcznych, rozkłada szereg metodą STL, liczy autokorelację przy opóźnieniu 12 i porównuje regresję z trendem z regresją z trendem i zmiennymi miesięcy.

Dekompozycja STL, ACF(12) i zmienne miesięcy

Dane wejściowe: 72 miesięczne liczby wizyt w poradni studenckiej z trendem i wzorcem roku akademickiego (dane symulowane, set.seed(2444)).

Co odczytać: składnik sezonowy dla każdego miesiąca, ACF przy opóźnieniu 12 dla zróżnicowanego szeregu, test F porównujący modele i oba R².

R
set.seed(2444)
mies <- rep(1:12, times = 6)                                  # 6 lat danych miesięcznych
efekt <- c(5, 8, 10, 6, 9, -4, -22, -25, 2, 12, 15, -16)      # wzorzec roku akademickiego
wizyty <- ts(round(120 + 0.3 * (1:72) + efekt[mies] + rnorm(72, 0, 6)),
             start = c(2020, 1), frequency = 12)              # wizyty w poradni studenckiej
d <- stl(wizyty, s.window = "periodic")                       # trend + sezonowość + reszta
sez <- d$time.series[1:12, "seasonal"]; names(sez) <- month.abb
round(sez, 1)                                                 # składnik sezonowy (odchylenie od trendu)
round(acf(diff(wizyty), lag.max = 12, plot = FALSE)$acf[13], 2)   # ACF(12) po usunięciu trendu różnicowaniem
czas <- 1:72; miesiac <- factor(mies)
m0 <- lm(wizyty ~ czas); m1 <- lm(wizyty ~ czas + miesiac)
anova(m0, m1)                                                 # czy zmienne miesięcy poprawiają model
round(c(R2_bez = summary(m0)$r.squared, R2_z = summary(m1)$r.squared), 2)
Wynik w R
  Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec 
  6.0   8.4   7.1   4.5   9.3  -3.7 -21.7 -19.3   2.4  10.1  15.5 -18.7 
[1] 0.58
Analysis of Variance Table

Model 1: wizyty ~ czas
Model 2: wizyty ~ czas + miesiac
  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
1     70 13134.0                                  
2     59  2091.2 11     11043 28.324 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R2_bez   R2_z 
  0.16   0.87

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje pakietu stats).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/

Najczęstsze pytania

Czym sezonowość różni się od cyklu?

Sezonowość ma stały, znany okres, np. 12 miesięcy lub 7 dni. Cykl to wahania o zmiennej długości, np. kilkuletnie, których okresu nie da się ustalić z góry.

Ile lat danych potrzeba, żeby ocenić sezonowość?

Potrzebujesz kilku pełnych okresów, bo każdy miesiąc musi wystąpić kilka razy. Przy dwóch latach danych sezonowość trudno odróżnić od przypadkowych zdarzeń w pojedynczym roku.

Jak usunąć sezonowość z danych miesięcznych?

Możesz odjąć składnik sezonowy z dekompozycji STL, zastosować różnicowanie sezonowe (yt − yt−12) albo dodać zmienne miesięcy do regresji. Napisz, którą metodę wybrano.

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Hyndman, R. J., & Khandakar, Y. (2008). Automatic time series forecasting: The forecast package for R. Journal of Statistical Software, 27(3). https://doi.org/10.18637/jss.v027.i03 ● Otwarty dostęp
  2. Jebb, A. T., & Tay, L. (2017). Introduction to time series analysis for organizational research: Methods for longitudinal analyses. Organizational Research Methods, 20(1), 61–94. https://doi.org/10.1177/1094428116668035
  3. Lopez Bernal, J., Cummins, S., & Gasparrini, A. (2016). Interrupted time series regression for the evaluation of public health interventions: A tutorial. International Journal of Epidemiology, 46(1), 348–355. https://doi.org/10.1093/ije/dyw098 ● Otwarty dostęp

Cytowania BibTeX

@article{hyndman2008automatic, author={Hyndman, Rob J. and Khandakar, Yeasmin}, title={{Automatic time series forecasting: The forecast package for R}}, journal={Journal of Statistical Software}, year={2008}, volume={27}, number={3}, doi={10.18637/jss.v027.i03}}
@article{jebb2017introduction, author={Jebb, Andrew T. and Tay, Louis}, title={{Introduction to time series analysis for organizational research: Methods for longitudinal analyses}}, journal={Organizational Research Methods}, year={2017}, volume={20}, number={1}, pages={61--94}, doi={10.1177/1094428116668035}}
@article{lopezbernal2016interrupted, author={Lopez Bernal, James and Cummins, Steven and Gasparrini, Antonio}, title={{Interrupted time series regression for the evaluation of public health interventions: A tutorial}}, journal={International Journal of Epidemiology}, year={2016}, volume={46}, number={1}, pages={348--355}, doi={10.1093/ije/dyw098}}
R