Data

Data harga gabah kering panen (GKP) di tingkat petani Kabupaten Serang, Januari 2023 - Desember 2024 (Rp/kg), 24 observasi.

gkp <- c(5200,5150,5300,5400,5250,5350,5450,5500,5400,5550,5600,5700,  # 2023
         5650,5700,5800,5900,5750,5850,5950,6000,5900,6050,6150,6300)  # 2024
length(gkp)
## [1] 24

1. Buat objek ts dan plot runtun waktu dari data harga GKP di atas.

gkp_ts <- ts(gkp, start = c(2023, 1), frequency = 12)
gkp_ts
##       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 2023 5200 5150 5300 5400 5250 5350 5450 5500 5400 5550 5600 5700
## 2024 5650 5700 5800 5900 5750 5850 5950 6000 5900 6050 6150 6300
plot(gkp_ts, type = "o", pch = 16, col = "navy",
     main = "Harga GKP Kabupaten Serang (Jan 2023 - Des 2024)",
     xlab = "Waktu", ylab = "Rp/kg")
grid()

Interpretasi:

2. Lakukan transformasi logaritma, lalu bandingkan plot data asli dan hasil transformasi.

log_gkp <- log(gkp_ts)
log_gkp
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2023 8.556414 8.546752 8.575462 8.594154 8.565983 8.584852 8.603371 8.612503
## 2024 8.639411 8.648221 8.665613 8.682708 8.656955 8.674197 8.691146 8.699515
##           Sep      Oct      Nov      Dec
## 2023 8.594154 8.621553 8.630522 8.648221
## 2024 8.682708 8.707814 8.724207 8.748305
par(mfrow = c(1, 2))
plot(gkp_ts, type = "o", pch = 16, col = "navy",
     main = "Data Asli (Rp/kg)", xlab = "Waktu", ylab = "Rp/kg")
plot(log_gkp, type = "o", pch = 16, col = "darkgoldenrod",
     main = "Log(Data)", xlab = "Waktu", ylab = "ln(Rp/kg)")

par(mfrow = c(1, 1))

Interpretasi:

3. Lakukan differencing tingkat pertama pada data hasil transformasi. Apakah tren sudah hilang?

diff_log_gkp <- diff(log_gkp)
diff_log_gkp
##               Jan          Feb          Mar          Apr          May
## 2023              -0.009661911  0.028710106  0.018692133 -0.028170877
## 2024 -0.008810630  0.008810630  0.017391743  0.017094433 -0.025752496
##               Jun          Jul          Aug          Sep          Oct
## 2023  0.018868484  0.018519048  0.009132484 -0.018349139  0.027398974
## 2024  0.017241806  0.016949558  0.008368250 -0.016807118  0.025105921
##               Nov          Dec
## 2023  0.008968670  0.017699577
## 2024  0.016393810  0.024097552
plot(diff_log_gkp, type = "o", pch = 16, col = "firebrick",
     main = "Differencing Tingkat Pertama dari Log(GKP)",
     xlab = "Waktu", ylab = "Wt = ln(Zt) - ln(Zt-1)")
abline(h = 0, lty = 2, col = "gray40")

mean(diff_log_gkp)   # rata-rata laju pertumbuhan bulanan
## [1] 0.008343087
sd(diff_log_gkp)
## [1] 0.01725887

Interpretasi:

4. Gunakan 21 observasi pertama sebagai data latih dan 3 observasi terakhir sebagai data uji. Hitung ramalan naif untuk 3 bulan tersebut, lalu hitung ME, MAE, MSE, RMSE, dan MAPE-nya.

train <- head(gkp, 21)
test  <- tail(gkp, 3)

# Ramalan naif: nilai observasi terakhir data latih dibawa mendatar
naive_forecast <- rep(tail(train, 1), 3)

hasil <- data.frame(Bulan = c("Okt 2024", "Nov 2024", "Des 2024"),
                    Aktual = test,
                    Ramalan_Naif = naive_forecast,
                    Galat = test - naive_forecast)
hasil
##      Bulan Aktual Ramalan_Naif Galat
## 1 Okt 2024   6050         5900   150
## 2 Nov 2024   6150         5900   250
## 3 Des 2024   6300         5900   400
error <- test - naive_forecast

ME   <- mean(error)
MAE  <- mean(abs(error))
MSE  <- mean(error^2)
RMSE <- sqrt(MSE)
MAPE <- mean(abs(error / test)) * 100

metrik <- data.frame(ME = ME, MAE = MAE, MSE = MSE, RMSE = RMSE,
                     MAPE = paste0(round(MAPE, 2), "%"))
metrik
##         ME      MAE      MSE     RMSE MAPE
## 1 266.6667 266.6667 81666.67 285.7738 4.3%
plot(gkp_ts, type = "o", pch = 16, col = "navy",
     main = "Ramalan Naif vs Aktual (3 Bulan Terakhir)",
     xlab = "Waktu", ylab = "Rp/kg")
lines(ts(naive_forecast, start = c(2024, 10), frequency = 12),
      col = "red", lwd = 2, lty = 2)
legend("topleft", legend = c("Aktual", "Ramalan naif"),
       col = c("navy", "red"), lty = c(1, 2), pch = c(16, NA), bty = "n")

Interpretasi: