Analisis Deret Waktu

Harga Gabah Kering Panen (GKP) Kabupaten Serang Tahun 2023-2024

Data

Berikut data harga gabah kering panen (GKP) di tingkat petani Kabupaten Serang periode Januari 2023 - Desember 2024 (Rp/kg):

# Data harga GKP per bulan tahun 2023-2024
Harga_GKP <- c(5200, 5150, 5300, 5400, 5250, 5350, 5450, 5500, 5400, 5550, 5600, 5700,
               5650, 5700, 5800, 5900, 5750, 5850, 5950, 6000, 5900, 6050, 6150, 6300)

# Membuat nama bulan dan tahun
bulan <- rep(month.abb, 2)
tahun <- rep(c(2023, 2024), each = 12)

df <- data.frame(
  Tahun = tahun,
  Bulan = factor(bulan, levels = month.abb),
  Harga = Harga_GKP)

# Menampilkan tabel
knitr::kable(
  matrix(Harga_GKP, nrow = 2, byrow = TRUE,
         dimnames = list(c("2023", "2024"), month.abb)))
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

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

# Membuat data menjadi objek time series
gkp_ts <- ts(Harga_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 runtun waktu
plot(gkp_ts, type="o", pch=16, col="steelblue4", lwd=2,
     main="Harga GKP di Tingkat Petani Kabupaten Serang\nJanuari 2023 - Desember 2024",
     xlab="Waktu (Tahun)",
     ylab="Harga GKP (Rp/kg)")

# keterangan data
legend("topleft", legend="Data", col="steelblue4", lwd=2, pch=16, bty="n")

# Menambahkan garis bantu
grid()

INTERPRETASI : Berdasarkan plot, harga GKP Kabupaten Serang cenderung meningkat dari Rp5.200/kg pada Januari 2023 menjadi Rp6.300/kg pada Desember 2024. Meskipun terdapat beberapa fluktuasi tiap bulannya, pergerakan harga masih menunjukkan tren naik. Artinya, data belum stasioner dalam mean (rata-rata) karena masih terdapat tren.

2. Lakukan transformasi logaritma, lalu bandingkan plot data asli dan hasil transformasi. Apakah tren sudah hilang?

# Transformasi logaritma
log_gkp <- log(gkp_ts)

# Nama bulan
bulan <- rep(month.abb, 2)
tahun <- rep(c(2023, 2024), each = 12)
label_bulan <- paste(bulan, tahun)

# Tabel hasil transformasi logaritma
knitr::kable(
  matrix(round(log_gkp, 6), nrow = 1,
         dimnames = list("Log GKP", label_bulan)),
  caption = "Hasil Transformasi Logaritma Harga GKP")
Hasil Transformasi Logaritma Harga GKP
Jan 2023 Feb 2023 Mar 2023 Apr 2023 May 2023 Jun 2023 Jul 2023 Aug 2023 Sep 2023 Oct 2023 Nov 2023 Dec 2023 Jan 2024 Feb 2024 Mar 2024 Apr 2024 May 2024 Jun 2024 Jul 2024 Aug 2024 Sep 2024 Oct 2024 Nov 2024 Dec 2024
Log GKP 8.556414 8.546752 8.575462 8.594154 8.565983 8.584852 8.603371 8.612503 8.594154 8.621553 8.630522 8.648221 8.639411 8.648221 8.665613 8.682708 8.656955 8.674197 8.691146 8.699515 8.682708 8.707814 8.724207 8.748305
# Bandingkan data asli vs hasil transformasi
par(mfrow = c(2, 1), mar = c(4, 4, 2, 1))

# Plot data asli
plot(gkp_ts,
     type = "o", pch = 16, col = "steelblue4", lwd = 2,
     main = "Data Asli Harga GKP Kabupaten Serang",
     xlab = "Waktu (Tahun)", ylab = "Harga GKP (Rp/kg)")
legend("topleft", legend = "Data Asli",
       col = "steelblue4", lwd = 2, pch = 16, bty = "n")
grid()

# Plot data hasil transformasi log
plot(log_gkp,
     type = "o", pch = 16, col = "firebrick", lwd = 2,
     main = "Data Hasil Transformasi Logaritma",
     xlab = "Waktu (Tahun)", ylab = "Log(Harga GKP)")
legend("topleft", legend = "Data Transformasi Log",
       col = "firebrick", lwd = 2, pch = 16, bty = "n")
grid()

par(mfrow = c(1, 1))

# Tabel perbandingan standar deviasi sebelum dan sesudah transformasi
tabel_sd <- data.frame(
  Data = c("Data Asli (GKP)", "Data Transformasi Log"),
  Standar_Deviasi = c(sd(gkp_ts), sd(log_gkp)))

knitr::kable(
  transform(tabel_sd, Standar_Deviasi = round(Standar_Deviasi, 4)),
  caption = "Perbandingan Standar Deviasi Data Asli dan Data Transformasi Logaritma")
Perbandingan Standar Deviasi Data Asli dan Data Transformasi Logaritma
Data Standar_Deviasi
Data Asli (GKP) 314.1514
Data Transformasi Log 0.0554

INTERPRETASI : Berdasarkan kedua plot, data asli dan hasil transformasi logaritma memiliki pola yang hampir sama dan sama-sama menunjukkan tren naik. Namun, setelah transformasi logaritma, perubahan data terlihat lebih stabil. Hal ini terlihat dari standar deviasi yang turun dari 314,1514 pada data asli menjadi 0,0554 pada data logaritma. Dengan demikian, transformasi logaritma membantu menstabilkan variasi data, tetapi belum menghilangkan tren, sehingga perlu dilanjutkan dengan differencing.

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

# Differencing tingkat pertama dari data hasil transformasi log
diff_log_gkp <- diff(log_gkp, differences = 1)

# Nama bulan setelah differencing
bulan <- rep(month.abb, 2)
tahun <- rep(c(2023, 2024), each = 12)
label_bulan <- paste(bulan, tahun)

# Tabel hasil differencing
knitr::kable(
  matrix(round(diff_log_gkp, 6), nrow = 1,
         dimnames = list("Differencing", label_bulan[-1])),
  caption = "Hasil Differencing Tingkat Pertama Data Log GKP")
Hasil Differencing Tingkat Pertama Data Log GKP
Feb 2023 Mar 2023 Apr 2023 May 2023 Jun 2023 Jul 2023 Aug 2023 Sep 2023 Oct 2023 Nov 2023 Dec 2023 Jan 2024 Feb 2024 Mar 2024 Apr 2024 May 2024 Jun 2024 Jul 2024 Aug 2024 Sep 2024 Oct 2024 Nov 2024 Dec 2024
Differencing -0.009662 0.02871 0.018692 -0.028171 0.018868 0.018519 0.009132 -0.018349 0.027399 0.008969 0.0177 -0.008811 0.008811 0.017392 0.017094 -0.025752 0.017242 0.01695 0.008368 -0.016807 0.025106 0.016394 0.024098
# Plot hasil differencing
plot(diff_log_gkp,
     type = "o", pch = 16, col = "darkgreen", lwd = 2,
     main = "Differencing Tingkat 1 dari Data Transformasi Log",
     xlab = "Waktu", ylab = "Diff Log(Harga)")

# Garis batas nol sebagai acuan tren
abline(h = 0, lty = 2)

# Menambahkan keterangan data
legend("topleft", legend = "Differencing Log",
       col = "darkgreen", lwd = 2, pch = 16, bty = "n")

grid()

INTERPRETASI : Setelah dilakukan differencing tingkat pertama, tren naik sudah tidak terlihat. Nilai differencing bergerak naik-turun di sekitar nol, dengan nilai sekitar -0,03 sampai 0,03, tanpa pola kenaikan atau penurunan yang jelas. Dengan demikian, differencing tingkat pertama berhasil menghilangkan tren, sehingga data sudah relatif stasioner dalam mean.

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.

# Label waktu berupa nama bulan (bukan angka desimal)
label_bulan <- paste(bulan, tahun)

# Membagi data jadi data latih (21 obs pertama) dan data uji (3 obs terakhir)
train <- head(Harga_GKP, 21)
test  <- tail(Harga_GKP, 3)

label_train <- label_bulan[1:21]
label_test  <- label_bulan[22:24]

# Ramalan naif = nilai terakhir data latih, diulang sebanyak data uji
naive_forecast <- rep(tail(train, 1), 3)

# Tabel data latih
knitr::kable(matrix(train, nrow = 1, dimnames = list("Harga", label_train)),
             caption = "Data Latih (21 Observasi Pertama)")
Data Latih (21 Observasi Pertama)
Jan 2023 Feb 2023 Mar 2023 Apr 2023 May 2023 Jun 2023 Jul 2023 Aug 2023 Sep 2023 Oct 2023 Nov 2023 Dec 2023 Jan 2024 Feb 2024 Mar 2024 Apr 2024 May 2024 Jun 2024 Jul 2024 Aug 2024 Sep 2024
Harga 5200 5150 5300 5400 5250 5350 5450 5500 5400 5550 5600 5700 5650 5700 5800 5900 5750 5850 5950 6000 5900
# Tabel data uji
knitr::kable(matrix(test, nrow = 1, dimnames = list("Harga", label_test)),
             caption = "Data Uji (3 Observasi Terakhir)")
Data Uji (3 Observasi Terakhir)
Oct 2024 Nov 2024 Dec 2024
Harga 6050 6150 6300
# Ramalan naif = nilai terakhir data latih, diulang sebanyak data uji
naive_forecast <- rep(tail(train, 1), 3)

# Selisih antara nilai aktual dan ramalan
error <- test - naive_forecast

# Tabel gabungan aktual, ramalan naif, dan error
hasil_ramalan <- data.frame(
  Waktu = label_test,
  Aktual = test,
  Ramalan_Naif = naive_forecast,
  Error = error)

knitr::kable(
  hasil_ramalan,
  caption = "Hasil Ramalan Naif (Okt-Des 2024)")
Hasil Ramalan Naif (Okt-Des 2024)
Waktu Aktual Ramalan_Naif Error
Oct 2024 6050 5900 150
Nov 2024 6150 5900 250
Dec 2024 6300 5900 400
# Ukuran akurasi ramalan
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, MAE, MSE, RMSE, MAPE)

