1 Time Series and Forecasting

Apa itu time series? Apa perbedaannya dengan regresi atau yang lainnya?

Time series adalah suatu object dalam statistik dimana object tersebut berhubungan dengan suatu deret waktu tertentu. Objek ini banyak ditemui dalam kehidupan sehari-hari, contoh: harga daging sapi harian, curah hujan bulanan, kuantitas penumpang bulanan, pendapatan tahunan, dll.

Discussion: Apa perbedaan Time Series dengan Regresi?

Perbedaan mendasar antara time series dengan regresi adalah jika pada regresi untuk memprediksi suatu nilai Y dipengaruhi oleh beberapa faktor yaitu x1,x2,..,xn. Sedangkan jika time series, untuk memprediksi suatu nilai Y dipengaruhi oleh nilai Y itu sendiri pada masa lampau (\(Y_{t-1}\)).

Regression

\[y = \beta_0+\beta_1*x_1+\beta_2*x_2+...+\beta_n*x_n\]

Time Series

\[y_t = \beta_0+\beta_1*y_{t-1}+\beta_2*y_{t-2}+...+\beta_n*y_{t-n}\]

Analisis time series berhubungan dengan suatu data yang memiliki nilai numerik pada interval waktu tertentu. Proses untuk memprediksi nilai pada anilisis time series disebut sebagai peramalan atau forecasting. Ide utama dalam melakukan forecasting itu adalah korelasi dari data numerik.

2 Time Series and Forecasting Workflow

Dalam berhadapan dengan kasus Time Series terdapat beberapa tahapan kerja yang akan kita ikuti, seperti berikut ini:

  1. Read Data + Data understanding
  2. Data Wrangling
  3. Data Pre-processing
  4. EDA
  5. Cross Validation
  6. Build Model
  7. Predict
  8. Evaluation

3 Read Data + Data understanding

Tentu saja ketika kita berhadapan dengan data atau kasus apapun, kita harus membaca datanya terlebih dahulu dan berusaha untuk memahami mengenai data tersebut.

Contoh 1: Data Tahunan Jumlah Murid Algoritma

# Please run the code down below
murid <- data.frame(tahun = c(2018, 2019, 2020, 2022, 2021),
                    murid = c(100, 200, 300, 500, 400))

murid

Q: Apakah ada yang aneh dari urutan data jumlah murid Algoritima? A: Urutan tahunnya masih belum terurut dengan baik, karena masih ada tahun yang terbalik yaitu tahun 2021 dan 2022

Contoh 2: Data Saham Algoritma

# Please run the code down below
saham <- data.frame(date = as.Date(c("2023-03-01","2023-03-02","2023-03-03", "2023-03-06")),
                    value = c(20, 30, 20, 40))
saham

Q: Apakah ada tanggal yang terlewat? A: Dari dataya terdapat data yang terlewat, yaitu untuk tanggal 4 & 5.

4 Data Wrangling

Dari kedua contoh data di atas, kita mengetahui bahwa terdapat beberapa hal yang janggal ataupun masih belum sesuai dengan beberapa “syarat” data yang mau dimasukan ke model time series.

Maka dari itu, mari kita coba berkenalan mengenai syarat agar sebuah data bisa digunakan untuk model time series dan bagaimana mempersiakan datanya.

Syarat 1: Data harus terurut berdasarkan periode waktunya

Dari contoh data yang pertama, kita sudah mengetahui bahwa data tahunan murid Algoritma masih belum terurut dengan baik.

# Please run the code down below
murid <- data.frame(tahun = c(2018, 2019, 2020, 2022, 2021),
                    murid = c(100, 200, 300, 500, 400))

murid

Untuk mengurutkan data tersebut kita dapat memanfaatkan fungsi arrange() dari library dplyr dan didalam fungsi tersebut dapat kita isi dengan nama kolom yang ingin kita urutkan.

# Please type your code
library(dplyr)

murid %>% 
  arrange(tahun)

