Dalam model algoritma peramalan ARIMA ada asumsi yang harus dipenuhi yaitu data tersebut bersifat stasioner, namun bila tidak stasioner maka perlu dilakukan stasionerisasi data. Suatu deret waktu yang tidak stasioner harus diubah menjadi data stasioner dengan melakukan differencing. Yang dimaksud dengan differencing adalah menghitung perubahan atau selisih nilai observasi. Nilai selisih yang diperoleh dicek lagi apakah stasioner atau tidak. Jika belum stasioner maka dilakukan differencing lagi. Jika varians tidak stasioner, maka dilakukan transformasi logaritma.
Differencing merupakan tahapan olah data dengan menghitung nilai perbedaan antara Yt dengan Yt-1. Jadi sebenarnya kita menghitung data tersebut dengan data sebelumnya. Karena yang kita olah adalah data selisih, yang akan menghilangkan unsur tren. Namun ada beberapa kasus data tren belum hilang setelah dilakukan differencing. Maka yang kita lakukan adalah melakukan differencing pada data yang telah dilakukan differencing sebelumnya. Tahap ini berarti memiliki nilai difference 2, artinya data dilakukan differencing sebanyak dua kali. Bagi kalian yang belum paham mengenai stasioneritas data, bisa baca Uji Stasioneritas Data dengan adf.test dan nilai lag
Differencing Data bila tidak Stasioner untuk Dataset non Stasioner
Kita ambil contoh dari data non stationer harga minyak mentah https://www.kaggle.com/mabusalah/brent-oil-prices yang mengandung tren kenaikan. Kalian bisa download yang sudah saya rapikan format date nya BrentOilPrices.csv
library(dplyr) library(ggplot2) library(scales) library(lubridate) dat = read.csv('BrentOilPrices.csv') dat$Date = lubridate::mdy(dat$Date) mean(dat$Price) var(dat$Price)
Perintah plot sederhana nggak pakai ribet, bisa kalian gunakan (sengaja saya hapus tidak pakai ggplot biar nggak kebanyakan kode)
plot(dat$Price,type='l') hist(dat$Price)
Kita juga bisa melihat data non stasoiner diatas dalam bentuk grafik lain yaitu histogram dengan nilai mean dan variance sebagai berikut
- mean : 46.35296 (mean akan mendekati NOL jika datanya stasioner)
- variance : 1034.605 (variance akan mendekati SATU jika datanya stasioner)
Nilai dickey fuller dengan signifikansi 5% sebagai berikut, oiya kita langsung saja uji dengan beragam nilai lag nya
hasil = data.frame() for(k in c(1:12)){ model = adf.test(dat$Price,k=k) buffer = data.frame(lag=k,model$p.value) hasil = rbind(hasil,buffer) } hasil
hasil
lag model.p.value 1 1 0.5337239 2 2 0.5413830 3 3 0.5347224 4 4 0.5291088 5 5 0.5129329 6 6 0.5151168 7 7 0.5100777 8 8 0.4964267 9 9 0.4654556 10 10 0.4604619 11 11 0.4586121 12 12 0.4513491
Terlihat nilai p-value > 0.05 sehingga H0 diterima (artinya data non stasioner), baca uji stasioner
Differencing Data Non Stasioner
Differencing data non statisoner data merupakan cara mengubah data non stasioner menjadi stasioner sebagai contoh berikut menggunakan lag. Misalkan untuk lag = 1, cara manual hitung differencing data yaitu
- x1 adalah data awal
- x2 adalah lag(x1,1) dengan lag == 1
- y adalah hasil differencing nya
library(dplyr) df = data.frame(x1=c(2,3,5,18,4,6,4)) df = df %>% mutate(x2=lag(x1,1)) df = df %>% mutate(y= x1-x2) df
hasilnya y
x1 x2 y 1 2 NA NA 2 3 2 1 3 5 3 2 4 18 5 13 5 4 18 -14 6 6 4 2 7 4 6 -2
cara cepat differencing bisa gunakan perintah diff()
diff(df$x1,lag=1)
Hasilnya
[1] 1 2 13 -14 2 -2
Penerapan Differencing pada dataset harga minyak mentah
Mengingat hasil diff akan berkurang 1 record nya, maka saya lebih suka menggunakan cara kedua saja karena bisa error kalau digabungkan dengan perintah mutate() yang membutuhkan jumlah record yang sama.
dat2 = dat %>% mutate(Price2 = lag(Price,1)-Price) #buang NA dat2 = dat2 %>% na.omit()
Sekarang, kita plotkan datanya
Terlihat grafik histogram mengikuti distribusi normal
Kita akan hitung nilai mean dan variance diatas
mean(dat2$Price) var(dat2$Price)
menghasilkan nilai yang sangat kecil
- mean : 0.004303753
- variance : 1.206682
dengan nilai Dickey Fuller sebagai berikut terlihat nilai p-value yaitu 0.01 < 0.05% artinya H0 ditolak dan H1 diterima (data stasioner)
adf.test(dat2$Price,k=1)
hasil
Augmented Dickey-Fuller Test data: dat2$Price Dickey-Fuller = -65.04, Lag order = 1, p-value = 0.01 alternative hypothesis: stationary
Atau bila kurang yakin, kita ubah-ubah saja nilai lag pada adf.test nya
hasil = data.frame() for(k in c(1:12)){ model = adf.test(dat2$Price2,k=k) buffer = data.frame(lag=k,model$p.value) hasil = rbind(hasil,buffer) } hasil
hasilnya pun tetap konsisten
lag model.p.value 1 1 0.01 2 2 0.01 3 3 0.01 4 4 0.01 5 5 0.01 6 6 0.01 7 7 0.01 8 8 0.01 9 9 0.01 10 10 0.01 11 11 0.01 12 12 0.01
Demikian pembahasan mengenai Differencing Data bila tidak Stasioner