Laporan ini menganalisis data bulanan harga gabah kering panen (GKP) di tingkat petani Kabupaten Serang pada periode Januari 2023 sampai Desember 2024 (24 observasi bulanan). Nilai pengamatan disajikan dalam satuan Rupiah per kilogram (Rp/kg). Tujuan analisis ini adalah membentuk objek runtun waktu bulanan serta memvisualisasikan pergerakan harga, menerapkan transformasi logaritma natural untuk memeriksa kompresi skala dan stabilitas variansi, melakukan pembedaan (differencing) tingkat pertama guna mengeliminasi komponen tren menuju kondisi stasioner dalam rata-rata, serta menerapkan metode peramalan naif (naive forecast) menggunakan 21 observasi pertama sebagai data latih dan mengevaluasi performanya terhadap 3 observasi terakhir sebagai data uji melalui metrik ME, MAE, MSE, RMSE, dan MAPE.
Langkah awal analisis adalah memasukkan 24 data observasi harga gabah
kering panen (GKP) di tingkat petani Kabupaten Serang secara kronologis
dari Januari 2023 hingga Desember 2024 ke R dan membentuk objek runtun
waktu bulanan (ts) dengan titik awal Januari 2023
(start = c(2023, 1)) serta frekuensi 12.
# Data bulanan harga gabah kering panen (Januari 2023 - Desember 2024) dalam Rp/kg
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
)
# Pembentukan objek ts
gkp_ts <- ts(
gkp,
start = c(2023, 1),
frequency = 12
)
# Label referensi nama bulan dan periode kalender
nama_bulan <- c(
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
)
label_periode <- paste(rep(nama_bulan, 2), rep(c(2023, 2024), each = 12))
# Pemisahan data per tahun untuk analisis perbandingan antartahun
gkp_2023 <- gkp[1:12]
gkp_2024 <- gkp[13:24]
diff_yoy <- gkp_2024 - gkp_2023
# Menampilkan objek ts
print(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 dibuat untuk melihat pola pergerakan harga gabah kering panen selama dua tahun masa pengamatan.
plot(
gkp_ts,
type = "o",
pch = 16,
xlab = "Waktu",
ylab = "Harga GKP (Rp/kg)",
main = "Harga Gabah Kering Panen Kabupaten Serang, 2023-2024"
)Grafik di atas memuat 24 titik observasi bulanan. Rentang nilai bergerak dari titik terendah 5.150 Rp/kg (Februari 2023) hingga titik tertinggi 6.300 Rp/kg (Desember 2024). Berdasarkan visualisasi runtun waktu tersebut, dapat diidentifikasi beberapa karakteristik utama:
Transformasi logaritma natural (\(Z_t = \ln(Y_t)\)) merupakan bentuk transformasi famili Box-Cox dengan parameter \(\lambda = 0\) yang sering diaplikasikan pada runtun waktu ekonomi dan komoditas pertanian. Penerapan transformasi ini bertujuan untuk menstabilkan variansi deret waktu, mempersempit rentang dinamis sebaran data, serta mentransformasikan hubungan yang bersifat multiplikatif menjadi aditif.
# Penerapan transformasi logaritma natural
log_gkp_ts <- log(gkp_ts)
# Tabel perbandingan statistik deskriptif sebelum dan setelah transformasi
tabel_transformasi <- data.frame(
Skala = c("Data Asli (Rp/kg)", "Transformasi Logaritma ln(Yt)"),
Minimum = c(fmt(min(gkp_ts), 0), fmt(min(log_gkp_ts), 4)),
Maksimum = c(fmt(max(gkp_ts), 0), fmt(max(log_gkp_ts), 4)),
Rata_rata = c(fmt(mean(gkp_ts), 2), fmt(mean(log_gkp_ts), 4)),
Simpangan_Baku = c(fmt(sd(gkp_ts), 2), fmt(sd(log_gkp_ts), 4))
)
knitr::kable(
tabel_transformasi,
align = "c",
col.names = c("Skala Pengamatan", "Nilai Minimum", "Nilai Maksimum", "Rata-Rata", "Simpangan Baku")
)| Skala Pengamatan | Nilai Minimum | Nilai Maksimum | Rata-Rata | Simpangan Baku |
|---|---|---|---|---|
| Data Asli (Rp/kg) | 5.150 | 6.300 | 5.660,42 | 314,15 |
| Transformasi Logaritma ln(Yt) | 8,5468 | 8,7483 | 8,6398 | 0,0554 |
Perbandingan visual antara pergerakan deret data asli dan hasil transformasi logaritma disajikan secara berdampingan pada grafik berikut.
par(mfrow = c(1, 2))
# Plot data asli
plot(
gkp_ts,
type = "o",
pch = 16,
col = "black",
xlab = "Waktu",
ylab = "Harga GKP (Rp/kg)",
main = "Data Asli Harga GKP"
)
# Plot data hasil transformasi logaritma
plot(
log_gkp_ts,
type = "o",
pch = 16,
col = "gray30",
xlab = "Waktu",
ylab = "ln(Harga GKP)",
main = "Transformasi Logaritma Harga GKP"
)Grafik di atas memuat perbandingan visual 24 observasi bulanan antara skala data asli dan skala hasil transformasi logaritma natural. Rentang nilai pada data asli terbentang dari 5.150 hingga 6.300 Rp/kg, sedangkan pada data hasil transformasi terkompresi secara teratur ke dalam rentang 8,5468 hingga 8,7483. Dari perbandingan kedua kurva tersebut diperoleh beberapa temuan:
Untuk mengatasi ketidakstasioneran dalam rata-rata akibat adanya tren kenaikan, dilakukan operasi pembedaan tingkat pertama (first differencing) pada data hasil transformasi logaritma. Secara matematis, pembedaan tingkat pertama didefinisikan sebagai \(w_t = \nabla \ln(Y_t) = \ln(Y_t) - \ln(Y_{t-1})\) untuk \(t = 2, 3, \dots, 24\).
# Diferensiasi tingkat pertama pada data logaritma (23 observasi selisih)
diff_log_ts <- diff(log_gkp_ts)
# Pemisahan data selisih per tahun
# Tahun 2023: Februari 2023 - Desember 2023 (11 observasi selisih)
diff_2023 <- diff_log_ts[1:11]
# Tahun 2024: Januari 2024 - Desember 2024 (12 observasi selisih)
diff_2024 <- diff_log_ts[12:23]
# Statistik deskriptif diferensiasi per periode pengamatan
tabel_diff <- data.frame(
Periode = c("Tahun 2023 (Feb - Des)", "Tahun 2024 (Jan - Des)", "Keseluruhan (Feb 2023 - Des 2024)"),
Jumlah_Observasi = c(length(diff_2023), length(diff_2024), length(diff_log_ts)),
Rata_rata = c(fmt(mean(diff_2023), 4), fmt(mean(diff_2024), 4), fmt(mean(diff_log_ts), 4)),
Simpangan_Baku = c(fmt(sd(diff_2023), 4), fmt(sd(diff_2024), 4), fmt(sd(diff_log_ts), 4)),
Variansi = c(fmt(var(diff_2023), 6), fmt(var(diff_2024), 6), fmt(var(diff_log_ts), 6))
)
knitr::kable(
tabel_diff,
align = "c",
col.names = c("Periode Pengamatan", "Jumlah Observasi", "Rata-Rata Selisih", "Simpangan Baku", "Variansi")
)| Periode Pengamatan | Jumlah Observasi | Rata-Rata Selisih | Simpangan Baku | Variansi |
|---|---|---|---|---|
| Tahun 2023 (Feb - Des) | 11 | 0,0083 | 0,0189 | 0,000356 |
| Tahun 2024 (Jan - Des) | 12 | 0,0083 | 0,0165 | 0,000272 |
| Keseluruhan (Feb 2023 - Des 2024) | 23 | 0,0083 | 0,0173 | 0,000298 |
Plot runtun waktu dari data hasil diferensiasi disajikan di bawah ini, dilengkapi dengan garis horizontal nol (garis putus-putus) dan garis rata-rata keseluruhan (garis solid).
plot(
diff_log_ts,
type = "o",
pch = 16,
col = "black",
xlab = "Waktu",
ylab = "Selisih ln(Harga GKP)",
main = "Differencing Tingkat Pertama Data Logaritma Harga GKP"
)
abline(h = 0, lty = 2, col = "gray30")
abline(h = mean(diff_log_ts), lty = 1, col = "black")
legend(
"topright",
legend = c("Deret Diferensiasi", "Garis Rata-Rata (Drift)", "Garis Nol"),
col = c("black", "black", "gray30"),
pch = c(16, NA, NA),
lty = c(1, 1, 2),
bty = "n"
)Grafik di atas memuat 23 titik observasi selisih bulanan dari Februari 2023 hingga Desember 2024. Nilai selisih berfluktuasi pada rentang terendah -0,0282 hingga tertinggi 0,0287 dengan pusat sebaran di sekitar garis rata-rata 0,0083. Berdasarkan evaluasi visual dan pembuktian statistik di atas:
Untuk mengevaluasi kemampuan peramalan jangka pendek, data dibagi menjadi 21 observasi pertama (Januari 2023 sampai September 2024) sebagai data latih (training set) dan 3 observasi terakhir (Oktober, November, dan Desember 2024) sebagai data uji (testing set). Peramalan dilakukan menggunakan metode naif (naive forecast) pada skala data asli (Rp/kg), di mana nilai ramalan untuk seluruh periode uji ditetapkan sama persis dengan nilai observasi terakhir pada data latih:
\[ \hat{y}_{T+h} = y_T \quad \text{untuk } h = 1, 2, 3 \]
dengan \(T = 21\) (September 2024, sebesar \(y_{21} = 5.900\) Rp/kg).
# Pembagian data latih dan data uji
n_train <- 21
train <- gkp[1:n_train]
test <- gkp[(n_train + 1):length(gkp)]
# Peramalan naif berdasarkan nilai terakhir data latih
y_hat <- rep(train[n_train], length(test))
# Perhitungan komponen galat per bulan pengujian
e <- test - y_hat
abs_e <- abs(e)
sq_e <- e^2
ape <- (abs_e / test) * 100
# Tabel galat per bulan pada data uji
tabel_galat <- data.frame(
Bulan = c("Oktober 2024", "November 2024", "Desember 2024"),
Aktual = fmt(test, 0),
Ramalan = fmt(y_hat, 0),
Galat_e = fmt(e, 0),
Abs_Galat = fmt(abs_e, 0),
Kuadrat_Galat = fmt(sq_e, 0),
Persen_Galat = paste0(fmt(ape, 2), "%")
)
knitr::kable(
tabel_galat,
align = "c",
col.names = c("Bulan Uji", "Aktual (yt)", "Ramalan (yt_hat)", "Galat (e)", "|e|", "e^2", "|e|/yt (%)")
)| Bulan Uji | Aktual (yt) | Ramalan (yt_hat) | Galat (e) | |e| | e^2 | |e|/yt (%) |
|---|---|---|---|---|---|---|
| Oktober 2024 | 6.050 | 5.900 | 150 | 150 | 22.500 | 2,48% |
| November 2024 | 6.150 | 5.900 | 250 | 250 | 62.500 | 4,07% |
| Desember 2024 | 6.300 | 5.900 | 400 | 400 | 160.000 | 6,35% |
Evaluasi performa akurasi peramalan dihitung berdasarkan rumus-rumus formal berikut:
Mean Error (ME): \[ \text{ME} = \frac{1}{n} \sum_{t=1}^n e_t = \frac{1}{n} \sum_{t=1}^n (y_t - \hat{y}_t) \]
Mean Absolute Error (MAE): \[ \text{MAE} = \frac{1}{n} \sum_{t=1}^n |e_t| = \frac{1}{n} \sum_{t=1}^n |y_t - \hat{y}_t| \]
Mean Squared Error (MSE): \[ \text{MSE} = \frac{1}{n} \sum_{t=1}^n e_t^2 = \frac{1}{n} \sum_{t=1}^n (y_t - \hat{y}_t)^2 \]
Root Mean Squared Error (RMSE): \[ \text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{n} \sum_{t=1}^n (y_t - \hat{y}_t)^2} \]
Mean Absolute Percentage Error (MAPE): \[ \text{MAPE} = \frac{1}{n} \sum_{t=1}^n \left| \frac{e_t}{y_t} \right| \times 100\% \]
Ringkasan nilai dari seluruh ukuran akurasi peramalan tersebut disajikan pada tabel berikut.
# Perhitungan metrik akurasi
me <- mean(e)
mae <- mean(abs_e)
mse <- mean(sq_e)
rmse <- sqrt(mse)
mape <- mean(ape)
# Tabel ringkasan ukuran akurasi
tabel_metrik <- data.frame(
Ukuran_Akurasi = c(
"Mean Error (ME)",
"Mean Absolute Error (MAE)",
"Mean Squared Error (MSE)",
"Root Mean Squared Error (RMSE)",
"Mean Absolute Percentage Error (MAPE)"
),
Nilai = c(
fmt(me, 2),
fmt(mae, 2),
fmt(mse, 2),
fmt(rmse, 2),
paste0(fmt(mape, 2), "%")
),
Satuan = c(
"Rp/kg",
"Rp/kg",
"(Rp/kg)2",
"Rp/kg",
"Persen (%)"
)
)
knitr::kable(
tabel_metrik,
align = "c",
col.names = c("Ukuran Akurasi", "Nilai Perhitungan", "Satuan")
)| Ukuran Akurasi | Nilai Perhitungan | Satuan |
|---|---|---|
| Mean Error (ME) | 266,67 | Rp/kg |
| Mean Absolute Error (MAE) | 266,67 | Rp/kg |
| Mean Squared Error (MSE) | 81.666,67 | (Rp/kg)2 |
| Root Mean Squared Error (RMSE) | 285,77 | Rp/kg |
| Mean Absolute Percentage Error (MAPE) | 4,30% | Persen (%) |
Grafik perbandingan antara nilai aktual keseluruhan dan hasil proyeksi ramalan naif pada data uji ditampilkan pada plot berikut.
# Vektor waktu objek ts
t_waktu <- time(gkp_ts)
plot(
gkp_ts,
type = "o",
pch = 16,
col = "black",
xlab = "Waktu",
ylab = "Harga GKP (Rp/kg)",
main = "Perbandingan Nilai Aktual dan Ramalan Naif Harga GKP",
ylim = c(min(gkp) - 50, max(gkp) + 150)
)
# Proyeksi garis ramalan naif dari akhir data latih ke data uji
lines(
t_waktu[21:24],
c(train[n_train], y_hat),
type = "o",
pch = 17,
lty = 2,
col = "gray30"
)
# Garis vertikal batas pemisah data latih dan data uji
abline(v = mean(t_waktu[21:22]), lty = 3, col = "gray30")
legend(
"topleft",
legend = c("Data Aktual (Latih & Uji)", "Ramalan Naif (Data Uji)", "Batas Pemisah Latih-Uji"),
col = c("black", "gray30", "gray30"),
pch = c(16, 17, NA),
lty = c(1, 2, 3),
bty = "n"
)Grafik dan tabel di atas memuat evaluasi komparatif antara nilai aktual dan ramalan naif pada 3 observasi data uji (Oktober, November, dan Desember 2024). Nilai ramalan naif bertahan konstan pada angka 5.900 Rp/kg, sementara harga aktual terus menanjak dari 6.050 Rp/kg hingga 6.300 Rp/kg. Berdasarkan ukuran akurasi yang diperoleh:
Berdasarkan keseluruhan tahapan eksplorasi, transformasi, diferensiasi, dan evaluasi peramalan deret waktu harga gabah kering panen (GKP) Kabupaten Serang periode Januari 2023 hingga Desember 2024, dapat disimpulkan hal-hal berikut: