Laporan ini menganalisis data bulanan jumlah pengunjung Perpustakaan
Daerah Kabupaten Serang pada periode Januari 2023 sampai Juni 2024 (18
observasi bulanan). Nilai pengamatan disajikan dalam satuan orang per
bulan (pemustaka/bulan). Analisis ini disusun untuk menyelesaikan
penugasan Latihan Pendalaman Materi (Tugas Mandiri) Pertemuan 4 mata
kuliah Analisis Deret Waktu (STA623303). Tujuan analisis ini meliputi:
(1) membentuk objek runtun waktu bulanan (ts) dan
memvisualisasikan data runtun waktu guna mengidentifikasi apakah pola
data menunjukkan kecenderungan tren yang cukup jelas; (2) menerapkan
metode pemulusan Single Moving Average (SMA) dengan orde
jendela \(m = 3\) menggunakan fungsi
rollmean() dari paket zoo
(align = "right", fill = NA), membandingkannya
dengan data asli pada 6 bulan terakhir (JanuariāJuni 2024), serta
mengevaluasi apakah pergerakan SMA memperlihatkan efek keterlambatan
(lag effect); (3) menghitung tahapan metode Double Moving
Average (DMA) berorde \(m = 3\)
yang mencakup rata-rata bergerak tingkat pertama (\(M'_t\)), rata-rata bergerak tingkat
kedua (\(M''_t\)), estimasi
komponen level saat ini (\(a_t\)), dan
estimasi komponen tren bulanan (\(b_t\)); serta (4) menggunakan formulasi DMA
untuk meramalkan jumlah pengunjung 1 dan 2 bulan ke depan (Juli dan
Agustus 2024), memperbandingkannya dengan hasil ramalan konstan metode
SMA biasa, dan menguraikan justifikasi teoretis mengenai penyebab
perbedaan hasil di antara kedua metode peramalan tersebut.
Langkah awal analisis adalah memasukkan 18 data observasi jumlah
pengunjung Perpustakaan Daerah Kabupaten Serang secara kronologis dari
Januari 2023 hingga Juni 2024 ke R dan membentuk objek runtun waktu
bulanan (ts) dengan titik awal Januari 2023
(start = c(2023, 1)) serta frekuensi 12.
# Data bulanan jumlah pengunjung Perpustakaan Daerah Kabupaten Serang (Januari 2023 - Juni 2024)
pengunjung <- c(
210, 195, 220, 205, 230, 215, 240, 225, 250, 235, 245, 260,
255, 265, 270, 280, 275, 290
)
# Pembentukan objek ts
pengunjung_ts <- ts(
pengunjung,
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 <- c(
paste(nama_bulan, 2023),
paste(nama_bulan[1:6], 2024)
)
# Pemisahan perbandingan semester pertama (Januari - Juni) antartahun 2023 dan 2024
pengunjung_s1_2023 <- pengunjung[1:6]
pengunjung_s1_2024 <- pengunjung[13:18]
diff_s1_yoy <- pengunjung_s1_2024 - pengunjung_s1_2023
# Menampilkan objek ts
print(pengunjung_ts)## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2023 210 195 220 205 230 215 240 225 250 235 245 260
## 2024 255 265 270 280 275 290
Plot runtun waktu dibuat untuk melihat pola pergerakan dan arah kecenderungan jumlah pengunjung perpustakaan selama 18 bulan masa pengamatan.
plot(
pengunjung_ts,
type = "o",
pch = 16,
xlab = "Waktu",
ylab = "Jumlah Pengunjung (orang)",
main = "Jumlah Pengunjung Perpustakaan Daerah Kabupaten Serang, 2023-2024"
)Grafik di atas memuat 18 titik observasi bulanan. Rentang nilai bergerak dari titik terendah 195 orang (Februari 2023) hingga titik tertinggi 290 orang (Juni 2024). Berdasarkan visualisasi runtun waktu tersebut, dapat diidentifikasi beberapa karakteristik utama:
Metode Single Moving Average (SMA) merupakan teknik pemulusan paling dasar yang merata-ratakan sejumlah \(m\) observasi terakhir guna meredam fluktuasi acak jangka pendek. Rata-rata bergerak tunggal orde \(m\) pada waktu \(t\) didefinisikan secara matematis sebagai:
\[ M'_t = \frac{1}{m} \sum_{i=0}^{m-1} Z_{t-i} = \frac{Z_t + Z_{t-1} + \dots + Z_{t-m+1}}{m} \]
Untuk orde pemulusan \(m = 3\), formulasi rata-rata bergerak tunggal pada periode ke-\(t\) adalah:
\[ M'_t = \frac{Z_t + Z_{t-1} + Z_{t-2}}{3} \]
Perhitungan SMA(3) diimplementasikan menggunakan fungsi
rollmean() dari paket zoo dengan argumen
align = "right" (menempatkan hasil rata-rata pada posisi
waktu observasi terakhir) dan fill = NA (mengisi \(m - 1\) posisi awal yang belum mencukupi
jendela data dengan NA).
library(zoo)
# Parameter jendela pemulusan
m <- 3
# Perhitungan Single Moving Average orde m = 3
sma3 <- rollmean(pengunjung_ts, k = m, align = "right", fill = NA)
# Ekstraksi dan perbandingan pada 6 bulan terakhir (Januari - Juni 2024, indeks 13 sampai 18)
idx_6bln <- 13:18
aktual_6bln <- pengunjung[idx_6bln]
sma3_6bln <- as.numeric(sma3[idx_6bln])
selisih_sma <- aktual_6bln - sma3_6bln
pct_lag_sma <- (selisih_sma / aktual_6bln) * 100
# Tabel perbandingan data asli vs SMA(3) pada 6 bulan terakhir
tabel_sma <- data.frame(
Bulan = label_periode[idx_6bln],
Aktual = fmt(aktual_6bln, 0),
SMA3 = fmt(sma3_6bln, 2),
Selisih = fmt(selisih_sma, 2),
Persen_Lag = paste0(fmt(pct_lag_sma, 2), "%")
)
knitr::kable(
tabel_sma,
align = "c",
col.names = c("Bulan Pengamatan (2024)", "Data Asli (Zt)", "SMA(3) (M't)", "Selisih (Zt - M't)", "Keterlambatan Relatif (%)")
)| Bulan Pengamatan (2024) | Data Asli (Zt) | SMA(3) (Māt) | Selisih (Zt - Māt) | Keterlambatan Relatif (%) |
|---|---|---|---|---|
| Januari 2024 | 255 | 253,33 | 1,67 | 0,65% |
| Februari 2024 | 265 | 260,00 | 5,00 | 1,89% |
| Maret 2024 | 270 | 263,33 | 6,67 | 2,47% |
| April 2024 | 280 | 271,67 | 8,33 | 2,98% |
| Mei 2024 | 275 | 275,00 | 0,00 | 0,00% |
| Juni 2024 | 290 | 281,67 | 8,33 | 2,87% |
Plot perbandingan antara data runtun waktu asli dan kurva hasil pemulusan SMA(3) disajikan pada grafik berikut.
plot(
pengunjung_ts,
type = "o",
pch = 16,
col = "black",
xlab = "Waktu",
ylab = "Jumlah Pengunjung (orang)",
main = "Pemulusan Single Moving Average (SMA m = 3) Jumlah Pengunjung",
ylim = c(min(pengunjung) - 10, max(pengunjung) + 15)
)
lines(
sma3,
type = "o",
pch = 17,
lty = 2,
col = "steelblue",
lwd = 2
)
legend(
"topleft",
legend = c("Data Asli (Zt)", "SMA(3) (M't)"),
col = c("black", "steelblue"),
pch = c(16, 17),
lty = c(1, 2),
lwd = c(1, 2),
bty = "n"
)Grafik dan tabel di atas memuat evaluasi komparatif antara data aktual dan nilai pemulusan SMA(3) pada 6 bulan terakhir masa pengamatan (Januari hingga Juni 2024). Berdasarkan telaah hasil tersebut, dapat disimpulkan beberapa temuan penting:
Metode Double Moving Average (DMA) dirancang secara spesifik untuk mengatasi kelemahan efek keterlambatan (lag) pada data yang mengandung tren linier. DMA menerapkan operasi rata-rata bergerak dua tahap secara berurutan dengan panjang jendela pemulusan \(m\) yang sama:
Tahap 1 ā Rata-Rata Bergerak Pertama (\(M'_t\)): \[ M'_t = \frac{1}{m} \sum_{i=0}^{m-1} Z_{t-i} = \frac{Z_t + Z_{t-1} + \dots + Z_{t-m+1}}{m} \]
Tahap 2 ā Rata-Rata Bergerak Kedua (\(M''_t\)): \[ M''_t = \frac{1}{m} \sum_{i=0}^{m-1} M'_{t-i} = \frac{M'_t + M'_{t-1} + \dots + M'_{t-m+1}}{m} \]
Ketika data memiliki tren linier dengan gradien \(b_t\), deret pemulusan pertama \(M'_t\) akan tertinggal di belakang data asli sebesar \(\frac{m-1}{2} b_t\). Rata-rata bergerak kedua \(M''_t\) (yang merupakan rata-rata dari \(M'_t\)) akan mengalami keterlambatan ganda dengan magnitudo yang sama, yaitu tertinggal sebesar \(\frac{m-1}{2} b_t\) di belakang \(M'_t\). Dengan demikian, selisih \((M'_t - M''_t)\) secara tepat mencerminkan besaran efek keterlambatan tersebut. Dari kedua nilai pemulusan ini, parameter level saat ini (\(a_t\)) dan komponen tren bulanan (\(b_t\)) diduga melalui rumus:
\[ a_t = 2M'_t - M''_t = M'_t + (M'_t - M''_t) \]
\[ b_t = \frac{2}{m - 1} (M'_t - M''_t) \]
Khusus untuk nilai \(m = 3\), faktor pengali tren bernilai \(\frac{2}{3 - 1} = 1\), sehingga formula estimasi laju tren tereduksi secara sederhana menjadi:
\[ b_t = M'_t - M''_t \]
Perhitungan seluruh tahapan DMA untuk ke-18 observasi bulanan pengunjung perpustakaan disajikan pada kode R berikut.
# Parameter orde pemulusan
m <- 3
# Tahap 1: Single Moving Average (M't)
Mp <- rollmean(pengunjung_ts, k = m, align = "right", fill = NA)
# Tahap 2: Double Moving Average (M''t) - rata-rata bergerak dari M't
Mpp <- rollmean(Mp, k = m, align = "right", fill = NA)
# Perhitungan komponen level tersesuaikan (at) dan kemiringan tren (bt)
a_t <- 2 * Mp - Mpp
b_t <- (2 / (m - 1)) * (Mp - Mpp)
# Pembentukan tabel lengkap DMA dari t = 1 sampai t = 18
tabel_dma <- data.frame(
t = 1:length(pengunjung),
Periode = label_periode,
Zt = fmt(pengunjung, 0),
Mp = ifelse(is.na(Mp), "-", fmt(Mp, 2)),
Mpp = ifelse(is.na(Mpp), "-", fmt(Mpp, 2)),
at = ifelse(is.na(a_t), "-", fmt(a_t, 2)),
bt = ifelse(is.na(b_t), "-", fmt(b_t, 2))
)
knitr::kable(
tabel_dma,
align = "c",
col.names = c("t", "Periode Pengamatan", "Data Asli (Zt)", "M't", "M''t", "Level (at)", "Tren (bt)")
)| t | Periode Pengamatan | Data Asli (Zt) | Māt | Māāt | Level (at) | Tren (bt) |
|---|---|---|---|---|---|---|
| 1 | Januari 2023 | 210 | - | - | - | - |
| 2 | Februari 2023 | 195 | - | - | - | - |
| 3 | Maret 2023 | 220 | 208,33 | - | - | - |
| 4 | April 2023 | 205 | 206,67 | - | - | - |
| 5 | Mei 2023 | 230 | 218,33 | 211,11 | 225,56 | 7,22 |
| 6 | Juni 2023 | 215 | 216,67 | 213,89 | 219,44 | 2,78 |
| 7 | Juli 2023 | 240 | 228,33 | 221,11 | 235,56 | 7,22 |
| 8 | Agustus 2023 | 225 | 226,67 | 223,89 | 229,44 | 2,78 |
| 9 | September 2023 | 250 | 238,33 | 231,11 | 245,56 | 7,22 |
| 10 | Oktober 2023 | 235 | 236,67 | 233,89 | 239,44 | 2,78 |
| 11 | November 2023 | 245 | 243,33 | 239,44 | 247,22 | 3,89 |
| 12 | Desember 2023 | 260 | 246,67 | 242,22 | 251,11 | 4,44 |
| 13 | Januari 2024 | 255 | 253,33 | 247,78 | 258,89 | 5,56 |
| 14 | Februari 2024 | 265 | 260,00 | 253,33 | 266,67 | 6,67 |
| 15 | Maret 2024 | 270 | 263,33 | 258,89 | 267,78 | 4,44 |
| 16 | April 2024 | 280 | 271,67 | 265,00 | 278,33 | 6,67 |
| 17 | Mei 2024 | 275 | 275,00 | 270,00 | 280,00 | 5,00 |
| 18 | Juni 2024 | 290 | 281,67 | 276,11 | 287,22 | 5,56 |
Plot komparatif komponen pemulusan Double Moving Average yang memuat kurva data aktual (\(Z_t\)), rata-rata bergerak pertama (\(M'_t\)), rata-rata bergerak kedua (\(M''_t\)), serta lintasan level tersesuaikan (\(a_t\)) ditampilkan pada grafik berikut.
plot(
pengunjung_ts,
type = "o",
pch = 16,
col = "black",
xlab = "Waktu",
ylab = "Jumlah Pengunjung (orang)",
main = "Komponen Pemulusan Double Moving Average (DMA m = 3)",
ylim = c(min(pengunjung) - 10, max(pengunjung) + 15)
)
lines(Mp, type = "o", pch = 17, lty = 2, col = "steelblue", lwd = 1.5)
lines(Mpp, type = "o", pch = 15, lty = 3, col = "tomato", lwd = 1.5)
lines(a_t, type = "o", pch = 18, lty = 1, col = "darkgreen", lwd = 2)
legend(
"topleft",
legend = c("Data Asli (Zt)", "M't (SMA)", "M''t (Double MA)", "Level Tersesuaikan (at)"),
col = c("black", "steelblue", "tomato", "darkgreen"),
pch = c(16, 17, 15, 18),
lty = c(1, 2, 3, 1),
lwd = c(1, 1.5, 1.5, 2),
bty = "n"
)Berdasarkan tabel perhitungan numerik dan visualisasi komponen DMA di atas, dapat diidentifikasi karakteristik penting dari metode ini:
NA).Peramalan untuk beberapa periode ke depan (\(p\) periode setelah data terakhir pada waktu \(t = 18\)) dilakukan dengan membandingkan dua pendekatan pemodelan:
Berdasarkan nilai estimasi pada observasi terakhir (\(t = 18\), Juni 2024), yaitu \(a_{18} = 287,22\) dan \(b_{18} = 5,56\): - Ramalan 1 bulan ke depan (\(p = 1\), Juli 2024): \[ \hat{Z}_{18+1} = a_{18} + b_{18}(1) = 287,22 + 5,56(1) = 292,78 \approx 293 \text{ orang} \] - Ramalan 2 bulan ke depan (\(p = 2\), Agustus 2024): \[ \hat{Z}_{18+2} = a_{18} + b_{18}(2) = 287,22 + 5,56(2) = 298,33 \approx 298 \text{ orang} \]
Dengan nilai \(M'_{18} = 281,67\): - Ramalan 1 bulan ke depan (\(p = 1\), Juli 2024): \[ \hat{Z}_{18+1} = M'_{18} = 281,67 \approx 282 \text{ orang} \] - Ramalan 2 bulan ke depan (\(p = 2\), Agustus 2024): \[ \hat{Z}_{18+2} = M'_{18} = 281,67 \approx 282 \text{ orang} \]
Perbandingan hasil perhitungan peramalan antara metode SMA dan DMA dirangkum pada kode dan tabel R berikut.
# Ekstraksi parameter akhir pada t = 18 (Juni 2024)
a_last <- as.numeric(tail(na.omit(a_t), 1))
b_last <- as.numeric(tail(na.omit(b_t), 1))
sma_last <- as.numeric(tail(na.omit(Mp), 1))
# Horizon peramalan 1 dan 2 bulan ke depan
p_vec <- c(1, 2)
nama_target <- c("Juli 2024 (t + 1)", "Agustus 2024 (t + 2)")
# Perhitungan nilai ramalan
ramalan_dma <- a_last + b_last * p_vec
ramalan_sma <- rep(sma_last, length(p_vec))
selisih_ramalan <- ramalan_dma - ramalan_sma
# Tabel ringkasan perbandingan hasil peramalan
tabel_peramalan <- data.frame(
Horizon = paste0("p = ", p_vec),
Periode_Target = nama_target,
Ramalan_SMA = fmt(ramalan_sma, 2),
Ramalan_DMA = fmt(ramalan_dma, 2),
Selisih = fmt(selisih_ramalan, 2),
Bulat_SMA = fmt(round(ramalan_sma), 0),
Bulat_DMA = fmt(round(ramalan_dma), 0)
)
knitr::kable(
tabel_peramalan,
align = "c",
col.names = c("Horizon", "Periode Target", "Ramalan SMA (orang)", "Ramalan DMA (orang)", "Selisih (DMA - SMA)", "Bulat SMA (orang)", "Bulat DMA (orang)")
)| Horizon | Periode Target | Ramalan SMA (orang) | Ramalan DMA (orang) | Selisih (DMA - SMA) | Bulat SMA (orang) | Bulat DMA (orang) |
|---|---|---|---|---|---|---|
| p = 1 | Juli 2024 (t + 1) | 281,67 | 292,78 | 11,11 | 282 | 293 |
| p = 2 | Agustus 2024 (t + 2) | 281,67 | 298,33 | 16,67 | 282 | 298 |
Visualisasi perbandingan proyeksi lintasan masa depan antara metode SMA dan DMA bersama data historis aktual disajikan pada grafik berikut.
# Vektor indeks waktu historis
t_waktu <- as.numeric(time(pengunjung_ts))
delta_t <- 1 / 12
# Titik koordinat waktu masa depan untuk proyeksi
t_future <- c(max(t_waktu) + delta_t, max(t_waktu) + 2 * delta_t)
# Rentang plot sumbu X dan Y
xlim_range <- c(min(t_waktu), max(t_future) + 0.05)
ylim_range <- c(min(pengunjung) - 10, max(ramalan_dma) + 15)
# Plot data historis
plot(
pengunjung_ts,
type = "o",
pch = 16,
col = "black",
xlim = xlim_range,
ylim = ylim_range,
xlab = "Waktu",
ylab = "Jumlah Pengunjung (orang)",
main = "Perbandingan Proyeksi Peramalan: SMA(3) vs DMA(3)"
)
# Lintasan proyeksi DMA
lines(
c(tail(t_waktu, 1), t_future),
c(tail(pengunjung, 1), ramalan_dma),
type = "o",
pch = 17,
lty = 2,
col = "darkgreen",
lwd = 2
)
# Lintasan proyeksi SMA
lines(
c(tail(t_waktu, 1), t_future),
c(tail(pengunjung, 1), ramalan_sma),
type = "o",
pch = 15,
lty = 3,
col = "tomato",
lwd = 2
)
# Garis vertikal pemisah data historis dan masa ramalan
abline(v = max(t_waktu) + (delta_t / 2), lty = 4, col = "gray40")
# Legenda grafik
legend(
"topleft",
legend = c("Data Historis Aktual", "Proyeksi Ramalan DMA", "Proyeksi Ramalan SMA", "Batas Periode"),
col = c("black", "darkgreen", "tomato", "gray40"),
pch = c(16, 17, 15, NA),
lty = c(1, 2, 3, 4),
lwd = c(1, 2, 2, 1),
bty = "n"
)Grafik dan tabel di atas memperlihatkan disparitas lintasan proyeksi yang sangat kontras antara metode SMA dan DMA. Berdasarkan telaah teoritis dan komputasional, berikut adalah penjelasan mendalam mengenai mengapa hasil ramalan kedua metode tersebut berbeda secara fundamental:
Berdasarkan keseluruhan tahapan eksplorasi data, pemulusan Single Moving Average (SMA), formulasi Double Moving Average (DMA), serta evaluasi perbandingan peramalan deret waktu jumlah pengunjung Perpustakaan Daerah Kabupaten Serang periode Januari 2023 hingga Juni 2024, diperoleh kesimpulan sebagai berikut: