Laporan ini menggabungkan Tugas 5 dan Tugas 6 mata kuliah Analisis Deret Waktu (STA623303) menggunakan satu dataset, yaitu volume produksi air minum PDAM Kabupaten Serang periode Januari 2022 sampai Desember 2024. Data terdiri atas 36 observasi bulanan dalam satuan ribu m³ per bulan dan seluruhnya bersumber dari Tugas 5.
Bagian Tugas 5 membahas dekomposisi additive, arah pertumbuhan tren, 12 indeks musiman, serta pemeriksaan residu. Bagian Tugas 6 menerapkan dekomposisi multiplicative pada data yang sama, memeriksa perubahan kenaikan April dan Desember, menampilkan 12 faktor musiman, membandingkan residu kedua model, serta menentukan model yang lebih sesuai. Struktur penjelasan, pemformatan angka, tabel, dan grafik mengikuti laporan tugas sebelumnya.
Data dimasukkan satu kali sesuai urutan kalender, lalu dibentuk menjadi objek runtun waktu bulanan dengan titik awal Januari 2022 dan frekuensi 12. Objek ini digunakan bersama pada kedua bagian analisis.
# 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)), all(produksi > 0))
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
Bagian Tugas 5 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. Data yang sama digunakan pada bagian Tugas 6 untuk membandingkan dekomposisi additive dan multiplicative. 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.
Objek produksi_ts yang telah dibentuk pada bagian data
bersama digunakan untuk dekomposisi additive. Titik awalnya Januari 2022
(start = c(2022, 1)), dengan frekuensi 12 yang menyatakan
satu siklus musiman sepanjang 12 bulan.
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.Bagian Tugas 6 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. Data yang digunakan sama persis dengan data pada Tugas 5. Analisis mengikuti empat soal Latihan Pendalaman Materi pada Pertemuan 7 mata kuliah Analisis Deret Waktu (STA623303), dengan konteks dan satuan disesuaikan menjadi produksi air minum. Tujuannya meliputi: (1) memvisualisasikan data dan memeriksa apakah kenaikan April serta Desember membesar dari 2023 ke 2024; (2) melakukan dekomposisi multiplicative dan menginterpretasikan 12 faktor musiman; (3) membandingkan simpangan baku residu model multiplicative dengan additive; dan (4) memilih model yang lebih sesuai berdasarkan pola data dan hasil perbandingan.
Model dekomposisi multiplicative memisahkan nilai pengamatan menjadi hasil kali komponen tren, musiman, dan residu:
\[ Z_t=T_t\times S_t\times e_t. \]
Komponen \(T_t\) memiliki satuan ribu m³ per bulan, sedangkan \(S_t\) dan \(e_t\) berupa rasio tanpa satuan. Faktor musiman \(S_t=1\) berarti produksi berada pada level tren, \(S_t>1\) berarti di atas tren, dan \(S_t<1\) berarti di bawah tren. Pengaruh musiman dalam persen dihitung sebagai \((S_t-1)\times100\%\). Penerapan model ini merupakan bagian dari perbandingan metode; kesesuaian model ditentukan setelah hasil analisis diperiksa.
Bagian ini menggunakan kembali objek produksi_ts dari
data bersama, dengan 36 observasi bulanan sejak Januari 2022 dan
frekuensi 12. Seluruh nilai produksi positif, sehingga memenuhi syarat
pembagian pada dekomposisi multiplicative.
Plot runtun waktu disajikan untuk melihat perubahan level produksi dan fluktuasi bulanan pada keseluruhan periode pengamatan.
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 bulanan. Produksi berkisar dari nilai terendah 405 ribu m³ pada Maret 2022 sampai nilai tertinggi 521 ribu m³ pada Juli 2024. Perbandingan pola bulanan ketiga tahun ditampilkan pada sumbu yang sama agar kenaikan level dapat dibedakan dari perubahan besarnya fluktuasi.
warna <- c("black", "steelblue", "gray50")
matplot(
1:12, produksi_tahunan, type = "o", pch = c(16, 17, 15),
lty = c(1, 2, 3), col = warna, lwd = 1.5, xaxt = "n",
xlab = "Bulan", ylab = "Produksi Air (ribu m3/bulan)",
main = "Perbandingan Pola Produksi Air Tahun 2022, 2023, dan 2024"
)
axis(1, at = 1:12, labels = substr(nama_bulan, 1, 3))
legend(
"topleft", legend = paste("Tahun", 2022:2024),
col = warna, pch = c(16, 17, 15), lty = c(1, 2, 3), bty = "n"
)Sesuai poin pertama soal Tugas 6, April dan Desember tetap diperiksa. Istilah kenaikan pada tabel berikut mengacu pada selisih terhadap bulan sebelumnya, yaitu April dikurangi Maret dan Desember dikurangi November. Besaran ini bersifat deskriptif dan masih mengandung pengaruh tren.
bulan_diperiksa <- c(4, 12)
lonjakan_2023 <- produksi_tahunan[bulan_diperiksa, 2] -
produksi_tahunan[bulan_diperiksa - 1, 2]
lonjakan_2024 <- produksi_tahunan[bulan_diperiksa, 3] -
produksi_tahunan[bulan_diperiksa - 1, 3]
tabel_perbandingan <- data.frame(
Bulan = nama_bulan[bulan_diperiksa],
Produksi_2023 = fmt(produksi_tahunan[bulan_diperiksa, 2], 0),
Produksi_2024 = fmt(produksi_tahunan[bulan_diperiksa, 3], 0),
Kenaikan_2023 = fmt(lonjakan_2023, 0),
Kenaikan_2024 = fmt(lonjakan_2024, 0),
Perubahan = fmt(lonjakan_2024 - lonjakan_2023, 0)
)
knitr::kable(
tabel_perbandingan, align = "c",
col.names = c("Bulan", "Produksi 2023", "Produksi 2024",
"Kenaikan dari Bulan Sebelumnya 2023",
"Kenaikan dari Bulan Sebelumnya 2024", "Perubahan Kenaikan")
)| Bulan | Produksi 2023 | Produksi 2024 | Kenaikan dari Bulan Sebelumnya 2023 | Kenaikan dari Bulan Sebelumnya 2024 | Perubahan Kenaikan |
|---|---|---|---|---|---|
| April | 452 | 483 | 14 | 15 | 1 |
| Desember | 468 | 499 | 18 | 19 | 1 |
Seluruh kolom angka pada tabel memiliki satuan ribu m³. Ringkasan tahunan berikut melengkapi pemeriksaan dengan membandingkan level rata-rata dan rentang maksimum-minimum.
colnames(produksi_tahunan) <- 2022:2024
rerata_tahunan <- colMeans(produksi_tahunan)
rentang_tahunan <- apply(produksi_tahunan, 2, function(x) diff(range(x)))
rentang_relatif <- rentang_tahunan / rerata_tahunan * 100
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),
Rentang_relatif = paste0(fmt(rentang_relatif, 3), "%")
)
knitr::kable(
tabel_tahunan, align = "c",
col.names = c("Tahun", "Rata-Rata", "Minimum", "Maksimum",
"Rentang Maksimum-Minimum", "Rentang/Rata-Rata (%)")
)| Tahun | Rata-Rata | Minimum | Maksimum | Rentang Maksimum-Minimum | Rentang/Rata-Rata (%) | |
|---|---|---|---|---|---|---|
| 2022 | 2022 | 426,500 | 405 | 455 | 50 | 11,723% |
| 2023 | 2023 | 458,583 | 438 | 488 | 50 | 10,903% |
| 2024 | 2024 | 489,750 | 468 | 521 | 53 | 10,822% |
Berdasarkan grafik dan tabel di atas, dapat diidentifikasi beberapa karakteristik utama:
Komponen tren diestimasi menggunakan Centered Moving Average (CMA) \(2\times12\), sama seperti pada Tugas 5. Setelah tren diperoleh, rasio \(R_t=Z_t/\widehat{T}_t\) dirata-ratakan untuk setiap bulan kalender dan dinormalisasi agar rata-rata 12 faktor musiman sama dengan satu:
\[ \widehat{S}_m=\frac{\overline{R}_m} {\frac{1}{12}\sum_{j=1}^{12}\overline{R}_j}, \qquad \frac{1}{12}\sum_{m=1}^{12}\widehat{S}_m=1. \]
dekomp_mul <- decompose(produksi_ts, type = "multiplicative")
tren <- dekomp_mul$trend
faktor_musiman <- as.numeric(dekomp_mul$figure)
residu_mul <- dekomp_mul$random
idx_valid <- which(!is.na(tren))
stopifnot(
length(idx_valid) == 24L,
all(tren[idx_valid] > 0),
abs(mean(faktor_musiman) - 1) < 1e-8,
max(abs(produksi_ts[idx_valid] -
tren[idx_valid] * dekomp_mul$seasonal[idx_valid] *
residu_mul[idx_valid])) < 1e-8
)
print(tren)## Jan Feb Mar Apr May Jun Jul Aug
## 2022 NA NA NA NA NA NA 427.7500 430.2500
## 2023 443.7083 446.4167 449.1250 451.8333 454.5000 457.2083 459.8333 462.3750
## 2024 475.4583 478.1667 480.7917 483.3750 485.9167 488.4583 NA NA
## Sep Oct Nov Dec
## 2022 432.8750 435.5833 438.2500 440.9583
## 2023 464.9167 467.4583 470.0833 472.7500
## 2024 NA NA NA NA
Komponen tren dan residu tersedia pada Juli 2022 sampai Juni 2024.
Enam bulan pertama dan enam bulan terakhir bernilai NA
karena jendela CMA membutuhkan data di kedua sisi bulan pengamatan.
Posisi tersebut bukan data produksi yang hilang dan tidak diganti dengan
nol.
Grafik dekomposisi memperlihatkan tren yang bergerak naik dengan lebih halus daripada data asli. Faktor musiman berulang setiap tahun, sedangkan residu berfluktuasi kecil di sekitar satu. Tabel berikut menampilkan 12 faktor dan pengaruh persentasenya terhadap tren.
idx_maks <- which.max(faktor_musiman)
idx_min <- which.min(faktor_musiman)
efek_persen <- (faktor_musiman - 1) * 100
tabel_musiman <- data.frame(
Bulan = nama_bulan,
Faktor = fmt(faktor_musiman, 6),
Efek = paste0(fmt(efek_persen, 3), "%"),
Interpretasi = ifelse(faktor_musiman > 1, "Di atas tren", "Di bawah tren")
)
knitr::kable(
tabel_musiman, align = "c",
col.names = c("Bulan", "Faktor Musiman", "Pengaruh terhadap Tren (%)", "Interpretasi")
)| Bulan | Faktor Musiman | Pengaruh terhadap Tren (%) | Interpretasi |
|---|---|---|---|
| Januari | 0,990187 | -0,981% | Di bawah tren |
| Februari | 0,996255 | -0,375% | Di bawah tren |
| Maret | 0,974417 | -2,558% | Di bawah tren |
| April | 0,999904 | -0,010% | Di bawah tren |
| Mei | 1,016678 | 1,668% | Di atas tren |
| Juni | 1,044901 | 4,490% | Di atas tren |
| Juli | 1,062594 | 6,259% | Di atas tren |
| Agustus | 1,021849 | 2,185% | Di atas tren |
| September | 0,983571 | -1,643% | Di bawah tren |
| Oktober | 0,965681 | -3,432% | Di bawah tren |
| November | 0,955638 | -4,436% | Di bawah tren |
| Desember | 0,988326 | -1,167% | Di bawah tren |
## Rata-rata 12 faktor musiman: 1,000000
plot(
1:12, faktor_musiman, type = "o", pch = 16, col = "steelblue",
xaxt = "n", ylim = c(0.94, 1.08),
xlab = "Bulan", ylab = "Faktor Musiman (rasio)",
main = "Dua Belas Faktor Musiman Multiplicative Produksi Air PDAM"
)
axis(1, at = 1:12, labels = substr(nama_bulan, 1, 3))
abline(h = 1, lty = 2, col = "gray30")
text(1:12, faktor_musiman, labels = fmt(faktor_musiman, 3), pos = 3, cex = 0.8)Interpretasi faktor musiman adalah sebagai berikut:
Data yang sama juga didekomposisi menggunakan model additive, sehingga perbandingan konsisten dengan Tugas 5. Residu kedua model didefinisikan sebagai:
\[ \widehat{e}^{\mathrm{mul}}_t =\frac{Z_t}{\widehat{T}_t\widehat{S}^{\mathrm{mul}}_t}, \qquad \widehat{e}^{\mathrm{add}}_t =Z_t-\widehat{T}_t-\widehat{S}^{\mathrm{add}}_t. \]
Residu multiplicative berupa rasio dengan pusat sekitar satu, sedangkan residu additive memiliki satuan ribu m³ dengan pusat sekitar nol. Ringkasan statistik dan simpangan baku dihitung pada 24 periode yang tersedia untuk kedua model.
dekomp_add <- decompose(produksi_ts, type = "additive")
residu_add <- dekomp_add$random
valid_bersama <- which(!is.na(residu_mul) & !is.na(residu_add))
stopifnot(
identical(valid_bersama, idx_valid),
max(abs(dekomp_add$trend[idx_valid] - tren[idx_valid])) < 1e-8,
abs(sum(dekomp_add$figure)) < 1e-8
)
sd_mul <- sd(residu_mul, na.rm = TRUE)
sd_add <- sd(residu_add, na.rm = TRUE)
rerata_mul <- mean(residu_mul, na.rm = TRUE)
rerata_add <- mean(residu_add, na.rm = TRUE)
summary(residu_mul)## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.9981 0.9989 0.9999 0.9999 1.0009 1.0017 12
## [1] 0.001249183
## 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
tabel_sd <- data.frame(
Model = c("Multiplicative", "Additive"),
Jumlah = rep(length(valid_bersama), 2),
Rata_rata = fmt(c(rerata_mul, rerata_add), 6),
SD = fmt(c(sd_mul, sd_add), 6),
Satuan = c("Rasio (tanpa satuan)", "Ribu m³")
)
knitr::kable(
tabel_sd, align = "c",
col.names = c("Model", "Jumlah Residu", "Rata-Rata Residu", "Simpangan Baku", "Skala Residu")
)| Model | Jumlah Residu | Rata-Rata Residu | Simpangan Baku | Skala Residu |
|---|---|---|---|---|
| Multiplicative | 24 | 0,999893 | 0,001249 | Rasio (tanpa satuan) |
| Additive | 24 | -0,043403 | 0,486262 | Ribu m³ |
Nilai residu pada setiap periode yang memiliki tren ditampilkan dalam tabel berikut agar besar deviasinya dapat diperiksa secara langsung.
tabel_residu <- data.frame(
Periode = label_periode[valid_bersama],
Additive = fmt(residu_add[valid_bersama], 6),
Multiplicative = fmt(residu_mul[valid_bersama], 6)
)
knitr::kable(
tabel_residu, align = "c",
col.names = c("Periode Pengamatan", "Residu Additive (ribu m³)", "Residu Multiplicative (rasio)")
)| Periode Pengamatan | Residu Additive (ribu m³) | Residu Multiplicative (rasio) |
|---|---|---|
| Juli 2022 | -0,501736 | 1,001046 |
| Agustus 2022 | 0,019097 | 1,000795 |
| September 2022 | -0,522569 | 0,998207 |
| Oktober 2022 | -0,105903 | 0,998491 |
| November 2022 | -0,126736 | 0,998070 |
| Desember 2022 | -0,647569 | 0,998140 |
| Januari 2023 | 0,831597 | 1,001469 |
| Februari 2023 | 0,331597 | 1,000574 |
| Maret 2023 | 0,789931 | 1,000834 |
| April 2023 | 0,227431 | 1,000465 |
| Mei 2023 | -0,335069 | 0,999827 |
| Juni 2023 | -0,418403 | 1,000550 |
| Juli 2023 | 0,414931 | 0,998739 |
| Agustus 2023 | -0,105903 | 0,998990 |
| September 2023 | 0,435764 | 1,001578 |
| Oktober 2023 | 0,019097 | 1,001294 |
| November 2023 | 0,039931 | 1,001715 |
| Desember 2023 | 0,560764 | 1,001645 |
| Januari 2024 | -0,918403 | 0,998316 |
| Februari 2024 | -0,418403 | 0,999211 |
| Maret 2024 | -0,876736 | 0,998951 |
| April 2024 | -0,314236 | 0,999320 |
| Mei 2024 | 0,248264 | 0,999958 |
| Juni 2024 | 0,331597 | 0,999235 |
par(mfrow = c(2, 1), mar = c(4, 4.5, 3, 1))
plot(
residu_add, type = "o", pch = 16, col = "black", ylim = c(-1.2, 1.2),
xlab = "Waktu", ylab = "Residu (ribu m3/bulan)", main = "Residu Model Additive"
)
abline(h = 0, lty = 2, col = "gray30")
plot(
residu_mul, type = "o", pch = 17, col = "steelblue", ylim = c(0.9975, 1.0025),
xlab = "Waktu", ylab = "Residu (rasio)", main = "Residu Model Multiplicative"
)
abline(h = 1, lty = 2, col = "gray30")Berdasarkan tabel dan grafik di atas, dapat diberikan penilaian berikut:
Untuk melengkapi perbandingan SD, dihitung selisih antara data aktual dan rekonstruksi tren-musiman. Kedua selisih dinyatakan dalam satuan ribu m³ dan dihitung pada periode yang sama:
\[ u^{\mathrm{add}}_t=Z_t-(\widehat{T}_t+\widehat{S}^{\mathrm{add}}_t), \qquad u^{\mathrm{mul}}_t=Z_t-\widehat{T}_t\widehat{S}^{\mathrm{mul}}_t. \]
Untuk model additive, galat ini sama dengan residu aditif. Untuk model multiplicative, galat pada satuan asli setara dengan \(\widehat{T}_t\widehat{S}^{\mathrm{mul}}_t(\widehat{e}^{\mathrm{mul}}_t-1)\). Dengan demikian, perbandingan tidak mencampurkan rasio dengan volume produksi. Ukuran yang digunakan adalah \(\mathrm{MAE}=\mathrm{mean}(|u_t|)\), \(\mathrm{RMSE}=\sqrt{\mathrm{mean}(u_t^2)}\), dan \(\mathrm{MAPE}=\mathrm{mean}(|u_t|/Z_t)\times100\%\).
fitted_add <- dekomp_add$trend + dekomp_add$seasonal
fitted_mul <- dekomp_mul$trend * dekomp_mul$seasonal
aktual_valid <- produksi[valid_bersama]
galat_add <- as.numeric(produksi_ts[valid_bersama] - fitted_add[valid_bersama])
galat_mul <- as.numeric(produksi_ts[valid_bersama] - fitted_mul[valid_bersama])
rmse_add <- sqrt(mean(galat_add^2))
rmse_mul <- sqrt(mean(galat_mul^2))
mae_add <- mean(abs(galat_add))
mae_mul <- mean(abs(galat_mul))
mape_add <- mean(abs(galat_add) / aktual_valid) * 100
mape_mul <- mean(abs(galat_mul) / aktual_valid) * 100
stopifnot(
max(abs(galat_add - as.numeric(residu_add[valid_bersama]))) < 1e-8,
max(abs(galat_mul - as.numeric(fitted_mul[valid_bersama]) *
(as.numeric(residu_mul[valid_bersama]) - 1))) < 1e-8
)
tabel_galat <- data.frame(
Model = c("Additive", "Multiplicative"),
MAE = fmt(c(mae_add, mae_mul), 6),
RMSE = fmt(c(rmse_add, rmse_mul), 6),
MAPE = paste0(fmt(c(mape_add, mape_mul), 6), "%")
)
knitr::kable(
tabel_galat, align = "c",
col.names = c("Model", "MAE (ribu m³)", "RMSE (ribu m³)", "MAPE Rekonstruksi (%)")
)| Model | MAE (ribu m³) | RMSE (ribu m³) | MAPE Rekonstruksi (%) |
|---|---|---|---|
| Additive | 0,397569 | 0,477998 | 0,086780% |
| Multiplicative | 0,499953 | 0,551710 | 0,110486% |
Perbandingan pada skala yang sama memperlihatkan RMSE additive sebesar 0,477998 ribu m³, lebih rendah daripada RMSE multiplicative sebesar 0,551710 ribu m³. MAE dan MAPE rekonstruksi juga lebih rendah pada model additive. Ukuran ini menilai kecocokan pada data historis yang dipakai untuk mengestimasi komponen, sehingga tidak diperlakukan sebagai hasil evaluasi ramalan pada data uji.
Berdasarkan hasil poin 1 sampai 3, model additive lebih sesuai untuk mendeskripsikan data produksi air minum PDAM Kabupaten Serang. Alasan dan batas penilaiannya adalah sebagai berikut:
Berdasarkan dekomposisi volume produksi air minum PDAM Kabupaten Serang periode Januari 2022 sampai Desember 2024 menggunakan data yang sama dengan Tugas 5, diperoleh kesimpulan sebagai berikut:
stats::decompose().