R ile Mevsimsel Zaman Serilerinde Box-Jenkins Modelleri (ARIMA)

Ramazan Erduran
9 min readDec 31, 2022

--

Box-Jenkins Modelleri nedir? Bu modeller nasıl kurulur? Gelecek zamana ilişkin tahminler nasıl elde edilir?

Photo by Andrew Neel

Bu yazımda bahsedeceğim başlıkları aşağıda bulabilirsiniz.

  1. Box-Jenkins modelleri nedir ne değildir ?
  2. Mevsimsel Otoregresyon modelleri (SAR)
  3. Bütünleşik Otoregresif Hareketli Ortalama (ARIMA)
  4. R Programlamada ARIMA modelleri ile tahminleme yapma
  5. Kaynakça

Box-Jenkins Modelleme

Box-Jenkins modelleme, bir tahmini modelleme yöntemidir ve genellikle zaman serilerinde tahmin etme amacıyla kullanılır. Bu yöntem, Arthur Box ve George Jenkins tarafından 1970'lerde geliştirilmiştir ve günümüzde hala zaman serisi tahmini modellerinin inşasında yaygın olarak kullanılmaktadır.

Box-Jenkins modelleme yönteminin en büyük avantajı, tahminlerinin oldukça hassas olmasıdır. Ancak, bu yöntem için veri kümesinin büyüklüğü ve kalitesi önemlidir, çünkü ARIMA modelinin oluşturulması için yeterli veriye ihtiyaç vardır. Ayrıca, bu yöntem uygulanırken, verilerin düzenlenmesi ve modelin parametrelerinin belirlenmesi gibi birçok adım gerekir ve bu adımları yaparken dikkatli olunması gerekir.

Mevsimsel Otoregresyon Modeli (SAR)

Mevsimsel otoregresyon (Seasonal Autoregression, SAR) modeli, bir zaman serisinde mevsimler arasındaki ilişkileri modellemeyi amaçlar. Bu model, bir zaman serisinin belirli bir mevsimdeki değerini, o mevsimin önceki yıllarındaki değerlerine göre tahmin etmeyi amaçlar.

Örneğin, bir şirketin ürün satışlarının belirli bir mevsimdeki değerini, o mevsimin önceki yıllarındaki satışlarına göre tahmin etmek isteyebilirsiniz. SAR modelinin genel formülü aşağıdaki gibidir:

Yt = c + ΣφiYt-i + ΣθiZt-m-i + εt

Bu formülde:

  • Yt: Belirli bir zaman noktasında (t) oluşan değerdir.
  • c: Sabit bir terimdir.
  • Σφi: Otoregresyon terimleridir ve Y değişkeninin kendi önceki değerlerine göre tahmin etmeyi amaçlar.
  • Σθi: Mevsimsel otoregresyon terimleridir ve Z değişkeninin (belirli bir mevsimin önceki yıllarındaki değerleri) Y değişkenine göre tahmin etmeyi amaçlar.
  • εt: Hata terimidir ve modelin tahminlerinin gerçek değerlerden ne kadar farklı olduğunu gösterir.

Bu tür modeller, günlük hayattaki zaman serilerini açıklamak için genellikle yeterli olmamaktadır. Dolayısıyla, çarpımsal Box-Jenkins modelleri diye adlandır; mevsimsel ve mevsimsel olmayan bileşenleri içeren modellere gerek duyulmaktadır. Bu tür modellere örnek olarak ARIMA(p,d,q)(P,D,Q)12 modelleri verilebilir.

Bu tür bir model hem AR hem de SAR terimini içermektedir. Dolayısıyla bu modelde bu iki terimin etkileşimi de olmaktadır.

Bütünleşik Otoregresif Hareketli Ortalama (ARIMA)

