Tampilkan postingan dengan label data berakala. Tampilkan semua postingan
Tampilkan postingan dengan label data berakala. Tampilkan semua postingan

Jumat, 01 Agustus 2025

Analisis Peramalan ARIMA dengan data BJ Sales

 

BJ Sales Arima

BJ Sales Arima

Author

Andri Faisal

Mengelola ARIMA RStudio

Kita mencoba menampilkan terlebih dahulu data penjualan dari BJ ini adalah data nilai penjualan tahunan dari perusahaan BJ. kita ketika nama filenya. nama file ini sudah ada di ikutan RStuio maka tidak perlu lagi menampilkan package lain.

BJsales
Time Series:
Start = 1 
End = 150 
Frequency = 1 
  [1] 200.1 199.5 199.4 198.9 199.0 200.2 198.6 200.0 200.3 201.2 201.6 201.5
 [13] 201.5 203.5 204.9 207.1 210.5 210.5 209.8 208.8 209.5 213.2 213.7 215.1
 [25] 218.7 219.8 220.5 223.8 222.8 223.8 221.7 222.3 220.8 219.4 220.1 220.6
 [37] 218.9 217.8 217.7 215.0 215.3 215.9 216.7 216.7 217.7 218.7 222.9 224.9
 [49] 222.2 220.7 220.0 218.7 217.0 215.9 215.8 214.1 212.3 213.9 214.6 213.6
 [61] 212.1 211.4 213.1 212.9 213.3 211.5 212.3 213.0 211.0 210.7 210.1 211.4
 [73] 210.0 209.7 208.8 208.8 208.8 210.6 211.9 212.8 212.5 214.8 215.3 217.5
 [85] 218.8 220.7 222.2 226.7 228.4 233.2 235.7 237.1 240.6 243.8 245.3 246.0
 [97] 246.3 247.7 247.6 247.8 249.4 249.0 249.9 250.5 251.5 249.0 247.6 248.8
[109] 250.4 250.7 253.0 253.7 255.0 256.2 256.0 257.4 260.4 260.0 261.3 260.4
[121] 261.6 260.8 259.8 259.0 258.9 257.4 257.7 257.9 257.4 257.3 257.6 258.9
[133] 257.8 257.7 257.2 257.5 256.8 257.5 257.0 257.6 257.3 257.5 259.6 261.1
[145] 262.9 263.3 262.8 261.8 262.2 262.7

dari data ini bentuknya adalah ts atau time series sebanyak 150 data . Tidak dijelaskan bentuk periodikal datanya apakah bulanan atau tahunan. Kemungkinan memang bulaanan. setelah menampilkan data maka kita bisa untuk mengola datanya dengan metode time series. kemudian kita jalankan package yang ada kalau tidak ada maka harus install terlebih dahulu package adalah tseries dan forecast.

library(forecast)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(tseries)

Pertama kita melihat dulu bentuk grafik dari BJsales tersebut. Ini bisa melihat pola stataioner atau tidaknya data. Tentu melihat grafik saja tidak atau belum pasti untuk menunjukkan kalau data terindikasi non staioner. Perlu kita ketahui, bahwa hampir seluruh peramalan mensyaratkan data yang stationer. Hal ini mencegah agar bentuk peramalah bias atau tidak akurat.
Sesudah kita memasang package maka kita melakukan uji di awal. uji pertama adalah memastikan datanya adalah data staioner. KIta emlakukan uji augemnetd Dickey Fueller

plot(BJsales)

adf.test(BJsales)

    Augmented Dickey-Fuller Test

data:  BJsales
Dickey-Fuller = -2.1109, Lag order = 5, p-value = 0.5302
alternative hypothesis: stationary

Dari hasil terlihat nilai Dickey-Fueller sebesar -2,1109 dengan nilai lag order 5. artinya … Kita bisa melihat nilai p atau pvalu sebesar 0,5032, artinya p>0,05 ini menandakan adalah menerima hipotesis nol untuk menolak kalau data adalah non stationer.

Memperbaiki data yang tidak stationer

Sesuai bahasan atas bahwa untik mengatasi kalau data tersebut harus stationer. slah satu cara yang ampuh untuk mengatsi ketidakstationeran daata adah dengan cara membuat difference data tersebut. Biasanya dengan satu kalai difference saja data yang tdiak stataioner akan menjadi stationer. perintahnuya adalah dengan diff pada dataset setelah itu kita bisa melakkan kembali adf test.

dBJsales=diff(BJsales)
adf.test(dBJsales)

    Augmented Dickey-Fuller Test

data:  dBJsales
Dickey-Fuller = -3.3485, Lag order = 5, p-value = 0.06585
alternative hypothesis: stationary

adf.test(dBJsales)

