Data Tidak Stasioner

Author

Windi Pangesti

Published

September 21, 2025

library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.5.1
library(tsibble)
Warning: package 'tsibble' was built under R version 4.5.1
Registered S3 method overwritten by 'tsibble':
  method               from 
  as_tibble.grouped_df dplyr

Attaching package: 'tsibble'
The following objects are masked from 'package:base':

    intersect, setdiff, union
library(tseries)
Warning: package 'tseries' was built under R version 4.5.1
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(MASS)
Warning: package 'MASS' was built under R version 4.5.1
set.seed(8990)

Stasioner dalam Rataan dan Ragam

Pada dasarnya, pembangkitan data ARIMA akan menghasilkan data yang stasioner dalam rataan dan ragam karena akan mengikuti fungsi default-nya yang mengikuti pembangkitan bilangan acak normal dengan mean=0 dan ragam=1 .

stas <- arima.sim(n=200, list(order=c(1,0,1),ar= 0.2, ma=0.2),mean=12)

Plot Time Series

plot_stas <- stas |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")
plot_stas

mean(stas)
[1] 18.06022
lattice::densityplot(as.vector(stas))

Plot deret waktu di atas menunjukkan bahwa data stasioner dalam rataan, ditandai dengan data yang menyebar di sekitar nilai tengahnya (18) dan stasioner dalam ragam, ditandai dengan data berfluktuasi pada rentang yang relatif sama sepanjang waktu.

Plot ACF

acf(stas)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut cenderung tails off dan membentuk gelombang sinus.

Uji ADF

Uji ADF (Augmented Dickey–Fuller) adalah uji statistik yang digunakan untuk memeriksa apakah suatu deret waktu stasioner dalam rataan.

tseries::adf.test(stas)
Warning in tseries::adf.test(stas): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  stas
Dickey-Fuller = -5.5322, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Plot Box-Cox

index <- seq(1:200)

# Box-Cox
bc <- boxcox(
  stas ~ index,
  lambda = seq(-1, 4, by = 0.01)
)

# Nilai lambda optimum
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 1.97
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
       0.22        3.73 

Gambar di atas menunjukkan nilai λ optimum (rounded value) sebesar 1,97 dan selang kepercayaan 95% nilai memiliki batas bawah 0,22 dan batas atas 3,73. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

Catatan:
Fungsi boxcox() di R tidak dapat digunakan langsung pada data yang mengandung nilai nol atau negatif, meskipun hanya untuk tujuan estimasi λ. Hal ini karena perhitungan log-likelihood dalam Box–Cox mensyaratkan seluruh data bernilai positif.Jika dataset mengandung nilai nol atau negatif, maka perlu ditambahkan suatu konstanta positif pada seluruh data sehingga semua nilainya menjadi positif sebelum dilakukan analisis Box–Cox.

Partisi Data Deret Waktu

library(ggplot2)
library(tsibble)

plot_stas <- stas |> 
  as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() +
  theme_bw() +
  xlab("Obs") + 
  ylab("Nilai") +
  
  # Tambahkan garis batas
  geom_vline(xintercept = 64, linetype = "dashed", color = "red") +
  geom_vline(xintercept = 134, linetype = "dashed", color = "blue") +
  ggtitle("Partisi Deret Waktu:")

plot_stas

Bagian 1 : observasi 1 - 64

dt_stas1 <- stas[1:67] |> ts()

#rata-rata
mean(dt_stas1)
[1] 18.08483
#varians
var(dt_stas1)
[1] 1.141982

Plot Time Series

dt_stas1 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Plot deret waktu di atas menunjukkan bahwa data stasioner dalam rataan, ditandai dengan data yang menyebar di sekitar nilai tengahnya (18) dan stasioner dalam ragam, ditandai dengan data berfluktuasi pada rentang yang relatif sama sepanjang waktu.

Plot ACF

acf(dt_stas1)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut cenderung tails off dan membentuk gelombang sinus.

Uji ADF

tseries::adf.test(dt_stas1)

    Augmented Dickey-Fuller Test