ARIMA modeli, bir zaman serisinin gelecekteki değerlerini tahmin etmek için kullanılır. Bu model, zaman serisi verilerinin düzenleyicisi olarak bir autoregressive (AR) modeli, zaman serisinin yönlendirici olarak bir moving average (MA) modeli ve zaman serisinin düzenlenmesi için bir integrated (I) modeli kullanır. Bu üç modelin birleşiminden oluşan ARIMA modeli, zaman serisinin gelecekteki değerlerini tahmin etmek için kullanılır.

R Programlamada ARIMA Modelleri ile Öngörüde Bulunma

Öncelikle zaman serimizi import edip field tanımlayalım

path = 'dataset.csv'
df <- read.csv(path)

df[,1] <- as.POSIXct(df[,1], format = "%Y-%m-%d %H:%M:%S")
rownames(df) <- df$Date
df$Date <- NULL
View(df)
Time Series

Zaman serisi grafiği çizdirip veri hakkında ön çıkarımlar elde edelim

library(ggplot2)
library(dplyr)

# Most basic bubble plot
p <- ggplot(df, aes(x=Date, y=Energy)) +
geom_line()
p
Time Series Plot

Grafikten görüleceği üzere trendi olmayan ancak mevsimselliği olan bir serimiz varmış elimizde. Ancak bizim trende de sahip bir veriye ihtiyacımız vardı. Bakalım gerçekten de trende sahip olup olmadığı konusundaki görüşümüz doğru muymuş?

ACF (Auto Correlation Function) grafiğini çizdirerek incelemeye devam edelim.

Acf(df, lag.max = 60,  ylim=c(-1,1), lwd=3)

Yukarıdaki kodda lag.max parametresini 60'a eşitlememin sebebi periyodu tam olarak bulup işlemimize daha doğru bir şekilde devam etmek

ACF Grafiği

Yukarıdaki ACF grafiğinden yapabileceğimiz yorumlar:

  1. İlk 4 gecikme CI (güven aralığı) dışında olduğundan trent vardır.
  2. Her 18 gecikmede 1 sıçrama yapması sayesinde ise periyodu 18 olarak belirleyebiliriz.

Şeklinde olacaktır. Yani neymiş ilk baştaki grafikten trent yoktur derken hatalıymışız.

Bu durumda serimizi trendden arındırıp durağanlaştırmak için serimizin 1. farklarını almalıyız. Ayrıca periyodu 18 belirlediğimiz için veri setimizi periyodu 18 olan bir zaman serisi olarak da tanımlamalıyız:

# periyodu 18 olan zaman serisi tanımlaması
df <- ts(df, frequency = 18)

# serinin 1. farklarının alınması
df_1 <- diff(df)
Acf(df_1, lag.max = 42, ylim=c(-1,1), lwd=3, main="1. Farkları Alınmış Serinin ACF Grafiği")
1. Farkları Alınmış Serinin ACF Grafiği

Yukarıdaki grafikte görüldüğü üzere ilk 4 gecikmenin hepsi CI dışına çıkamamış bu nedenle trendden arındırdığımızı söyleyebiliriz.

Şimdi sıra mevsimsellikten arındırmada:

season <- rep(1:18, length.out = 144)
df_2 <- df_1 - ave(df_1, season, FUN = mean)

Acf(df_2, lag.max = 42, ylim=c(-1,1), lwd=3)
Mevsimsel Farkı Alınmış Serinin ACF Grafiği

Yukarıdaki ACF grafiğinden hareketle söyleyebiliriz ki artık serimizi trendden ve mevsimsellikten arındırdık.

Trendden ve mevsimsellikten arındırmayı ne için yaptık? Bu önemli bir soru.

Bu soruya cevabımızı şu şekilde verebiliriz. Serimizi durağanlaştırmak için kaç defa fark işlemi yaptığımızın sayısı bizim ARIMA modellerini kurarken ki “d” değerimizi verir. Ayrıca mevsimsellikten kurtulmak için kaç defa mevsimsel fark aldığımız ise mevsimsel ARIMA modeli için “D” değerini verir.