Syarat 2: Tidak boleh ada waktu atau periode yang terlewat/bolong

Dari contoh data yang kedua, kita mengetahui bahwa terdapatbeberapa tanggal yang terlewat, maka dari itu kita akan coba menambahkan tanggal.

# Please run the code down below
saham <- data.frame(date = as.Date(c("2023-03-01","2023-03-02","2023-03-03", "2023-03-06")),
                    value = c(20, 30, 20, 40))
saham

Dalam menambahkan tanggal yang belum termasuk pada data kita, terdapat fungsi yang dinamakan pad()dari library padr. Mari kita coba bersama-sama untuk menambahkan tanggal yang hilang dan kita simpan kembail ke dalam sebuah objek yang bernama saham_pad.

# Please type your code
library(padr)

saham_pad <- saham %>% 
  pad()
# Please run the code down below
contoh <- data.frame(date = as.Date(c("2023-03-05","2023-03-12", "2023-03-26")),
                    value = c(20, 30, 40))
contoh
contoh <- contoh %>% 
  pad()

contoh
contoh2 <- data.frame(date = ymd_hms(c("2023-03-05 00:00:00","2023-03-05 01:00:00", "2023-03-05 03:00:00")),
                    value = c(20, 30, 40))
contoh2
contoh2 <- contoh2 %>% 
  pad()

contoh2

Syarat 3: Data tidak boleh ada yang missing

Setelah kita menambahkan tanggal agar tidak terdapat periode yang terlewat dengan menggunakan fungsi pad() ternyata kedua tanggal tanggal tersebut belum terisi dengan harga saham. Oleh karena itu, data tersebut masih belum memenuhi syarat terakhir.

Agar syarat terakhir dapat terpenuh kita akan mencoba untuk mengisi missing value tersebut dengan menggunakan beberapa fungsi dari library zoo.

  • na.aggregate(): nilai aggregasi (mean/median)
    object =: Parameter ini diperuntuhkan untuk memberitahu fungsi, kolom apa yang mau diisi
    FUN =: Parameter ini diperuntuhkan untuk memberitahu fungsi, metode apa yang digunakan (mean/median)
saham_pad$value %>% 
  na.aggregate("mean")
#> [1] 20.0 30.0 20.0 27.5 27.5 40.0
# Please type your code for code na.aggregate()
library(zoo)
saham_pad %>% 
  mutate(value = na.aggregate(object = value,
                              FUN = mean))
#mean
(20+30+20+40)/4
#> [1] 27.5
# median
# 20,20,30,40
(20+30)/2
#> [1] 25
  • na.locf(): nilai terakhir/sesudah missing
    object =: Parameter ini diperuntuhkan untuk memberitahu fungsi, kolom apa yang mau diisi
    fromLast =: Parameter ini diperuntuhkan untuk memberitahu fungsi, metode pengisiannya akan dari data sebelumnya atau sesudahnya. Jika sebelumnya, maka kita bisa isi dengan FALSE dan jika yang di-inginkan adalah sebaliknya bisa di-isi dengan TRUE
# Please type your code for code na.locf()
saham_pad %>% 
  mutate(value = na.locf(object = value,
          fromLast = F))
# Please type your code for code na.locf()
saham_pad %>% 
  mutate(value = na.locf(object = value,
          fromLast = T))

Q: Dari kedua teknik imputasi nilai missing data saham, manakah cara yang paling tepat? A:

Quick Summary 4 Syarat Data Time Series

  • Syarat 1: Data harus terurut berdasarkan periode waktunya
  • Syarat 2: Tidak boleh ada waktu atau periode yang terlewat/bolong
  • Syarat 3: Data tidak boleh ada yang missing
  • Syarat 4: Interval waktu harus sama

5 Data Pre-processing

Tahapan selanjutnya yang perlu kita lakukan adalah mengubah data yang kita miliki menjadi sebuah objek Time Series. Tujuan pengubahan data menjadi Time Series karena model yang akan kita gunakan mewajibkan kita untuk membuat data menjadi objek Time Series.

