#ASISTENSI 1

R Markdown

SIAPKAN DATA

# Instal dan panggil library (jika belum)
library(readxl)
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(urca)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(forecast)

# Baca data dari file Excel
data <- read_excel("C:/Users/Asus/OneDrive/Dokumen/Semester 5/Analisis Runtun Waktu/Harga Eceran Beras di Jakarta.xlsx", 
                   sheet = "Sheet1")

# Lihat struktur data
head(data)
## # A tibble: 6 × 3
##   Tahun Bulan    `Harga Beras`
##   <dbl> <chr>    <chr>        
## 1  2024 Januari  16091,34     
## 2  2024 Februari 17042,21     
## 3  2024 Maret    17806,92     
## 4  2024 April    17773,21     
## 5  2024 Mei      16944,86     
## 6  2024 Juni     16872,22
# Ubah kolom Harga Beras menjadi numerik (ganti koma jadi titik)
data <- data %>%
  mutate(`Harga Beras` = as.numeric(gsub(",", ".", `Harga Beras`)))

# Ubah Bulan ke format angka (Jan = 1, Feb = 2, dst)
data <- data %>%
  mutate(
    Bulan = match(Bulan,
                  c("Januari", "Februari", "Maret", "April", "Mei", "Juni",
                    "Juli", "Agustus", "September", "Oktober", "November", "Desember")),
    # Gabungkan Tahun dan Bulan jadi tanggal (ambil tanggal 1)
    Tanggal = as.Date(paste(Tahun, Bulan, "1", sep = "-"))
  )

# Cek hasil konversi
head(data)
## # A tibble: 6 × 4
##   Tahun Bulan `Harga Beras` Tanggal   
##   <dbl> <int>         <dbl> <date>    
## 1  2024     1        16091. 2024-01-01
## 2  2024     2        17042. 2024-02-01
## 3  2024     3        17807. 2024-03-01
## 4  2024     4        17773. 2024-04-01
## 5  2024     5        16945. 2024-05-01
## 6  2024     6        16872. 2024-06-01

PLOT TIME SERIES