Hazır ufaktan açıklamamızı yapmışken ARIMA modelimizi kurarkenki parametrelerimizi nasıl belirleyeceğimizi öğrenelim:

Modelimiz: ARIMA(p,d,q)(P,D,Q)s

  • d: Zaman serisini trendden arındırmak için uygulanan fark işlemi sayısı (d=1)
  • D: Zaman serisini mevsimsellikten arındırmak için uygulanan mevsimsel fark işlemi sayısı (D=1)

Diğer parametrelere geçerken bir açıklamam olacak. Serimizin ACF ve PACF grafiklerini çizdirdiğimizde ilk 3 değişkenine bakacağız. Hangisinin gecikmeleri diğerine göre daha hızlı (aniden) azalıyor:

  • Eğer ACF grafiğinin ilk 3 gecikmesi PACF ‘nin ilk 3 gecikmesinden daha hızlı (aniden) azalıyorsa modelimiz MA(q) modelidir. Bu durumda “p” değişkenine sıfır verilip “q” değişkeni için inceleme yapılır.
  • Eğer PACF, ACF ‘den daha hızlı (aniden) azalıyorsa modelimiz AR(p) modelidir. Bu durumda “q” değişkenine sıfır verilip “p” değişkeni için inceleme yapılır.
  • ACF ve PACF ‘nin azalma hızı eşit ise modelimiz ARMA(p,q) modelidir. Bu durumda her iki değişken için de (“p”, “q”) inceleme yapmak gerekir.
Acf(df_2, lag.max = 42,  ylim=c(-1,1), lwd=3, main="ACF")
Pacf(df_2, lag.max = 42, ylim=c(-1,1), lwd=3, main="PACF")
PACF & ACF

Yukarıdaki ACF ve PACF grafiklerinden çıkarım olarak iki grafiğin de aynı hızda azaldığını söyleyebiliriz.

  • q: Her zaman ACF grafiğinden incelenir. ACF grafiğinin ilk üç gecikmesinin kaç tanesi CI dışında ise q ona eşitlenir (q=0).
  • p: Her zaman PACF grafiğinden incelenir. PACF grafiğinin ilk üç gecikmesinin kaç tanesi CI dışında ise p ona eşitlenir (p=0).

Modelimiz şimdilik ARIMA(0,1,0)(P,1,Q) şeklini aldı. “P” ve “Q” değişkenlerini ise deneyerek bulacağız.

Öncelikle denemeye başlayacağımız noktayı şu şekilde belirleyeceğiz.

ACF grafiğinden periyodumuzu kaç olarak bulduysak onun 1 önceki ve 1 sonraki gecikmesinin yönlerine bakacağız (+-). Periyodumuzu 18 olarak bulmuştuk o zaman:

Acf(df, lag.max = 42,  ylim=c(-1,1), lwd=3)
ACF Grafiği

Periyodumuzu 18 olarak belirlemiştik bu nedenle 17. ve 19. gecikmelere baktığımızda ikisi de pozitif (aynı) yönde yer alıyor. Buradan çıkarım olarak ARIMA modelimizin mevsimsellik kısmını 1'den başlatıp 3'e kadar deneyeceğiz.

Ancak bir diğer husus ise “P” değişkenini 1'den 3'e kadar denerken “Q” ‘yu 0 olarak almlıyız. Aynı durum “Q” ‘yu denerken “P” için de geçerli.

Modellerimizi denemeye başlayalım. Modelleri denerken istatistiksel olarak anlamlı olan modelleri toplayıp hatalarının “akgürültü” serisi olup olmadığına bakacağız.

Hataların akgürültü serisi olması demek, hataların ACF grafiğinde hiçbir gecikmenin CI dışına çıkmaması gerekiyor.

Hem anlamlı hem de hataları “akgürültü” serisi olan modellerden en küçük hataya sahip modeli asıl modelimiz olarak seçelim:

Model-1 : ARIMA(0,1,0)(1,1,0)

ARIMA1 <- Arima(df, order=c(0,1,0), seasonal=c(1,1,0), include.constant = TRUE)
coeftest(ARIMA1)
ARIMA(0,1,0)(1,1,0)

H0: Modelin anlamlılığı = 0
H1: Modelin anlamlıdır.

Yukarıdaki coeftest(ARIMA1) çıktımıza göre yokluk hipotezini reddedebiliriz. Yani %95 güvenle söylenebilir ki 1. modelimiz anlamlıdır.

Model anlamlı olma şartını sağladı bakalım hataları da “akgürültü” serisi mi?

Acf(ARIMA1$residuals, lag.max = 42,  ylim=c(-1,1), lwd=3, main="1. ARIMA Modelinin ACF Grafiği")
1. ARIMA Modelinin ACF Grafiği

Sanki 40. gözlem CI dışına çıkıyor gibi. Bundan emin olmak için “Box-Ljung” testi yapmalıyız:

H0: 1. ARIMA modelinin hataları akgürültü serisidir.
H1: 1. ARIMA modelinin hataları akgürültü serisi değildir.

Box.test(ARIMA1$residuals, lag = 42, type = "Ljung")
1. ARIMA Modeli Box-Ljung Testi

Box-Ljung testi sonucuna göre %95 güvenle söyleyebiliriz ki 1. ARIMA modelimizin hataları akgürültü serisidir.

Modelin anlamlı olması şartı ile hatalarının akgürültü olması şartını sağlayan 1. ARIMA modelimizi daha sonra modeller arası elemeye alabiliriz o zaman modelimizin skorlarını alalım:

summary(ARIMA1)
1. ARIMA Skorları

Yukarıda 1. ARIMA modelinin skorları yer alıyor. Ben modellerimi kıyaslamak için BIC (Bayesian Bilgi Kriterleri) ve RMSE (Hata Kareler Ortalaması Karekökü) değerlerini baz alacağım.

ARIMA(0,1,0)(1,1,0) modeli sonuçları:

  • BIC = 1542.41
  • RMSE = 102.2535

Model-2 : ARIMA(0,1,0)(2,1,0)

Bir önceki modelde yaptığımızdan parkı olarak ARIMA modelini kurarken “P” değişkenine 1 yerine 2 vereceğiz:

ARIMA2 <- Arima(df, order=c(0,1,0), seasonal=c(2,1,0), include.constant = TRUE)
coeftest(ARIMA2)
ARIMA(0,1,0)(2,1,0)

H0: 2. ARIMA modelinin anlamlılı = 0
H1: 2. ARIMA modeli anlamlıdır.

P-value < alfa=0.05 için %95 güvenle söyleyebiliriz ki modelimiz anlamlıdır. İkinci şartın testini yapalım:

Acf(ARIMA2$residuals, lag.max = 42,  ylim=c(-1,1), lwd=3, main="2. ARIMA Modelinin ACF Grafiği")
2. ARIMA Modelinin ACF Grafiği

38. gecikme sanki CI dışına çok az çıkmış gibi, Box-Ljung testi uygulayalım:

H0: 2. ARIMA modelinin hataları akgürültü serisidir.
H1: 2. ARIMA modelinin hataları akgürültü serisi değildir.

Box.test(ARIMA2$residuals, lag = 42, type = "Ljung")
2. ARIMA Modeli Box-Ljung Testi

%95 güvenle söyleyebiliriz ki 2. ARIMA modelimizin hataları akgürültü serisidir.

summary(ARIMA2)
2. ARIMA Skorları

ARIMA(0,1,0)(2,1,0) modeli sonuçları:

  • BIC = 1542.19
  • RMSE = 99.38836

Model-3 : ARIMA(0,1,0)(3,1,0)

