Analisis Deret Waktu: Single & Double Moving Average pada Data Pengunjung Perpustakaan Daerah Kabupaten Serang (Jan 2023 - Jun 2024)
Gambaran Umum Data dan Analisis
Data yang digunakan merupakan data jumlah pengunjung Perpustakaan Daerah Kabupaten Serang periode Januari 2023 hingga Juni 2024 dengan 18 observasi bulanan. Analisis yang dilakukan menggunakan metode Single Moving Average (SMA) dan Double Moving Average (DMA) dengan periode 3 bulan untuk mengidentifikasi pola pergerakan data dan melakukan peramalan. Hasil analisis kemudian dibandingkan untuk melihat kemampuan masing-masing metode dalam menangkap tren jumlah pengunjung.
1. Membuat Objek ts dan Plot Data
Objek Time Series
pengunjung <- c(210,195,220,205,230,215,240,225,250,235,245,260,
255,265,270,280,275,290)
pengunjung_ts <- ts(pengunjung, start = c(2023,1), frequency = 12)
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 Time Series
label_bulan <- format(zoo::as.yearmon(time(pengunjung_ts)), "%b-%y")
plot(pengunjung_ts, type = "o", pch = 16, col = "steelblue",
main = "Jumlah Pengunjung Perpustakaan Daerah Kab. Serang",
xlab = "Waktu (Bulan)", ylab = "Jumlah Pengunjung (orang)",
xaxt = "n")
axis(1, at = time(pengunjung_ts), labels = label_bulan, las = 2, cex.axis = 0.8)
grid()Interpretasi:
Dari plot terlihat data bergerak naik hampir sepanjang periode pengamatan, meskipun ada riak-riak kecil (naik-turun antar bulan, misalnya Feb 2023 turun dibanding Jan 2023). Jika kita “menyipitkan mata” seperti pada analogi ombak, pola besarnya jelas: tren naik yang cukup konsisten, terutama sejak awal 2024 di mana kenaikan terlihat lebih tajam (255 -> 265 -> 270 -> 280 -> 275 -> 290). Karena ada tren, metode Single Moving Average (SMA) saja berpotensi kurang tepat dan Double Moving Average (DMA) akan lebih sesuai.
2. Single Moving Average SMA(3)
Rumus:
\[M'_t = \frac{1}{m}(Z_t + Z_{t-1} + \dots + Z_{t-m+1})\]
dengan \(m = 3\), dihitung
menggunakan rollmean() dari paket zoo.
sma3 <- rollmean(pengunjung_ts, k = 3, align = "right", fill = NA)
tabel_sma <- data.frame(
Bulan = format(zoo::as.yearmon(time(pengunjung_ts)), "%b %Y"),
DataAsli = as.numeric(pengunjung_ts),
SMA3 = round(as.numeric(sma3), 2)
)
tabel_sma## Bulan DataAsli SMA3
## 1 Jan 2023 210 NA
## 2 Feb 2023 195 NA
## 3 Mar 2023 220 208.33
## 4 Apr 2023 205 206.67
## 5 May 2023 230 218.33
## 6 Jun 2023 215 216.67
## 7 Jul 2023 240 228.33
## 8 Aug 2023 225 226.67
## 9 Sep 2023 250 238.33
## 10 Oct 2023 235 236.67
## 11 Nov 2023 245 243.33
## 12 Dec 2023 260 246.67
## 13 Jan 2024 255 253.33
## 14 Feb 2024 265 260.00
## 15 Mar 2024 270 263.33
## 16 Apr 2024 280 271.67
## 17 May 2024 275 275.00
## 18 Jun 2024 290 281.67
plot(pengunjung_ts, type = "o", pch = 16, col = "steelblue",
main = "Data Asli vs SMA(3)",
xlab = "Waktu (Bulan)", ylab = "Jumlah Pengunjung (orang)",
ylim = range(pengunjung_ts),
xaxt = "n")
axis(1, at = time(pengunjung_ts), labels = label_bulan, las = 2, cex.axis = 0.8)
lines(sma3, type = "o", pch = 16, col = "tomato", lwd = 2)
legend("topleft", legend = c("Data asli", "SMA(3)"),
col = c("steelblue", "tomato"), lty = 1, pch = 16, bty = "n")
grid()## Bulan DataAsli SMA3
## 13 Jan 2024 255 253.33
## 14 Feb 2024 265 260.00
## 15 Mar 2024 270 263.33
## 16 Apr 2024 280 271.67
## 17 May 2024 275 275.00
## 18 Jun 2024 290 281.67
Interpretasi:
Pada 6 bulan terakhir (Jan-Jun 2024), data asli terus meningkat dari 255 ke 290, sedangkan SMA(3) meningkat lebih lambat dari sekitar 253.33 ke 281,67. Selisih SMA(3) terhadap data asli di bulan terakhir (Juni 2024) adalah 290 - 281,67 = 8,33, yang menunjukkan SMA memang terlihat tertinggal (lag) di belakang data asli. Karena data punya tren naik yang konsisten, SMA(3) secara sistematis underestimate (nilai SMA lebih rendah dari data aktual).
3. Double Moving Average (m = 3)
Tahap 1, \(M'_t\) (identik dengan SMA(3) di atas), dan tahap 2, \(M''_t\) (rata-rata bergerak dari \(M'_t\)):
\[M''_t = \frac{1}{m}\sum_{i=0}^{m-1} M'_{t-i}\]
m <- 3
Mp <- rollmean(pengunjung_ts, k = m, align = "right", fill = NA)
Mpp <- rollmean(Mp, k = m, align = "right", fill = NA)
a_t <- 2*Mp - Mpp
b_t <- (2/(m-1)) * (Mp - Mpp)
tabel_dma <- data.frame(
Bulan = format(zoo::as.yearmon(time(pengunjung_ts)), "%b-%y"),
Zt = as.numeric(pengunjung_ts),
Mp_t = round(as.numeric(Mp), 2),
Mpp_t = round(as.numeric(Mpp), 2),
a_t = round(as.numeric(a_t), 2),
b_t = round(as.numeric(b_t), 2)
)
tabel_dma## Bulan Zt Mp_t Mpp_t a_t b_t
## 1 Jan-23 210 NA NA NA NA
## 2 Feb-23 195 NA NA NA NA
## 3 Mar-23 220 208.33 NA NA NA
## 4 Apr-23 205 206.67 NA NA NA
## 5 May-23 230 218.33 211.11 225.56 7.22
## 6 Jun-23 215 216.67 213.89 219.44 2.78
## 7 Jul-23 240 228.33 221.11 235.56 7.22
## 8 Aug-23 225 226.67 223.89 229.44 2.78
## 9 Sep-23 250 238.33 231.11 245.56 7.22
## 10 Oct-23 235 236.67 233.89 239.44 2.78
## 11 Nov-23 245 243.33 239.44 247.22 3.89
## 12 Dec-23 260 246.67 242.22 251.11 4.44
## 13 Jan-24 255 253.33 247.78 258.89 5.56
## 14 Feb-24 265 260.00 253.33 266.67 6.67
## 15 Mar-24 270 263.33 258.89 267.78 4.44
## 16 Apr-24 280 271.67 265.00 278.33 6.67
## 17 May-24 275 275.00 270.00 280.00 5.00
## 18 Jun-24 290 281.67 276.11 287.22 5.56
Interpretasi:
Nilai \(M''_t\) baru muncul mulai bulan Mei 2023 (t=5) karena butuh 3 nilai \(M'_t\) yang juga baru tersedia mulai bulan Maret 2023 (t=3). Terlihat \(M''_t\) selalu lebih “ketinggalan” dibanding \(M'_t\), karena \(M''_t\) adalah rata-rata bergerak dari rata-rata bergerak itu sendiri. Selisih (\(M'_t - M''_t\)) inilah yang dipakai untuk menduga komponen tren \(b_t\): nilai \(b_t\) sepanjang periode konsisten positif, mengonfirmasi bahwa data pengunjung perpustakaan memang bertren naik.
4. Peramalan dengan DMA vs SMA
Nilai \(a_t\) dan \(b_t\) pada titik terakhir (Juni 2024, t = 18)
a_last <- tail(na.omit(a_t), 1)
b_last <- tail(na.omit(b_t), 1)
c(a_18 = round(as.numeric(a_last), 2), b_18 = round(as.numeric(b_last), 2))## a_18 b_18
## 287.22 5.56
Ramalan DMA 1 dan 2 bulan ke depan
\[\hat{Z}_{t+p} = a_t + b_t \, p\]
forecast_dma_1 <- a_last + b_last * 1 # Juli 2024
forecast_dma_2 <- a_last + b_last * 2 # Agustus 2024
data.frame(
Bulan = c("Juli 2024 (t+1)", "Agustus 2024 (t+2)"),
Ramalan_DMA = round(c(forecast_dma_1, forecast_dma_2), 2)
)## Bulan Ramalan_DMA
## 1 Juli 2024 (t+1) 292.78
## 2 Agustus 2024 (t+2) 298.33
Ramalan SMA biasa (dibandingkan)
Pada SMA, ramalan periode ke depan disamakan dengan nilai SMA terakhir (datar, \(\hat{Z}_{t+1} = M'_t\)), untuk semua horizon:
sma_last <- tail(na.omit(sma3), 1)
data.frame(
Bulan = c("Juli 2024 (t+1)", "Agustus 2024 (t+2)"),
Ramalan_SMA = round(rep(as.numeric(sma_last), 2), 2)
)## Bulan Ramalan_SMA
## 1 Juli 2024 (t+1) 281.67
## 2 Agustus 2024 (t+2) 281.67
Perbandingan Visual
waktu_depan <- c(2024 + 6/12, 2024 + 7/12) # Jul & Agu 2024
label_depan <- format(zoo::as.yearmon(waktu_depan), "%b-%y")
waktu_semua <- c(time(pengunjung_ts), waktu_depan)
label_semua <- c(label_bulan, label_depan)
plot(pengunjung_ts, type = "o", pch = 16, col = "steelblue",
xlim = c(2023, 2024 + 8/12),
ylim = c(190, 300),
main = "Data Asli, Ramalan SMA(3), dan Ramalan DMA (m=3)",
xlab = "Waktu (Bulan)", ylab = "Jumlah Pengunjung (orang)",
xaxt = "n")
axis(1, at = waktu_semua, labels = label_semua, las = 2, cex.axis = 0.7)
lines(waktu_depan, c(sma_last, sma_last), type = "o", pch = 16,
col = "tomato", lty = 2, lwd = 2)
lines(waktu_depan, c(forecast_dma_1, forecast_dma_2), type = "o", pch = 16,
col = "forestgreen", lty = 2, lwd = 2)
legend("topleft",
legend = c("Data asli", "Ramalan SMA(3)", "Ramalan DMA"),
col = c("steelblue", "tomato", "forestgreen"),
lty = c(1, 2, 2), pch = 16, bty = "n")
grid()Interpretasi:
- Ramalan SMA untuk Juli dan Agustus 2024 sama-sama 281,67, karena SMA hanya meng-copy nilai rata-rata bergerak terakhir tanpa memperhitungkan arah tren (ramalannya datar, seperti pada rumus \(\hat{Z}_{t+1} = M'_t\)).
- Ramalan DMA untuk Juli 2024 adalah 292,78 dan untuk Agustus 2024 adalah 298,33 terus naik mengikuti tren, karena DMA menambahkan komponen tren \(b_t \approx 5{,}56\) orang/bulan secara eksplisit ke level \(a_t \approx 287{,}22\).
- Perbedaan ini muncul karena data pengunjung perpustakaan memiliki tren linear yang cukup jelas. SMA hanya menangkap level rata-rata sesaat sehingga ramalannya tertinggal dan datar, sedangkan DMA secara eksplisit memodelkan laju perubahan (\(b_t\)) sehingga mampu “mengejar” arah tren. Jika data bertren tetap dipaksakan memakai SMA, ramalannya akan tertinggal jauh dari data aktual sehingga tidak masuk akal untuk perencanaan. Untuk kasus ini, ramalan DMA jauh lebih masuk akal dibanding ramalan SMA yang datar.
Kesimpulan
Data pengunjung Perpustakaan Daerah Kabupaten Serang menunjukkan tren naik yang cukup jelas sepanjang Januari 2023–Juni 2024. Hasil analisis menunjukkan bahwa SMA(3) mengalami lag terhadap data asli pada 6 bulan terakhir, sesuai dengan karakteristik data yang memiliki tren. Sementara itu, DMA (m=3) mampu menduga level sebesar (\(a_t \approx 287{,}22\)) dan tren sebesar (\(b_t \approx 5{,}56\) orang per bulan pada titik data terakhir. Oleh karena itu, untuk data yang memiliki tren, ramalan DMA lebih sesuai digunakan untuk perencanaan karena mempertimbangkan arah kenaikan data, sedangkan