Untuk membuat sebuah object time series pada R kita bisa menggunakan function ts() dengan parameter yang diperlukan yaitu :

ts(data, start, frequency)

  • data = data yang akan kita prediksi
  • start = waktu awal mula data yang akan diprediksi
  • frequency = pola berulang dari data

5.1 Cara menentukan frequency

Frequency merupakan banyaknya data dalam satu pola musiman, untuk mengetahui frequency kita perlu mengetahui bagaimana data tersusun dan pola apa yang ingin kita amanti.

Latihan :

  1. data jam -> pola harian -> freq = 24
  2. data harian -> pola mingguan -> freq = 7
  3. data harian -> pola weekday -> freq = 5
  4. data jam -> pola mingguan -> freq = 24 * 7
  5. data bulanan -> pola tahunan -> freq = 12
  6. data bulanan -> pola kuartalan -> freq = 3
  7. data tahunan -> pola tahunan -> freq = 1

5.2 Mini Dive Deeper

Mari kita coba ubah data ini menjadi tipe Time Series.

  • Data 1: Data angka kelahiran
# read nybirth.csv
birth <- read.csv("data_input/nybirth.csv")
birth

Dari data birth tersebut mari kita coba ubah menjadi data time series lalu simpanlah dalam object birth_ts dengan data bulanan yang ada. Pola yang ingin dilihat adalah pola tahunan.

# Please type your code here
birth_ts <- ts(data = birth$births,
               start = 1946,
               frequency = 12)
birth_ts2 <- ts(data = birth$births,
               start = c(1946, 6),
               frequency = 12)

birth_ts2
#>         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
#> 1946                                    26.663 23.598 26.931 24.740 25.806
#> 1947 23.901 23.175 23.227 21.672 21.870 21.439 21.089 23.709 21.669 21.752
#> 1948 23.824 23.105 23.110 21.759 22.073 21.937 20.035 23.590 21.672 22.222
#> 1949 23.504 22.238 23.142 21.059 21.573 21.548 20.000 22.424 20.615 21.761
#> 1950 23.748 23.262 22.907 21.519 22.025 22.604 20.894 24.677 23.673 25.320
#> 1951 24.454 24.122 24.252 22.084 22.991 23.287 23.049 25.076 24.037 24.430
#> 1952 25.618 25.014 25.110 22.964 23.981 23.798 22.270 24.775 22.646 23.988
#> 1953 25.816 25.210 25.199 23.162 24.707 24.364 22.644 25.565 24.062 25.431
#> 1954 26.606 26.268 26.462 25.246 25.180 24.657 23.304 26.982 26.199 27.210
#> 1955 26.878 26.152 26.379 24.712 25.688 24.990 24.239 26.721 23.475 24.767
#> 1956 28.599 27.914 27.784 25.693 26.881 26.217 24.218 27.914 26.975 28.527
#> 1957 28.169 28.056 29.136 26.291 26.987 26.589 24.848 27.543 26.896 28.878
#> 1958 28.141 29.048 28.484 26.634 27.735 27.132 24.924 28.963 26.589 27.931
#> 1959 28.759 28.405 27.945 25.912 26.619 26.076 25.286 27.660 25.951 26.398
#> 1960 30.000 29.261 29.012 26.992 27.897                                   
#>         Nov    Dec
#> 1946 24.364 24.477
#> 1947 20.761 23.479
#> 1948 22.123 23.950
#> 1949 22.874 24.104
#> 1950 23.583 24.671
#> 1951 24.667 26.451
#> 1952 24.737 26.276
#> 1953 24.635 27.009
#> 1954 26.122 26.706
#> 1955 26.219 28.361
#> 1956 27.139 28.982
#> 1957 27.390 28.065
#> 1958 28.009 29.229
#> 1959 25.565 28.865
#> 1960
  • Data 2: Data angka co2