Augmented Dickey-Fuller Test

data: dBJsales Dickey-Fuller = -3.3485, Lag order = 5, p-value = 0.06585 alternative hypothesis: stationary Setelah sekali difference atau diff menunjukkan nilai Dickey-FUeller adalah -3.3845 dnegan lag order = 5. Sedangkan nilai p 0,6585. Meski nilai ini kecil namun masih leboih dari 0,05. maka data yang sudah melakukan difference ini masih harus dilakukan sekali lagi

dBJsales2=diff(diff(BJsales))
plot(dBJsales2)

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

    Augmented Dickey-Fuller Test

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

cara untuk melakukan difference tiga dua adalah menulis diff didalam diff maka hasilnya adalah difference tingkat dua. Lalu setelah uji adf.test maka hasilnya adalah nilai stataioner artinya data yang sudah difeference tingkat dua bisa dilakukan analisis time series.

acf(dBJsales2)

pacf(dBJsales2)

BJsales_arima<-auto.arima(dBJsales2,trace=TRUE,seasonal=TRUE)

 ARIMA(2,0,2) with non-zero mean : 524.5745
 ARIMA(0,0,0) with non-zero mean : 579.7576
 ARIMA(1,0,0) with non-zero mean : 544.1259
 ARIMA(0,0,1) with non-zero mean : 519.2962
 ARIMA(0,0,0) with zero mean     : 577.7051
 ARIMA(1,0,1) with non-zero mean : 521.2459
 ARIMA(0,0,2) with non-zero mean : 521.2693
 ARIMA(1,0,2) with non-zero mean : Inf
 ARIMA(0,0,1) with zero mean     : 517.2202
 ARIMA(1,0,1) with zero mean     : 519.1404
 ARIMA(0,0,2) with zero mean     : 519.164
 ARIMA(1,0,0) with zero mean     : 542.0475
 ARIMA(1,0,2) with zero mean     : Inf

 Best model: ARIMA(0,0,1) with zero mean     

Sebeluam melakukan uji arima maka kita bisa melihat grafik adf atau pacf. bagian acf menunjukkan ada spike yang melwati garis signifikannya yakni di pertama. ada dugaan penggunaaan AR(1). setelah itu kita melihat

Untuk melihat rangkuman hasil arima dapat diketik perintah summary pada syntax dan jangan lupa nama formula yang sudah kita masukkan sebelumnya.

summary(BJsales_arima)
Series: dBJsales2 
ARIMA(0,0,1) with zero mean 

Coefficients:
          ma1
      -0.7480
s.e.   0.0662

sigma^2 = 1.879:  log likelihood = -256.57
AIC=517.14   AICc=517.22   BIC=523.13

Training set error measures:
                     ME    RMSE      MAE MPE MAPE      MASE       ACF1
Training set 0.01787588 1.36597 1.078827 Inf  Inf 0.4459719 0.01682201

Kita bisa melihat kalau model yang paling baik adalah ARIMA (0,0,1) artinya adalah nilai dari persamaan ini adalah Moving Average tingkat pertama. Setelah itu kita akan melihat apakah bentuk peramalan ini sudah melalui dari uji yang lain seperti Ljung Box.

# Plot ACF dari residual
acf(residuals(BJsales_arima), main = "ACF of Residuals")

# Uji Ljung-Box
Box.test(residuals(BJsales_arima), lag = 20, type = "Ljung-Box")

    Box-Ljung test

data:  residuals(BJsales_arima)
X-squared = 17.408, df = 20, p-value = 0.6263

Hasil menunjukkan kalau residuals tidak mengalami autokorelasi. Begitu juga pada ACF residuals ada spike pada lag pertama menunjukkan model ini sudah baik. Setelah itu kita akan melihat normalitas dari residuals peramalan atau nilai sisaan.

# Plot histogram residual
hist(residuals(BJsales_arima))

# Plot QQ
qqnorm(residuals(BJsales_arima))
qqline(residuals(BJsales_arima))

# Uji Shapiro-Wilk
shapiro.test(residuals(BJsales_arima))

    Shapiro-Wilk normality test

data:  residuals(BJsales_arima)
W = 0.99403, p-value = 0.8025

Nilai shapiro menujukkan kalau residulas sudah teridsitribusi normal.

KIta ke bentuk peramalan (forecast) seperti dibawah ini. peramalan dalam bentuk 10 periode ke depan.

# Peramalan untuk 10 periode ke depan
forecast_result <- forecast(BJsales_arima, h = 10)

# Visualisasikan hasil peramalan
plot(forecast_result, main = "Peramalan dengan Model ARIMA")

Peramalan menggunakan Simple Extropolation Smoothing pada data drivers

  Simple exptrapolating Smoothing Simple exptrapolating Smoothing ...