Ö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 bölümünde, gerekli R paketlerini okara paketindeki Load.Install fonksiyonunu kullanarak indirin ve yükleyin.
  • 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 adlı İngilizce kaynaktan faydalanabilirsiniz.

1 Hazırlık

1.1 Paketler

  • R paketlerini okara paketindeki Load.Install fonksiyonunu kullanarak indirin ve/veya yükleyin.
# 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"))
#> Warning: package 'tidyr' was built under R version 4.3.2
#> Warning: package 'ggplot2' was built under R version 4.3.2
#> Warning: package 'DT' was built under R version 4.3.2
#> Warning: package 'tsibble' was built under R version 4.3.2
#> Warning: package 'fabletools' was built under R version 4.3.2
#> Warning: package 'quantmod' was built under R version 4.3.2
#> Warning: package 'ecm' was built under R version 4.3.2

1.2 Seed

  • Aşağıdaki R kodu bölümünde istediğiniz sayıyı girebilirsiniz.
set.seed(1234)

1.3 Çalışma Klasörü

  • 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.
# 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.

2 Veri Yükleme

  • Bu bölümde zaman serileri verisinin farklı kaynaklardan yüklenmesi gösterilecektir.

2.1 World Bank Verisi

  • World Bank’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.
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")
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` instead.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.


2.2 R Paketleri Verisi

  • 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 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 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 tarafından hazırlanan web sitesini inceleyebilirsiniz.

2.2.1 fpp2 Paketi Verisi

  • 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 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.
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.
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 1956 3.923 4.436 4.806 4.418
#> 1957 4.339 4.811 5.259 4.735
#> 1958 4.608 5.196 5.609 4.977
#> 1959 4.883 5.744 6.035 5.514
#> 1960 5.387 6.211 6.659 5.983
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")

2.2.2 tsdl Paketi Verisi

  • 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 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.
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.
#> Time Series Data Library: 648 time series  
#> 
#>                        Frequency
#> Subject                 0.1 0.25   1   4   5   6  12  13  52 365 Total
#>   Agriculture             0    0  37   0   0   0   3   0   0   0    40
#>   Chemistry               0    0   8   0   0   0   0   0   0   0     8
#>   Computing               0    0   6   0   0   0   0   0   0   0     6
#>   Crime                   0    0   1   0   0   0   2   1   0   0     4
#>   Demography              1    0   9   2   0   0   3   0   0   2    17
#>   Ecology                 0    0  23   0   0   0   0   0   0   0    23
#>   Finance                 0    0  23   5   0   0  20   0   2   1    51
#>   Health                  0    0   8   0   0   0   6   0   1   0    15
#>   Hydrology               0    0  42   0   0   0  78   1   0   6   127
#>   Industry                0    0   9   0   0   0   2   0   1   0    12
#>   Labour market           0    0   3   4   0   0  17   0   0   0    24
#>   Macroeconomic           0    0  18  33   0   0   5   0   0   0    56
#>   Meteorology             0    0  18   0   0   0  17   0   0  12    47
#>   Microeconomic           0    0  27   1   0   0   7   0   1   0    36
#>   Miscellaneous           0    0   4   0   1   1   3   0   1   0    10
#>   Physics                 0    0  12   0   0   0   4   0   0   0    16
#>   Production              0    0   4  14   0   0  28   1   1   0    48
#>   Sales                   0    0  10   3   0   0  24   0   9   0    46
#>   Sport                   0    1   1   0   0   0   0   0   0   0     2
#>   Transport and tourism   0    0   1   1   0   0  12   0   0   0    14
#>   Tree-rings              0    0  34   0   0   0   1   0   0   0    35
#>   Utilities               0    0   2   1   0   0   8   0   0   0    11
#>   Total                   1    1 300  64   1   1 240   3  16  21   648
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.
# İ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.
#>        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
#> 1965                                     27418 30592 23910 25509 27003 20943
#> 1966 25333 17004 20249 21384 19565 21253 23041 23026 23860 22295 27286 23928
#> 1967 29008 18387 26340 21437 27105 30316 22101 34180 32133 29867 27710 25342
# Grafik
## Elimizdeki veri zaman serisi objesi olduğu için plot fonksiyonunu kullanarak direkt olarak grafiğe dökebiliriz.
plot(data)


2.3 Excel Verisi

  • 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.
  • Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim.
  • Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim.
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")


2.4 CSV Verisi

  • 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.
  • Daha sonra yüklediğimiz bu veriyi temizleyelim ve düzenleyelim.
  • Son olarak temizlenmiş ve düzenlemiş veriyi grafiğe dökelim.
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")


2.5 Yahoo Finance Verisi

  • Yahoo Finance’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.
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.
#> [1] "GOOG"
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")


3 Verinin Hazırlanması

  • Bu bölümde zaman serileri verisinin hazırlanması için uygulanabilecek teknikler farklı kaynaklardan veriler kullanılarak gösterilecektir.

3.1 Enflasyon Ayarlaması

  • Ö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.
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ı.
#> [1] 2009
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")


3.2 Nüfus Ayarlaması

  • Ö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.
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")


3.3 Kur Ayarlaması

  • Ö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.
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")


3.4 Büyüme Oranı

  • Ö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.
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")
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_line()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).


3.5 İndeks Ayarlaması

  • Ö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.
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")


3.6 Matematiksel Transformasyon

  • Ö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.
loadSymbols(Symbols = "TRY=X", periodicity = "daily", return.class = "data.frame") ## Datanın indirilmesi.
#> Warning: TRY=X contains missing values. Some functions will not work if objects
#> contain missing values in the middle of the series. Consider using na.omit(),
#> na.approx(), na.fill(), etc to remove or replace them.
#> [1] "TRY=X"
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ı."))
}
#> Box-Cox transformasyonu sonucu: λ = -0.55 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")

3.7 Gecikmeli Değişkenler

  • Ö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.
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

4 Mevsimsel Grafikler

  • 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.
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.
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 1956 3.923 4.436 4.806 4.418
#> 1957 4.339 4.811 5.259 4.735
#> 1958 4.608 5.196 5.609 4.977
#> 1959 4.883 5.744 6.035 5.514
#> 1960 5.387 6.211 6.659 5.983
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()
#> Scale for x is already present.
#> Adding another scale for x, which will replace the existing scale.


5 Klasik Dekompozizasyon

  • 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.

5.1 Toplamsal Dekompozizasyon

  • 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.
  • 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.
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()
#> Warning: Removed 6 rows containing missing values or values outside the scale range
#> (`geom_line()`).


5.2 Çarpımsal Dekompozizasyon

  • 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.
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.
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 1956 3.923 4.436 4.806 4.418
#> 1957 4.339 4.811 5.259 4.735
#> 1958 4.608 5.196 5.609 4.977
#> 1959 4.883 5.744 6.035 5.514
#> 1960 5.387 6.211 6.659 5.983
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()
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_line()`).


6 Hareketli Ortalama

  • 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.
  • 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.
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()
#> Warning: Removed 5 rows containing missing values or values outside the scale range
#> (`geom_line()`).


7 Otokorelasyon Fonksiyonu

  • 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.
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)
#>  Time-Series [1:1000] from 1 to 1000: -1.207 0.277 1.084 -2.346 0.429 ...
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.
#> [1] -0.0265972
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.
#> [1] 0.9946825
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()