Kita akan menggunakan data emisi CO2 di Indonesia dimana datanya sudah tersimpan dalam folder data_input dengan nama environment_1970f.csv. Dari data co2 ini, kita akan menggunakan 2 kolom yang kita butuhkan yaitu kolom year untuk menunjukkan waktu dan CO2.emissions..metric.tons.per.capita. sebagai nilai Y yang kita amati untuk membuat object ts.

# read co2
co2 <- read.csv("data_input/environment_1970f.csv")

co2 %>% 
  head()

Dari data yang kita miliki, mari kita coba buat menjadi object TS.

# Please type your code
co2_ts <- ts(data = co2$CO2.emissions..metric.tons.per.capita.,
             start = 1970,
             frequency = 1)

6 EDA

6.1 Visualisasi autoplot()

Dalam membantu proses penarikan analisa, kita bisa memanfaatkan visualisasi.

# Please type your code
library(fpp)

birth_ts %>% 
  autoplot()

6.2 Additive & Multiplicative Time Series

Tipe pola data time series, dimana terdapat 2 jenis pada data time series, yaitu :

  • 1. Data Additive : Model time series yang memiliki varians konstan mengikuti trend dan seasonalnya. Ditandai dengan pola time series memiliki trend bertambah, maka ukuran seasonalnya tetap.

Berikut ini contoh data time series yang bertipe additive :

# Please run the code down below
birth_ts %>% 
  autoplot()

  • 2. Data Multiplicative : Model time series yang memiliki varians semakin tinggi/rendah mengikuti trend dan seasonal yang ada. Ditandai dengan pola time series apabila trend bertambah, maka ukuran seasonal makin besar atau kecil.

Berikut ini contoh data time series yang bertipe multiplicative:

Dalam mengetahui data yang bertipe multiplicative, kita akan menggunakan data yang bernama AirPassengers.

# Please run the code down below
AirPassengers %>% 
  autoplot()

6.3 Visualisasi Decomposition

Decomposition adalah suatu tahapan dalam time series analisis yang digunakan untuk menguraikan beberapa komponen dalam time series data.

Sebelum melakukan modeling forecasting kita perlu mengamati objek timeseries dari hasil decompose. Ide utama dari decompose adalah untuk menguraikan ketiga komponen dari objek ts (trend, seasonal, residual).

  • Decomposition Data Additive

Untuk dapat menguraikan data time series kita menjadi 3 komponen tersebut, kita dapat menggunakan fungsi decompose().

# Please type your code
birth_decom <- birth_ts %>% 
  decompose()

Memvisualisasikan hasil decompose menggunakan autoplot()

# Please type your code
birth_decom %>% 
  autoplot()

Pada hasil decompose kita mendapatkan informasi visualisasi:

  1. Data : pola data asli
  2. Seasonal (S) : pola musiman atau pola berulang dari data
  3. Trend (T) : pola data secara global (naik atau turun)
  4. Remainder (E) : pola data yang tidak dapat ditangkap oleh seasonal dan trend
  • Decomposition Data Multiplicative

Untuk melakukan analisa dekomposisi dari data multiplicative, terdapat tambahan parameter yang perlu kita berikan pada fungsi decompose yaitu type = "multiplicative".

# Please type your code
air_decom <- AirPassengers %>% 
  decompose(type = "multiplicative")
air_decom %>% 
  autoplot()

💡 Notes: Jika pada hasil decompose, trend masih membentuk sebuah pola maka dapat dicurigai masih ada seasonality yang belum ditangkap. Seharusnya trend cenderung naik atau cenderung turun secara smooth. Penyebabnya adalah Frequency yang kita tetapkan belum tepat.

7 Build Model

Model Time Series memiliki banyak sekali varian dan setiap variannya memiliki syarat dan keunggulannya masing-masing.

7.1 Model 1: Simple Moving Average (SMA)

