Differencing Data bila tidak Stasioner

By | September 2, 2023
Print Friendly, PDF & Email
5,189 Views

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)
See also  k-nearest neighbors Distance - kNNDist

 

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 

  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

See also  Pengertian, Cara Kerja dan Penerapan A/B testing

 

Leave a Reply