#ASISTENSI 1
# 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 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"))
# 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")
)
)
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)
)
# 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