Pendahuluan

Laporan ini menganalisis volume produksi air minum PDAM Kabupaten Serang pada periode Januari 2022 sampai Desember 2024, terdiri atas 36 observasi bulanan dalam satuan ribu m³ per bulan. Analisis disusun untuk menjawab empat soal Latihan Pendalaman Materi (Tugas Mandiri) pada materi Pertemuan 6 mata kuliah Analisis Deret Waktu (STA623303), yang ditempatkan pada folder Tugas 5. Tujuan analisis meliputi: (1) membentuk objek runtun waktu bulanan dan melakukan dekomposisi additive; (2) menampilkan komponen tren serta memeriksa arah pertumbuhannya; (3) menginterpretasikan 12 indeks musiman dan mengidentifikasi bulan tertinggi serta terendah; dan (4) memeriksa ringkasan statistik, simpangan baku, serta pola residu di sekitar nol.

Model dekomposisi additive memisahkan nilai pengamatan menjadi penjumlahan komponen tren, musiman, dan residu:

\[ Z_t = T_t + S_t + e_t. \]

Komponen \(T_t\) menggambarkan perubahan level produksi jangka panjang, \(S_t\) menunjukkan tambahan atau pengurangan produksi akibat pola bulan kalender, sedangkan \(e_t\) merupakan bagian yang belum dijelaskan oleh kedua komponen tersebut. Model ini sesuai ketika besarnya ayunan musiman relatif tetap dalam satuan asli, walaupun level produksi meningkat. Data yang digunakan merupakan data penugasan; dugaan mengenai penyebab pola bulanan diperlakukan sebagai interpretasi, bukan sebagai fakta operasional PDAM yang telah diverifikasi.

1 Objek Time Series dan Dekomposisi Additive

Langkah pertama adalah memasukkan data sesuai urutan bulan pada soal, kemudian membentuk objek ts dengan titik awal Januari 2022 (start = c(2022, 1)) dan frekuensi 12. Frekuensi ini menyatakan bahwa satu siklus musiman terdiri atas 12 bulan.

# Volume produksi air minum PDAM Kabupaten Serang (ribu m3/bulan)
produksi <- c(
  410, 415, 405, 420, 430, 445, 455, 440, 425, 420, 418, 435,
  440, 445, 438, 452, 462, 478, 488, 472, 458, 452, 450, 468,
  470, 476, 468, 483, 494, 510, 521, 504, 489, 483, 480, 499
)

stopifnot(length(produksi) == 36L, all(is.finite(produksi)))
produksi_ts <- ts(produksi, start = c(2022, 1), frequency = 12)

nama_bulan <- c(
  "Januari", "Februari", "Maret", "April", "Mei", "Juni",
  "Juli", "Agustus", "September", "Oktober", "November", "Desember"
)
label_periode <- paste(rep(nama_bulan, 3), rep(2022:2024, each = 12))
produksi_tahunan <- matrix(produksi, nrow = 12, ncol = 3)

print(produksi_ts)
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2022 410 415 405 420 430 445 455 440 425 420 418 435
## 2023 440 445 438 452 462 478 488 472 458 452 450 468
## 2024 470 476 468 483 494 510 521 504 489 483 480 499

Grafik data asli disajikan untuk melihat perubahan level produksi dan keterulangan fluktuasi bulanan sebelum komponen-komponennya dipisahkan.

plot(
  produksi_ts, type = "o", pch = 16, col = "black",
  xlab = "Waktu", ylab = "Produksi Air (ribu m3/bulan)",
  main = "Produksi Air Minum PDAM Kabupaten Serang, 2022-2024"
)

Produksi air PDAM meningkat dari 2022 sampai 2024 dengan puncak bulanan berulang pada Juli.

Grafik di atas memuat 36 observasi, dari nilai terendah 405 ribu m³ pada Maret 2022 sampai nilai tertinggi 521 ribu m³ pada Juli 2024. Pola produksi memperlihatkan kenaikan level antartahun, disertai puncak yang berulang sekitar pertengahan tahun. Untuk memisahkan kedua pola tersebut, diterapkan fungsi decompose() dengan tipe additive.

# Dekomposisi klasik menggunakan centered moving average 2 x 12
dekomp_add <- decompose(produksi_ts, type = "additive")
tren <- dekomp_add$trend
musiman <- dekomp_add$seasonal
residu <- dekomp_add$random
indeks_musiman <- as.numeric(dekomp_add$figure)

# Pemeriksaan identitas model pada periode yang memiliki tren
idx_valid <- which(!is.na(tren))
stopifnot(
  length(idx_valid) == 24L,
  abs(sum(indeks_musiman)) < 1e-8,
  max(abs(produksi_ts[idx_valid] -
    (tren[idx_valid] + musiman[idx_valid] + residu[idx_valid]))) < 1e-8
)
plot(dekomp_add)

Empat panel menampilkan data asli, tren yang naik, musiman berulang, dan residu kecil di sekitar nol.

Visualisasi dekomposisi menampilkan empat panel: data asli (observed), tren (trend), musiman (seasonal), dan residu (random). Tren bergerak naik dengan lebih halus daripada data asli, sementara pola musiman berulang setiap tahun. Panel tren dan residu hanya terisi dari Juli 2022 sampai Juni 2024. Enam bulan pertama dan enam bulan terakhir bernilai NA karena perhitungan tren terpusat memerlukan data di kedua sisi periode pengamatan; nilai tersebut bukan produksi nol atau data asli yang hilang.

2 Komponen Tren dan Arah Pertumbuhan Produksi

Fungsi decompose() mengestimasi tren bulanan menggunakan Centered Moving Average (CMA) \(2\times12\). Karena periode musiman 12 merupakan bilangan genap, dua rata-rata bergerak 12 bulan yang berurutan dirata-ratakan kembali agar hasilnya berada tepat pada bulan pengamatan. Bobot akhirnya dapat dituliskan sebagai:

\[ \widehat{T}_t = \frac{Z_{t-6}}{24} + \frac{1}{12}\sum_{j=-5}^{5} Z_{t+j} + \frac{Z_{t+6}}{24}. \]

Dengan 36 observasi, tren dapat dihitung pada \(t=7,\ldots,30\). Tabel berikut menampilkan komponen tren pada seluruh bulan, termasuk posisi yang tidak dapat diestimasi.

tabel_tren <- data.frame(
  t = seq_along(produksi),
  Periode = label_periode,
  Produksi = fmt(produksi, 0),
  Tren = ifelse(is.na(tren), "-", fmt(tren, 3))
)

knitr::kable(
  tabel_tren, align = "c",
  col.names = c("t", "Periode Pengamatan", "Produksi (ribu m³)", "Tren CMA (ribu m³)")
)
t Periode Pengamatan Produksi (ribu m³) Tren CMA (ribu m³)
1 Januari 2022 410 -
2 Februari 2022 415 -
3 Maret 2022 405 -
4 April 2022 420 -
5 Mei 2022 430 -
6 Juni 2022 445 -
7 Juli 2022 455 427,750
8 Agustus 2022 440 430,250
9 September 2022 425 432,875
10 Oktober 2022 420 435,583
11 November 2022 418 438,250
12 Desember 2022 435 440,958
13 Januari 2023 440 443,708
14 Februari 2023 445 446,417
15 Maret 2023 438 449,125
16 April 2023 452 451,833
17 Mei 2023 462 454,500
18 Juni 2023 478 457,208
19 Juli 2023 488 459,833
20 Agustus 2023 472 462,375
21 September 2023 458 464,917
22 Oktober 2023 452 467,458
23 November 2023 450 470,083
24 Desember 2023 468 472,750
25 Januari 2024 470 475,458
26 Februari 2024 476 478,167
27 Maret 2024 468 480,792
28 April 2024 483 483,375
29 Mei 2024 494 485,917
30 Juni 2024 510 488,458
31 Juli 2024 521 -
32 Agustus 2024 504 -
33 September 2024 489 -
34 Oktober 2024 483 -
35 November 2024 480 -
36 Desember 2024 499 -

Komponen tren digambarkan bersama data asli agar pergerakan jangka panjang dapat dibedakan dari fluktuasi musiman.

plot(
  produksi_ts, type = "o", pch = 16, col = "gray50",
  xlab = "Waktu", ylab = "Produksi Air (ribu m3/bulan)",
  main = "Data Aktual dan Komponen Tren Produksi Air PDAM"
)
lines(tren, col = "steelblue", lwd = 2, lty = 2)
legend(
  "topleft", legend = c("Data Aktual", "Tren CMA 2 x 12"),
  col = c("gray50", "steelblue"), pch = c(16, NA),
  lty = c(1, 2), lwd = c(1, 2), bty = "n"
)

Tren CMA meningkat dari 427,75 ribu m3 pada Juli 2022 menjadi 488,46 ribu m3 pada Juni 2024.

tren_valid <- as.numeric(tren[idx_valid])
kenaikan_tren <- tail(tren_valid, 1) - head(tren_valid, 1)
kenaikan_per_bulan <- kenaikan_tren / (length(tren_valid) - 1)
rerata_tahunan <- colMeans(produksi_tahunan)
rentang_tahunan <- apply(produksi_tahunan, 2, function(x) diff(range(x)))

tabel_tahunan <- data.frame(
  Tahun = 2022:2024,
  Rata_rata = fmt(rerata_tahunan, 3),
  Minimum = fmt(apply(produksi_tahunan, 2, min), 0),
  Maksimum = fmt(apply(produksi_tahunan, 2, max), 0),
  Rentang = fmt(rentang_tahunan, 0)
)
knitr::kable(
  tabel_tahunan, align = "c",
  col.names = c("Tahun", "Rata-Rata", "Minimum", "Maksimum", "Rentang Maksimum-Minimum")
)
Tahun Rata-Rata Minimum Maksimum Rentang Maksimum-Minimum
2022 426,500 405 455 50
2023 458,583 438 488 50
2024 489,750 468 521 53

Berdasarkan tabel dan grafik di atas, produksi air minum menunjukkan tren naik. Temuan tersebut dapat dijelaskan sebagai berikut:

  1. Kenaikan Komponen Tren: Nilai CMA meningkat dari 427,750 ribu m³ pada Juli 2022 menjadi 488,458 ribu m³ pada Juni 2024. Selisihnya sebesar 60,708 ribu m³ selama 23 interval bulanan, atau rata-rata 2,639 ribu m³ per bulan. Seluruh 23 perubahan CMA antarbulan bernilai positif. Angka ini menggambarkan kenaikan tren historis pada bagian tengah data, bukan ramalan untuk bulan di luar pengamatan.
  2. Dukungan Rata-Rata Tahunan: Rata-rata produksi meningkat dari 426,500 ribu m³ pada 2022 menjadi 458,583 ribu m³ pada 2023 dan 489,750 ribu m³ pada 2024. Peningkatan level tidak hanya terjadi pada satu bulan puncak, tetapi terlihat pada keseluruhan pola tahunan.
  3. Ayunan Musiman Relatif Tetap: Rentang maksimum-minimum tahunan masing-masing sebesar 50, 50, dan 53 ribu m³. Rentang mentah ini masih mencakup pengaruh tren, tetapi besarnya yang relatif serupa memberi dukungan awal bagi penggunaan model additive.

3 Dua Belas Indeks Musiman dan Interpretasinya

Setelah tren diperoleh, pengaruh tren dihilangkan melalui selisih \(D_t=Z_t-\widehat{T}_t\). Selisih tersebut dirata-ratakan untuk setiap bulan kalender, kemudian dinormalisasi agar jumlah 12 indeks musiman sama dengan nol:

