R ile Enerji Analizi – Bölüm 8- ARIMA ve TBATS ile Elektrik Talep Tahmini Denemesi
Özet: Bu bölümde, 6 ve 7nci bölümlerin devamı niteliğinde, ARIMA ve TBATS’ı inceleyeceğiz. Aslında ulaşmak istediğimiz nihai nokta, çoklu periyodu olan serileri, örneğin Türkiye elektrik talebini modelleyebilmek. Bunun için de yazılmış bir makaleden faydalanacağız. Böylelikle hem hicri, hem miladi hem de haftalık periyotları olan bir veri setini, yani elektrik talebini modelleyerek 2015 sonuna kadar modellemeye çalışacağız.  Bu Bölümdeki Fonksiyonlar read.csv ts(veri, start=başladığı tarih, frequency= periyodu) auto.arima(veri seti) auto.arima(veri seti, stepwise=FALSE, approximation=FALSE) msts(veri$ortalama_tuketim, seasonal.periods = c(periyod1, periyod2)) tbats(zaman serisi)
8.0. Veriyi yüklemek Her zamanki gibi veri dosyamızı tekrar yükleyelim. veri=read.csv("http://www.barissanli.com/calismalar/dersler/r/elektrik-talep.csv",
header=TRUE,sep=";",dec=".") Ortalama tüketim verisini de ot değişkenine atayalım. ot=veri$ortalama_tuketim Þimdi “veri” yazdığımız her noktada alt detaylara erişebiliriz. Ders 6’da olduğu gibi forecast paketini bilgisayarınıza kurduğunuza emin olun. Daha önce kurmadıysanız: install.packages(“forecast”) İle kurabilirsiniz. 8.1. Zaman Serisini Kurmak Yedinci bölümde gördüğümüz şekli ile yeniden “forecast” paketini yüklüyoruz. “ts” komutu ile de 365 günlük periyodu olan ve 2007’den başlayan zaman serimizi oluşturuyoruz. library("forecast") ot=veri$ortalama_tuketim ott=ts(ot, start=2007,frequency=365) Þimdi zaman serimizi bir kez daha ekrana çizelim. plot(ott) Hazır isek artık başlayabiliriz. 8.2. ARIMA Modelleri (Bu bölüm için Rob J. Hyndman’ın kitabındaki https://www.otexts.org/fpp/8 bölümüne ve özellikle de https://www.otexts.org/fpp/8/9 “Seasonal Arima Models” kısmına bakın). Arima modelleri en popüler modelleme yöntemlerinden biridir. Arima anlatmak çok zaman alacağından, öncelikle kitaplara bakarak biraz birşeyler öğrenmeniz gerekir. Hyndman’ın “forecast” paketinde otomatik bir hesaplama yöntemi var. Bu da “auto.arima” komutu ile gayet kolay oluşturulabiliyor. Ben programı birkaç kez farklı parametreler ile çalıştırdıktan sonra farklı sonuçlar aldım. Burada belki de en önemlisi, verinizin frekansını doğru belirlemek. model1<-auto.arima(ott) plot(forecast(model1,h=100))
Aynı modelde bu sefer 7 günlük periyodlarla bir veri seti belirlersek ise cevap çok daha farklı oluyor. ottw=ts(ot,frequency=7) model1w<-auto.arima(ott) plot(forecast(model1w,h=100))
Hyndman, kitabında “auto.arima” ile ilgili olarak, hesap zamanı kazanmak için bazı kısa yollar kullandığından ve bu yüzden de otomatik model seçiminin her zaman en doğrusu olmayacağını söylüyor. Kendi önerdiği parametrelerle yukarıdaki modelleri bir kez daha çalıştırırsak, - 365 günlük periyotlu zaman serisi için: model2<-auto.arima(ott, stepwise=FALSE, approximation=FALSE) plot(forecast(model2,h=1000))
- 7 günlük periyod için ise model2w<-auto.arima(ottw, stepwise=FALSE, approximation=FALSE) plot(forecast(model2w,h=1000))
Peki modellerdeki sorun ne? Aslında trendleri ve mevsimselliği çıkarırsak model çok daha iyi çalışacaktır. Bu konuya daha fazla girmek yerine, başka bir soruna eğilmekte fayda var. Modelimizi kurarken, modelin frekansının 7 gün mü 365 gün mü alınacağı konusunda net fikirler ortaya koyamadık. Aynı şekilde Arima’nın teorik altyapısına da giremediğimizden bir çok şey eksik kaldı, fakat “auto.arima” ile otomatik model seçimini yapıp, “stepwise=FALSE, approximation=FALSE” parametrelerini de ekleyerek en uygun modellerden birini otomatik olarak seçmeyi gördük.
(link : https://www.otexts.org/fpp/8/9 ) Arima modelinde yukarıdaki p,d,q ile P,D,Q’ları kendiniz de belirtebilirsiniz. “order=c(p,d,q)” ve “seasonal=c(P,D,Q)”, girerek modelinizi hesaplatabilirsiniz. Sorumuz şu, “Aynı anda bir çok periyodun bir arada olduğu veri serilerinde modeller nasıl kurulur?”
8.2. TBATS ile Elektrik Talebinde Hem Haftalık Hem Senelik Hem de Hicri Etkileri İncelemek TBATS modeli, aslında pek çok modelcinin kullandığı gibi bir çok modelin en iyi özelliklerini bir araya getirerek çoklu bir yapı oluşturmaktadır. Yardımına baktığınızda (http://www.inside-r.org/packages/cran/forecast/docs/tbats) bu yapının De Livera, Hyndman ve Snyder’in 2011 yılındaki ( http://www.tandfonline.com/doi/pdf/10.1198/jasa.2011.tm09771 ) makalesindeki gibi Trigonometrik bir BATS modelidir. BATS ise : - Box-Cox dönüşümü - ARMA hatalar - Trend ve Mevsimsel parçalardan oluşmaktadır. Hyndman’ın makalesine bakarsanız daha makalenin başından Türkiye’nin elektrik talebi ile ilgi çekici birkaç noktaya değindiğini göreceksiniz. Türkiye’nin elektrik talebindeki ilginçlik ise: - Haftalık bir dönemselliğinin - Miladi takvime göre bir mevsimselliğinin - Ayrıca hicri takvime göre de bir mevsimselliğinin (en düşük talepler bayram günlerinde olur) olduğunu göreceksiniz. (bakınız: http://robjhyndman.com/papers/complex-seasonality/ ) Türkiye’nin elektrik talebinde periyod - 7 , çünkü haftalık - 354.37 , hicri takvimin periyodu - 365.25, miladi takvimin periyodu olmak üzere üç dönemsellik vardır. Peki 3 dönemselliği bir arada nasıl tanımlayacağız. Bunun için de “msts” komutunu kullanacağız. (Not: Yukarıdaki linkteki Hyndman’ın sitesinde 2000’den başlayan veri setlerini bulabilirsiniz) (UYARI: Bazen aşağıdaki modeli çalıştırırken sorun yaşayınca, R’ı tekrar başlatıp denemek, veya tekrar başlatıp, “forecast” paketini tekrar yüklemek faydalı oldu) Önce veri serimizin periyotlarını belirtelim, sonra da tbats ile modelimizi oluşturalım. telec <- msts(veri$ortalama_tuketim, start=2007, seasonal.periods = c(7,354.37,365.25)) model3<-tbats(telec) plot(model3) Dikkat ederseniz: - Season1 ->haftalık - Season2 -> hicri - Season3 -> miladi (mevsimsel) Dönemleri göstermektedir. Aynı şekilde level’a da dikkat ederseniz, daha önceki “decompose” komutundakilere benzediğini göreceksiniz. (Periyodlar için bakınız : http://robjhyndman.com/hyndsight/tscharacteristics/ ) Þimdi de model sonucumuzu 3-5 yıl ileri doğru öteleyelim plot(forecast(model3,h=1500))
Yukarıda görülen grafiğin en güzel özelliği, günlük ortalama tüketimlerin yaz aylarına geldiği dönemlerde, yaz pikinin etrafında ramazanın denk gelmesi ile oluşan aşağı yönlü bir darbe yıllar geçtikçe, yaz pikinin soluna doğru kaymaktadır. Þu ana kadar yaptığımız en başarılı “otomatik” model bu olmakla birlikte, hala eksikleri var, mesela kurban ve ramazan bayramlarındaki minimum tüketimlerin o kadar iyi modellenemediğini görüyoruz. Sonuç Bu bölümde ARIMA’yı gördükten sonra, aslında tüm modellerin bir sentezi olan TBATS isimli bir model denedik. Bu konu ile ilgili makalenin web sitesini paylaştık. Ayrıca Türkiye elektrik talebinin ilginç bir özelliği olan 3 dönemlilik, yani hicri, miladi ve haftalık dönemleri göz önüne alarak modeli nasıl oluşturacağımızı da gözlemledik.
Komutlar veri=read.csv("http://www.barissanli.com/calismalar/dersler/r/elektrik-talep.csv", header=TRUE,sep=";",dec=".")
library("forecast") ot=veri$ortalama_tuketim ott=ts(ot, start=2007,frequency=365) ottw=ts(ot,frequency=7)
plot(ott)
model1<-auto.arima(ott) plot(forecast(model1,h=100))
#şimdi haftalık deneyelim ottw=ts(ot,frequency=7) model1w<-auto.arima(ott) plot(forecast(model1w,h=100))
model2<-auto.arima(ott, stepwise=FALSE, approximation=FALSE) plot(forecast(model2,h=1000))
model2w<-auto.arima(ottw, stepwise=FALSE, approximation=FALSE) plot(forecast(model2w,h=1000))
telec <- msts(veri$ortalama_tuketim, start=2007, seasonal.periods = c(7,354.37,365.25)) model3<-tbats(telec) plot(model3)
plot(forecast(model3,h=1500))
telec <- msts(veri$puant_tuketim, start=2007, seasonal.periods = c(7,354.37,365.25)) model3<-tbats(telec) plot(model3) |