# Plot deret waktu
ggplot(data, aes(x = Tanggal, y = `Harga Beras`)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "darkred", size = 2) +
  labs(title = "Plot Deret Waktu Harga Eceran Beras di Jakarta (2021- 2024)",
       x = "Waktu",
       y = "Harga Beras (Rp/kg)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# --- Buat box plot per tahun ---
ggplot(data, aes(x = factor(Tahun), y = `Harga Beras`)) +
  geom_boxplot(fill = "skyblue", color = "darkblue", alpha = 0.7) +
  geom_jitter(width = 0.1, color = "red", size = 2, alpha = 0.7) +
  labs(title = "Box Plot Harga Eceran Beras per Tahun",
       x = "Tahun",
       y = "Harga Beras (Rp/kg)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

— BOX PLOT HARGA BERAS PER BULAN (SEMUA TAHUN DIGABUNG) —

# Ubah kembali angka bulan ke nama bulan biar lebih informatif di sumbu X
data <- data %>%
  mutate(
    Nama_Bulan = factor(
      c("Januari", "Februari", "Maret", "April", "Mei", "Juni",
        "Juli", "Agustus", "September", "Oktober", "November", "Desember")[Bulan],
      levels = c("Januari", "Februari", "Maret", "April", "Mei", "Juni",
                 "Juli", "Agustus", "September", "Oktober", "November", "Desember")
    )
  )

Buat boxplot per bulan

ggplot(data, aes(x = Nama_Bulan, y = `Harga Beras`)) +
  geom_boxplot(fill = "lightgreen", color = "darkgreen", alpha = 0.7, outlier.color = "red") +
  geom_jitter(aes(color = factor(Tahun)), width = 0.2, size = 2, alpha = 0.8) +
  scale_color_manual(values = c("2021" = "blue", "2022" = "orange", "2023" = "purple", "2024" = "red")) +
  labs(
    title = "Box Plot Harga Eceran Beras per Bulan (Gabungan 2021–2024)",
    x = "Bulan",
    y = "Harga Beras (Rp/kg)",
    color = "Tahun"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

UJI ADF

# Ambil hanya kolom harga
harga <- data$`Harga Beras`

# Lakukan uji Augmented Dickey-Fuller
adf_result <- adf.test(harga)

# Tampilkan hasil uji
adf_result
## 
##  Augmented Dickey-Fuller Test
## 
## data:  harga
## Dickey-Fuller = -2.0795, Lag order = 3, p-value = 0.5426
## alternative hypothesis: stationary

#SPLITTING DATA

# Misal data terakhir tahun 2024 -> kita jadikan data test
data_train <- data %>% filter(Tahun < 2024)
data_test  <- data %>% filter(Tahun == 2024)

# Cek jumlah data train dan test
cat("Jumlah data train:", nrow(data_train), "\n")
## Jumlah data train: 48
cat("Jumlah data test:", nrow(data_test), "\n")
## Jumlah data test: 12

#PLOT ACF DAN PCAF

# Gunakan kolom harga dari data_train
harga_train <- ts(data_train$`Harga Beras`)

# Plot ACF dan PACF
par(mfrow = c(1, 2)) # 2 grafik berdampingan
acf(harga_train, main = "Plot ACF Harga Beras (Data Train)")
pacf(harga_train, main = "Plot PACF Harga Beras (Data Train)")

par(mfrow = c(1, 1))

#ASISTENSI 2

# Di sini, waktu kita wakilkan dengan urutan data (karena deret waktu)
data_train$Time <- 1:nrow(data_train)

# Buat model regresi
model <- lm(`Harga Beras` ~ Time, data = data_train)

# Lakukan uji Breusch-Pagan
bp_test <- bptest(model)

# Tampilkan hasil uji
print(bp_test)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 0.24981, df = 1, p-value = 0.6172
# --- DIFFERENCING ORDE 1 ---

# Ambil data harga dari dataset train
harga_train <- ts(data_train$`Harga Beras`)

# Lakukan differencing orde 1
diff1_harga <- diff(harga_train, differences = 1)

# Plot hasil differencing
plot(diff1_harga,
     main = "Plot Data Setelah Differencing Orde 1",
     ylab = "Perubahan Harga Beras (Rp/kg)",
     xlab = "Waktu",
     col = "blue")

# --- CEK STASIONERITAS SETELAH DIFFERENCING (UJI ADF) ---
adf_diff1 <- adf.test(diff1_harga)

# Tampilkan hasil uji
adf_diff1
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1_harga
## Dickey-Fuller = -3.5581, Lag order = 3, p-value = 0.04659
## alternative hypothesis: stationary
# --- MODEL DOUBLE EXPONENTIAL SMOOTHING (HOLT) ---

# Buat data time series dari data train
harga_train_ts <- ts(data_train$`Harga Beras`, frequency = 12, start = c(min(data_train$Tahun), 1))

# Tentukan horizon peramalan (jumlah data test)
h <- nrow(data_test)

# Fit model Holt (Double Exponential Smoothing)
model_holt <- holt(harga_train_ts, h = h, damped = FALSE)

# Tampilkan ringkasan model
summary(model_holt)
## 
## Forecast method: Holt's method
## 
## Model Information:
## Holt's method 
## 
## Call:
## holt(y = harga_train_ts, h = h, damped = FALSE)
## 
##   Smoothing parameters:
##     alpha = 0.9412 
##     beta  = 1e-04 
## 
##   Initial states:
##     l = 14826.2855 
##     b = -21.7077 
## 
##   sigma:  392.4131
## 
##      AIC     AICc      BIC 
## 764.9833 766.4119 774.3394 
## 
## Error measures:
##                     ME     RMSE      MAE         MPE     MAPE      MASE
## Training set 0.2031828 375.7069 200.1646 -0.03193709 1.430138 0.2118304
##                       ACF1
## Training set -0.0009009449
## 
## Forecasts:
##          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## Jan 2024       13770.14 13267.24 14273.04 13001.02 14539.25
## Feb 2024       13748.43 13057.79 14439.07 12692.19 14804.67
## Mar 2024       13726.72 12889.41 14564.04 12446.16 15007.29
## Apr 2024       13705.02 12743.11 14666.93 12233.90 15176.13
## May 2024       13683.31 12611.17 14755.45 12043.61 15323.01
## Jun 2024       13661.60 12489.53 14833.68 11869.07 15454.14
## Jul 2024       13639.90 12375.75 14904.05 11706.55 15573.25
## Aug 2024       13618.19 12268.22 14968.17 11553.58 15682.80
## Sep 2024       13596.48 12165.81 15027.16 11408.45 15784.52
## Oct 2024       13574.78 12067.70 15081.86 11269.90 15879.66
## Nov 2024       13553.07 11973.26 15132.88 11136.96 15969.18
## Dec 2024       13531.36 11882.02 15180.71 11008.90 16053.82
# Lihat nilai alpha dan beta
cat("Nilai alpha:", model_holt$model$par["alpha"], "\n")
## Nilai alpha: 0.941176
cat("Nilai beta:", model_holt$model$par["beta"], "\n")
## Nilai beta: 0.0001000212
# Plot hasil peramalan
autoplot(model_holt) +
  autolayer(fitted(model_holt), series = "Fitted", color = "blue") +
  autolayer(model_holt$mean, series = "Forecast", color = "red") +
  labs(title = "Model Double Exponential Smoothing (Holt)",
       x = "Waktu", y = "Harga Beras (Rp/kg)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

# --- EVALUASI MODEL DENGAN DATA TEST ---

# Buat data test dalam bentuk ts
harga_test_ts <- ts(data_test$`Harga Beras`, start = time(model_holt$mean)[1], frequency = 12)

# Hitung akurasi model (MAPE, RMSE, dsb)
accuracy(model_holt, harga_test_ts)
##                        ME      RMSE       MAE         MPE      MAPE      MASE
## Training set    0.2031828  375.7069  200.1646 -0.03193709  1.430138 0.2118304
## Test set     3176.5170647 3212.4640 3176.5171 18.81055262 18.810553 3.3616477
##                       ACF1 Theil's U
## Training set -0.0009009449        NA
## Test set      0.3909333984  6.986052
# --- CEK RESIDUAL MODEL ---
checkresiduals(model_holt)

## 
##  Ljung-Box test
## 
## data:  Residuals from Holt's method
## Q* = 4.5138, df = 10, p-value = 0.9212
## 
## Model df: 0.   Total lags used: 10
# --- MODEL REGRESI LINIER TREND ---

# Tambahkan kolom waktu t
data_train$t <- 1:nrow(data_train)

# Bangun model regresi
model_regresi <- lm(`Harga Beras` ~ t, data = data_train)

# Lihat hasil model
summary(model_regresi)
## 
## Call:
## lm(formula = `Harga Beras` ~ t, data = data_train)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -976.2 -387.2 -120.3  503.3 1353.6 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 14717.333    182.837  80.494  < 2e-16 ***
## t             -30.490      6.496  -4.694 2.44e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 623.5 on 46 degrees of freedom
## Multiple R-squared:  0.3238, Adjusted R-squared:  0.3091 
## F-statistic: 22.03 on 1 and 46 DF,  p-value: 2.438e-05
# Plot hasil model
library(ggplot2)
ggplot(data_train, aes(x = t, y = `Harga Beras`)) +
  geom_point(color = "blue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Model Regresi Linear Harga Beras terhadap Waktu",
       x = "Waktu (t)", y = "Harga Beras (Rp/kg)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

#Nilai X
data_train$t
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
# --- CEK DIAGNOSTIK MODEL ---
par(mfrow=c(2,2))
plot(model_regresi)

# Prediksi data test
data_test$t <- (nrow(data_train) + 1):(nrow(data_train) + nrow(data_test))
prediksi_regresi <- predict(model_regresi, newdata = data_test)

# Gabungkan hasil
hasil_prediksi <- data.frame(
  Waktu = data_test$t,
  Harga_aktual = data_test$`Harga Beras`,
  Harga_prediksi = prediksi_regresi
)
print(hasil_prediksi)
##    Waktu Harga_aktual Harga_prediksi
## 1     49     16091.34       13223.30
## 2     50     17042.21       13192.81
## 3     51     17806.92       13162.32
## 4     52     17773.21       13131.83
## 5     53     16944.86       13101.34
## 6     54     16872.22       13070.85
## 7     55     16698.37       13040.36
## 8     56     16640.82       13009.87
## 9     57     16672.38       12979.38
## 10    58     16767.41       12948.89
## 11    59     16375.96       12918.40
## 12    60     16241.52       12887.91

#Asistensi 3

# --- UJI STASIONERITAS VARIANS MENGGUNAKAN BOX-COX ---
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
# Time series dari data train
harga_ts <- ts(data_train$`Harga Beras`, frequency = 12)

# Jalankan Box-Cox dan simpan output
bc <- boxcox(harga_ts ~ 1,
             lambda = seq(-2, 2, by = 0.1),
             main = "Plot Box-Cox dengan LCL dan UCL")
## Warning: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
##  extra argument 'main' will be disregarded
# Ambil lambda dan log-likelihood
lambda_vals <- bc$x
ll_vals <- bc$y

# Cari nilai lambda maksimum (MLE)
max_ll <- max(ll_vals)
lambda_mle <- lambda_vals[which.max(ll_vals)]

# Hitung batas confidence interval 95%
# 0.5 * chi-square quantile dengan df=1
cutoff <- max_ll - 0.5 * qchisq(0.95, df = 1)

# Cari LCL dan UCL dari plot
lambda_LCL <- min(lambda_vals[ll_vals > cutoff])
lambda_UCL <- max(lambda_vals[ll_vals > cutoff])

# Tambahkan garis vertikal pada plot
abline(v = lambda_mle, col = "red", lwd = 2)        # Lambda optimal
abline(v = lambda_LCL, col = "blue", lwd = 2, lty=2)
abline(v = lambda_UCL, col = "blue", lwd = 2, lty=2)

# Tampilkan hasil
cat("Lambda optimal (MLE):", lambda_mle, "\n")
## Lambda optimal (MLE): -1.474747
cat("LCL:", lambda_LCL, "\n")
## LCL: -2
cat("UCL:", lambda_UCL, "\n")
## UCL: 2
#Uji Stasioneritas Mean
#Plot ACF untuk melihat mean stasioner
acf(harga_ts, main = "Plot ACF Harga Beras (Data Train)")

#Adf Test 
adf_train <- adf.test(harga_ts)
adf_train
## 
##  Augmented Dickey-Fuller Test
## 
## data:  harga_ts
## Dickey-Fuller = -1.8923, Lag order = 3, p-value = 0.6171
## alternative hypothesis: stationary
# Lakukan differencing orde 1
diff1_harga_train <- diff(harga_ts, differences = 1)


#Plot ACF setelah differecing
acf(diff1_harga_train, main = "Plot ACF Harga Beras (Data Train after differencing)")

#ADF setelah differencing
adf_train <- adf.test(diff1_harga_train)
adf_train
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1_harga_train
## Dickey-Fuller = -3.5581, Lag order = 3, p-value = 0.04659
## alternative hypothesis: stationary
#PEMODELAN ARIMA
par(mfrow = c(1, 2)) # 2 grafik berdampingan
acf(diff1_harga_train, main = "Plot ACF Harga Beras (Data Train untuk menentukan orde)")
pacf(diff1_harga_train, main = "Plot PACF Harga Beras (Data Train untuk menentukan orde)")

par(mfrow = c(1, 1))
# --- PERBANDINGAN MODEL ARIMA ---
# Pastikan library 'forecast' sudah ter-load
if (!require(forecast)) {
  install.packages("forecast")
  library(forecast)
}

cat("--- MEMULAI PROSES PERBANDINGAN MODEL ARIMA ---\n\n")
## --- MEMULAI PROSES PERBANDINGAN MODEL ARIMA ---
# --- 1. PERSIAPAN DATA TIME SERIES ---
# Pastikan data train dan test sudah ada dalam format 'ts'
# (Mengambil dari skrip utama Anda)

# Data Train TS
harga_train_ts <- ts(data_train$`Harga Beras`, 
                     frequency = 12, 
                     start = c(min(data_train$Tahun), min(data_train$Bulan[data_train$Tahun == min(data_train$Tahun)])))

# Data Test TS
h <- nrow(data_test) # Horizon peramalan
harga_test_ts <- ts(data_test$`Harga Beras`, 
                    frequency = 12, 
                    start = c(min(data_test$Tahun), min(data_test$Bulan[data_test$Tahun == min(data_test$Tahun)])))

cat("Data train dan test 'ts' siap digunakan.\n")
## Data train dan test 'ts' siap digunakan.
cat("Horizon peramalan (h):", h, "periode\n\n")
## Horizon peramalan (h): 12 periode
# --- 2. MEMBUAT KANDIDAT MODEL ARIMA ---
cat("Membuat model ARIMA...\n")
## Membuat model ARIMA...
# Kandidat 1: ARIMA(0, 1, 0) - Random Walk
# Sesuai plot ACF/PACF yang 'cut-off' setelah differencing
model_arima_010 <- Arima(harga_train_ts, order = c(0, 1, 0))
cat("Model ARIMA(0,1,0) selesai.\n")
## Model ARIMA(0,1,0) selesai.
# Kandidat 2: ARIMA(1, 1, 0)
model_arima_110 <- Arima(harga_train_ts, order = c(1, 1, 0))
cat("Model ARIMA(1,1,0) selesai.\n")
## Model ARIMA(1,1,0) selesai.
# Kandidat 3: ARIMA(0, 1, 1)
model_arima_011 <- Arima(harga_train_ts, order = c(0, 1, 1))
cat("Model ARIMA(0,1,1) selesai.\n")
## Model ARIMA(0,1,1) selesai.
# --- 3. PERBANDINGAN METRIK IN-SAMPLE (DATA TRAIN) ---
# Membandingkan model berdasarkan seberapa baik mereka 'fit' di data training
# Model dengan nilai AIC, AICc, atau BIC terkecil adalah yang terbaik

model_names <- c("ARIMA(0,1,0)", 
                 "ARIMA(1,1,0)", 
                 "ARIMA(0,1,1)")

aic_values <- c(model_arima_010$aic, 
                model_arima_110$aic, 
                model_arima_011$aic)

aicc_values <- c(model_arima_010$aicc, 
                 model_arima_110$aicc, 
                 model_arima_011$aicc)

bic_values <- c(model_arima_010$bic, 
                model_arima_110$bic, 
                model_arima_011$bic)


# Buat tabel perbandingan
tabel_aic <- data.frame(
  Model = model_names,
  AIC = aic_values,
  AICc = aicc_values,
  BIC = bic_values
)

cat("--- PERBANDINGAN METRIK IN-SAMPLE (DATA TRAIN) ---\n")
## --- PERBANDINGAN METRIK IN-SAMPLE (DATA TRAIN) ---
print(tabel_aic)
##          Model      AIC     AICc      BIC
## 1 ARIMA(0,1,0) 691.0503 691.1392 692.9005
## 2 ARIMA(1,1,0) 693.0049 693.2777 696.7052
## 3 ARIMA(0,1,1) 693.0089 693.2816 696.7092
cat("*Catatan: Model dengan nilai terkecil adalah yang terbaik (secara in-sample).\n\n")
## *Catatan: Model dengan nilai terkecil adalah yang terbaik (secara in-sample).
# --- 4. PERBANDINGAN AKURASI OUT-OF-SAMPLE (DATA TEST) ---
# Ini adalah perbandingan yang paling penting: seberapa baik model memprediksi data baru

cat("Membuat peramalan untuk data test...\n")
## Membuat peramalan untuk data test...
# Buat peramalan (forecast) dari setiap model
fc_arima_010 <- forecast(model_arima_010, h = h)
fc_arima_110 <- forecast(model_arima_110, h = h)
fc_arima_011 <- forecast(model_arima_011, h = h)

cat("Menghitung akurasi pada data test...\n")
## Menghitung akurasi pada data test...
# Hitung akurasi
acc_010 <- accuracy(fc_arima_010, harga_test_ts)
acc_110 <- accuracy(fc_arima_110, harga_test_ts)
acc_011 <- accuracy(fc_arima_011, harga_test_ts)

# Ekstrak hanya metrik dari "Test set" (baris ke-2)
eval_010 <- acc_010[2, c("RMSE", "MAE", "MAPE")]
eval_110 <- acc_110[2, c("RMSE", "MAE", "MAPE")]
eval_011 <- acc_011[2, c("RMSE", "MAE", "MAPE")]

# Gabungkan menjadi satu data frame
tabel_evaluasi_test <- rbind(
  eval_010,
  eval_110,
  eval_011)

# Beri nama baris agar mudah dibaca
rownames(tabel_evaluasi_test) <- model_names

cat("\n--- PERBANDINGAN AKURASI PADA DATA TEST (OUT-OF-SAMPLE) ---\n")
## 
## --- PERBANDINGAN AKURASI PADA DATA TEST (OUT-OF-SAMPLE) ---
print(tabel_evaluasi_test)
##                  RMSE      MAE     MAPE
## ARIMA(0,1,0) 3072.094 3029.978 17.93333
## ARIMA(1,1,0) 3074.152 3032.066 17.94575
## ARIMA(0,1,1) 3074.034 3031.946 17.94503
cat("*Catatan: Model dengan nilai RMSE, MAE, dan MAPE terkecil adalah yang terbaik.\n\n")
## *Catatan: Model dengan nilai RMSE, MAE, dan MAPE terkecil adalah yang terbaik.
cat("--- SELESAI ---\n")
## --- SELESAI ---
auto.arima(harga_train_ts, seasonal = FALSE, stepwise = FALSE, approximation = FALSE)
## Series: harga_train_ts 
## ARIMA(0,1,0) 
## 
## sigma^2 = 136325:  log likelihood = -344.53
## AIC=691.05   AICc=691.14   BIC=692.9
 # --- PERAMALAN MENGGUNAKAN ARIMA(0,1,0) ---

# Fit model ARIMA(0,1,0)
model_arima_010 <- Arima(harga_train_ts, order = c(0, 1, 0))

# Ringkasan model
summary(model_arima_010)
## Series: harga_train_ts 
## ARIMA(0,1,0) 
## 
## sigma^2 = 136325:  log likelihood = -344.53
## AIC=691.05   AICc=691.14   BIC=692.9
## 
## Training set error measures:
##                    ME     RMSE      MAE         MPE     MAPE      MASE
## Training set -7.73973 365.3563 180.5507 -0.08901369 1.295812 0.1910734
##                    ACF1
## Training set -0.0310137
# Buat forecast untuk h periode ke depan (sesuai jumlah data test)
fc_arima_010 <- forecast(model_arima_010, h = h)

# Tampilkan hasil forecast
print(fc_arima_010)
##          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## Jan 2024       13797.29 13324.11 14270.47 13073.63 14520.95
## Feb 2024       13797.29 13128.12 14466.46 12773.88 14820.70
## Mar 2024       13797.29 12977.72 14616.86 12543.87 15050.71
## Apr 2024       13797.29 12850.93 14743.65 12349.96 15244.62
## May 2024       13797.29 12739.23 14855.35 12179.13 15415.45
## Jun 2024       13797.29 12638.25 14956.33 12024.68 15569.90
## Jul 2024       13797.29 12545.38 15049.20 11882.66 15711.92
## Aug 2024       13797.29 12458.94 15135.64 11750.46 15844.12
## Sep 2024       13797.29 12377.76 15216.82 11626.30 15968.28
## Oct 2024       13797.29 12300.97 15293.61 11508.87 16085.71
## Nov 2024       13797.29 12227.94 15366.64 11397.17 16197.41
## Dec 2024       13797.29 12158.15 15436.43 11290.45 16304.13
# Plot hasil peramalan
autoplot(fc_arima_010) +
  autolayer(harga_test_ts, series = "Data Aktual", color = "red") +
  labs(title = "Peramalan Harga Beras Menggunakan ARIMA(0,1,0)",
       x = "Waktu",
       y = "Harga Beras (Rp/kg)") +
  theme_minimal()

# --- EVALUASI MODEL ARIMA(0,1,0) ---
evaluasi_010 <- accuracy(fc_arima_010, harga_test_ts)

cat("=== EVALUASI MODEL ARIMA(0,1,0) ===\n")
## === EVALUASI MODEL ARIMA(0,1,0) ===
print(evaluasi_010)
##                      ME      RMSE       MAE         MPE      MAPE      MASE
## Training set   -7.73973  365.3563  180.5507 -0.08901369  1.295812 0.1910734
## Test set     3029.97833 3072.0937 3029.9783 17.93333199 17.933332 3.2065685
##                    ACF1 Theil's U
## Training set -0.0310137        NA
## Test set      0.4680307  6.666473
# Plot residual ARIMA
tsdisplay(residuals(model_arima_010),
          main = "Diagnostik Residual ARIMA(0,1,0)")

library(tseries)

# Uji normalitas residual
jarque.bera.test(residuals(model_arima_010))
## 
##  Jarque Bera Test
## 
## data:  residuals(model_arima_010)
## X-squared = 224.01, df = 2, p-value < 2.2e-16
shapiro.test(residuals(model_arima_010))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model_arima_010)
## W = 0.6995, p-value = 1.301e-08
#Uji White Noise
Box.test(residuals(model_arima_010),
         type = "Ljung-Box",
         lag = 12)
## 
##  Box-Ljung test
## 
## data:  residuals(model_arima_010)
## X-squared = 4.3315, df = 12, p-value = 0.9767