\[ \widehat{S}_m = \overline{D}_m - \frac{1}{12}\sum_{j=1}^{12}\overline{D}_j, \qquad \sum_{m=1}^{12}\widehat{S}_m=0. \]

Indeks positif menyatakan produksi yang cenderung lebih tinggi daripada tren, sedangkan indeks negatif menyatakan produksi yang cenderung lebih rendah. Seluruh indeks masih memiliki satuan ribu m³ per bulan, sehingga interpretasinya merupakan selisih volume, bukan persentase.

idx_maks <- which.max(indeks_musiman)
idx_min <- which.min(indeks_musiman)

tabel_musiman <- data.frame(
  Bulan = nama_bulan,
  Indeks = fmt(indeks_musiman, 3),
  Pengaruh = ifelse(indeks_musiman > 0, "Di atas tren", "Di bawah tren")
)
knitr::kable(
  tabel_musiman, align = "c",
  col.names = c("Bulan", "Indeks Musiman (ribu m³)", "Interpretasi")
)
Bulan Indeks Musiman (ribu m³) Interpretasi
Januari -4,540 Di bawah tren
Februari -1,748 Di bawah tren
Maret -11,915 Di bawah tren
April -0,061 Di bawah tren
Mei 7,835 Di atas tren
Juni 21,210 Di atas tren
Juli 27,752 Di atas tren
Agustus 9,731 Di atas tren
September -7,352 Di bawah tren
Oktober -15,477 Di bawah tren
November -20,123 Di bawah tren
Desember -5,311 Di bawah tren
cat("Jumlah 12 indeks musiman:", fmt(sum(indeks_musiman), 6), "ribu m3\n")
## Jumlah 12 indeks musiman: 0,000000 ribu m3
posisi <- barplot(
  indeks_musiman, names.arg = substr(nama_bulan, 1, 3),
  col = ifelse(indeks_musiman >= 0, "steelblue", "gray60"),
  border = NA, ylim = c(-26, 34),
  xlab = "Bulan", ylab = "Indeks Musiman (ribu m3/bulan)",
  main = "Dua Belas Indeks Musiman Additive Produksi Air PDAM"
)
abline(h = 0, lty = 2, col = "gray30")
text(
  posisi, indeks_musiman, labels = fmt(indeks_musiman, 2),
  pos = ifelse(indeks_musiman >= 0, 3, 1), cex = 0.8
)

Indeks musiman additive tertinggi terjadi pada Juli dan terendah pada November.

Tabel dan grafik di atas memperlihatkan beberapa karakteristik pola musiman:

  1. Bulan dengan Pengaruh Musiman Tertinggi: Bulan Juli memiliki indeks tertinggi sebesar +27,752 ribu m³. Artinya, setelah pengaruh tren dipisahkan, produksi pada Juli cenderung berada sekitar 27,752 ribu m³ di atas level trennya. Juni juga memiliki indeks positif sebesar 21,210 ribu m³, sehingga kenaikan musiman terutama terkonsentrasi pada pertengahan tahun.
  2. Bulan dengan Pengaruh Musiman Terendah: Bulan November memiliki indeks terendah sebesar -20,123 ribu m³. Dengan demikian, produksi November cenderung berada 20,123 ribu m³ di bawah trennya. Oktober dan Maret juga menunjukkan pengaruh musiman negatif yang cukup besar, masing-masing sebesar -15,477 dan -11,915 ribu m³.
  3. Dugaan Penjelasan Pola: Tingginya produksi pada Juni-Juli mungkin berkaitan dengan meningkatnya kebutuhan air atau penyesuaian operasi saat pasokan air alternatif berkurang pada musim kemarau. Rendahnya produksi pada November mungkin berkaitan dengan perubahan kebutuhan pelanggan ketika memasuki musim hujan, atau penyesuaian operasi dan pemeliharaan. Dugaan ini memerlukan data curah hujan, konsumsi pelanggan, kapasitas instalasi, dan jadwal pemeliharaan untuk dikonfirmasi; data produksi saja tidak dapat menetapkan penyebabnya.
  4. Pembedaan Indeks Musiman dan Nilai Aktual: Bulan dengan indeks terendah tidak harus menjadi bulan dengan produksi aktual paling kecil. Nilai minimum aktual terdapat pada Maret 2022, sedangkan indeks minimum terdapat pada November, karena indeks musiman telah dikoreksi terhadap level tren yang berubah menurut waktu.

