Bu yazıda R Programlama dili ile, Zaman serisi analizinde sıkça kullanılan Çarpımsal Winters Üstel Düzleştirme Yöntemini göreceğiz.
Bir Önceki yazıda Toplamsal Winters Üstel Düzleştirme Yöntemini Görmüştük. Şimdi de Çarpımsal Winters Üstel Düzleştirme Yönteminin nasıl uygulandığına bakalım.
Verinin Tanımlanması ve Zaman Serisinin Oluşturulması
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 |
Serinin Hazırlanması
Zaman Serisinin Oluşturulması
veri_ts <- ts(data = veri$Elektrik_Tuketimi, start = c(1973, 01), end = c(2021, 11), frequency = 12 )
Verimizde gözlemler aylık olduğu için frekans değeri (frequency) 12 olarak belirlenmelidir.
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 Grafiğinin Çizilmesi
! BİLGİ !
Gecikmeli seri: Serilerdeki verilerin dönem kaydırılması işlemi ile ortaya çıkan serilerdir. Zt bir zaman serisi değişkeni ise; bir dönem gecikmeli zaman serisi Zt-1, iki dönem gecikmeli Zt-2 ve k dönem gecikmeli Zt-k ile gösterilir.
Otokorelasyon katsayısı: Zaman serileri ile bu serilerin gecikmeli serileri arasındaki ilişkileri verir.
ACF: Otokorelasyon fonksiyonu (Autocorrelation function) demektir. Otokorelasyon katsayısı değerlerinden oluşur.
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.
Birinci Farkın Alınması
! BİLGİ !
Fark Alınması: Zaman serisinin akışkanlı bir şekilde son değerlerinden belli bir dönem önceki değerlerinin çıkarılması işlemidir. Bu işlem sayesinde serideki trend ya da mevsimsel dalgalanmaları yok etmek mümkün olmaktadır.
veri_birinci_fark <- diff(veri_ts, differences = 1)
Farkı alınmış seri için ACF:
Acf(veri_birinci_fark,lag.max = 42, ylim=c(-1,1), lwd=5,main="Birinci Fark sonrası ACF Grafiği")
MEVSİMSELLİK
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.
WİNTERS ÜSTEL DÜZLEŞTİRME YÖNTEMİ
Diğer yazılarda anlatılan yöntemler, zaman içinde değişmeyen parametre varsayımına uygun serilerin tahminlerinde kullanılmaktaydı. Bir başka deyişle, bu tür seriler deterministik trende sahipti. Ancak birçok zaman serisinin hareketi regresyon doğrusuna ya da eğrisine dönme eğilimi göstermemektedir. Yani, zaman içinde serinin trend yapısı rasgele değişebilmektedir. Bu durumda, regresyon katsayısı sabit bir değer değil her t zamanında değişen değerlere sahip rasgele bir değişken olmaktadır. Böyle bir serinin tahınininin yapılabilmesi için elde edilen son gözlem (T’ inci döneme ait gözlem) değeri ile son döneme ait tahminin güncelleştirilmiş hali kullanılır.
Bu bölümde, zaman içinde değişen parametrelere sahip olan ve bir regresyon doğrusuna ya da eğrisine dönme eğilimi olmadığından tek bir regresyon doğrusu ya da eğrisiyle açıklanamayan, yani kısaca stokastik trende sahip olan serilerin analizi üzerinde durulacaktır.
Zaman Serileri için Üstel Düzleştirme Yöntemi, serinin mevsimsel olup olmamasına göre değişiklik göstermektedir.
Sadece trende sahip seriler (Mevsimsel olmayan) için;
Basit Üstel Düzleştirme Yöntemi
Holt Üstel Düzleştirme Yöntemi gibi yöntemler kullanılabilir.
Hem trende hem de mevsimselliğe sahip seriler için ise Winters Üstel Düzleştirme Yöntemini uygulayabiliriz.
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 Winters Üstel Düzleştirme Yöntemi gösterilecektir.
Winters Üstel Düzleştirme Yöntemi için aşağıdaki formüller kullanılacaktır:
Kaynak: Prof. Dr. Cem Kadılar, Dr. Hatice Öncel Çekim SPSS ve R Uygulamalı Zaman Serileri Analizine Giriş
Çarpımsal Winters Yöntemi
Mevsimsel hareketlerin trende bağlı olarak değiştiği ve trendin bir çarpanı olduğu varsayılmaktadır. Genellikle çarpımsal model tercih edilmektedir.
α, β ve γ’nın Belirlenmesi:
Kurulan model çarpımsal model olacağı için fonksiyon içindeki model değişkeni “MAM” olmalıdır.
Winters2<- forecast::ets(veri_ts, model = "MAM")
summary(Winters2)
## ETS(M,A,M)
##
## Call:
## forecast::ets(y = veri_ts, model = "MAM")
##
## Smoothing parameters:
## alpha = 0.3292
## beta = 9e-04
## gamma = 0.2528
##
## Initial states:
## l = 141713.6213
## b = 564.3679
## s = 0.991 0.958 0.9931 1.0717 1.0836 1.0489
## 0.9816 0.9136 0.9304 0.9685 0.9911 1.0685
##
## sigma: 0.0231
##
## AIC AICc BIC
## 13919.11 13920.19 13993.49
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -378.7723 6176.062 4754.346 -0.2122225 1.822243 0.6141731
## ACF1
## Training set 0.3226722
Model çıktısına bakıldığında:
l = 141713.6213 -> ortalama düzeyin başlangıç değeridir.
b = 564.3679 -> eğimin başlangıç değeridir.
s değerine bakıldığında ise 12 farklı değer (periyot sayımız 12 olduğu için) vardır. Bu değerler mevsimsel terimin başlangıç değerleridir. Başlangıç değerleri kullanılarak Optimal düzleştirme katsayıları,
- α = 0.3292
- β = 0
- γ = 0.2528 olarak elde edilmiştir.
Çarpımsal Winters Modeli HKO
- Hata kareler ortalaması-HKO = 6176.062^2 bulunmuştur.
Tahmin, ACF ve Dağılım Grafikleri:
library(forecast)
checkresiduals(Winters2, lag = 42)
##
## Ljung-Box test
##
## data: Residuals from ETS(M,A,M)
## Q* = 169.05, df = 26, p-value < 2.2e-16
##
## Model df: 16. Total lags used: 42
Tahmin ve Hata Serilerinin Bulunması:
α, β ve γ düzleştirme katsayıları kullanılarak serinin tahmin değerleri aşağıdaki gibi bulunabilir.
tahmin_win2<- Winters2[["fitted"]]
Tahmin edilen ilk 12 değeri (2022 yılı ABD elektrik tüketim tahminlerini) görelim:
ongoru2 <- forecast(Winters2,h=12)
knitr::kable(ongoru2[["mean"]],col.names = "2022 yılı ABD elektrik tüketimi - Çarpımsal Winters Tahminleri", align = "c")
2022 yılı ABD elektrik tüketimi - Çarpımsal Winters Tahminleri |
---|
327095.8 |
340700.8 |
311116.3 |
311409.0 |
288255.3 |
307903.8 |
349996.3 |
395149.7 |
393769.1 |
349813.4 |
318125.3 |
300226.6 |
Tahmin ve Orijinal serileri birlikte çizdirelim:
plot( window(veri_ts),
xlab="Zaman", ylab="",lty=1, col=4, lwd=2)
lines( window(tahmin_win2) ,lty=3,col=2,lwd=3)
legend("topleft",c(expression(paste(Elektrik_Tuketimi)),
expression(paste(Çar.Winters_Tahmini))),
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 Çarpımsal Winters yöntemi ile yapılan tahminlerin 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.
Hata Serisi:
α, β ve γ düzleştirme katsayıları kullanılarak serinin hata değerleri aşağıdaki gibi bulunabilir.
hata_win2<- Winters2[["residuals"]]
plot.ts(hata_win2)
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(hata_win2, 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 gecikmeden üç tanesinin sınırları geçtiği, birinin 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.
Çarpımsal Winter Yöntemi ile elektrik Tüketim Öngörüsü Grafiği:
plot(forecast(Winters2,h=120),main = "Çarpımsal Winter Yönteminin İlerleyen Yıllar İçin Tahminleri")
SONUÇ
Bir önceki adımda görüldüğü üzere;
Hatalar Arasında ilişki olmadığını yani hataların akgürültü olduğunu gördük.
Sonuç olarak ABD’deki aylık elektrik tüketimi serisinin Regresyon analizi için kullanılan Çarpımsal Winters Üstel Düzleştirme Yöntemi uygundur.
Peki hangi model daha iyi?
winters yöntemlerinde kullanılan iki yöntemin de yaptıkları tahminlerin orijinal seri ile karşılaştırmasında uyumlu sonuçlar verdiğini ve bu modellerin tahmin için kullanılabileceğini gördük.
Toplamsal ve Çarpımsal Winters 2022 Tahminleri:
ongoru2022 <- as.data.frame(cbind(ongoru1[["mean"]],ongoru2[["mean"]]))
colnames(ongoru2022) <- c("Toplamsal Winters", "Çarpımsal Winters")
knitr::kable(ongoru2022, align = "c")
Toplamsal Winters | Çarpımsal Winters |
---|---|
327234.9 | 327095.8 |
337517.9 | 340700.8 |
310134.8 | 311116.3 |
309123.1 | 311409.0 |
286408.9 | 288255.3 |
305893.2 | 307903.8 |
349325.4 | 349996.3 |
393799.4 | 395149.7 |
393737.8 | 393769.1 |
348913.6 | 349813.4 |
317616.4 | 318125.3 |
300346.8 | 300226.6 |
ongoru111 <- forecast(Winters1,h=120)
ongoru222 <- forecast(Winters2,h=120)
plot( window(ongoru111[["mean"]]),
xlab="Zaman", ylab="",lty=1, col=4, lwd=2,main = "Toplamsal ve Çarpımsal Winters Yöntemlerinin 10 Yıllık Tahmin Grafiği")
lines( window(ongoru222[["mean"]]) ,lty=3,col=2,lwd=3)
legend("topleft",c(expression(paste(ToplamsalWinters)),
expression(paste(ÇarpımsalWinters))),
lwd=c(2,2),lty=c(1,3), cex=0.7, col=c(4,2))
- İki modelin 2022 yılı elektrik kullanımı tahmin değerlerinin ve 10 yıllık Tahminlerinin yakın olduğunu söyleyebiliriz.
Peki hangi model bu veri için daha iyi?
Bu durumda iki yöntemin de HKO (Hata Kareler Ortalaması) değerlerine bakmamız gerekir.
Toplamsal Winters Yöntemi HKO = 6965.969^2
Çarpımsal Winters Yöntemi HKO = 6176.062^2
Çarpımsal Winters yönteminin HKO’sı, Toplamsal Winters yönteminden küçük olduğu için; Çarpımsal Winters yöntemi seriyi tahmin etmek için daha uygun olan yöntemdir.
Özet
Bu bölümde; Mevsimsel seriler için kullanılan Üstel Düzleştirme yöntemleri ile ABD’deki aylık elektrik tüketimini tahmin etmeye çalıştık. Uyguladığımız iki model de veriyi tahmin etmede iyi sonuçlar verdi. Bu iki model arasında Hata Kareler Ortalaması daha küçük olan Çarpımsal Winters yönteminin daha iyi olduğu sonucuna vardık.
Sonuç olarak ABD’deki aylık elektrik tüketimi serisinin tahmini için
Winters Üstel Düzleştirme yöntemleri uygundur ve kullanılabilir.