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.