Bu yazıda R Programlama dili ile, Zaman serisi analizinde sıkça kullanılan Regresyon Analizini, Toplamsal Model ile Uygulayacağız.
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.
REGRESYON ANALİZİ
Zaman Serileri için Regresyon Analizinde, serinin mevsimsel olup olmamasına göre yöntemler değişiklik göstermektedir.
</blockquote>Sadece trende sahip seriler (Mevsimsel olmayan) için;
Basit Doğrusal Regresyon
Birinci Farklar Regresyon Modeli
Üstel Regresyon Modeli
Karesel Regresyon Modeli
Lojistik Regresyon Modeli
Kübik Regresyon Modeli
gibi yöntemler kullanılabilir.
Hem trende hem de mevsimselliğe sahip seriler için ise önceki yazıda gördüğümüz Toplamsal Ayrıştırma Yönteminden yararlanarak Regresyon analizini 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 Mevsimsel Serilerde Regresyon Analizi yöntemleri gösterilecektir.
Toplamsal Model İle Regresyon Analizi
! BİLGİ !
Eğer bir seride hem trent hem de mevsimsellik var ise bu seriye uygulanacak regresyon modeli
biçiminde olmaktadır.
m: serinin trendinin yapısına göre polinom derecesidir.
- m=l doğrusal trende sahip seri içindir.
- m=2 karesel regresyona modeline uygun trende sahip seri içindir.
- m=3 kübik regresyon modeline uygun trende sahip seri içindir.
Formüldeki ilk ∑ ifadesi: serinin trend bileşenini açıklar.
s:periyot olmak üzere [s /2] periyodun yarısının tamsayı kısmını gösterir. Örneğin, periyot 9 ise [s /2], 4 olmaktadır.
Burada j indisli toplam, yani köşeli parantez içindeki sinüs ve kosinüs fonksiyonları serinin mevsimsel bileşenini açıklamaktadır. Her regresyon modelinde olduğu gibi bu regresyon denkleminde de tüm katsayıların istatistiksel olarak önemli olması gerekmektedir.
Sinüs ve kosinüs çiftine harmonik adı verilmektedir. Böylece, j=l için birinci harmonik, j=2 için ikinci harmonik şeklinde j= [s /2] oluncaya kadar regresyon denklemine harmonik eklenir. Ancak her ekleme sonucunda ci ve di regresyon katsayılarının önemlilik kontrolü yapılır.
Bu regresyon katsayılarından biri önemsiz olduğunda harmonik ekleme işlemine son verilir ve önemsiz olan regresyon katsayısına ait terim modelden atılarak serinin tahmininde katsayılarının hepsi önemli olan regresyon modeli kullanılır.
Uygulama verilerinde genellikle sadece birinci harmonikler seriyi açıklamada yeterli olmaktadır. Dolayısıyla, genellikle ikinci harmonikler regresyon modeline eklenmemektedir. Ayrıca, j= [s/2] için periyot çift sayı iken sinüs fonksiyonu, yani sin(nt) hep 0 değerini alacağından ilgili harmonikte sinüs serisinin oluşturulmamasına ve regresyon modeline eklenmemesine dikkat edilmelidir.
Kaynak: Prof. Dr. Cem Kadılar, Dr. Hatice Öncel Çekim SPSS ve R Uygulamalı Zaman Serileri Analizine Giriş
t, Sin ve Cos Terimlerinin oluşturulması
Serimiz, hem trende hem de mevsimsel dalgalanmaya sahip olduğundan regresyon modelinin; t, sinüs ve kosinüs terimlerini içermesi gerekmektedir.
t <- 1: 1: 587
Veride 144 gözlem bulunduğu için bu değerler girilmiştir.
sin1<-sin(2*3.1416*t/12)
cos1<-cos(2*3.1416*t/12)
Sin ve Cos değerleri bulunurken yazılan formüldeki 12 değeri, daha önceki bölümlerde bulduğumuz periyottur.
veri, t, sin ve cos terimleri ile yeni bir veri oluşturulur:
veri_mev_yeni <- as.data.frame(cbind(veri_ts, t, sin1, cos1))
names(veri_mev_yeni)<- c("y", "t", "sin1", "cos1")
knitr::kable(head(veri_mev_yeni), align = "c")
y | t | sin1 | cos1 |
---|---|---|---|
144505.2 | 1 | 0.5000011 | 0.8660248 |
139546.1 | 2 | 0.8660266 | 0.4999979 |
137102.3 | 3 | 1.0000000 | -0.0000037 |
131365.9 | 4 | 0.8660230 | -0.5000042 |
131360.9 | 5 | 0.4999947 | -0.8660285 |
140293.0 | 6 | -0.0000073 | -1.0000000 |
Regresyon Modelinin Oluşturulması
Birinci Harmonik
Oluşturulan yeni veri ile regresyon analizi yapılır.
regresyon.model1<-lm(data = veri_mev_yeni, y ~ t+sin1+cos1)
summary(regresyon.model1)
##
## Call:
## lm(formula = y ~ t + sin1 + cos1, data = veri_mev_yeni)
##
## Residuals:
## Min 1Q Median 3Q Max
## -76521 -16912 -2573 17977 67127
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 149688.507 2123.682 70.485 < 2e-16 ***
## t 367.920 6.259 58.787 < 2e-16 ***
## sin1 -14720.908 1498.521 -9.824 < 2e-16 ***
## cos1 -7451.091 1500.895 -4.964 9.06e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 25690 on 583 degrees of freedom
## Multiple R-squared: 0.8605, Adjusted R-squared: 0.8598
## F-statistic: 1199 on 3 and 583 DF, p-value: < 2.2e-16
Birinci Harmonik için Regresyon modeli sonucuna göre:
Coefficients kısmındaki p değerlerinin hepsi < α =0.05 olduğundan, modeldeki tüm terimlerin önemli olduğunu söyleyebiliriz.
p-value değeri < α =0.05 olduğundan kurulan regresyon modelinin anlamlı olduğunu söyleyebiliriz.
İkinci Harmonik
Birinci harmonikte tüm terimler anlamlı çıktığından ikinci harmonikte de regresyon denklemine katılırlar.
Sin, Cos Terimlerinin oluşturulması:
sin2<-sin(2*3.1416*2*t/12)
cos2<-cos(2*3.1416*2*t/12)
Yeni Verinin Oluşturulması:
Yeni veri oluşturulurken birinci harmonikte kullanılan sin ve cos değerleri de eklenir.
veri_mev_yeni2 <- as.data.frame(cbind(veri_ts, t, sin1, cos1, sin2, cos2))
names(veri_mev_yeni2)<- c("y", "t", "sin1", "cos1", "sin2", "cos2")
knitr::kable(head(veri_mev_yeni2), align = "c")
y | t | sin1 | cos1 | sin2 | cos2 |
---|---|---|---|---|---|
144505.2 | 1 | 0.5000011 | 0.8660248 | 0.8660266 | 0.4999979 |
139546.1 | 2 | 0.8660266 | 0.4999979 | 0.8660230 | -0.5000042 |
137102.3 | 3 | 1.0000000 | -0.0000037 | -0.0000073 | -1.0000000 |
131365.9 | 4 | 0.8660230 | -0.5000042 | -0.8660303 | -0.4999915 |
131360.9 | 5 | 0.4999947 | -0.8660285 | -0.8660193 | 0.5000106 |
140293.0 | 6 | -0.0000073 | -1.0000000 | 0.0000147 | 1.0000000 |
İkinci Harmonik için regresyon modelinin kurulması:
regresyon.model2<-lm(data= veri_mev_yeni2, y ~ t+sin1+cos1+sin2+cos2)
summary(regresyon.model2)
##
## Call:
## lm(formula = y ~ t + sin1 + cos1 + sin2 + cos2, data = veri_mev_yeni2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -60416 -12872 -180 15512 48319
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 149491.070 1663.554 89.862 < 2e-16 ***
## t 368.601 4.903 75.186 < 2e-16 ***
## sin1 -14718.377 1173.821 -12.539 < 2e-16 ***
## cos1 -7445.983 1175.687 -6.333 4.81e-10 ***
## sin2 22502.242 1173.708 19.172 < 2e-16 ***
## cos2 1480.181 1175.687 1.259 0.209
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20120 on 581 degrees of freedom
## Multiple R-squared: 0.9147, Adjusted R-squared: 0.914
## F-statistic: 1246 on 5 and 581 DF, p-value: < 2.2e-16
İkinci Harmonik için Regresyon modeli sonucuna göre:
Coefficients kısmındaki cos2 terimi dışındaki p değerlerinin hepsi < α =0.05 olduğundan, cos2 dışındaki terimlerin önemli olduğunu söyleyebiliriz.
p-value değeri < α =0.05 olduğundan kurulan regresyon modelinin anlamlı olduğunu söyleyebiliriz.
cos2 terimi katsayısı = 0.209 > α =0.05 olduğu için, cos2 terimine ait katsayının anlamsız olduğunu söyleyebiliriz.
Bu durumda cos2 değişkeni çıkarılarak tekrardan model anlamlılığına bakılır.
cos2 teriminin olmadığı modelin oluşturulması:
regresyon.model3<-lm(data= veri_mev_yeni2, y ~ t+sin1+cos1+sin2)
summary(regresyon.model3)
##
## Call:
## lm(formula = y ~ t + sin1 + cos1 + sin2, data = veri_mev_yeni2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -61153 -12957 35 15170 47578
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 149488.533 1664.389 89.816 < 2e-16 ***
## t 368.601 4.905 75.148 < 2e-16 ***
## sin1 -14718.379 1174.411 -12.533 < 2e-16 ***
## cos1 -7451.037 1176.271 -6.334 4.77e-10 ***
## sin2 22502.238 1174.298 19.162 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20130 on 582 degrees of freedom
## Multiple R-squared: 0.9145, Adjusted R-squared: 0.9139
## F-statistic: 1555 on 4 and 582 DF, p-value: < 2.2e-16
Modelin Anlamlılığı:
Ho: Model Anlamsızdır.
H1: Model Anlamlıdır.
- p-value değeri < α =0.05 olduğundan Ho RED. Kurulan regresyon modelinin anlamlı olduğunu söyleyebiliriz.
Durbin-Watson Testi:
Ho: Otokorelasyon sorunu yoktur.
H1: Otokorelasyon sorunu
vardır.
library(fpp)
dwtest(data= veri_mev_yeni2, y ~ t+sin1+cos1+sin2)
##
## Durbin-Watson test
##
## data: y ~ t + sin1 + cos1 + sin2
## DW = 0.3644, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Durbin-Watson Test sonucuna göre:
- DW= 0,3644 değeri 2 ye yakın bir değer olmadığı için (p = 0 < α =0.05) Ho RED. Otokorelasyon sorunu vardır.
Toplamsal Model ile kurulan Regresyon Analizinin Denklemi :
Zt = 149488.533 + 368.601t - 14718.379sin(2πt/12) - 7451.037cos(2πt/12) + 22502.238sin(4πt/12) + εi olur.
Kurulan Model İçin Tahmin, Hata ve Tahminin Sınır Serileri
Zt = 149488.533 + 368.601t - 14718.379sin(2πt/12) - 7451.037cos(2πt/12) + 22502.238sin(4πt/12) + εi modeli için:
Tahmin:
tahmin_model3<-predict(regresyon.model3)
plot.ts(tahmin_model3)
Alt ve Üst Sınırlar:
sinir_model3<-predict(regresyon.model3, interval = 'confidence' ,level = .95)
plot.ts(sinir_model3)
Hata:
hata_model3<-resid(regresyon.model3)
plot.ts(hata_model3)
Gerçek Elektrik Tüketimi ve Tahmin Sınırlarının Birlikte Çizilmesi
plot( window(veri_mev_yeni2$y),
xlab="", ylab="", type="l", lty=3, col=2, lwd=2)
lines(window(sinir_model3[,2]) ,type="l",lty=1,col=4,lwd=2)
lines(window(sinir_model3[,3]) ,type="l",lty=1,col=3,lwd=2)
legend("topleft",c(expression(paste(Elektri_Tüketimi)),
expression(paste(Altsinir)),
expression(paste(Üstsinir))),
lwd=c(2,2,3),lty=c(3,1,2), cex=0.7, col=c(2,4,3))
Modelin Güvenirliği
Toplamsal Regresyon modelinin orijinal seri üzerinde geçerli bir model olup olmadığını kontrol edelim.
Orijinal seri ile tahmin serisinin uyumu:
plot( window(veri_mev_yeni2$y),
xlab="Zaman", ylab="",type="l",lty=1, col=4, lwd=2)
lines( window(tahmin_model3),lty=3,col=2,lwd=3)
legend("topleft",c(expression(paste(Elektrik_tüketimi)),
expression(paste(Tahmin))),
lwd=c(2,2),lty=c(1,3), cex=0.6, col=c(4,2))
Zaman Serisi Grafiğine bakıldığında:
Tahmin ile orijinal seri arasında sapmanın yüksek olduğunu dolayısıyla uyum göstermediğini söyleyebiliriz.
Fakat emin olmak için hataların akgürültü olup olmadığına bakabiliriz.
Hatalar Akgürültü mü?
! BİLGİ !
Akgürültü Serisi: Durağanlık koşullarından tek farkı kovaryans teriminin sıfır olmasıdır. Dolayısıyla, akgürültü serisi durağan bir seriden farklı özellikler gösterir.
Örneğin, akgürültü serisi rasgele hareketlere sahip modellenemez bir seri iken durağan serilerin hareketlerinin belli bir sistematiği vardır ve bu nedenle modellenebilmektedir. Akgürültü serisinin tüm gecikmelerindeki otokorelasyon ve kısmi otokorelasyon değerleri önemsizdir.
ACF ve PACF grafıklerinin yorumunda serinin akgürültü serisi olup olmadığına net bir şekilde karar verilemiyorsa, yani ACF veya PACF grafiklerinde birinci gecikme dışında az sayıda güven sınırını biraz geçen ilişkiler var ise bu durumda seriye Box-Ljung Testi uygulanır.
Eğer her gecikme için Box-Ljung Testi sonucunda Ho : rk = 0 yokluk hipotezi kabul edilirse serinin akgürültü serisi olduğu söylenir.
Kaynak: Prof. Dr. Cem Kadılar, Dr. Hatice Öncel Çekim SPSS ve R Uygulamalı Zaman Serileri Analizine Giriş
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_model3, 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:
Tüm gecikmelerin sınırları geçtiği gözükmektedir.
Hataların akgürültü olmadığı (Ho RED) Söylenebilir. Box-Ljung testi ile de bunu görebiliriz.
Box-Ljung Testi:
Box.test(hata_model3,type = "Ljung",lag = 42)
##
## Box-Ljung test
##
## data: hata_model3
## X-squared = 8221.9, df = 42, p-value < 2.2e-16
Box-Ljung test sonucuna bakıldığında:
p değeri = 0 < α =0.05 ’dir. Yani Ho RED.
Hatalar Arasında ilişki olduğunu yani hataların akgürültü olmadığını söyleyebiliriz.
SONUÇ
Bir önceki adımda görüldüğü üzere;
Hatalar Arasında ilişki olduğunu yani hataların akgürültü olmadığını gördük.
Sonuç olarak ABD’deki aylık elektrik tüketimi serisinin Regresyon analizi için kullanılan Toplamsal Regresyon denklemi uygun değildir.