4 Pemeriksaan Komponen Residu

Residu diperoleh dengan mengurangkan estimasi tren dan musiman dari data asli:

\[ \widehat{e}_t=Z_t-\widehat{T}_t-\widehat{S}_t. \]

Pada model additive, residu diharapkan berada di sekitar nol. Pemeriksaan menggunakan summary() dan sd(..., na.rm = TRUE) hanya melibatkan 24 periode yang memiliki estimasi tren. Dua belas NA pada tepi deret tetap dipertahankan dan tidak diganti dengan nol.

summary(residu)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
## -0.9184 -0.4184 -0.0434 -0.0434  0.3316  0.8316      12
sd_residu <- sd(residu, na.rm = TRUE)
sd_residu
## [1] 0.4862621
residu_valid <- as.numeric(residu[idx_valid])
ringkasan_residu <- c(
  min(residu_valid), unname(quantile(residu_valid, 0.25)),
  median(residu_valid), mean(residu_valid),
  unname(quantile(residu_valid, 0.75)), max(residu_valid), sd_residu
)
tabel_residu <- data.frame(
  Statistik = c("Minimum", "Kuartil 1", "Median", "Rata-Rata", "Kuartil 3", "Maksimum", "Simpangan Baku"),
  Nilai = fmt(ringkasan_residu, 6)
)
knitr::kable(
  tabel_residu, align = "c",
  col.names = c("Statistik Residu", "Nilai (ribu m³)")
)
Statistik Residu Nilai (ribu m³)
Minimum -0,918403
Kuartil 1 -0,418403
Median -0,043403
Rata-Rata -0,043403
Kuartil 3 0,331597
Maksimum 0,831597
Simpangan Baku 0,486262
cat("Residu tersedia:", length(residu_valid), "bulan\n")
## Residu tersedia: 24 bulan
cat("Residu tidak tersedia:", sum(is.na(residu)), "bulan\n")
## Residu tidak tersedia: 12 bulan
plot(
  residu, type = "o", pch = 16, col = "black", ylim = c(-1.2, 1.2),
  xlab = "Waktu", ylab = "Residu (ribu m3/bulan)",
  main = "Komponen Residu Dekomposisi Additive Produksi Air PDAM"
)
abline(h = 0, col = "gray30", lty = 2)
abline(h = mean(residu_valid), col = "steelblue", lty = 3)
legend(
  "topright", legend = c("Residu", "Garis Nol", "Rata-Rata Residu"),
  col = c("black", "gray30", "steelblue"),
  pch = c(16, NA, NA), lty = c(1, 2, 3), bty = "n"
)

Residu additive kecil dan berganti tanda di sekitar nol, dengan sebagian pola tahunan yang masih perlu diperiksa.

Untuk melengkapi pemeriksaan visual, ditampilkan ACF residu hingga lag 12 bulan. Grafik ini bersifat diagnostik deskriptif; garis batas pada ACF merupakan pendekatan dan tidak membuktikan keacakan residu dengan sendirinya.

# Gunakan vektor agar lag pada sumbu ditampilkan dalam satuan bulan
acf_residu <- acf(
  residu_valid, lag.max = 12, plot = FALSE
)
plot(acf_residu, xlab = "Lag (bulan)", main = "ACF Residu Additive Produksi Air PDAM")

