Uji Stasioneritas Data dengan adf.test dan nilai lag

By | December 6, 2022
12,948 Views

— Uji Stasioneritas Data — Dalam analisis time series hal yang perlu diperhatikan yaitu stationary data. Kita berangkat terlebih dahulu mengenai time series yang berarti setiap data mempunyai domain waktu atau dipengaruhi oleh waktu. Setidaknya ada beberapa plot time series seperti konstan (stationary), trend, seaosonal, dan cyclic. Time series digunakan untuk forecasting, nah ada satu metode forecasting yaitu ARIMA yang mengharuskan data tersebut bersifat stationary – konstan – stasioner.

Data stasioner adalah data yang menunjukkan mean, varians dan autovarians (pada variasi lag) tetap sama pada waktu kapan saja data itu dibentuk atau dipakai, artinya dengan data yang stasioner model time series dapat dikatakan lebih stabil. Apabila data yang digunakan dalam model ada yang tidak stasioner.

Tulisan ini akan dibagi menjadi 3 bagian yaitu pengertian stationary – konstan – stasioner, deteksi, serta mengubah data tersebut agar stationary – konstan – stasioner. Nanti kita akan menggunakan software seperti R/RStudio dan SPSS.

Pengertian stationary – konstan – stasioner

Data stasioner adalah sekumpulan data dinyatakan stasioner jika nilai rata-rata dan varian dari data time series tersebut tidak mengalami perubahan secara sistematik sepanjang waktu, atau sebagian ahli menyatakan rata-rata dan variannya konstan (nachrowi dan haridus usman, 2006). Kalian bisa melihat jenis plot time series berikut untuk mengetahui mengenai stasioner data

 

Data bersifat stasioner akan tampil acak tapi tetap ditengah/mean nya berbeda dengan data seasonal yang saling menyimpang jauh membentuk sebuah lembah dan gunung. Setelah kita mengetahui tampilan grafik stasioner, kita  lanjut ke deteksi stasioner data

Uji Stasioneritas Data Dick Fuller

Untuk mnguji stasioneritas data, kita akan buat contoh dataset, data ini adalah data kelahiran bayi perhari daily-total-female-births, Yuk kita lihat plot datanya, oiya saya menggunakan R/RStudio buat ploting data biar gampang, nanti kalian bisa menggunakan excel koq. Berikut contoh data stasioner

library(dplyr)
library(ggplot2)
library(scales)


dat = read.csv('daily-total-female-births.csv')
dat$Date <- as.Date(dat$Date,format="%Y-%m-%d")
plot(dat$Births,type='l')

# (sengaja saya hapus tidak pakai ggplot biar nggak kebanyakan kode)

 

atau menggunakan SPSS juga bagus

dari plot diatas akan nampak bahwa data tersebut stationer.

Kita akan membandingkan antara contoh data stasioner diatas dengan non stasioner berikut yang diambil dari https://data.transportation.gov/api/views/xgub-n9bw/rows.csv?accessType=DOWNLOAD. Data tersebut adalah data penumpang harian sehingga datanya sangat banyak sekali.  Saya akan olah saja yaitu dengan teknik pivot/aggregasi. Data akan diolah terlebih dahulu agar dijumlah perbulan saja. Berikut contoh snipet datasetnya

   year  month total_bulan tanggal   
   <chr> <chr>       <int> <date>    
 1 1990  01        6271648 1990-01-01
 2 1990  02        5608228 1990-02-01
 3 1990  03        7261485 1990-03-01
 4 1990  04        6666438 1990-04-01
 5 1990  05        6684581 1990-05-01
 6 1990  06        7629021 1990-06-01
 7 1990  07        8677938 1990-07-01
 8 1990  08        9100434 1990-08-01
 9 1990  09        7123752 1990-09-01
10 1990  10        6632612 1990-10-01

Bagi kalian yang suka menggunakan SPSS tentu butuh software tambahan seperti excel, tidak seperti R/RStudio maka proses aggregasi data sangat mudah.

library(dplyr)
library(ggplot2)
library(scales)


dat = read.csv('International_Report_Passengers.csv')

dat = dat %>% select(data_dte,Total) #ambil kolom date_dte dan Total saja
dat = dat %>% rename(date = data_dte) %>% rename(total = Total) #rename kolom

dat$date <- as.Date(dat$date,format="%m/%d/%Y") #ubah jadi format tanggal

#lakukan proses aggregasi dengan melakukan split bulan dan tahun
dat = dat %>%
    mutate(month = format(date, "%m"), year = format(date, "%Y")) %>%
    group_by(year,month) %>%
    summarise(total_bulan = sum(total))

