LOAD PACKAGE

library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.3

IMPORT DATA EXCEL

data <- read_excel(
  "~/PROJECT SEMESTER 6/PROJECT STATISTIKA 1/DATA PROJECT UAS JST.xlsx"
)

head(data)
## # A tibble: 6 × 2
##   Tanggal    Terakhir
##   <chr>      <chr>   
## 1 30/12/2025 8.646,94
## 2 29/12/2025 8.644,26
## 3 24/12/2025 8.537,91
## 4 23/12/2025 8.584,78
## 5 22/12/2025 8.645,84
## 6 19/12/2025 8.609,55

MELIHAT STRUKTUR DATA

str(data)
## tibble [474 × 2] (S3: tbl_df/tbl/data.frame)
##  $ Tanggal : chr [1:474] "30/12/2025" "29/12/2025" "24/12/2025" "23/12/2025" ...
##  $ Terakhir: chr [1:474] "8.646,94" "8.644,26" "8.537,91" "8.584,78" ...
summary(data)
##    Tanggal            Terakhir        
##  Length:474         Length:474        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character

DATA CLEANING

# Mengubah format angka Indonesia menjadi numerik

data$Terakhir <- as.numeric(
  gsub(",", ".", 
       gsub("\\.", "", data$Terakhir))
)

# Mengubah tanggal menjadi format Date

data$Tanggal <- as.Date(
  data$Tanggal,
  format = "%d/%m/%Y"
)

# Mengurutkan data berdasarkan tanggal

data <- data[order(data$Tanggal), ]

# Mengecek missing value

sum(is.na(data$Terakhir))
## [1] 0
head(data)
## # A tibble: 6 × 2
##   Tanggal    Terakhir
##   <date>        <dbl>
## 1 2024-01-15    7224 
## 2 2024-01-16    7243.
## 3 2024-01-17    7201.
## 4 2024-01-18    7253.
## 5 2024-01-19    7227.
## 6 2024-01-22    7248.

MEMBUAT TIME SERIES

ts_data <- ts(data$Terakhir)

plot(
  ts_data,
  main = "Plot Data IHSG",
  ylab = "Harga Penutupan",
  xlab = "Waktu",
  col = "blue"
)

# UJI STASIONERITAS AWAL

adf_awal <- adf.test(ts_data)

adf_awal
## 
##  Augmented Dickey-Fuller Test
## 
## data:  ts_data
## Dickey-Fuller = -1.9426, Lag order = 7, p-value = 0.6023
## alternative hypothesis: stationary

Interpretasi: Jika p-value > 0.05 maka data tidak stasioner

DIFFERENCING

diff1 <- diff(ts_data)

plot(
  diff1,
  main = "Differencing Orde 1",
  ylab = "Differencing",
  xlab = "Waktu",
  col = "red"
)

adf_diff <- adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
adf_diff
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1
## Dickey-Fuller = -7.2105, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary

PLOT ACF DAN PACF

acf(
  diff1,
  main = "Plot ACF"
)

pacf(
  diff1,
  main = "Plot PACF"
)

# MEMBAGI DATA TRAINING DAN TESTING

n <- length(ts_data)

train_size <- floor(0.8 * n)

train <- ts_data[1:train_size]

test <- ts_data[(train_size + 1):n]

length(train)
## [1] 379
length(test)
## [1] 95

PEMODELAN ARIMA

model_arima <- auto.arima(
  train,
  seasonal = FALSE
)

summary(model_arima)
## Series: train 
## ARIMA(0,1,0) 
## 
## sigma^2 = 10429:  log likelihood = -2285.06
## AIC=4572.11   AICc=4572.12   BIC=4576.05
## 
## Training set error measures:
##                      ME     RMSE      MAE         MPE      MAPE      MASE
## Training set -0.3596464 101.9897 67.13956 -0.01570036 0.9305611 0.9976447
##                    ACF1
## Training set -0.0276924

FORECASTING ARIMA

forecast_arima <- forecast(
  model_arima,
  h = length(test)
)

plot(
  forecast_arima,
  main = "Forecasting ARIMA"
)

# EVALUASI MODEL ARIMA

akurasi_arima <- accuracy(
  forecast_arima,
  test
)

akurasi_arima
##                       ME     RMSE       MAE         MPE      MAPE      MASE
## Training set  -0.3596464 101.9897  67.13956 -0.01570036 0.9305611 0.9976447
## Test set     225.7737895 303.3168 249.63779  3.01616523 3.3615990 3.7094347
##                    ACF1
## Training set -0.0276924
## Test set             NA

PEMODELAN SARIMA

model_sarima <- auto.arima(
  train,
  seasonal = TRUE
)