ARIMA3 <- Arima(df, order=c(0,1,0), seasonal=c(3,1,0), include.constant = TRUE)
coeftest(ARIMA3)
3. ARIMA Model Anlamlılığı

Mavi ile kırmızı kutuların kesişiminde “sar3” değişkeni anlamsız olarak çıkıyor bu nedenle, 3. model için diğer incelemeleri yapmamıza gerek kalmıyor 3. modeli çöpe atabiliriz.

Şimdi sırada “P” değişkenine 0 veri “Q” değişkenini denemek kalıyor.

Model-4 : ARIMA(0,1,0)(0,1,1)

ARIMA4 <- Arima(df, order=c(0,1,0), seasonal=c(0,1,1), include.constant = TRUE)
coeftest(ARIMA4)
4. ARIMA Model Anlamlılığı

H0: 4. ARIMA modelinin anlamlılığı = 0
H1: 4. ARIMA modeli anlamlıdır.

%95 güvenle yukarıdaki çıktıdan yararlanarak söyleyebiliriz ki 4. ARIMA modelimiz anlamlıdır.

Acf(ARIMA4$residuals, lag.max = 42,  ylim=c(-1,1), lwd=3, main="4. ARIMA Modeli ACF Grafiği")
4. ARIMA Modeli ACF Grafiği

4. Modelin hatalarının akgürültü serisi olduğundan emin olmak için Box-Ljung testi yapalım:

H0: 4. ARIMA modelinin hataları akgürültü serisidir.
H1: 4. ARIMA modelinin hataları akgürültü serisi değildir.

Box.test(ARIMA4$residuals, lag = 42, type = "Ljung")
4. ARIMA Box-Ljung

%95 güvenle söylenebilir ki 4. ARIMA modelinin hataları akgürütü serisidir.

Modelin skorları:

summary(ARIMA4)
4. ARIMA Modeli Skorları

ARIMA(0,1,0)(0,1,1) modeli sonuçları:

  • BIC = 1538.64
  • RMSE = 100.1105

Model-5 : ARIMA(0,1,0)(0,1,2)

ARIMA5 <- Arima(df, order=c(0,1,0), seasonal=c(0,1,2), include.constant = TRUE)
coeftest(ARIMA5)
5. ARIMA Modeli Anlamlılığı

yeni eklediğimiz değişkenin P-değeri > 0.05 için söyleyebiliriz ki 5. ARIMA modelimiz anlamlı değildir. Bu nedenle bu model de çöp artık model denemeye gerek yok.

Modellerin Değerlendirilmesi ve Öngörülerin Yapılması

  1. ARIMA(0,1,0)(1,1,0) modeli sonuçları:
    - BIC = 1542.41
    - RMSE = 102.2535
  2. ARIMA(0,1,0)(2,1,0) modeli sonuçları:
    - BIC = 1542.19
    - RMSE = 99.38836
  3. ARIMA(0,1,0)(0,1,1) modeli sonuçları:
    BIC = 1538.64
    RMSE = 100.1105

Yukarıdaki metriklere göre seçtiğim model ARIMA(0,1,0)(2,1,0) oluyor.

Şimdi bu modeli kurarak önümüzdeki 5 dönemin öngörüsünü yapalım:

model <- Arima(df, order=c(0,1,0), seasonal=c(2,1,0), include.constant = TRUE)
ongoru <- forecast(ARIMA2, h=5)
ongoru[['mean']]
Öngörüler

Yukarıdaki çıktımızdan önümüzdeki 5 döneme ilişkin öngörülerimiz oluşturduk ve kırmızı ile çizilmiş alandaki değerleri elde ettik.

Kaynakça

  1. Prof. Dr. Cem Kadılar ve Dr. Hatice Öncel Çekim. Zaman Serileri Analizine Giriş (Seçkin Yayıncılık, 2020, 3. Baskı), 242–336

--

--