data:  dt_stas1
Dickey-Fuller = -3.5663, Lag order = 4, p-value = 0.043
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.043 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Plot Boxcox

index <- seq(1, 67)

# Box-Cox
bc <- boxcox(
  dt_stas1 ~ index,
  lambda = seq(-2, 6, by = 0.01)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 2.22
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      -1.03        5.57 

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 2,2 dan pada selang kepercayaan 95% nilai memiliki batas bawah -1,03 dan batas atas 5,57. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

Bagian 2 : observasi 1 - 134

dt_stas2 <- stas[1:134] |> ts()
mean(dt_stas2)
[1] 17.93724
var(dt_stas2)
[1] 1.128205

Plot Time Series

dt_stas2 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Plot deret waktu di atas menunjukkan bahwa data stasioner dalam rataan, ditandai dengan data yang menyebar di sekitar nilai tengahnya (18) dan stasioner dalam ragam, ditandai dengan data berfluktuasi pada rentang yang relatif sama sepanjang waktu.

Plot ACF

acf(dt_stas2)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut cenderung tails off dan membentuk gelombang sinus.

Uji ADF

adf.test(dt_stas2)
Warning in adf.test(dt_stas2): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dt_stas2
Dickey-Fuller = -4.4004, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Plot Boxcox

index <- seq(1, 134)

# Box-Cox
bc <- boxcox(
  dt_stas2 ~ index,
  lambda = seq(0, 6, by = 0.01)
)

# Nilai lambda optimum
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 2.84
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
       0.47        5.27 

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 2,85 dan pada selang kepercayaan 95% nilai memiliki batas bawah 0,47 dan batas atas 5,27. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

Tidak Stasioner dalam Rataan, Stasioner dalam Ragam

Bagaimana cara mensimulasikan data dengan tren tertentu?

Kunci dari simulasi tersebut berada di \(Y_{t}-Y_{t-1}\), atau first difference, atau selisih antara observasi di waktu ke \(t\) dan observasi sebelumnya. Jika suatu deret waktu memiliki tren naik, misal, maka selisih tersebut akan positif. Sebaliknya, jika suatu deret memiliki tren turun, maka selisih akan negatif. Jika suatu deret stasioner, selisih akan memiliki rata-rata nol.

Ini dapat diilustrasikan dengan fungsi cumsum. cumsum adalah jumlah kumulatif. Untuk mengerti logika dari pengunaan jumlah kumulatif, bayangkan ada deret waktu dengan nilai awal \(c\):

\[ Y_1 = c \]

Lalu definsikan \(d_i\), di mana \(i = 2, 3, \ldots\) sebagai selisih observasi ke-i dengan observasi sebelumnya:

\[ d_i = Y_i-Y_{i-1} \]

Perhatikan bahwa:

\[ \begin{aligned} Y_3-Y_{1} & = d_3+d_2\\ &= Y_3-Y_2+Y_2-Y_1 \end{aligned} \]

Cukup jelas bahwa sifat tersebut berarti:

\[ \begin{aligned} Y_t-Y_1 &= \sum_{i=2}^t d_i\\ Y_t &= Y_1 + \sum_{i=2}^t d_i \end{aligned} \]

Atau, amatan di waktu ke \(t\) dapat ditemukan dari menambahkan amatan ke-1 dengan jumlah kumulatif perbedaan \(d_i\) sampai di waktu ke-t. Kode di bawah membuat data dengan proses tersebut. Ada tiga skenario, yaitu:

  1. Selisih antara observasi dan observasi sebelumnya nol

  2. Selisih antara observasi dan observasi sebelumnya positif

  3. Selisih antara observasi dan observasi sebelumnya negatif

Dengan nilai awal 1 dan komponen \(e_t\) menyebar normal.

# Simulasi deret waktu dengan tren berbeda
# Tanpa tren
notrend <- 1 + cumsum(rep(0, 100)) + rnorm(100) |> ts()

# Tren naik
postrend <- 1 + cumsum(rep(0.2, 100)) + rnorm(100) |> ts() 

# Tren turun
negtrend <- 1 + cumsum(rep(-0.2, 100)) + rnorm(100) |> ts()

Hasil yang muncul dapat di-plot (note, untuk plotting ini digunakan ggplot2; ts.plot() dapat digunakan - ini tergantung preferensi saja):

plot_notrend <- notrend |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai") + ggtitle("First Difference = 0")
plot_postrend <- postrend |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai") + ggtitle("First Difference = 0.2")
plot_negtrend <- negtrend |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai") + ggtitle("First Difference = -0.2")

ggpubr::ggarrange(plot_notrend, plot_postrend, plot_negtrend, nrow = 3)

Dapat disimulasikan proses MA atau AR yang tidak stasioner dengan suatu tren dengan mensimulasikan beda terlebih dahulu (menggunakan arima.sim), ditambah suatu konstanta, lalu mencari jumlah kumulatif. Terdapat juga parameter mean di fungsi arima.sim, tetapi parameter ini adalah parameter untuk \(E[e_t]\), bukan \(E[Y_t-Y_{t-1}]\). Proses dari nilai harapan rg2 noise tertentu menjadi nilai harapan \(Y\) di suatu proses MA atau AR yang tak stasioner sangat tergantung pada model, yang diilustrasikan disini.

startSpot <- 3

# Cara 1: tambah konstanta 1.5 di selisih
dt <- ts(arima.sim(n = 100,
                   list(order = c(1,0,1), ar = 0.2, ma = 0.2),
                   sd = 2) + 1.5)
yt <- ts(startSpot + cumsum(dt))

# Cara 2: gunakan mean = 1.5 di arima.sim
dt_alt <- ts(arima.sim(n = 100,
                       list(order = c(1,0,1), ar = 0.2, ma = 0.2),
                       mean = 1.5, sd = 2))
yt_alt <- ts(startSpot + cumsum(dt_alt))

# Plot hasil simulasi
plot_dt <- dt |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai") + ggtitle("Penambahan konstanta 1.5 di selisih")
plot_yt <- yt |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")
plot_dt_alt <- dt_alt |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai") + ggtitle("Mean 1.5 di parameter arima.sim")
plot_yt_alt <- yt_alt |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) + geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

# Gabungkan Plot
ggpubr::ggarrange(plot_dt, plot_yt, plot_dt_alt, plot_yt_alt)

Terlihat di contoh di atas bahwa menambahkan konstanta 1.5 pada hasil arima.sim beda dengan memasukkan parameter mean = 1.5.

Data Bangkitan Baru

set.seed(8990)
dt_alt <- arima.sim(n=200, list(order=c(1,0,1),ar=c(.2), ma=.2), mean=0.2, sd=0.5)  |> ts()
postrend <- startSpot + cumsum(dt_alt) |> ts()

Plot Time Series

postrend |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

mean(postrend)
[1] 33.75305
var(postrend)
[1] 341.6068

Berdasarkan plot time series tersebut, terlihat bahwa data tidak stasioner dalam rataan, ditandai dengan adanya kecenderungan (tren) positif, tetapi stasioner dalam ragam, ditandai dengan adanya lebar pita pada plot yang cenderung sama.

acf(postrend)

Plot ACF postrend menunjukkan korelasi yang menurun secara perlahan pada banyak lag, sehingga menjadi indikasi kuat bahwa deret tidak stasioner.

Uji ADF

tseries::adf.test(postrend)

    Augmented Dickey-Fuller Test

data:  postrend
Dickey-Fuller = -1.9413, Lag order = 5, p-value = 0.6007
alternative hypothesis: stationary

Berdasarkan uji ADF tersebut, didapat p-value lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Plot Box-Cox

index <- seq(1, 200)

# Uji Box-Cox
bc <- boxcox(
  postrend ~ index,
  lambda = seq(0.8, 1.1, by = 0.001)
)

# Nilai lambda optimum
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 0.961
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      0.900       1.022 

Differencing

Dalam analisis deret waktu, differencing merupakan salah satu prosedur transformasi yang digunakan untuk memperoleh sifat stasioneritas dalam rataan. Metode ini dilakukan dengan menghitung selisih nilai observasi antar periode sehingga pola tren atau ketidakstasioneran dalam rataan dapat dieliminasi.

Secara umum, pembedaan pertama ditulis sebagai:

\[ \nabla Y_t = Y_t - Y_{t-1} \]

Jika tren linier masih tersisa/ belum stasioner, dapat dilakukan differencing kedua:
\[ \nabla^2 Y_t = \nabla (\nabla Y_t) = Y_t - 2Y_{t-1} + Y_{t-2} \]

Dengan cara ini, data yang awalnya tidak stasioner dapat ditransformasi menjadi stasioner sehingga bisa digunakan dalam pemodelan. Di dalam R, proses differencing dapat dilakukan dengan fungsi:

  • diff(y, differences = 1) → untuk differencing pertama.
  • diff(y, differences = 2) → untuk differencing kedua.
# Differencing pertama pada postrend
postrend_diff1 <- diff(postrend, differences = 1)

# Plot hasil differencing
ts.plot(postrend_diff1,
        main = "First-order Differencing dari postrend",
        col = "blue", lwd = 2)

Plot ACF

acf(postrend_diff1)

Uji ADF

adf.test(postrend_diff1)
Warning in adf.test(postrend_diff1): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  postrend_diff1
Dickey-Fuller = -5.52, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data sudah stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Partisi Data

postrend |> 
  as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() +
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  theme_bw()

Bagian 1 : observasi 1 - 100

postrend1 <- postrend[1:100] |> ts()
mean(postrend1)
[1] 18.84534
var(postrend1)
[1] 116.7756

Plot Time Series

postrend1 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line()+theme_bw() +
  xlab("Obs") + ylab("Nilai")

Plot ACF

acf(postrend1)

Uji ADF

adf.test(postrend1)

    Augmented Dickey-Fuller Test

data:  postrend1
Dickey-Fuller = -2.2384, Lag order = 4, p-value = 0.4779
alternative hypothesis: stationary

Plot Boxcox

index <- seq(1:100)