summary(model_sarima)
## Series: train 
## ARIMA(0,1,0) 
## 
## sigma^2 = 10429:  log likelihood = -2285.06
## AIC=4572.11   AICc=4572.12   BIC=4576.05
## 
## Training set error measures:
##                      ME     RMSE      MAE         MPE      MAPE      MASE
## Training set -0.3596464 101.9897 67.13956 -0.01570036 0.9305611 0.9976447
##                    ACF1
## Training set -0.0276924

FORECASTING SARIMA

forecast_sarima <- forecast(
  model_sarima,
  h = length(test)
)

plot(
  forecast_sarima,
  main = "Forecasting SARIMA"
)

# EVALUASI MODEL SARIMA

akurasi_sarima <- accuracy(
  forecast_sarima,
  test
)

akurasi_sarima
##                       ME     RMSE       MAE         MPE      MAPE      MASE
## Training set  -0.3596464 101.9897  67.13956 -0.01570036 0.9305611 0.9976447
## Test set     225.7737895 303.3168 249.63779  3.01616523 3.3615990 3.7094347
##                    ACF1
## Training set -0.0276924
## Test set             NA

TABEL PERBANDINGAN MODEL

perbandingan <- data.frame(

  Model = c(
    "ARIMA",
    "SARIMA"
  ),

  RMSE = c(
    akurasi_arima[2, "RMSE"],
    akurasi_sarima[2, "RMSE"]
  ),

  MAE = c(
    akurasi_arima[2, "MAE"],
    akurasi_sarima[2, "MAE"]
  ),

  MAPE = c(
    akurasi_arima[2, "MAPE"],
    akurasi_sarima[2, "MAPE"]
  ),

  AIC = c(
    AIC(model_arima),
    AIC(model_sarima)
  )
)

perbandingan
##    Model     RMSE      MAE     MAPE      AIC
## 1  ARIMA 303.3168 249.6378 3.361599 4572.114
## 2 SARIMA 303.3168 249.6378 3.361599 4572.114

MENENTUKAN MODEL TERBAIK

if(
  min(perbandingan$RMSE) ==
  perbandingan$RMSE[1]
){

  cat("Model terbaik adalah ARIMA")

} else {

  cat("Model terbaik adalah SARIMA")

}
## Model terbaik adalah ARIMA

DIAGNOSTIK RESIDUAL

checkresiduals(model_arima)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,0)
## Q* = 8.9193, df = 10, p-value = 0.5398
## 
## Model df: 0.   Total lags used: 10
checkresiduals(model_sarima)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,0)
## Q* = 8.9193, df = 10, p-value = 0.5398
## 
## Model df: 0.   Total lags used: 10

FORECAST 30 HARI KE DEPAN

forecast_30 <- forecast(
  model_arima,
  h = 30
)

plot(
  forecast_30,
  main = "Forecast 30 Hari Kedepan"
)

forecast_30
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 380        7080.47 6949.592 7211.348 6880.310 7280.630
## 381        7080.47 6895.381 7265.559 6797.400 7363.540
## 382        7080.47 6853.783 7307.157 6733.782 7427.158
## 383        7080.47 6818.714 7342.226 6680.149 7480.791
## 384        7080.47 6787.818 7373.122 6632.898 7528.042
## 385        7080.47 6759.886 7401.054 6590.179 7570.761
## 386        7080.47 6734.200 7426.740 6550.895 7610.045
## 387        7080.47 6710.292 7450.648 6514.331 7646.609
## 388        7080.47 6687.836 7473.104 6479.989 7680.951
## 389        7080.47 6666.598 7494.342 6447.507 7713.433
## 390        7080.47 6646.397 7514.543 6416.613 7744.327
## 391        7080.47 6627.096 7533.844 6387.094 7773.846
## 392        7080.47 6608.583 7552.357 6358.782 7802.158
## 393        7080.47 6590.770 7570.170 6331.538 7829.402
## 394        7080.47 6573.582 7587.358 6305.252 7855.688
## 395        7080.47 6556.959 7603.981 6279.829 7881.111
## 396        7080.47 6540.847 7620.093 6255.188 7905.752
## 397        7080.47 6525.202 7635.738 6231.261 7929.679
## 398        7080.47 6509.987 7650.953 6207.991 7952.949
## 399        7080.47 6495.167 7665.773 6185.326 7975.614
## 400        7080.47 6480.712 7680.228 6163.220 7997.720
## 401        7080.47 6466.599 7694.341 6141.635 8019.305
## 402        7080.47 6452.802 7708.138 6120.535 8040.405
## 403        7080.47 6439.302 7721.638 6099.888 8061.052
## 404        7080.47 6426.081 7734.859 6079.668 8081.272
## 405        7080.47 6413.121 7747.819 6059.848 8101.092
## 406        7080.47 6400.409 7760.531 6040.406 8120.534
## 407        7080.47 6387.930 7773.010 6021.321 8139.619
## 408        7080.47 6375.671 7785.269 6002.573 8158.367
## 409        7080.47 6363.623 7797.317 5984.146 8176.794