R ile Mevsimsel Zaman Serilerinde Box-Jenkins Modelleri (ARIMA)
Box-Jenkins Modelleri nedir? Bu modeller nasıl kurulur? Gelecek zamana ilişkin tahminler nasıl elde edilir?
Bu yazımda bahsedeceğim başlıkları aşağıda bulabilirsiniz.
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)
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
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
Yukarıdaki ACF grafiğinden yapabileceğimiz yorumlar:
- İlk 4 gecikme CI (güven aralığı) dışında olduğundan trent vardır.
- 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")
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)
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")
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)
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)
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")
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")
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)
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)
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")
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")
%95 güvenle söyleyebiliriz ki 2. ARIMA modelimizin hataları akgürültü serisidir.
summary(ARIMA2)
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)
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)
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. 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")
%95 güvenle söylenebilir ki 4. ARIMA modelinin hataları akgürütü serisidir.
Modelin skorları:
summary(ARIMA4)
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)
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ı
- ARIMA(0,1,0)(1,1,0) modeli sonuçları:
- BIC = 1542.41
- RMSE = 102.2535 - ARIMA(0,1,0)(2,1,0) modeli sonuçları:
- BIC = 1542.19
- RMSE = 99.38836 - 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']]
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
- 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