# Uji Box-Cox
bc <- boxcox(
  postrend1 ~ index,
  lambda = seq(0.5, 1, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 0.747
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      0.575       0.919 

Tidak Stasioner dalam Ragam, Stasioner dalam Rataan

arima.sim memiliki parameter sd yang dapat di-set beda.

set.seed(8090)
sd1 <- arima.sim(n=80, list(order=c(1,0,1),ar=c(.2), ma=.2), sd = 1)
sd5 <- arima.sim(n=120, list(order=c(1,0,1),ar=c(.2), ma=.2), sd = 5)
dtgab <- c(sd1,sd5) |> ts()

Plot Time Series

dtgab |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot deret waktu, data terlihat stasioner dalam rataan karena tidak menunjukkan adanya tren maupun pola musiman. Namun, data belum stasioner dalam ragam, yang ditunjukkan oleh adanya perbedaan besar-kecilnya fluktuasi pada plot.

Plot ACF

acf(dtgab)

Berdasarkan plot ACF, terlihat bahwa data stasioner dalam rataan.

Uji ADF

adf.test(dtgab)
Warning in adf.test(dtgab): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dtgab
Dickey-Fuller = -5.1553, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang kurang dari taraf nyata 5% dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Plot Box Cox

index <- seq(1:200)

# Uji Box-Cox
bc <- boxcox(
  dtgab - min(dtgab) + 1 ~ index,
  lambda = seq(0, 5, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 0.679
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      0.479       0.890 

Hasil uji Box–Cox menunjukkan bahwa nilai λ optimum adalah 0,679 dengan interval kepercayaan 95% sebesar (0,479–0,890). Karena selang tersebut tidak memuat nilai λ = 1, maka dapat disimpulkan bahwa data tidak stasioner dalam ragam sehingga diperlukan transformasi.

Transformasi Box–Cox

Transformasi Box–Cox atau transformasi pangkat digunakan untuk menangani deret yang tidak stasioner dalam ragam.

Catatan:
Transformasi pangkat hanya dapat diterapkan pada data yang bernilai positif.
Apabila terdapat nilai nol atau negatif, maka suatu konstanta positif perlu ditambahkan pada seluruh data agar semuanya bernilai positif sebelum dilakukan transformasi.

# Data digeser agar positif
y_shift <- dtgab - min(dtgab) + 1

# Transformasi Box-Cox dengan lambda ~ 0.5 (akar kuadrat)
y_bc <- y_shift^0.5
index <- seq(1:200)

# Uji Box-Cox
bc <- boxcox(
  y_bc ~ index,
  lambda = seq(0, 5, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 1.359
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      0.958       1.781 

Partisi Data

Bagian 1 :

dtgab1 <- dtgab[80:200] |> ts()
mean(dtgab1)
[1] 1.863762
var(dtgab1)
[1] 25.95595

Plot Time Series

dtgab1 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot time series tersebut, terlihat bahwa data cenderung stasioner dalam rataan, ditandain dengan tidak adanya trend dan musiman pada data, serta stasioner dalam ragam, ditandai dengan lebar pita yang cenderung sama pada plot tersebut

Plot ACF

acf(dtgab1)

Berdasarkan plot ACF, terlihat bahwa data cenderung stasioner dalam rataan ditandai dengan plot ACF yang tails off dan cenderung membentuk gelombang sinus

Uji ADF

adf.test(dtgab1)
Warning in adf.test(dtgab1): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dtgab1
Dickey-Fuller = -4.5366, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01691 yang kurang dari taraf nyata 5% dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF

Plot Boxcox

index <- seq(80:200)
bc = boxcox(dtgab1+25~index, lambda = seq(0,6,by=1))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 0.4848485
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
 [1] 0.00000000 0.06060606 0.12121212 0.18181818 0.24242424 0.30303030
 [7] 0.36363636 0.42424242 0.48484848 0.54545455 0.60606061 0.66666667
[13] 0.72727273 0.78787879 0.84848485 0.90909091 0.96969697 1.03030303
[19] 1.09090909 1.15151515 1.21212121 1.27272727

Bagian 2

dtgab2 <- dtgab[1:132] |> ts()
mean(dtgab2)
[1] 1.050091
var(dtgab2)
[1] 11.85878

Plot Time Series

dtgab2 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot data deret waktu tersebut, terlihat bahwa data stasioner dalam rataan, ditandai dengan data yang tidak menunjukkan adanya trend ataupun musiman, serta tidak stasioner dalam ragam ditandai dengan lebar pita pada plot yang cenderung berbeda di beberapa periode waktunya

Plot ACF

acf(dtgab2)

Berdasarkan plot ACF tersebut, terlihat bahwa data stasioner dalam rataan ditandai dengan plot ACF yang cuts off pada lag ke 2

Uji ADF

adf.test(dtgab2)
Warning in adf.test(dtgab2): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dtgab2
Dickey-Fuller = -4.1739, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01383 yang kurang dari taraf nyata 5% dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF

index <- seq(1:132)

# Uji Box-Cox
bc <- boxcox(
  dtgab2 +15 ~ index,
  lambda = seq(-2, 5, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] -0.35
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
     -0.944       0.236 

Tidak Stasioner dalam Rataan dan Ragam

Hal ini dapat disimulasikan dengan membangkitkan data yang tidak stasioner dalam ragam lalu membentuk trend menggunakan data tersebut

set.seed(8990)
sd2 <- arima.sim(n=100, list(order=c(1,0,1),ar=c(.2), ma=.2), sd = 2)
sd6 <- arima.sim(n=100, list(order=c(1,0,1),ar=c(.2), ma=.2), sd = 6)
datagab <- c(sd2,sd6)
dt_rg <- startSpot + cumsum(datagab)  |> ts() 
dt_rg <- dt_rg +100

Plot Time Series

dt_rg |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot time series tersebut, terlihat bahwa data tidak stasioner dalam rataan, ditandai dengan adanya trend pada data dan tidak stasioner dalam ragam, ditandai dengan adanya perbedaan lebar pita pada plot

Plot ACF

acf(dt_rg)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut menurun secara perlahan (tails off slowly) yang menandakan data tidak stasioner dalam rataan

Uji ADF

adf.test(dt_rg)

    Augmented Dickey-Fuller Test

data:  dt_rg
Dickey-Fuller = -1.8362, Lag order = 5, p-value = 0.6447
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.6447 yang lebih besar dari taraf nyata 5% dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

index <- seq(1:200)

# Uji Box-Cox
bc <- boxcox(
  dt_rg ~ index,
  lambda = seq(-2, 5, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 1.47
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      1.148       1.805 

differencing

# Differencing pertama pada postrend
dt_rg_diff1 <- diff(dt_rg, differences = 1)
index <- seq(1:199)

# Uji Box-Cox
bc <- boxcox(
  dt_rg_diff1 - min(dt_rg_diff1) + 1 ~ index,
  lambda = seq(0, 5, by = 0.001)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 1.238
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
      0.978       1.517 

Partisi Data

Bagian 1

dt_rg1 <- dt_rg[1:66] |> ts()
mean(dt_rg1)
[1] 101.2441
var(dt_rg1)
[1] 118.5542

Plot Time Series

dt_rg1 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot time series tersebut, terlihat bahwa data tidak stasioner dalam rataan karena masih terdapat tren pada data, namun cenderung stasioner dalam ragam karena memiliki lebar pita yang cenderung sama

Plot ACF

acf(dt_rg1)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut menurun secara perlahan (tails off slowly) yang menandakan data tidak stasioner dalam rataan

Uji ADF

adf.test(dt_rg1)

    Augmented Dickey-Fuller Test

data:  dt_rg1
Dickey-Fuller = -1.7373, Lag order = 4, p-value = 0.6816
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.6816 yang lebih besar dari taraf nyata 5% dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF

Bagian 2

dt_rg2 <- dt_rg[67:150] |> ts()
mean(dt_rg2)
[1] 87.36297
var(dt_rg2)
[1] 913.2413

Plot Time Series

dt_rg2 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot time series tersebut, terlihat bahwa data tidak stasioner dalam rataan karena masih terdapat tren pada data, dan tidak stasioner dalam ragam karena memiliki lebar pita yang cenderung tidak sama

Plot ACF

acf(dt_rg2)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut menurun secara perlahan (tails off slowly) yang menandakan data tidak stasioner dalam rataan

Uji ADF

adf.test(dt_rg2)

    Augmented Dickey-Fuller Test

data:  dt_rg2
Dickey-Fuller = -1.3767, Lag order = 4, p-value = 0.8315
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.9202 yang lebih besar dari taraf nyata 5% dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF

index <- seq(1:84)

# Uji Box-Cox
bc <- boxcox(
  dt_rg2 ~ index,
  lambda = seq(0, 6, by = 1)
)

# Nilai lambda optimum (dibulatkan)
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 2.181818
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
   1.575758    2.909091 

Bagian 3

dt_rg3 <- dt_rg[151:200] |> ts()
mean(dt_rg3)
[1] 129.5688
var(dt_rg3)
[1] 711.8398

Plot Time Series

dt_rg3 |> as_tsibble() |> 
  ggplot(aes(x = index, y = value)) +
  geom_line() + theme_bw() +
  xlab("Obs") + ylab("Nilai")

Berdasarkan plot time series tersebut, terlihat bahwa data tidak stasioner dalam rataan karena masih terdapat tren pada data, namun cenderung stasioner dalam ragam karena memiliki lebar pita yang cenderung sama

Plot ACF

acf(dt_rg3)

Berdasarkan plot ACF, terlihat bahwa plot ACF pada data tersebut menurun secara perlahan (tails off slowly)yang menandakan data tidak stasioner dalam rataan

Uji ADF

tseries::adf.test(dt_rg3,k=5)

    Augmented Dickey-Fuller Test

data:  dt_rg3
Dickey-Fuller = -3.1927, Lag order = 5, p-value = 0.0984
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.323 yang lebih besar dari taraf nyata 5% dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini tidak sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF