Bu yazıda R Programlama dili ile, Zaman serisi analizinde sıkça kullanılan Box-Jenkins Modellerini göreceğiz.
Veri
Analiz boyunca kullanılan veri, ABD Enerji Bilgi Yönetim İdaresi (eia) tarafından 1973-2021 yılları arasında tutulan aylık elektrik tüketimi verisidir.
Veriye buradan ulaşabilirsiniz: Veri / eia
Verinin yüklenmesi:
veri <-read.csv("https://raw.githubusercontent.com/gungorrbaris/zaman-serisi-analizi-R/main/data/Table_7.6_Electricity_End_Use.csv")
knitr::kable(head(veri,n=10), align = "c")
Month | Electricity.End.Use..Total |
---|---|
1973 January | 144505.2 |
1973 February | 139546.1 |
1973 March | 137102.3 |
1973 April | 131365.9 |
1973 May | 131360.9 |
1973 June | 140293.0 |
1973 July | 152562.2 |
1973 August | 157480.8 |
1973 September | 157309.6 |
1973 October | 146042.0 |
Verinin Düzenlenmesi:
Tarih değişkenini Ay-Yıl formatına getirelim:
tarih = seq(from = as.Date("1973-01-01"), to = as.Date("2021-11-01"), by = 'month')
veri$Month <- tarih
veri$Month <-format(veri$Month, "%m-%Y")
knitr::kable(head(veri), align = "c")
Month | Electricity.End.Use..Total |
---|---|
01-1973 | 144505.2 |
02-1973 | 139546.1 |
03-1973 | 137102.3 |
04-1973 | 131365.9 |
05-1973 | 131360.9 |
06-1973 | 140293.0 |
Değişken isimlerini türkçeleştirelim:
colnames(veri) <- c("Tarih","Elektrik_Tuketimi")
knitr::kable(head(veri), align = "c")
Tarih | Elektrik_Tuketimi |
---|---|
01-1973 | 144505.2 |
02-1973 | 139546.1 |
03-1973 | 137102.3 |
04-1973 | 131365.9 |
05-1973 | 131360.9 |
06-1973 | 140293.0 |
Zaman Serisinin Oluşturulması
veri_ts <- ts(data = veri$Elektrik_Tuketimi, start = c(1973, 01), end = c(2021, 11), frequency = 12 )
BOX - JENKİNS MODELLERİ
Box-Jenkins modelleri, bu yazıda anlatılan üstel düzleştirme yöntemlerinin genelleştirilmiş biçimi olup mevsimsel ve mevsimsel olmayan modeller şeklinde ikiye ayrılmaktadır.
Box-Jenkins Yöntemi, sırasıyla seriye uygun modeli belirleme, modelin tahmini, tanısal denetimi ve öngörü işllemlerini içermektedir. Bu işlemlerin yapılabilmesi için öncelikle serinin trentten ve mevsimsel dalgalanmadan arındırılınış olmasına, yani serinin durağan olmasına dikkat edilmelidir.
Durağan olan ya da durağan hale dönüştürülen serinin ACF ve PACF grafiklerine göre seriye uygun olabikecek model belirlenir. Bu belirleme işlemine göre, eğer ACF grafiğindeki ilişki miktarları gecikme sayısı arttıkça yavaş yavaş azalıyor, ama PACF grafiğinde bu azalma bir anda, yani hızlı bir şekilde oluyorsa seriye uygun model otoregresyon modeli olmaktadır. Bunun tam tersi, yani PACF grafiğindeki ilişki miktarları yavaş yavaş azalırken ACF grafiğindeki ilişki miktarları hızlı bir şekilde azalıyorsa model hareketli ortalama modeli olmaktadır. Hem ACF hem de PACF grafıklerinde ilişki miktarlarının azalışı yavaş yavaş olursa model otoregresif hareketli ortalama modeli olmaktadır.
Ancak, bu azalışların hızlı ya da yavaş olduğuna karar verebilmek oldukça güç olup doğru kararların verilebilmesi için de yılların deneyimi gerekmektedir. Bu nedenle, verilen kararın doğru olup olmadığını anlayabilmek için modeldeki katsayıların önemlilik testi sonucuna bakılmaktadır. ACF ve PACF grafıklerinden karar verilen modelin katsayılarından herhangi biri istatistiksel olarak önemsiz ise bu modelin seriye uygun olmadığı anlaşılır. Buradan, grafıklerin yanlış yorumlandığı ortaya çıkar.
Dolayısıyla, model belirleme işleminin devamı olarak modelin katsayılarının tahmini işlemi de önemli olmakta ve bu iki işlem birbirini tamamlamaktadır.
Kaynak: Prof. Dr. Cem Kadılar, Dr. Hatice Öncel Çekim SPSS ve R Uygulamalı Zaman Serileri Analizine Giriş
Buradaki başlıkta; Trende sahip serinin birinci farkını aldığımızda serinin aynı zamanda mevsimselliğe sahip olduğunu ACF grafiğine bakarak açıklamıştık.
Kullandığımız veri mevsimselliğe sahip olduğu için bu bölümde sadece Mevsimsel Box-Jenkins modelleri gösterilecektir.
Mevsimsel Box-Jenkins modelleri üç farklı model barındırır. Bunlar; - mevsimsel otoregresyon (SAR)
- mevsiınsel hareketli ortalama (SMA)
- mevsimsel otoregresif hareketli ortalama (SARMA) modelleridir.
Mevsimsel Box-Jenkins modelleri genelde ARIMA(p,d,q)(P,D,Q)s biçiminde ifade edilmektedir. Burada,
- p otoregresyon (AR) modelinin derecesi,
- d fark alma işlemi sayısı
- q hareketli ortalama (MA) modelinin derecesi
- P mevsimsel otoregresyon (SAR) modelinin derecesi,
- D mevsimsel fark alma işlemi sayısı,
- Q mevsimsel hareketli ortalama (SMA) modelinin derecesi
- s periyot
olmaktadır.
Zaman Serisi Grafiğinin Çizilmesi
ts.plot(veri_ts,gpars=list(xlab="Zaman", ylab="Elektrik Tüketimi"))
Zaman Serisi Grafiğine bakıldığında:
Pozitif yönlü artış vardır. Bu yüzden Serinin artan bir trende sahip olduğunu söyleyebiliriz.
Seride düzenli dalgalanmaların olduğu görülmektedir. Bu seride mevsimsellik olabileceğini gösterir. Daha kesin sonuç için ACF grafiğini çizelim.
ACF ve PACF Grafiğinin Çizilmesi
Seride trendin olduğunu anlamak için ACF grafiğindeki ilk dört gecikmeye bakmak yeterlidir. İlk dört gecikme sınırlar dışındaysa seri için “trende sahiptir” diyebiliriz.
library(fpp)
## Zorunlu paket yükleniyor: forecast
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Zorunlu paket yükleniyor: fma
## Zorunlu paket yükleniyor: expsmooth
## Zorunlu paket yükleniyor: lmtest
## Zorunlu paket yükleniyor: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Zorunlu paket yükleniyor: tseries
Acf(veri_ts,lag.max = 42, ylim=c(-1,1), lwd=5,main="Orijinal veri ACF Grafiği")
ACF Grafiğine bakıldığında:
Tüm gecikmeler (4 gecikme olması yeterlidir) sınırlar dışında olduğu için zaman serisinin trende sahip olduğu söylenebilir. Bu yüzden serinin farkı alınıp durağan hale getirilmelidir.
Trend ile birlikte düzenli dalgalanmaların olduğu gözükse de baskın bir mevsimsellikten şu an için bahsedemeyiz.
Pacf(veri_ts,lag.max = 42, ylim=c(-1,1), lwd=5,main="Orijinal seri PACF Grafiği")
Birinci Farkın Alınması
veri_birinci_fark <- diff(veri_ts, differences = 1)
Farkı alınmış seri için ACF ve PACF:
Acf(veri_birinci_fark,lag.max = 42, ylim=c(-1,1), lwd=5,main="Birinci Fark sonrası ACF Grafiği")
Pacf(veri_birinci_fark,lag.max = 42, ylim=c(-1,1), lwd=5,main="Birinci Fark sonrası ACF Grafiği")
Birinci Farkı alınmış seri için ACF Grafiğine bakıldığında:
- Yine tüm gecikmeler sınırlar dışında olduğu için birinci farkı alınmış zaman serisinin de trende sahip olduğu söylenebilir. Fakat bir öncekine göre bu ACF grafiğinde baskın bir mevsimsellik görülüyor. Dalgalanmalar ve gecikmelerdeki düzenli sıçramalar bunu destekliyor.
Birinci Mevsimsel Farkın Alınması
veri_ts_mev1 <- diff(veri_birinci_fark,12)
Mevsimsel Farkı alınmış seri için ACF ve PACF:
Acf(veri_ts_mev1,lag.max = 42, ylim=c(-1,1), lwd=5,main="Birinci Mevsimsel Fark sonrası ACF Grafiği")
Birinci Mevsimsel Farkı alınmış seri için ACF Grafiğine bakıldığında:
İlk dört gecikmeden sadece iki tanesi sınırları geçtiği için trendin kaybolduğunu söyleyebiliriz.
Düzenli dalgalanmaların dolayısıyla mevsimselliğin de kaybolduğunu söyleyebiliriz. >Seriyi durağan hale getirmek için;
Bir kez fark aldığımız için -> d=1
Bir kez mevsimsel fark adlığımız için -> D=1
Durağan Serinin ACF ve PACF Yorumu:
Acf(veri_ts_mev1,lag.max = 42, ylim=c(-1,1), lwd=5,main="Durağan Seri ACF Grafiği")
Pacf(veri_ts_mev1,lag.max = 42, ylim=c(-1,1), lwd=5,main="Durağan Seri PACF Grafiği")
Durağan hale gelmiş serinin ACF ve PACF Grafiklerine bakıldığında:
ACF deki düşüşün daha sert olduğu söylenebilir. (ilk iki gecikmeler nerdeyse aynı seviyede. üçüncü gecikmelere bakıldığında ACF’deki gecikme PACF’ye göre daha fazladır.)
Fakat bu yorum kesin ve belirgin bir yorum değildir. Grafiklere bakarak modeli anlayabilmek çok zordur. Bu yüzden en iyi modeli bulmak için auto.arima() fonksiyonu kullanılacaktır.
auto.arima() fonksiyonunun sağlıklı çalışabilmesi için parmatrelerin doğru verilmesi gerekmektedir.
d ve D değerlerinin 1 olduğunu göstermiştik. Şimdi de p, q ve Q değerlerini bulalım:
> ACF grafiğine bakıldığında (SMA modelleri) ilk 3 gecikmede 2 gecikmenin sınırları geçtiği görülüyor. Buradan q değerinin maksimum 2 olacağını söyleyebiliriz.
> PACF grafiğine bakıldığında (SAR modelleri) ilk 3 gecikmede 3 gecikmenin sınırları geçtiği görülüyor. Buradan p değerinin maksimum 3 olacağını söyleyebiliriz.
> P ve Q değerlerinin maksimum 3 olacağını söyleyebiliriz.
Sonuç olarak:
q = 1 ve 2
p = 1, 2, ve
3
d = 1
D = 1
Q = 0, 1, 2 ve 3
P = 0, 1, 2 ve 3
değerlerini alabilirler.
Bu değerler ile en iyi modelin kodlarını yazalım:
En İyi SARIMA Modelinin Bulunması
library(forecast)
en_iyi_model <- auto.arima(veri_ts,max.p = 2,max.q = 2,max.P = 3,max.Q = 3,d=1,D=1,seasonal = TRUE,ic = 'aicc')
summary(en_iyi_model)
## Series: veri_ts
## ARIMA(2,1,1)(0,1,1)[12]
##
## Coefficients:
## ar1 ar2 ma1 sma1
## 0.6168 -0.0656 -0.9291 -0.7128
## s.e. 0.0485 0.0466 0.0274 0.0261
##
## sigma^2 = 35020961: log likelihood = -5803.15
## AIC=11616.3 AICc=11616.41 BIC=11638.07
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -101.9441 5831.529 4476.961 -0.05593736 1.694013 0.5783401
## ACF1
## Training set 0.0009559872
Model Özetine bakıldığında:
- En iyi model bulunurken; AR1 ve AR2 Otoregresyon modelleri, MA1 ve SMA1 Hareketli ortalama modelleri kullanımıştır.
- En iyi modelin ARIMA(2,1,1)(0,1,1)[12] olduğu görülmektedir.
- ARIMA(2,1,1)(0,1,1)[12] modelinin AIC değeri 11616.41’dir.
En iyi Modelin Tahmin, Hata ve Öngörüleri:
Tahmin:
tahmin21<- en_iyi_model[["fitted"]]
Hata:
hata21<- en_iyi_model[["residuals"]]
Tahmin ve Orijinal Serinin Birlikte Çizilmesi:
plot( window(veri_ts),
xlab="Zaman (Yıl)", ylab="",lty=1, col=4, lwd=2)
lines( window(tahmin21) ,lty=3,col=2,lwd=3)
legend("topleft",c(expression(paste(Elektrik_Tüketimi)),
expression(paste("ARIMA(2,1,1)(0,1,1)[12]"))),
lwd=c(2,2),lty=c(1,3), cex=0.7, col=c(4,2))
Zaman Serisi Grafiğine bakıldığında:
Tahmin ile orijinal seri arasında uyum olduğu görülmektedir. Yani görsel olarak Box-Jenkins yöntemi ile kurulan modelin tahminlerinin gerçeğe yakın olduğunu söyleyebiliriz.
Fakat emin olmak için hataların akgürültü olup olmadığına bakmamız gerekmektedir.
Hatalar Akgürültü mü?
Ho: Hatalar Akgürültüdür.(Hatalar arasında ilişki yoktur.)
H1: Hatalar Akgürültü değildir.(Hatalar arasında ilişki vardır.)
Hatalar için ACF Grafiği:
Acf(hata21, lag.max = 42, ylim=c(-1,1), lwd=5,main="Hatalar için ACF Grafiği")
Hatalar için ACF Grafiğine bakıldığında:
İlk dört gecikmenin de sınırlar içinde kaldığı görülmektedir.
Hataların akgürültü olduğunu söyleyebiliriz. Yani Hatalar arasında ilişki yoktur. Kurulan model tahmin etmede kullanılabilir.
ARIMA Modeli ile 2022 yılının elektrik Tüketim Öngörüsü:
ongoru21<- forecast(en_iyi_model, h=12)
knitr::kable(ongoru21[["mean"]],col.names = "ARIMA(2,1,1)(0,1,1)[12] Modelinin 2022 için aylık Elektrik Tüketim Tahminleri",align = "c")
ARIMA(2,1,1)(0,1,1)[12] Modelinin 2022 için aylık Elektrik Tüketim Tahminleri |
---|
327038.8 |
339054.7 |
308118.3 |
307515.3 |
283593.8 |
301561.5 |
342029.5 |
386849.5 |
387040.2 |
344870.4 |
313781.8 |
296237.2 |
ARIMA Modeli ile elektrik Tüketim Öngörüsü:
plot(forecast(en_iyi_model,h=120),main = "ARIMA(2,1,1)(0,1,1)[12] modelinin İlerleyen Yıllar İçin Tahminleri")
Özet
Bu bölümde; Box-Jenkins modelleri ile ABD’deki aylık elektrik tüketimini tahmin etmeye çalıştık. Fonksiyon yardımı ile bulduğumuz en iyi model veriyi tahmin etmede iyi sonuçlar verdi.
Sonuç olarak ABD’deki aylık elektrik tüketimi serisinin tahmini için
Box-Jenkins modelleri uygundur ve kullanılabilir.