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()

enam_terakhir <- tail(tabel_sma, 6)
enam_terakhir
##       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