library(knitr)
library(kableExtra)

Data harga GKP Kabupaten Serang

Data yang digunakan merupakan data harga Gabah Kering Panen (GKP) di tingkat petani Kabupaten Serang periode Januari 2023 sampai Desember 2024. Data terdiri dari 24 observasi bulanan dengan satuan harga Rp/kg.

Data Harga Gabah Kering Panen (GKP) Kabupaten Serang Januari 2023–Desember 2024
No Periode Harga.GKP..Rp.kg.
1 Jan 2023 5200
2 Feb 2023 5150
3 Mar 2023 5300
4 Apr 2023 5400
5 May 2023 5250
6 Jun 2023 5350
7 Jul 2023 5450
8 Aug 2023 5500
9 Sep 2023 5400
10 Oct 2023 5550
11 Nov 2023 5600
12 Dec 2023 5700
13 Jan 2024 5650
14 Feb 2024 5700
15 Mar 2024 5800
16 Apr 2024 5900
17 May 2024 5750
18 Jun 2024 5850
19 Jul 2024 5950
20 Aug 2024 6000
21 Sep 2024 5900
22 Oct 2024 6050
23 Nov 2024 6150
24 Dec 2024 6300

Membuat Objek Time Series dan plot runtun waktu dari data harga GKP

gkp_ts <- ts(
  harga_gkp,
  start = c(2023, 1),
  frequency = 12
)

# Menampilkan objek ts
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

Berikut Plot Runtun Waktu dari data harga GKP

plot(
  gkp_ts,
  type = "o",
  pch = 19,
  lwd = 2,
  col = "darkgreen",
  main = "Dinamika Harga Gabah Kering Panen (GKP)",
  sub = "Kabupaten Serang | Januari 2023 – Desember 2024",
  xlab = "Periode",
  ylab = "Harga GKP (Rp/kg)",
  xaxt = "n"
)

grid(
  nx = NA,
  ny = NULL,
  lty = 3,
  col = "gray80"
)

axis(
  1,
  at = c(2023, 2024),
  labels = c("2023", "2024")
)

abline(
  v = 2024,
  lty = 2,
  col = "gray50",
  lwd = 1.5
)

min_harga <- min(gkp_ts)
min_waktu <- time(gkp_ts)[which.min(gkp_ts)]

points(
  min_waktu,
  min_harga,
  pch = 19,
  col = "red",
  cex = 1.4
)

text(
  min_waktu,
  min_harga,
  labels = paste0("Terendah: Rp ", min_harga),
  pos = 1,
  cex = 0.8
)

max_harga <- max(gkp_ts)
max_waktu <- time(gkp_ts)[which.max(gkp_ts)]

points(
  max_waktu,
  max_harga,
  pch = 19,
  col = "blue",
  cex = 1.4
)

text(
  max_waktu,
  max_harga,
  labels = paste0("Tertinggi: Rp ", max_harga),
  pos = 3,
  cex = 0.8
)

Melakukan Transformasi logaritma

log_gkp <- log(gkp_ts)

# Melihat hasil transformasi
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

Pebandingan Data Asli dan Transformasi

par(
  mfrow = c(1, 2),
  mar = c(4, 4, 3, 1)
)

plot(
  gkp_ts,
  type = "o",
  pch = 19,
  lwd = 2,
  col = "darkgreen",
  main = "Data Asli",
  sub = "Harga GKP (Rp/kg)",
  xlab = "Tahun",
  ylab = "Harga (Rp/kg)"
)

grid(
  nx = NA,
  ny = NULL,
  lty = 3,
  col = "gray80"
)

abline(
  v = 2024,
  lty = 2,
  col = "gray50"
)

plot(
  log_gkp,
  type = "o",
  pch = 19,
  lwd = 2,
  col = "steelblue",
  main = "Transformasi Logaritma",
  sub = "ln(Harga GKP)",
  xlab = "Tahun",
  ylab = "ln(Harga)"
)

grid(
  nx = NA,
  ny = NULL,
  lty = 3,
  col = "gray80"
)

abline(
  v = 2024,
  lty = 2,
  col = "gray50"
)

par(mfrow = c(1, 1))

Interpretasi

Berdasarkan perbandingan plot, pola pergerakan harga GKP sebelum dan sesudah transformasi logaritma secara umum tetap sama. Transformasi logaritma tidak mengubah arah maupun urutan perubahan harga tetapi mengubah skala data. Nilai pada data hasil transformasi menjadi lebih terkompresi dibandingkan data asli.

Melakukan differencing tingkat pertama pada data hasil transformasi

diff_log_gkp <- diff(log_gkp, differences = 1)

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

Secara matematis:

\[ W_t = \ln(Y_t)-\ln(Y_{t-1}) \]

atau ekuivalen dengan:

\[ W_t = \ln\left(\frac{Y_t}{Y_{t-1}}\right) \]

Data yang dianalisis bukan lagi harga absolut, tetapi perubahan relatif harga dari satu bulan ke bulan berikutnya.


Plot hasil differencing

plot( diff_log_gkp, type = "o", pch = 19, lwd = 2, main = "Differencing Tingkat Pertama Log Harga GKP", sub = "Perubahan Bulanan Harga GKP", xlab = "Tahun", ylab = "Differenced Log Harga" )

abline( h = 0, lty = 2, lwd = 1.5 )

grid( nx = NA, ny = NULL, lty = 3, col = "gray80" )

Perbandingan Sebelum dan Sesudah Differencing

Agar lebih jelas apakah tren sudah hilang:

par(
  mfrow = c(1, 2),
  mar = c(4, 4, 3, 1)
)

plot(
  log_gkp,
  type = "o",
  pch = 19,
  lwd = 2,
  main = "Sebelum Differencing",
  sub = "Log Harga GKP",
  xlab = "Tahun",
  ylab = "ln(Harga)"
)

grid(nx = NA, lty = 3, col = "gray80")

plot(
  diff_log_gkp,
  type = "o",
  pch = 19,
  lwd = 2,
  main = "Setelah Differencing",
  sub = "Differenced Log Harga GKP",
  xlab = "Tahun",
  ylab = "Δ ln(Harga)"
)

abline(
  h = 0,
  lty = 2,
  lwd = 1.5
)

grid(nx = NA, lty = 3, col = "gray80")

par(mfrow = c(1, 1))

Apakah tren sudah hilang?

Berdasarkan plot hasil differencing tingkat pertama, tren kenaikan pada data logaritma telah berkurang dan nilai data berfluktuasi di sekitar nilai nol. Hal ini menunjukkan bahwa differencing tingkat pertama telah menghilangkan kecenderungan tren pada data.

Menghitung ramalan naif untuk 3 bulan menggunakan 21 observasi pertama sebagai data latih dan 3 observasi terakhir sebagai data uji.

Evaluasi Ramala Naif

# Membagi data menjadi data latih dan data uji
train <- head(harga_gkp, 21)
test <- tail(harga_gkp, 3)

naive_forecast <- rep(tail(train, 1), 3)

hasil_ramalan <- data.frame(
  Observasi = 22:24,
  Aktual = test,
  Ramalan_Naif = naive_forecast,
  Error = test - naive_forecast
)

hasil_ramalan
##   Observasi Aktual Ramalan_Naif Error
## 1        22   6050         5900   150
## 2        23   6150         5900   250
## 3        24   6300         5900   400

Karena nilai terakhir data latih adalah **Rp5.950**, maka:

\[ \hat{Y}_{22}=\hat{Y}_{23}=\hat{Y}_{24}=5.950 \]

Menghitung ME, MAE, MSE, RMSE, dan MAPE

error <- test - naive_forecast

ME <- mean(error)

MAE <- mean(abs(error))

MSE <- mean(error^2)

RMSE <- sqrt(MSE)

MAPE <- mean(abs(error / test)) * 100

hasil_evaluasi <- data.frame(
  ME = ME,
  MAE = MAE,
  MSE = MSE,
  RMSE = RMSE,
  MAPE = MAPE
)

hasil_evaluasi
##         ME      MAE      MSE     RMSE     MAPE
## 1 266.6667 266.6667 81666.67 285.7738 4.297862

Kesimpulan

Berdasarkan hasil evaluasi ramalan naif diperoleh nilai ME sebesar 266,67, MAE sebesar 266,67, MSE sebesar 81.666,67, RMSE sebesar 285,77, dan MAPE sebesar 4,30%. Nilai ME yang positif menunjukkan bahwa hasil ramalan cenderung berada di bawah nilai aktual. Hal ini terlihat pada tiga bulan data uji, ketika harga GKP aktual terus meningkat sementara ramalan naif tetap menggunakan nilai observasi terakhir pada data latih yaitu Rp5.900/kg.