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.
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"
)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
)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.
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_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:
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 |
## 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
)Tabel dan grafik di atas memperlihatkan beberapa karakteristik pola musiman:
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.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -0.9184 -0.4184 -0.0434 -0.0434 0.3316 0.8316 12
## [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 |
## Residu tersedia: 24 bulan
## 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"
)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")Berdasarkan pemeriksaan tersebut, dapat diberikan penilaian berikut:
Berdasarkan dekomposisi volume produksi air minum PDAM Kabupaten Serang periode Januari 2022 sampai Desember 2024, diperoleh kesimpulan sebagai berikut:
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.stats::decompose().