--- title: "Zaman Serileri Analizi" subtitle: "Hafta #1 - Uygulama" author: "[Dr. Ömer Kara]()" date: "`r format(Sys.time(), format = '%A, %B %d, %Y')`" output: html_document: code_folding: show df_print: paged fig_caption: yes highlight: zenburn keep_md: no number_sections: yes theme: readable toc: yes toc_depth: 3 toc_float: collapsed: yes smooth_scroll: yes pdf_document: fig_caption: yes highlight: zenburn toc: yes number_sections: yes editor_options: chunk_output_type: inline --- ```{=html} ``` ```{r Settings.Code.Chunk, include = FALSE, purl = FALSE} # Değiştirmeyin. knitr::opts_chunk$set(cache = TRUE, collapse = TRUE, comment = "#>", echo = TRUE, engine = "R", error = FALSE, eval = TRUE, fig.align = "center", fig.height = 5, fig.width = 7, out.width = "100%", highlight = TRUE, include = TRUE, message = TRUE, prompt = FALSE, purl = TRUE, results = "markup", rows.print = 5, strip.white = TRUE, tidy = FALSE, tidy.opts = list(width.cutoff = 80), warning = TRUE) ``` ```{r Settings.Mirros, include = FALSE, purl = FALSE, cache = TRUE} # Değiştirmeyin. r <- getOption("repos") r["CRAN"] <- "https://cloud.r-project.org/" options(repos = r) ``` ```{r Settings.Functions, include = FALSE, cache = TRUE} # Değiştirmeyin. ``` ---- **Önemli Notlar** - Yanında **Değiştirmeyin** ibaresi bulunan hiçbir kodu ve/veya satırı değiştirmeyin. - Yazılardakı ve kodlardaki açıklamaları dikkatlice okuyun. - Kodların sırasını **mümkün olduğunca** değiştirmeyin. Aksi taktirde hata ile karşılaşabilirsiniz. - [Paketler](#Packages) bölümünde, gerekli [R paketlerini](https://cran.r-project.org/web/packages/available_packages_by_name.html) [`okara`](https://github.com/omerkara/okara) paketindeki `Load.Install` fonksiyonunu kullanarak indirin ve yükleyin. - [Seed](#Seed) bölümünde, istediğiniz sayıyı kullanabilirsiniz. Rassal olarak seçilen değerler, eğer varsa, seçtiğiniz sayıya göre değişecektir. - R hakkında daha fazla bilgi için, benim yazdığım [R mini BootCamp](https://akademiekonometri.bitbucket.io/R_mini_BootCamp/R_mini_BootCamp.html) adlı İngilizce kaynaktan faydalanabilirsiniz. ---- # Hazırlık {#Preparation} ## Paketler {#Settings.Packages} - [R paketlerini](https://cran.r-project.org/web/packages/available_packages_by_name.html) [`okara`](https://github.com/omerkara/okara) paketindeki `Load.Install` fonksiyonunu kullanarak indirin ve/veya yükleyin. ```{r Settings.Packages, cache = TRUE} # Devtools ve okara paketlerinin yüklenmesi. if("devtools" %in% rownames(utils::installed.packages()) == FALSE) {suppressWarnings(suppressMessages(install.packages("devtools")))} suppressWarnings(suppressMessages(library("devtools"))) ## devtools paketi, okara paketinin yüklenmesi için gereklidir. if("okara" %in% rownames(utils::installed.packages()) == FALSE) {suppressWarnings(suppressMessages(devtools::install_github("omerkara/okara", force = FALSE)))} suppressWarnings(suppressMessages(library("okara"))) ## okara paketi. # Gerekli paketlerin yüklenmesi. Load.Install(c("rstudioapi", "readxl", "plyr", "dplyr", "tidyr", "stringr", "stringi", "Hmisc", "reshape2", "scales", "lubridate", "ggplot2", "xtable", "DT", "latex2exp", "forecast", "WDI", "fpp2", "fpp3", "datasets", "quantmod", "FinYang/tsdl", "ggseas", "slider", "ecm", "wooldridge")) ``` ## Seed {#Settings.Seed} - Aşağıdaki `R kodu` bölümünde istediğiniz sayıyı girebilirsiniz. ```{r Settings.Seed} set.seed(1234) ``` ## Çalışma Klasörü {#Settings.Working.Directory} - Aşağıdaki `R kodu`, R çalışma klasörünü (yani working directory) sadece bu dosya için, bu dosyanın bilgisayarınızda bulunan lokasyonunda belirliyor. + `getwd()` fonksiyonunu kullanarak mevcut çalışma klasörünün hangi lokasyonda belirlendiğine bakabilirsiniz. ```{r Settings.Working.Directory} # Değiştirmeyin. main.path <- dirname(rstudioapi::getActiveDocumentContext()$path) ## Bu kod otomatik olarak kaynak dosyasının, yani üzerinde çalıştığınız dosyanın, bilgisayarınızda hangi lokasyonda olduğunu buluyor. setwd(paste0(main.path)) ## Yeni çalışma klasörü (yani working directory) bu kaynak dosyasının lokasyonunda belirleniyor. ``` ---- # Veri Yükleme {#Data.Load} - Bu bölümde zaman serileri verisinin farklı kaynaklardan yüklenmesi gösterilecektir. ## World Bank Verisi {#World.Bank.Data} - [World Bank](https://data.worldbank.org/)'ten direkt olarak `WDI` R paketini kullanarak veri indirip yüklemeye çalışalım. - World Bank'ten veri indirip yüklemek için temel olarak 2 fonksiyonu kullanacağız: `WDIsearch` ve `WDI`. + `WDIsearch` fonksiyonu ile indirip yüklemek istediğimiz veriyi belirleyebiliriz. + `WDI` fonksiyonu ile belirlediğimiz veriyi indirip yükleyebiliriz. - Örnek olması açısından "Türkiye için Nominal Gayri Safi Yurtiçi Hasıla" verisini TL cinsinden indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim. ```{r World.Bank.Data} WDIsearch(string = "gdp.*current.*LCU", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.MKTP.CN" GDP (current LCU) datasını kullanacağız. data <- WDI(country = c("TR"), indicator = c("NY.GDP.MKTP.CN"), start = 1960, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör ismini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.MKTP.CN")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "GDP") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "GDP")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "GDP" variable.name <- "Nominal GSYH (TL)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## R Paketleri Verisi {#R.Packages.Data} - Bazı **R paketlerinde mevcut olan veriyi** direkt olarak yüklemeye çalışalım. - İndirdiğiniz ve daha sonra yüklediğiniz R paketleri içerisindeki veriyi genellikle çok basit birkaç fonksiyonu kullanarak R'ın içine yükleyebilirsiniz. + R paketi içinden veri yüklemek genellikle verinin paket içindeki ismi ve `data` fonksiyonu kullanılarak yapılır. Örneğin: [`fpp2` Paketi Verisi](#ffp2.Package.Data) bölümünde, paket içindeki verinin ismi ve `data` fonksiyonu kullanılarak istenilen veri yüklenmiştir. + Bazı R paketlerinde ise verinin belli bir ismi olmadığından, yüklenmek istenilen veri paket içinden belirli fonksiyonlar kullanılarak seçilmelidir. Örneğin: [`tsdl` Paketi Verisi](#tsdl.Package.Data) bölümünde, paket içindeki verinin ismi belli olmadığından farklı birkaç fonksiyon kullanılarak istenilen veri yüklenmiştir. - R paketlerinin içinde olan verileri toplu olarak görmek için [Vincent Arel-Bundock](http://arelbundock.com/) tarafından hazırlanan [web sitesini](https://vincentarelbundock.github.io/Rdatasets/articles/data.html) inceleyebilirsiniz. ### `fpp2` Paketi Verisi {#ffp2.Package.Data} - R paketlerinde mevcut olan veriyi, verinin ismini kullanarak yüklemek için 1 fonksiyon kullanacağız: `data`. + `data` fonksiyonu ile istediğimiz veriyi verinin R paketi içindeki ismini kullanarak direkt olarak R'ın içine yükleyebiliriz. - Örnek olması açısından [`fpp2`](https://cran.r-project.org/package=fpp2) R paketinden "Avustralya Elektrik Üretimi (milyar kWh)" verisini yükleyelim. + `fpp2` R paketinden yüklemek istediğimiz verinin ismi `qauselec`'tir. - Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim. ```{r fpp2.Package.Data} data(qauselec) ## Datayı yüklüyoruz. data <- qauselec ## Yüklediğimiz datayı "data" ismi ile kaydediyoruz. head(data, 20) ## Datanın yapısını inceleyelim. İlk 20 gözlemin gösterilmesini istedik. data <- data.frame(Date = as.Date(date_decimal(as.numeric(time(data)))), Elec.Prod = as.matrix(data), stringsAsFactors = FALSE) ## Yüklediğimiz data time series formatında olduğu için bu datayı data.frame formatına çeviriyoruz. data ## Datanın yapısını inceleyelim. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "Elec.Prod" variable.name <- "Avustralya Elektrik Üretimi (milyar kWh)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Çeyreklik)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ### `tsdl` Paketi Verisi {#tsdl.Package.Data} - R paketlerinde mevcut olan veriyi, verinin ismini bilmeden yüklemek için 1 fonksiyon kullanacağız: `subset` + `subset` fonksiyonu ile istediğimiz veriyi verinin R paketi içindeki ismini kullanmadan direkt olarak R'ın içine yükleyebiliriz. - Örnek olması açısından [`tsdl`](https://pkg.yangzhuoranyang.com/tsdl/articles/tsdl.html) R paketinden, veriyi adım adım ilerleyerek önce belirleyelim ve sonra yükleyelim. + `tsdl` R paketindeki tüm verilerin zaman serisi formatında, yani `ts()`, olduğu unutulmamalıdır. - Son olarak yüklediğimiz bu veriyi grafiğe dökelim. ```{r tsdl.Package.Data.1} Load.Install("tsdl") tsdl ## tsdl paketinin içinde bulunan verilerin konulara ve frekansa göre kategorisi. Daha sonra bu obje datanın yüklenmesi için kullanılacaktır. datatable(meta_tsdl, filter = "top", options = list(pageLength = 5, autoWidth = TRUE)) ## tsdl paketinin içinde bulunan verilerin metadatası (bilgisi). Bu tabloya bakarak istediğimız datayı sıra numarasını kullanarak ya da diğer başka fonksiyonları kullanarak seçebiliriz. ``` ```{r tsdl.Package.Data.2} # İstenilen datanın yüklenmesi. ## İstediğimiz data 134. sırada bulunan: Monthly Australian imports from Japan: thousands of dollars. Jul 65 – Oct 93. data <- subset(tsdl, description = "Monthly Australian imports from Japan")[[1]] ## Alternatif olarak datayı bu şekilde de yükleyebiliriz. data <- tsdl[[134]] ## Sıra numarası kullanarak datayı yüklüyoruz. Bu datanın zaman serisi objesi olduğuna dikkat edin. head(data, 30) ## Datanın yapısını inceleyelim. # Grafik ## Elimizdeki veri zaman serisi objesi olduğu için plot fonksiyonunu kullanarak direkt olarak grafiğe dökebiliriz. plot(data) ``` ---- ## Excel Verisi {#Excel.Data} - Excel dosyasından direkt olarak veri yüklemeye çalışalım. - Excel dosyasından veri yüklemek için 1 fonksiyon kullanacağız: `read_excel`. + `read_excel` fonksiyonu ile veriyi direkt olarak R'ın içine yükleyebiliriz. - Örnek olması açısından "İstanbul'a Verilen Temiz Su Miktarları" verisini yükleyelim. + İlgili veri: [`clean-water.xlsx`](https://akademiekonometri.netlify.app/repo/akek/r/courses/zaman-serileri-analizi/Hafta_1/clean-water.xlsx) - Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim. ```{r Excel.Data} file.path <- "clean-water.xlsx" ## Data dosyasının ismi ve uzantısı. # Ham datanın yüklenmesi data <- read_excel(path = file.path, sheet = 3, range = cell_limits(c(1, 1), c(NA, NA)), col_names = TRUE, col_types = "text") ## Yüklediğimiz datayı tibble formatında kaydediyoruz. data <- as.data.frame(data, stringsAsFactors = FALSE) ## Datayı data.frame formatına çeviriyoruz. data ## Datanın yapısını inceleyelim. colnames(data)[1] <- "Month" ## İlk sütun ismini değiştiriyoruz. data$Month <- 1:12 ## İlk sütundaki hücrelere ay ismi yerine rakam veriyoruz. # Datanın dönüştürülmesi. data <- reshape2::melt(data, id.vars = c("Month"), variable_name = "value") # Bazı değişiklikler. data <- dplyr::rename(data, Year = variable) data <- dplyr::rename(data, Clean.Water = value) data$Year <- as.numeric(as.character(data$Year)) data$Clean.Water <- as.numeric(data$Clean.Water) data$Date <- as.Date(paste(data$Year, data$Month, "1", sep = "-")) ## Date adlı tarihi belirten yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "Month", "Clean.Water")] ## İstediğimiz değişkenleri belirtiyoruz. data <- data[data$Year != 2019, ] ## 2019 datasının son gözleminde bir problem olduğu için 2019 yılını siliyoruz. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "Clean.Water" variable.name <- "İstanbul'a Verilen Temiz Su Miktarı (Ton)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Ay)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## CSV Verisi {#CSV.Data} - CSV dosyasından den direkt olarak veri yüklemeye çalışalım. - CSV dosyasından veri yüklemek için 1 fonksiyon kullanacağız: `read.csv`. + `read.csv` fonksiyonu ile veriyi direkt olarak R'ın içine yükleyebiliriz. - Örnek olması açısından "İstanbul Barajlarinin Doluluk Oranları" verisini yükleyelim. + İlgili veri: [`dam_occupancy.csv`](https://akademiekonometri.netlify.app/repo/akek/r/courses/zaman-serileri-analizi//Hafta_1/dam_occupancy.csv) - Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim. ```{r CSV.Data} file.path <- "dam_occupancy.csv" ## Data dosyasının ismi ve uzantısı. # Ham datanın yüklenmesi data <- read.csv(file = file.path, header = TRUE, sep = ",", dec = ".", colClasses = "character", comment.char = "", na.string = "") ## Datanın yüklenmesi. data ## Datanın yapısını inceleyelim. colnames(data) <- c("Date", "Occupancy.Rate", "Reserved.Water") ## Sütun isimlerinin değiştirilmesi. data$Occupancy.Rate <- as.numeric(data$Occupancy.Rate) ## Numerik kategori olarak değiştirildi. data$Reserved.Water <- as.numeric(data$Reserved.Water) ## Numerik kategori olarak değiştirildi. data$Date <- as.Date(data$Date, tz = "UTC", format = "%Y-%m-%d") ## Date kategori olarak değiştirildi. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "Occupancy.Rate" variable.name <- "İstanbul Barajları Doluluk Oranı" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Gün)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## Yahoo Finance Verisi {#Yahoo.Finance.Data} - [Yahoo Finance](https://finance.yahoo.com/)'ten direkt olarak `quantmod` R paketini kullanarak veri indirip yüklemeye çalışalım. - Yahoo Finance'ten veri indirip yüklemek için 1 fonksiyon kullanacağız: `loadSymbols`. + `loadSymbols` fonksiyonu ile istediğimiz veriyi direkt olarak R'ın içine yükleyebiliriz. - Örnek olması açısından "Google Hisse Senedi Fiyatı" verisini indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim. ```{r Yahoo.Finance.Data} loadSymbols(Symbols = "GOOG", periodicity = "daily", return.class = "data.frame") ## Yahoo Finance uzerinden buldugumuz sembolu (GOOG) kullanarak ve datanın frekansını seçerek datayı indirip yükleyebiliriz. İndirdiğimiz datanın ismi sembol ismi ile aynı olacaktır. GOOG ## Datanın yapısını inceleyelim. data <- data.frame(Date = gsub("\\.", "-", gsub("X", "", rownames(GOOG))), Google = GOOG$GOOG.Close, stringsAsFactors = FALSE) ## Kapanış fiyatları seçiliyor ve sütun ismi olarak Google veriliyor. data$Date <- as.Date(data$Date) ## Date kategori olarak değiştiriliyor. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "Google" variable.name <- "Google Hisse Senedi Fiyatı" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Gün)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- # Verinin Hazırlanması {#Data.Preparation} - Bu bölümde **zaman serileri verisinin hazırlanması için uygulanabilecek teknikler** farklı kaynaklardan veriler kullanılarak gösterilecektir. ## Enflasyon Ayarlaması {#Inflastion.Adjustment} - Örnek olması açısından World Bank'ten "Türkiye için Nominal Gayri Safi Yurtiçi Hasıla" verisini TL cinsinden ve "Türkiye için Gayri Safi Yurtiçi Hasıla Deflatörü (2009 Baz Yılı)" verisini beraber indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş verinin **enflasyon ayarlamasını** yapalım. - Son olarak enflasyon ayarlaması yapılmış veriyi grafiğe dökelim. ```{r Inflastion.Adjustment} WDIsearch(string = "gdp.*current.*LCU", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.MKTP.CN" GDP (current LCU) datasını kullanacağız. WDIsearch(string = "gdp.*deflator", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.DEFL.ZS" GDP deflator (base year varies by country) datasını kullanacağız. 2009 baz yılı kullanılıyor. data <- WDI(country = c("TR"), indicator = c("NY.GDP.MKTP.CN", "NY.GDP.DEFL.ZS"), start = 1960, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör isimlerini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.MKTP.CN", "NY.GDP.DEFL.ZS")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "GDP", "GDP.Deflator") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "GDP", "GDP.Deflator")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Enflasyon ayarlaması. data[data$GDP.Deflator == 100, "Year"] ## Datanin baz yılı belirleniyor. 2009 yılı. data$R.GDP <- (data$GDP / data$GDP.Deflator) * 100 ## Enflasyon ayarlaması yapılıyor. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "R.GDP" variable.name <- "Real GSYH (2009 TL)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## Nüfus Ayarlaması {#Population.Adjustment} - Örnek olması açısından World Bank'ten "Türkiye için Reel Gayri Safi Yurtiçi Hasıla (2009 Baz Yılı)" verisini TL cinsinden ve "Türkiye için Nüfus" verisini beraber indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş verinin **nüfus ayarlamasını** yapalım. - Son olarak nüfus ayarlaması yapılmış veriyi grafiğe dökelim. ```{r Population.Adjustment} WDIsearch(string = "gdp.*constant.*LCU", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.MKTP.KN" GDP (constant LCU) datasını kullanacağız. 2009 baz yılı kullanılıyor. WDIsearch(string = "SP.POP.TOTL", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "SP.POP.TOTL" Total Population datasını kullanacağız. data <- WDI(country = c("TR"), indicator = c("NY.GDP.MKTP.KN", "SP.POP.TOTL"), start = 1960, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör isimlerini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.MKTP.KN", "SP.POP.TOTL")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "R.GDP", "Population") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "R.GDP", "Population")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Nüfus ayarlaması. data$R.GDP.PCAP <- data$R.GDP / data$Population ## Nüfus ayarlaması yapılıyor. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "R.GDP.PCAP" variable.name <- "Kişi Başı Reel GSYH (2009 TL)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## Kur Ayarlaması {#Exchange.Rate.Adjustment} - Örnek olması açısından World Bank'ten "Türkiye için Kişi Başı Reel Gayri Safi Yurtiçi Hasıla (2009 Baz Yılı)" verisini TL cinsinden ve "TL/USD Döviz Kuru" verisini beraber indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veriyi USD cinsinden (Amerikan Dolarına çevirme) hesaplayıp **kur ayarlaması** yapalım. - Son olarak kur ayarlaması yapılmış veriyi grafiğe dökelim. ```{r Exchange.Rate.Adjustment} WDIsearch(string = "gdp.*capita.*constant.*LCU", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.PCAP.KN" GDP per capita (constant LCU) datasını kullanacağız. 2009 baz yılı kullanılıyor. WDIsearch(string = "exchange.*rate.*LCU", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "PA.NUS.FCRF" Official exchange rate (LCU per US$, end period) datasını kullanacağız. data <- WDI(country = c("TR"), indicator = c("NY.GDP.PCAP.KN", "PA.NUS.FCRF"), start = 2000, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör isimlerini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.PCAP.KN", "PA.NUS.FCRF")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "R.GDP.PCAP", "Exchange.Rate") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "R.GDP.PCAP", "Exchange.Rate")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Kur ayarlaması ayarlaması. data$R.GDP.PCAP.USD <- data$R.GDP.PCAP / data$Exchange.Rate ## Nüfus ayarlaması yapılıyor. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "R.GDP.PCAP.USD" variable.name <- "Kişi Başı Reel GSYH (2009 USD)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## Büyüme Oranı {#Growth.Rate} - Örnek olması açısından World Bank'ten "Türkiye için Kişi Başı Reel Gayri Safi Yurtiçi Hasıla (2010 Baz Yılı)" verisini USD cinsinden indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veri üzerinden **büyüme oranı** hesaplayalım. - Son olarak büyüme oranı hesaplanmış veriyi grafiğe dökelim. ```{r Growth.Rate} WDIsearch(string = "gdp.*capita.*constant", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.PCAP.KD" GDP per capita (constant 2010 US$) datasını kullanacağız. 2010 baz yılı kullanılıyor. data <- WDI(country = c("TR"), indicator = c("NY.GDP.PCAP.KD"), start = 1960, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör ismini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.PCAP.KD")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "R.GDP.PCAP") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "R.GDP.PCAP")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Büyüme oranı hesaplaniyor. temp <- data ## Aşağıdaki dögünün işlemesi için datayı farklı bir isimle kaydedip onunla işlem yapıyoruz. for (i in 3:ncol(temp)) { x <- temp[ , i] growth.x <- 100 * (diff(x, lag = 1, differences = 1) / x[-length(x)]) growth.x <- round(growth.x, 3) x <- as.data.frame(c(NA, growth.x), stringsAsFactors = FALSE) colnames(x) <- paste0("Gr.", colnames(temp)[i]) ## Büyüme değerlerini "Gr." ile ifade ediyoruz. temp <- cbind(temp, x) } data <- temp ## Tekrar aynı ismi kullanmaya başlıyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "Gr.R.GDP.PCAP" variable.name <- "Kişi Başı Reel GSYH Büyüme Oranı (USD)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + geom_hline(aes(yintercept = 0), show.legend = FALSE, linetype = 1, colour = 2, size = 0.25) + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## İndeks Ayarlaması {#Index.Adjustment} - Örnek olması açısından World Bank'ten "Türkiye için Tüketici Fiyatları İndeksi (2010 Baz Yılı)" verisini indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veri üzerinden yeni bir baz yılı belirleyip bu baz yila göre **indeks ayarlaması** yapalım. - Son olarak yeni baz yılı ile hesaplanmış veriyi grafiğe dökelim. ```{r Index.Adjustment} WDIsearch(string = "consumer.*price.*index", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "FP.CPI.TOTL" Consumer price index (2010 = 100) datasını kullanacağız. 2010 baz yılı kullanılıyor. data <- WDI(country = c("TR"), indicator = "FP.CPI.TOTL", start = 1960, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör ismini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "FP.CPI.TOTL")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "CPI.2010") ## Değişkenlere yeni isimler veriyoruz. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "CPI.2010")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Yeni bir baz yılına göre (2019 Baz Yılı) indeksi tekrar hesaplıyoruz. data$CPI.2019 <- (data$CPI.2010/data[data$Year == 2019, "CPI.2010"]) * 100 data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "CPI.2019" variable.name <- "Tüketici Fiyatları İndeksi (2019 Baz Yılı)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + geom_point(aes(x = Date, y = temp[ , variable], colour = "Variable"), size = 1) + xlab("Zaman (Yıl)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + geom_hline(aes(yintercept = 0), show.legend = FALSE, linetype = 1, colour = 2, size = 0.25) + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ---- ## Matematiksel Transformasyon {#Math.Transformation} - Örnek olması açısından Yahoo Finance'ten "Döviz Kuru (TL/USD)" verisini indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veri üzerinde **logaritmik transformasyon** ve **Box-Cox transformasyonu** uygulayalım. - Son olarak düzey formundaki, logaritmik formdaki ve Box-Cox transformasyonu ile değiştirilmiş veriyi grafiğe dökelim. ```{r Math.Transformation} loadSymbols(Symbols = "TRY=X", periodicity = "daily", return.class = "data.frame") ## Datanın indirilmesi. data <- data.frame(Date = gsub("\\.", "-", gsub("X", "", rownames(`TRY=X`))), Close = `TRY=X`$`TRY=X.Close`, stringsAsFactors = FALSE) ## Datanın data.frame olarak kaydedilmesi. data$Date <- as.Date(data$Date) ## Date kategori olarak değiştirildi. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Logaritmik transformasyon. data$Ln.Close <- log(data$Close) # Box-Cox transformasyonu. value <- data$Close ## Box-cox transformasyonu ile bulunan lambda değerine göre ham veri değiştiriliyor: Eğer lambda = 1 ise transformasyona gerek yok, eğer lambda == 0 ise ln(x), ve eğer lambda farklı bir değer ise (x^lambda - 1)/lambda. s.lambda <- forecast::BoxCox.lambda(value, method = c("loglik"), lower = -2, upper = 2) ## Box-cox transformasyonu sonucunda bulunan lambda değeri. method = c("guerrero") kriteri de kullanılabilir. Genelde kullanılan alt limit -2 ve üst limit ise 2'dir. if(s.lambda == 1) { ## Lambda = 1. value.boxcox <- value message("Box-Cox transformasyonu sonucu: Transformasyona gerek yok.") } else if(s.lambda == 0) { ## Lambda = 0. value.boxcox <- log(value) message("Box-Cox transformasyonu sonucu: Logaritmik Transformasyon yapıldı.") } else { ## Lambda farklı bir değer ise. value.boxcox <- (value^s.lambda - 1)/s.lambda message(paste0("Box-Cox transformasyonu sonucu: λ = ", round(s.lambda, 2), " kullanılarak Box-Cox transformasyonu yapıldı.")) } data$Box.Cox.Close <- value.boxcox data ## Datanın yapısını inceleyelim. # Düzey Formu: Grafik temp <- data variable <- "Close" variable.name <- "Döviz Kuru (TL/USD)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Gün)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") # Logaritmik Form: Grafik temp <- data variable <- "Ln.Close" y.lab <- "Ln Döviz Kuru (TL/USD)" variable.name <- "Logaritmik Transformasyon ile Döviz Kuru (TL/USD)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Gün)") + ylab(y.lab) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") # Box-Cox Transformasyonu: Grafik temp <- data variable <- "Box.Cox.Close" y.lab <- paste0("Box-Cox $(\\lambda = ", round(s.lambda, 2), ")$ ile Döviz Kuru (TL/USD)") variable.name <- paste0("Box-Cox Transformasyonu ile Döviz Kuru (TL/USD)") ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Gün)") + ylab(latex2exp::TeX(y.lab)) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "1 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") ``` ## Gecikmeli Değişkenler {#Lagged.Variables} - Örnek olması açısından World Bank'ten "Amerika için Satın Alma Gücü Paritesine Göre Kişi Başı Reel Gayri Safi Yurtiçi Hasıla (2017 Baz Yılı)" verisini USD cinsinden indirip yükleyelim. - Daha sonra indirip yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veri üzerinden $y_{t-s}$ gibi **gecikmeli zaman serisi değişkenlerini** hesaplayalım. - Son olarak cari dönemdeki değişken $y_{t}$ ve tüm gecikmeli değişkenleri bir tabloda gösterelim. ```{r Lagged.Variables} WDIsearch(string = "gdp.*capita.*constant", field = "name", short = TRUE, cache = NULL) ## Olası seriler ve kodları. Biz "NY.GDP.PCAP.PP.KD" GDP per capita, PPP (constant 2017 international $) datasını kullanacağız. 2017 baz yılı kullanılıyor. data <- WDI(country = c("US"), indicator = c("NY.GDP.PCAP.PP.KD"), start = 1990, end = 2024, extra = FALSE) ## Bir önceki kodda belirlediğimiz indikatör ismini ve ülke kısaltmasını kullanıyoruz. Datanın başlangıç ve bitiş tarihlerini de ayrı ayrı belirtiyoruz. data ## Datanın yapısını inceleyelim. data <- data[, c("year", "NY.GDP.PCAP.PP.KD")] ## İstediğimiz değişkenleri belirtiyoruz. colnames(data) <- c("Year", "GDP") ## Değişkenlere yeni isimler veriyoruz. Tablo sütunlarının iyi görünmesi için satın alma gücü paritesine göre kişi başı reel gayri safi yurtiçi hasıla özellikle GDP olarak gösterildi. data$Date <- as.Date(paste(data$Year, "1", "1", sep = "-")) ## Date adlı yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "GDP")] ## Değişkenleri sütun olarak sıralıyoruz. data <- data[order(data$Date, data$Year, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. data ## Datanın yapısını inceleyelim. # Tablo temp <- data temp$GDP <- round(temp$GDP, 0) ## Tablonun daha iyi görünmesi için sayılar yuvarlanıyor. temp$t <- 1:nrow(temp) ## Trend değişkeni ya da t indeks değeri ekleniyor. temp <- temp[, c("Year", "t", "GDP")] ## Değişkenler sıraya dizildi. temp$GDP.t1 <- ecm::lagpad(x = temp$GDP, k = 1) ## 1. Gecikme oluşturuldu. temp$GDP.t2 <- ecm::lagpad(x = temp$GDP, k = 2) ## 2. Gecikme oluşturuldu. temp$GDP.t3 <- ecm::lagpad(x = temp$GDP, k = 3) ## 3. Gecikme oluşturuldu. temp$GDP.t4 <- ecm::lagpad(x = temp$GDP, k = 4) ## 4. Gecikme oluşturuldu. data <- temp data ``` --- # Mevsimsel Grafikler {#Seasonal.Graphics} - Bu bölümde zaman serisi verisindeki mevsimsel örüntünün görsel olarak belirlenmesinde kullanılan **mevsimsel grafik** ve **mevsimsel alt seri grafiği** gösterilecektir. - Örnek olması açısından `fpp2` R paketinden "Avustralya Elektrik Üretimi (milyar kWh)" verisini yükleyelim. + `fpp2` R paketinden yüklemek istediğimiz verinin ismi `qauselec`'tir. - Daha sonra yüklediğimiz bu veriyi temizleyelim, düzenleyelim ve grafiğe dökelim. - Son olarak temizlenmiş ve düzenlemiş veriyi kullanarak mevsimsel grafik ve mevsimsel altseri grafiğini gösterelim. ```{r Seasonal.Graphics} data(qauselec) ## Datayı yüklüyoruz. data <- qauselec ## Yüklediğimiz datayı "data" ismi ile kaydediyoruz. head(data, 20) ## Datanın yapısını inceleyelim. data <- data.frame(Date = as.Date(date_decimal(as.numeric(time(data)))), Elec.Prod = as.matrix(data), stringsAsFactors = FALSE) ## Yüklediğimiz data time series formatında olduğu için bu datayı data.frame formatına çeviriyoruz. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. # Grafik temp <- data variable <- "Elec.Prod" variable.name <- "Avustralya Elektrik Üretimi (milyar kWh)" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman (Çeyreklik)") + ylab(variable.name) + # labs(title = "Başlık") + ## Grafik için isterseniz başlık eklenebilir. scale_x_date(date_breaks = "5 year", date_labels = "%Y") + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") # Mevsimsel Grafik variable <- "Elec.Prod" temp <- ts(data = data[, variable], start = c(year(data$Date[1]), month(data$Date[1])), frequency = 4) ## Mevsimsel grafikleri oluşturabilmek için datanın zaman serisi objesi (time series) olması lazım. Bu nedenle dönüşüm yapıldı. temp <- window(temp, start = NULL, end = c(2009, 4)) ## 2010 yılına ait veri tam olmadığı için çıkartılıyor. variable.name <- "Avustralya Elektrik Üretimi (milyar kWh)" title <- "Avustralya Elektrik Üretimi (milyar kWh): Mevsimsel Grafik" quarter.labels <- c("Ç1", "Ç2", "Ç3", "Ç4") ggseasonplot(x = temp, season.labels = quarter.labels, year.labels = TRUE, year.labels.left = TRUE, continuous = FALSE, polar = FALSE, labelgap = 0.04) + ## year.labels = FALSE ve year.labels.left = FALSE olduğunda legend gösterilmez onun yerine yıllara ait etiket gösterilir. xlab("Zaman (Çeyreklik)") + ylab(variable.name) + labs(title = title) + theme_grey() # Mevsimsel Alt Seri Grafiği variable <- "Elec.Prod" temp <- ts(data = data[, variable], start = c(year(data$Date[1]), month(data$Date[1])), frequency = 4) ## Mevsimsel grafikleri oluşturabilmek için datanın zaman serisi objesi (time series) olması lazım. Bu nedenle dönüşüm yapıldı. temp <- window(temp, start = NULL, end = c(2009, 4)) ## 2010 yılına ait veri tam olmadığı için çıkartılıyor. variable.name <- "Avustralya Elektrik Üretimi (milyar kWh)" title <- "Avustralya Elektrik Üretimi (milyar kWh): Mevsimsel Altseri Grafiği" quarter.labels <- c("Ç1", "Ç2", "Ç3", "Ç4") ggsubseriesplot(temp) + xlab("Zaman (Çeyreklik)") + ylab(variable.name) + labs(title = title) + scale_x_continuous(breaks = 1:frequency((temp)), labels = quarter.labels) + theme_grey() ``` --- # Klasik Dekompozizasyon {#Classical.Decomposition} - Bu bölümde zaman serileri analizinde yaygın olarak kullanılan **klasik dekompozizasyon methodu** iki farklı yöntem ile gösterilecektir: **toplamsal dekompozizasyon** ve **çarpımsal dekompozizasyon**. ## Toplamsal Dekompozizasyon {#Additive.Decomposition} - Mevsimsel dalgalanmaların büyüklüğü veya trend etrafındaki dalgalanmalar, zaman serisinin düzeyine göre değişmiyorsa, toplamsal dekompozizasyon en uygun olan yöntemdir. - Örnek olması açısından "İstanbul'a Verilen Temiz Su Miktarları" verisini yükleyelim. + İlgili veri: [`clean-water.xlsx`](https://akademiekonometri.netlify.app/repo/akek/r/courses/zaman-serileri-analizi/Hafta_1/clean-water.xlsx) - Daha sonra yüklediği bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş verinin **toplamsal klasik dekompozizasyonunu** grafiğe dökelim. ```{r Additive.Decomposition} file.path <- "clean-water.xlsx" ## Data dosyasının ismi ve uzantısı. # Ham datanın yüklenmesi data <- read_excel(path = file.path, sheet = 3, range = cell_limits(c(1, 1), c(NA, NA)), col_names = TRUE, col_types = "text") ## Yüklediğimiz datayı tibble formatında kaydediyoruz. data <- as.data.frame(data, stringsAsFactors = FALSE) ## Datayı data.frame formatına çeviriyoruz. colnames(data)[1] <- "Month" ## İlk sütun ismini değiştiriyoruz. data$Month <- 1:12 ## İlk sütundaki hücrelere ay ismi yerine rakam veriyoruz. # Datanın dönüştürülmesi. data <- reshape2::melt(data, id.vars = c("Month"), variable_name = "value") # Bazı değişiklikler. data <- dplyr::rename(data, Year = variable) data <- dplyr::rename(data, Clean.Water = value) data$Year <- as.numeric(as.character(data$Year)) data$Clean.Water <- as.numeric(data$Clean.Water) data$Date <- as.Date(paste(data$Year, data$Month, "1", sep = "-")) ## Date adlı tarihi belirten yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "Month", "Clean.Water")] ## İstediğimiz değişkenleri belirtiyoruz. data <- data[data$Year != 2019, ] ## 2019 datasının son gözleminde bir problem olduğu için 2019 yılını siliyoruz. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. # Grafik temp <- data variable <- "Clean.Water" colnames(temp)[colnames(temp) == variable] <- "y" variable.name <- "İstanbul'a Verilen Temiz Su Miktarı (Ton)" title <- "İstanbul'a Verilen Temiz Su Miktarı (Ton): Toplamsal Klasik Dekompozizasyon" frequency <- 12 ## Datanın frekansı. ggsdc(temp, aes(x = Date, y = y), frequency = frequency, method = "decompose", type = "additive", facet.titles = c("Veri", "Trend", "Mevsimsellik", "Kalıntı")) + geom_line(colour = "darkblue", size = 1) + xlab("Zaman (Çeyreklik)") + ylab(variable.name) + labs(title = title) + scale_x_date(date_breaks = "1 year", date_labels = "%Y") + theme_grey() ``` --- ## Çarpımsal Dekompozizasyon {#Multiplicative.Decomposition} - Mevsimsellikteki varyasyon veya trend etrafındaki varyasyon, zaman serisinin seviyesiyle orantılı göründüğünde, çarpımsal dekompozizasyon daha uygundur. - Örnek olması açısından `fpp2` R paketinden "Avustralya Elektrik Üretimi (milyar kWh)" verisini yükleyelim. + `fpp2` R paketinden yüklemek istediğimiz verinin ismi `qauselec`'tir. - Daha sonra yüklediği bu veriyi temizleyelim ve düzenleyelim. - Son olarak temizlenmiş ve düzenlemiş verinin **çarpımsal klasik dekompozizasyonunu** grafiğe dökelim. ```{r Multiplicative.Decomposition} data(qauselec) ## Datayı yüklüyoruz. data <- qauselec ## Yüklediğimiz datayı "data" ismi ile kaydediyoruz. head(data, 20) ## Datanın yapısını inceleyelim. data <- data.frame(Date = as.Date(date_decimal(as.numeric(time(data)))), Elec.Prod = as.matrix(data), stringsAsFactors = FALSE) ## Yüklediğimiz data time series formatında olduğu için bu datayı data.frame formatına çeviriyoruz. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. # Grafik temp <- data variable <- "Elec.Prod" colnames(temp)[colnames(temp) == variable] <- "y" variable.name <- "Avustralya Elektrik Üretimi (milyar kWh)" title <- "Avustralya Elektrik Üretimi (milyar kWh): Çarpımsal Klasik Dekompozizasyon" frequency <- 4 ## Datanın frekansı. ggsdc(temp, aes(x = Date, y = y), frequency = frequency, method = "decompose", type = "multiplicative", facet.titles = c("Veri", "Trend", "Mevsimsellik", "Kalıntı")) + geom_line(colour = "darkblue", size = 1) + xlab("Zaman (Çeyreklik)") + ylab(variable.name) + labs(title = title) + scale_x_date(date_breaks = "5 year", date_labels = "%Y") + theme_grey() ``` --- # Hareketli Ortalama {#Moving.Average} - Bu bölümde zaman serileri analizinde sıkça kullanılan ve klasik dekompozizasyonun ilk adımı olan **hareketli ortalama** (moving average) hesabının nasıl yapıldığı gösterilecektir. - Örnek olması açısından "İstanbul'a Verilen Temiz Su Miktarları" verisini yükleyelim. + İlgili veri: [`clean-water.xlsx`](https://akademiekonometri.netlify.app/repo/akek/r/courses/zaman-serileri-analizi/Hafta_1/clean-water.xlsx) - Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veri üzerinden farklı derecelerden hareketli ortalamaları hesaplayalım: 3-MA, 5-MA, 7-MA ve 9-MA. + Hesaplamalarda hareketli ortalama merkezden alınmıştır. Fakat ilgili kodda ufak bir değişiklik ile sola ya da sağa dayalı hareketli ortalama da hesaplanabilir. - Son olarak merkezden hesaplanmış hareketli ortalama verisini bir tabloda gösterelim ve grafiğe dökelim. ```{r Moving.Average} file.path <- "clean-water.xlsx" ## Data dosyasının ismi ve uzantısı. # Ham datanın yüklenmesi data <- read_excel(path = file.path, sheet = 3, range = cell_limits(c(1, 1), c(NA, NA)), col_names = TRUE, col_types = "text") ## Yüklediğimiz datayı tibble formatında kaydediyoruz. data <- as.data.frame(data, stringsAsFactors = FALSE) ## Datayı data.frame formatına çeviriyoruz. colnames(data)[1] <- "Month" ## İlk sütun ismini değiştiriyoruz. data$Month <- 1:12 ## İlk sütundaki hücrelere ay ismi yerine rakam veriyoruz. # Datanın dönüştürülmesi. data <- reshape2::melt(data, id.vars = c("Month"), variable_name = "value") # Bazı değişiklikler. data <- dplyr::rename(data, Year = variable) data <- dplyr::rename(data, Clean.Water = value) data$Year <- as.numeric(as.character(data$Year)) data$Clean.Water <- as.numeric(data$Clean.Water) data$Date <- as.Date(paste(data$Year, data$Month, "1", sep = "-")) ## Date adlı tarihi belirten yeni bir değişken oluşturuyoruz. data <- data[, c("Date", "Year", "Month", "Clean.Water")] ## İstediğimiz değişkenleri belirtiyoruz. data <- data[data$Year != 2019, ] ## 2019 datasının son gözleminde bir problem olduğu için 2019 yılını siliyoruz. data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını sıralıyoruz. # Hareketli ortalama hesabı. temp <- data variable <- "Clean.Water" temp$`3-MA` <- slider::slide_dbl(.x = temp[, variable], .f = mean, .before = 1, .after = 1, .complete = TRUE) ## 3-MA (3 Dönemlik hareketli ortalama) - Ortalama merkezden alınmıştır. temp$`5-MA` <- slider::slide_dbl(.x = temp[, variable], .f = mean, .before = 2, .after = 2, .complete = TRUE) ## 5-MA (5 Dönemlik hareketli ortalama) - Ortalama merkezden alınmıştır. temp$`7-MA` <- slider::slide_dbl(.x = temp[, variable], .f = mean, .before = 3, .after = 3, .complete = TRUE) ## 5-MA (7 Dönemlik hareketli ortalama) - Ortalama merkezden alınmıştır. temp$`9-MA` <- slider::slide_dbl(.x = temp[, variable], .f = mean, .before = 4, .after = 4, .complete = TRUE) ## 9-MA (9 Dönemlik hareketli ortalama) - Ortalama merkezden alınmıştır. temp.table <- temp ## Hareketli ortalama tablosunda kullanılacak data. temp1 <- reshape2::melt(temp, id.vars = c(grep("(Date)|(Year)|(Day)|(Week)|(Month)", colnames(temp), value = TRUE)), measure.vars = c(grep("(MA)", colnames(temp), value = TRUE)), variable_name = "Variable", na.rm = FALSE) temp.figure <- temp1 ## Hareketli ortalama grafiğinde kullanılacak data. # Tablo temp <- temp.table temp$`3-MA` <- round(temp$`3-MA`, 0) ## Tablonun daha iyi görünmesi için sayılar yuvarlanıyor. temp$`5-MA` <- round(temp$`5-MA`, 0) ## Tablonun daha iyi görünmesi için sayılar yuvarlanıyor. temp$`7-MA` <- round(temp$`7-MA`, 0) ## Tablonun daha iyi görünmesi için sayılar yuvarlanıyor. temp$`9-MA` <- round(temp$`9-MA`, 0) ## Tablonun daha iyi görünmesi için sayılar yuvarlanıyor. temp <- temp[, -1] ## Date değişkeni çıkarılıyor. temp # Grafik temp <- data temp1 <- temp.figure variable <- "Clean.Water" variable.name <- "İstanbul'a Verilen Temiz Su Miktarı (Ton)" title <- "İstanbul'a Verilen Temiz Su Miktarı (Ton): Hareketli Ortalama (m-MA)" ggplot(temp1, aes(x = Date, y = value)) + geom_line(colour = "#FF6666", size = 0.5, linetype = 1) + facet_wrap(variable ~ ., scales = "free_y", strip.position = "top") + geom_line(data = temp, aes(x = Date, y = Clean.Water), colour = "darkblue", size = 0.5) + xlab("Zaman (Ay)") + ylab(variable.name) + labs(title = title) + scale_x_date(date_breaks = "2 year", date_labels = "%Y") + theme_grey() ``` --- # Otokorelasyon Fonksiyonu {#Autocorrelation.Function} - Bu bölümde bir zaman serisinin bağımlılık yapısının incelenmesinde kullanılan ve **örneklem otokorelasyon fonksiyonu (SACF)** gösterilecektir. - Örnek olması açısından zaman serileri analizinde sıkça kullanılan ve stokastik bir süreç olan "Pür Rassal Süreç" verisinin örneklem otokorelasyon fonksiyonunu inceleyelim. + İlgili veri: Simüle edilmiş bir pür rassal süreç örneği kullanılmıştır. - Daha sonra simüle ettiğimiz bu veriyi temizleyelim ve düzenleyelim. - Daha sonra temizlenmiş ve düzenlenmiş veriyi grafiğe dökelim. - Son olarak temizlenmiş ve düzenlenmiş verideki otokorelasyon varlığını belirlemek için 2 farklı grafik kullanalım: + $WN_{t}$ ve $WN_{t-s}$ arasındaki grafik. + Örneklem otokorelasyon fonksiyonunun grafiği. ```{r Autocorrelation.Function} n <- 1000 ## Gozlem sayisi. WN <- arima.sim(model = list(order = c(0, 0, 0)), n = n) ## Simüle edilmiş pür rassal süreç verisi. Zaman serisi objesi olduğunu ve plot(WN) kullanılarak hemen grafiğe dökülebileceğini unutmayın. str(WN) mean(WN) ## Pür rassal sürecin ortalaması sıfırdır. Simüle edilmiş veri olduğundan sıfıra yakın çıkıyor. var(WN) ## Gözlem sayısı yeteri kadar büyük olduğunda merkezi limit teorimi kullanılarak pür rassal sürecin standart normal yaptığı bilinmektedir. Simüle veride de bu durum gözlenmiştir. data <- data.frame(Date = 1:length(WN), White.Noise = as.matrix(WN), stringsAsFactors = FALSE) data <- data[order(data$Date, decreasing = FALSE, na.last = FALSE), ] ## Datayı tarihe göre sıralıyoruz. rownames(data) <- 1:nrow(data) ## Satır sayılarını düzenliyoruz. data ## Datanın yapısını inceleyelim. # Grafik temp <- data variable <- "White.Noise" variable.name <- "Simüle Edilmiş Pür Rassal Süreç" ggplot(temp) + geom_line(aes(x = Date, y = temp[ , variable], colour = "Variable"), linetype = 1, size = 1) + xlab("Zaman") + ylab(variable.name) + scale_y_continuous(breaks = pretty(temp[ , variable])) + geom_hline(aes(yintercept = 0), show.legend = FALSE, linetype = 1, colour = 2, size = 0.25) + scale_colour_manual(name = "", labels = c(variable.name), values = c("Variable" = "darkblue")) + theme_grey() + theme(legend.position = "top") # WN(t) vs WN(t-s) için bazı düzenlemeler. s <- 1 ## Seçili gecikme uzunluğunu belirliyoruz. WN <- c(WN) ## Zaman serisini normal bir vektöre çeviriyoruz. WNt <- WN[(1 + s):length(WN)] ## WN(t). Cari dönem verisi. WNts <- WN[1:(length(WN) - s)] ## WN(t-s). s gecikme önceki veri. data <- data.frame(WNt = WNt, WNts = WNts, stringsAsFactors = FALSE) # WN(t) vs WN(t-s) grafiği. temp <- data ggplot(temp) + geom_point(aes(x = WNt, y = WNts, colour = "Variable"), size = 3, colour = "darkblue") + xlab(paste0("wn_t")) + ylab(paste0("wn_t-", s)) + labs(title = paste0("Simüle Edilmiş Pür Rassal Süreç wn_t vs wn_t-", s)) + geom_hline(aes(yintercept = 0), show.legend = FALSE, linetype = 1, colour = 2, size = 0.25) + geom_vline(aes(xintercept = 0), show.legend = FALSE, linetype = 1, colour = 2, size = 0.25) + theme_grey() # WN'nin SACF grafigi temp <- WN title <- "Simüle Edilmiş Pür Rassal Süreç: SACF" ggAcf(x = temp, ci = 0.95, lag.max = 10, type = "correlation", plot = TRUE, demean = TRUE) + xlab("Gecikme Değeri") + ylab("Örneklem Otokorelasyon Katsayısı") + labs(title = title) + theme_grey() ```