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.
Dalam berhadapan dengan kasus Time Series terdapat beberapa tahapan kerja yang akan kita ikuti, seperti berikut ini:
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
<- data.frame(tahun = c(2018, 2019, 2020, 2022, 2021),
murid 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
<- data.frame(date = as.Date(c("2023-03-01","2023-03-02","2023-03-03", "2023-03-06")),
saham 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.
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
<- data.frame(tahun = c(2018, 2019, 2020, 2022, 2021),
murid 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
<- data.frame(date = as.Date(c("2023-03-01","2023-03-02","2023-03-03", "2023-03-06")),
saham 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 %>%
saham_pad pad()
# Please run the code down below
<- data.frame(date = as.Date(c("2023-03-05","2023-03-12", "2023-03-26")),
contoh value = c(20, 30, 40))
contoh
<- contoh %>%
contoh pad()
contoh
<- data.frame(date = ymd_hms(c("2023-03-05 00:00:00","2023-03-05 01:00:00", "2023-03-05 03:00:00")),
contoh2 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)
$value %>%
saham_padna.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 missingobject =
: 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
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 prediksistart
= waktu awal mula data yang akan diprediksifrequency
= pola berulang dari dataFrequency merupakan banyaknya data dalam satu pola musiman, untuk mengetahui frequency kita perlu mengetahui bagaimana data tersusun dan pola apa yang ingin kita amanti.
Latihan :
Mari kita coba ubah data ini menjadi tipe Time Series.
# read nybirth.csv
<- read.csv("data_input/nybirth.csv")
birth 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
<- ts(data = birth$births,
birth_ts start = 1946,
frequency = 12)
<- ts(data = birth$births,
birth_ts2 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
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
<- read.csv("data_input/environment_1970f.csv")
co2
%>%
co2 head()
Dari data yang kita miliki, mari kita coba buat menjadi object TS.
# Please type your code
<- ts(data = co2$CO2.emissions..metric.tons.per.capita.,
co2_ts start = 1970,
frequency = 1)
Dalam membantu proses penarikan analisa, kita bisa memanfaatkan visualisasi.
# Please type your code
library(fpp)
%>%
birth_ts autoplot()
Tipe pola data time series, dimana terdapat 2 jenis pada data time series, yaitu :
Berikut ini contoh data time series yang bertipe additive :
# Please run the code down below
%>%
birth_ts autoplot()
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()
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).
Untuk dapat menguraikan data time series kita menjadi 3 komponen
tersebut, kita dapat menggunakan fungsi decompose()
.
# Please type your code
<- birth_ts %>%
birth_decom decompose()
Memvisualisasikan hasil decompose menggunakan
autoplot()
# Please type your code
%>%
birth_decom autoplot()
Pada hasil decompose kita mendapatkan informasi visualisasi:
Untuk melakukan analisa dekomposisi dari data multiplicative,
terdapat tambahan parameter yang perlu kita berikan pada fungsi
decompose yaitu type = "multiplicative"
.
# Please type your code
<- AirPassengers %>%
air_decom 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.
Model Time Series memiliki banyak sekali varian dan setiap variannya memiliki syarat dan keunggulannya masing-masing.
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.
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
<- scan("data_input/precip1.dat", skip =1)
rain 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
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
<- ts(rain, start = 1813, frequency = 1) rain_ts
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
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 forecastn
: jumlah observasi di masa lalu yang digunakan untuk
membuat model# Mari kita buat model dengan observasi masa lalu sebanyak 3
<- SMA(x = rain_ts, n = 3) #menggunakan ordo 3
rain_sma3 <- SMA(x = rain_ts, n = 5) # menggunakan ordo 5
rain_sma5 <- SMA(x = rain_ts, n = 10) #menggunakan ordo 10 rain_sma10
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
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