#merging 
dat2 = dat%>%mutate(tanggal=as.Date(paste(1,month,year,sep='/'),format='%d/%m/%Y'))

plot(dat2$total_bulan,type='l')
# (sengaja saya hapus tidak pakai ggplot biar nggak kebanyakan kode)

Kita lihat data time series nya mengandung trend

Namun bila kalian ingin menampilkan dalam SPPS, simpan saja variabel dat2 kedalam format CSV

write.csv(dat2,'data olah passenger.csv')

Berikut tampilan data time series non stasioner di SPSS

Uji stasioneritas data kelahiran bayi

Namun demikian melihat plot data akan bersifat subjeksifitas, oleh hal tersebut kita membutuhkan uji stasioneritas data time series menggunakan analisis Uji Stasioneritas Augmented Dickey–Fuller (ADF). Langsung saja kita akan menguji uji stasioneritas data time series pada dataset kelahiran diatas menggunakan package tseries.

Mari kita uji untuk data kelahiran bayi perhari (menurut plot grafik adalah stasioner)

library(tseries)
adf.test(dat$Births)

untuk dataset kelahiran bayi harian didapatkan hasil berikut

   Augmented Dickey-Fuller Test

data:  dat$Births
Dickey-Fuller = -11.491, Lag order = 1, p-value = 0.01
alternative hypothesis: stationary

Hipotesis untuk ADF yaitu

H0 : data deret waktu tidak stasioner
H1 : data deret waktu stasioner

Dengan keterangan sebagai berikut

  • jika p-value > siginifikan, maka HO diterima maka dapat disimpulkan data tidak stasioner.

Pada contoh diatas dihasilkan p-value = 0.01 < 0.05 artinya H0 ditolak sehingga data kelahiran bayi adalah data stasioner.

Uji stasioneritas data air passenger

Kita akan coba uji stasioneritas data air passenger diatas, kita cek dulu

adf.test(dat2$total_bulan)

hasilnya

   Augmented Dickey-Fuller Test

data:  dat2$total_bulan
Dickey-Fuller = -5.3722, Lag order = 7, p-value = 0.01
alternative hypothesis: stationary

hemm ternyata tidak masuk akal! coba kita buat lag/frekuensinya 12 yang artinya setiap 12 bulan akan terjadi trend naik/berulang

adf.test(dat2$total_bulan,k=12)

hasilnya

   Augmented Dickey-Fuller Test

data:  dat2$total_bulan
Dickey-Fuller = -1.136, Lag order = 12, p-value = 0.9158
alternative hypothesis: stationary

Pada contoh diatas dihasilkan p-value = 0.9158> 0.05 artinya H0 diterima sehingga data air passenger adalah data non stasioner yang berulang mengandung tren setiap frekuensi 12

adf.test dengan nilai lag yang berbeda-beda

hemm kalian tentu penasaran, kenapa nilai lag pada adf.test harus disetting? yuk kita coba nilai lag dimulai dari 1 sampai 12 untuk data air passenger akan menghasilkan nilai p-value berikut

hasil = data.frame()
for(k in c(1:12)){
  model = adf.test(dat2$total_bulan,k=k)
  buffer = data.frame(lag=k,model$p.value)
  hasil = rbind(hasil,buffer)
}
hasil

hasilnya

   lag model.p.value
1    1    0.01000000
2    2    0.01000000
3    3    0.01000000
4    4    0.01000000
5    5    0.01000000
6    6    0.01000000
7    7    0.01000000
8    8    0.07347634
9    9    0.18301770
10  10    0.99000000
11  11    0.99000000
12  12    0.91583079

dapat disimpulkan bahwa data air passenger mulai tidak stasioner itu pada lag = 10  (mengingat data air passenger tersaji dalam bentuk bulanan akan nampak pada bulan ke 10 setiap bulannya).

Hal ini berbeda dengan data kelahiran bayi dengan lag berapun akan senantiasa sama, karena data tersebut stationer, mari kita coba

hasil = data.frame()
for(k in c(1:12)){
  model = adf.test(dat$Births,k=k)
  buffer = data.frame(lag=k,model$p.value)
  hasil = rbind(hasil,buffer)
}
hasil

hasilnya

   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

 

jadi jangan bingung untuk menggunakan nilai lag pada adf.test. Untuk membuat data menjadi stasioner akan dibahas lebih lanjut nanti Differencing Data bila tidak Stasioner

ref:

Augmented Dickey-Fuller Test in R (With Example)