ACF residu menunjukkan korelasi negatif pada lag 12, sehingga keacakan sempurna tidak dapat dinyatakan.

acf_lag12 <- as.numeric(acf_residu$acf)[13]

Berdasarkan pemeriksaan tersebut, dapat diberikan penilaian berikut:

  1. Pusat Residu Dekat Nol: Rata-rata residu sebesar -0,043403 ribu m³ dan median sebesar -0,043403 ribu m³. Nilai residu berada pada rentang -0,918403 sampai 0,831597 ribu m³. Terdapat 12 residu positif dan 12 residu negatif, sehingga tidak terlihat bias besar yang terus berada pada satu sisi garis nol.
  2. Besaran Residu Kecil: Simpangan baku residu sebesar 0,486262 ribu m³, setara dengan sekitar 486,26 m³. Nilai tersebut hanya sekitar 0,106% dari rata-rata produksi pada periode yang memiliki residu. Pemisahan tren dan musiman berhasil menyisakan deviasi yang kecil pada bagian data yang dapat dihitung.
  3. Penilaian Keacakan: Residu berfluktuasi kecil di sekitar nol, tetapi belum dapat dinyatakan sepenuhnya acak atau white noise. ACF lag 12 bernilai -0,500, menunjukkan hubungan negatif pada bulan yang berjarak satu tahun. Dengan 36 data asli, setiap indeks musiman hanya diperkirakan dari dua selisih terhadap tren; proses pengurangan rata-rata bulanan itu sendiri membuat residu pada bulan kalender yang sama saling mengimbangi. Oleh karena itu, sebagian pola ACF dapat muncul karena cara estimasi dan pendeknya deret, bukan semata-mata gangguan operasional.
  4. Batas Interpretasi: Residu yang kecil mendukung kemampuan model additive untuk merangkum data historis, tetapi tidak membuktikan akurasi ramalan atau menjamin residu independen. Pemeriksaan dengan data yang lebih panjang diperlukan untuk mengevaluasi kestabilan pola musiman dan sifat residu secara lebih kuat.

Kesimpulan

Berdasarkan dekomposisi volume produksi air minum PDAM Kabupaten Serang periode Januari 2022 sampai Desember 2024, diperoleh kesimpulan sebagai berikut:

  1. Pembentukan Model: Data telah dibentuk menjadi objek ts bulanan dengan frekuensi 12 dan dipisahkan menggunakan decompose(..., type = "additive"). Komponen tren dan residu tersedia pada Juli 2022 sampai Juni 2024, sementara enam bulan pada setiap tepi deret bernilai NA akibat kebutuhan jendela CMA.
  2. Tren Produksi: Produksi memperlihatkan tren naik. CMA meningkat dari 427,750 menjadi 488,458 ribu m³, dengan rata-rata kenaikan sekitar 2,639 ribu m³ per bulan pada rentang yang dapat diestimasi.
  3. Pola Musiman: Juli merupakan bulan dengan indeks tertinggi (+27,752 ribu m³), sedangkan November memiliki indeks terendah (-20,123 ribu m³). Perubahan kebutuhan air dan kondisi musim merupakan dugaan penjelasan yang masih memerlukan data pendukung.
  4. Residu dan Kesesuaian Model: Rata-rata residu mendekati nol (-0,043403 ribu m³), dengan simpangan baku 0,486262 ribu m³. Model additive merangkum tren dan pola musiman dengan deviasi historis yang kecil. Meskipun residu bergerak di sekitar nol, ACF dan keterbatasan jumlah observasi membuat klaim keacakan sempurna belum dapat diberikan.

Sumber Data dan Metode

  • Materi Pertemuan 6, Konsep Dekomposisi dan Model Additive (Analisis Deret Waktu), halaman 17: Latihan Pendalaman Materi, data produksi air minum PDAM Kabupaten Serang.
  • R Core Team, Classical Seasonal Decomposition by Moving Averages: dokumentasi fungsi stats::decompose().