# Tabel hasil evaluasi
knitr::kable(round(hasil_evaluasi, 3),
             caption = "Hasil Evaluasi Ramalan Naif (Okt-Des 2024)")
Hasil Evaluasi Ramalan Naif (Okt-Des 2024)
ME MAE MSE RMSE MAPE
266.667 266.667 81666.67 285.774 4.298

INTERPRETASI : Berdasarkan data yang digunakan, 21 observasi pertama (Januari 2023–September 2024) dijadikan sebagai data latih, sedangkan 3 observasi terakhir (Oktober–Desember 2024) dijadikan sebagai data uji. Dengan ramalan naif, hasil ramalan untuk ketiga bulan tersebut adalah Rp5.900/kg, sedangkan harga aktualnya Rp6.050, Rp6.150, dan Rp6.300/kg. Nilai error masing-masing adalah +Rp150, +Rp250, dan +Rp400/kg. Nilai ME dan MAE sebesar 266,667, RMSE sebesar 285,774, dan MAPE sebesar 4,298%. Jadi, rata-rata kesalahan ramalan sekitar 4,3% dari harga aktual. Karena error semuanya bernilai positif, maka hasil ramalannya lebih rendah daripada harga aktual.

Kesimpulan akhir

Berdasarkan hasil analisis, data harga GKP Kabupaten Serang belum stasioner karena memiliki tren naik, meskipun terdapat fluktuasi naik-turun. Rata-rata harga selama 2023–2024 sebesar Rp5.700/kg. Berdasarkan transformasi logaritma, tren naik masih terlihat sehingga data belum stasioner. Berdasarkan hasil differencing tingkat pertama, tren naik sudah hilang dan data bergerak naik-turun dengan rata-rata yang relatif konstan, sehingga data menjadi relatif stasioner dalam mean.

Berdasarkan hasil ramalan naif, diperoleh MAPE sebesar 4,298% dan seluruh error bernilai positif, sehingga ramalan lebih rendah daripada harga aktual Oktober–Desember 2024.