Metode yang menggunakan rataan bergerak untuk melakukan forecasting. Karena menggunakan rataan, bobot yang digunakan sama untuk setiap observasi di masa lalu. Maka dari itu, metode ini sering digunakan untuk data yang tidak mengandung trend dan seasonal.

7.1.1 Simple Moving Average (SMA) Workflow

  • Read Data

Kita akan coba melakukan forecasting pada data curah hujan tahunan sejak 1813-1912 yang tersimpan pada folder data_input dengan nama file precip1.dat. Dalam melakukan pembacaan datanya kita akan menggunakan fungsi scan()

# Please type your code
rain <- scan("data_input/precip1.dat", skip =1)
rain
#>   [1] 23.56 26.07 21.86 31.24 23.65 23.88 26.41 22.67 31.69 23.86 24.11 32.43
#>  [13] 23.26 22.57 23.00 27.88 25.32 25.08 27.76 19.82 24.78 20.12 24.34 27.42
#>  [25] 19.44 21.63 27.49 19.43 31.13 23.09 25.85 22.65 22.75 26.36 17.70 29.81
#>  [37] 22.93 19.22 20.63 35.34 25.89 18.65 23.06 22.21 22.18 18.77 28.21 32.24
#>  [49] 22.27 27.57 21.59 16.93 29.48 31.60 26.25 23.40 25.42 21.32 25.02 33.86
#>  [61] 22.67 18.82 28.44 26.16 28.17 34.08 33.82 30.28 27.92 27.14 24.40 20.35
#>  [73] 26.64 27.01 19.21 27.74 23.85 21.23 28.15 22.61 19.80 27.94 21.47 23.52
#>  [85] 22.86 17.69 22.54 23.28 22.17 20.84 38.10 20.65 22.97 24.26 23.01 23.67
#>  [97] 26.75 25.36 24.79 27.88
  • Membuat Object TS

Setelah data berhasil dibaca mari kita coba transformasi bentuk datanya menjadi object TS dan kita akan melihat datanya dalam bentuk tahunan.

# Please type your code
rain_ts <- ts(rain, start = 1813, frequency = 1)
  • Visualisasi Data

Mari kita coba visualisasikan terlebih dahulu data curah hujan yang kita miliki dengan menggunakan autoplot.

# Please type your code
rain_ts %>% 
  autoplot()

Q: Dari hasil visualisasinya apakah terdapat sebuah seasonal ataupun trend? A: Tidak ada

  • Memnbuat Model & Melakukan Prediksi

Metode SMA di R dapat langsung membuat model dengan menggunakan satu fungsi saja. Fungsi yang akan kita gunakan disini adalah SMA dari library TTR.

Parameter yang digunakan, yaitu:

  • x :objek time series yang akan di forecast
  • n: jumlah observasi di masa lalu yang digunakan untuk membuat model
# Mari kita buat model dengan observasi masa lalu sebanyak 3
rain_sma3 <- SMA(x = rain_ts, n = 3) #menggunakan ordo 3
rain_sma5 <- SMA(x = rain_ts, n = 5) # menggunakan ordo 5
rain_sma10 <- SMA(x = rain_ts, n = 10) #menggunakan ordo 10
forecast(object = rain_sma3,h = 3)
#>      Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
#> 1913       26.00996 23.68437 28.33555 22.45328 29.56665
#> 1914       26.00996 22.72125 29.29868 20.98031 31.03962
#> 1915       26.00996 21.98219 30.03773 19.85002 32.16990
  • Evaluasi Model

Karena kita melakukan pemodelan tanpa cross validation kita tidak perlu melakukan prediksi/forecast sebab hasil forecast data historis sudah terdapat pada output hasil pemodelan. Kita dapat menghitung error yang dihasilkan oleh model dengan menggunakan fungsi accuracy() dari library forecast.

# Please type your code
accuracy(rain_sma3, rain_ts)
#>                 ME     RMSE      MAE       MPE     MAPE       ACF1 Theil's U
#> Test set 0.0164966 3.591968 2.845748 -1.942503 11.50456 -0.2350681 0.5920757