Laporan ini menganalisis data konsentrasi karbon dioksida (CO2)
atmosfer bulanan yang diukur di Observatorium Mauna Loa, Hawaii, dari
tahun 1959 hingga 1997. Data ini tersedia sebagai dataset bawaan R
(co2) dan merupakan salah satu deret waktu klasik yang
menunjukkan pola trend naik jangka panjang beserta pola musiman
(seasonal) yang stabil, sehingga cocok untuk dianalisis menggunakan
model ARIMA (Autoregressive Integrated Moving Average).
Tujuan analisis:
Deret waktu (time series) adalah sekumpulan observasi yang dikumpulkan secara berurutan berdasarkan waktu. Salah satu syarat penting sebelum memodelkan deret waktu dengan ARIMA adalah stasioneritas, yaitu kondisi di mana rata-rata, varians, dan autokovariansi data tidak berubah terhadap waktu. Data yang memiliki trend atau pola musiman biasanya bersifat non-stasioner dan perlu ditransformasi (misalnya melalui differencing) sebelum dimodelkan.
Uji stasioneritas yang umum digunakan adalah Augmented Dickey-Fuller (ADF) test, dengan hipotesis:
Model ARIMA(p, d, q) menggabungkan tiga komponen:
Karena data CO2 memiliki pola musiman tahunan (siklus 12 bulan), model yang lebih sesuai adalah SARIMA (Seasonal ARIMA), dengan notasi ARIMA(p,d,q)(P,D,Q)[s], di mana komponen (P,D,Q) menangkap pola musiman dengan periode s (di sini s = 12).
Identifikasi orde model umumnya dibantu dengan plot ACF
(Autocorrelation Function) dan PACF (Partial
Autocorrelation Function), serta pemilihan otomatis berbasis
AIC melalui fungsi auto.arima() dari paket
forecast.
data(co2)
summary_co2 <- as.data.frame(t(as.matrix(summary(co2))))
knitr::kable(summary_co2, caption = "Ringkasan statistik deskriptif CO2 (ppm)", digits = 2)
| Min. | 1st Qu. | Median | Mean | 3rd Qu. | Max. |
|---|---|---|---|---|---|
| 313.18 | 323.53 | 335.17 | 337.05 | 350.26 | 366.84 |
Berdasarkan statistik deskriptif, konsentrasi CO2 atmosfer selama periode januari 1959 hingga Desember 1997 memiliki nilai minimum sebesar 313.18 ppm dan maksimum sebesar 366.84 ppm. Nilai rata-rata konsentrasi CO2 adalah 337.05 ppm, sedangkan nilai mediannya sebesar 335.17 ppm. Selisih antara nilai minimum dan maksimum menunjukkan adanya variasi konsentrasi CO2 yang cukup besar selama periode pengamatan. Selain itu, nilai kuartil pertama sebesar 323.53 ppm menunjukkan bahwa sekitar 25% observasi memiliki konsentrasi CO2 di bawah atau sama dengan nilai tersebut, sedangkan kuartil ketiga sebesar 350.26 ppm menunjukkanbahwa sekitar 75% observasi berada di bawah atau sama dengan nilai tersebut. Secara keseluruhan, statistik deskriptif menunjukkan adanya peruahan konsentrasi CO2 selama periode pengamatan yang selanjutnya perlu dikaji melalui visualisasi deret waktu untuk melihat pola tren dan musiman.
Dataset co2 merupakan objek ts dengan
frekuensi 12 (bulanan), dimulai dari Januari 1959 hingga Desember 1997,
sehingga terdapat 468 observasi.
co2_df <- data.frame(
Tahun = floor(time(co2))[1:12],
Bulan = month.abb,
CO2 = as.numeric(window(co2, start = c(1959,1), end = c(1959,12)))
)
knitr::kable(co2_df, caption = "Cuplikan data CO2 tahun 1959 (12 bulan pertama)")
| Tahun | Bulan | CO2 |
|---|---|---|
| 1959 | Jan | 315.42 |
| 1959 | Feb | 316.31 |
| 1959 | Mar | 316.50 |
| 1959 | Apr | 317.56 |
| 1959 | May | 318.13 |
| 1959 | Jun | 318.00 |
| 1959 | Jul | 316.39 |
| 1959 | Aug | 314.65 |
| 1959 | Sep | 313.68 |
| 1959 | Oct | 313.18 |
| 1959 | Nov | 314.66 |
| 1959 | Dec | 315.43 |
Pada Tabel menunjukkan 12 observasi konsentrasi CO2 pada tahun 1959. Konsentrasi CO2 meningkat dari 315.42 ppm pada Januari hingga mencapai 318.13 ppm pada Mei, kemudian mengalami penurunan hingga 313.18 ppm pada Oktober sebelum kembali meingkat pada November dan Desember. Pola kenaikan dan penurunan dalam satu tahun tersebut memberikan indikasi awal adanya pola musiman tahunan pada konsentrasi CO2, yang selanjutnya akan dianalisis melalui visualisasi runtun waktu dan dekomposisi.
plot(co2, main = "Konsentrasi CO2 Atmosfer Bulanan (Mauna Loa, 1959-1997)",
ylab = "CO2 (ppm)", xlab = "Tahun", col = "darkgreen")
Berdasarkan plot deret waktu, konsentrasi CO₂ menunjukkan tren peningkatan dalam jangka panjang selama periode 1959–1997. Konsentrasi CO₂ pada awal periode pengamatan berada pada kisaran sekitar 315 ppm, kemudian meningkat hingga mendekati 367 ppm pada akhir periode. Selain tren jangka panjang, terlihat adanya pola fluktuasi yang berulang setiap tahun, yang menunjukkan adanya komponen musiman dengan periode 12 bulan. Dengan adanya tren dan pola musiman tersebut, data pada level awal diduga belum stasioner. Oleh karena itu, diperlukan pengujian stasioneritas secara formal menggunakan Augmented Dickey-Fuller (ADF) test sebelum dilakukan pemodelan.
plot(decompose(co2))
Hasil dekomposisi menunjukkan bahwa deret waktu CO2 terdiri atas beberapa komponen utama, yaitu trend, seasonal, dan random. Komponen trend menunjukkan peningkatan konsentrasi CO2 secara bertahap selama periode pengamatan. Komponen seasonal menunjukkanadanya pola berulang periodek setiap tahun, sedangkan komponen random menunjukkan variasi yang tidak dijelaskan oleh komponen trend dan seasonal. Keberadaan pola musiman dengan periode 12 bulan mendukung penggunaan model SARIMA, karena model tersebut mengakomodasi ketergantungan pada pola musiman selain pola non-musiman.
Hipotesis
\[ H_0: \text{Data memiliki unit root (tidak stasioner)} \qquad H_1: \text{Data stasioner} \] Taraf signifikansi: \(\alpha = 5\%\)
adf_awal <- adf.test(co2)
tabel_adf_awal <- data.frame(
Statistik = c("Dickey-Fuller", "Lag Order", "p-value"),
Nilai = c(round(unname(adf_awal$statistic), 4),
unname(adf_awal$parameter),
round(adf_awal$p.value, 4))
)
knitr::kable(tabel_adf_awal, caption = "Hasil ADF Test pada Data CO2 (sebelum differencing)")
| Statistik | Nilai |
|---|---|
| Dickey-Fuller | -2.8299 |
| Lag Order | 7.0000 |
| p-value | 0.2269 |
Keputusan dan kesimpulan: Diperoleh statistik Dickey-Fuller sebesar -2.8299 dengan p-value sebesar 0.2269. Karena p-value > 0,05, maka \(H_0\) tidak ditolak. Dengan demikian, data CO2 pada level belum stasioner, sehingga diperlukan proses differencing sebelum pemodelan SARIMA.
Differencing non-musiman orde satu dituliskan sebagai:
\[ \nabla Y_t = Y_t - Y_{t-1} \] Differencing dilakukan berurutan: non-musiman terlebih dahulu, kemudian musiman.
co2_diff <- diff(co2, differences = 1)
co2_diff_seasonal <- diff(co2_diff, lag = 12)
plot(co2_diff_seasonal, main = "Data CO2 Setelah Differencing (d=1, D=1, s=12)",
ylab = "Selisih CO2", col = "steelblue")
Hipotesis \[ H_0: \text{Data memiliki unit root (tidak stasioner)} \qquad H_1: \text{Data stasioner} \]
Taraf signifikansi: \(\alpha = 5\%\)
adf_diff <- adf.test(co2_diff_seasonal)
tabel_adf_diff <- data.frame(
Statistik = c("Dickey-Fuller", "Lag Order", "p-value"),
Nilai = c(round(unname(adf_diff$statistic), 4),
unname(adf_diff$parameter),
round(adf_diff$p.value, 4))
)
knitr::kable(tabel_adf_diff, caption = "Hasil ADF Test Setelah Differencing")
| Statistik | Nilai |
|---|---|
| Dickey-Fuller | -8.9846 |
| Lag Order | 7.0000 |
| p-value | 0.0100 |
Keputusan dan kesimpulan: Setelah differencing non-musiman (\(d=1\)) dan musiman (\(D=1\), \(s=12\)), diperoleh statistik Dickey-Fuller sebesar -8.9846 dengan p-value sebesar 0.01. Karena p-value < 0,05, maka \(H_0\) ditolak, sehingga data hasil differencing dinyatakan stasioner dan dapat digunakan untuk tahap identifikasi dan pembentukan model SARIMA.
par(mfrow = c(1,2))
acf(co2_diff_seasonal, main = "ACF")
pacf(co2_diff_seasonal, main = "PACF")
par(mfrow = c(1,1))
ACF digunakan untuk melihat hubungan antara suatu observasi dengan
observasi pada lag-lag sebelumnya, sedangkan PACF melihat hubungan
parsial setelah pengaruh lag di antaranya diperhitungkan. Identifikasi
orde \((p,q)\) dan \((P,Q)\) secara manual dari pola
cut-off/tailing-off pada plot di atas dilengkapi
dengan pemilihan otomatis berbasis AIC menggunakan
auto.arima() pada bagian berikut. Interpretasi lag spesifik
mana yang cut-off sebaiknya dibaca langsung dari bentuk plot
hasil knit, bukan diasumsikan tanpa melihatnya.
auto.arima()model_auto <- auto.arima(co2, seasonal = TRUE, stepwise = FALSE, approximation = FALSE)
ord <- arimaorder(model_auto)
koef <- coef(model_auto)
se <- sqrt(diag(vcov(model_auto)))
tabel_koef <- data.frame(
Parameter = names(koef),
Estimate = round(unname(koef), 4),
`Std. Error` = round(unname(se), 4),
check.names = FALSE
)
knitr::kable(tabel_koef, caption = paste0("Koefisien Model ", arimaorder(model_auto) |> (\(o) paste0("SARIMA(", o[1], ",", o[2], ",", o[3], ")(", o[4], ",", o[5], ",", o[6], ")[", o[7], "]"))()))
| Parameter | Estimate | Std. Error |
|---|---|---|
| ma1 | -0.3394 | 0.0475 |
| ma2 | -0.0180 | 0.0497 |
| ma3 | -0.0973 | 0.0467 |
| sma1 | -0.8538 | 0.0256 |
tabel_fit <- data.frame(
Ukuran = c("AIC", "AICc", "BIC", "Log-Likelihood", "Sigma^2"),
Nilai = c(round(model_auto$aic, 2), round(model_auto$aicc, 2),
round(model_auto$bic, 2), round(model_auto$loglik, 2),
round(model_auto$sigma2, 4))
)
knitr::kable(tabel_fit, caption = "Ukuran Kebaikan Model (Goodness of Fit)")
| Ukuran | Nilai |
|---|---|
| AIC | 176.8600 |
| AICc | 177.0000 |
| BIC | 197.4700 |
| Log-Likelihood | -83.4300 |
| Sigma^2 | 0.0852 |
Interpretasi: Model terpilih adalah SARIMA(\(0,1,3\))(\(0,1,1\))\(_{12}\). Komponen non-musiman terdiri atas
MA(\(3\)) dan komponen musiman
SMA(\(1\)), dengan differencing
non-musiman sebanyak \(d=1\) kali dan
musiman \(D=1\) kali pada periode 12
bulan. Koefisien MA menggambarkan hubungan nilai saat ini dengan error
pada beberapa periode sebelumnya setelah differencing, sedangkan
koefisien SMA menggambarkan hubungan dengan error pada periode musiman
(12 bulan) sebelumnya. Model menghasilkan AIC sebesar 176.86, AICc
sebesar 177, dan BIC sebesar 197.47, nilai yang lebih kecil menunjukkan
model lebih baik dibanding kandidat lain yang dievaluasi
auto.arima().
Hipotesis
\[ H_0: \rho_1 = \rho_2 = \cdots = \rho_h = 0 \qquad H_1: \text{setidaknya terdapat satu } \rho_k \neq 0 \] dengan \(\rho_k\) merupakan autokorelasi residual pada lag ke-\(k\). Statistik Ljung-Box:
\[ Q = n(n+2) \sum_{k=1}^{h} \frac{\hat\rho_k^2}{n-k} \] Taraf signifikansi: \(\alpha = 5\%\)
checkresiduals(model_auto, plot = TRUE)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,1,3)(0,1,1)[12]
## Q* = 17.337, df = 20, p-value = 0.631
##
## Model df: 4. Total lags used: 24
lb_test <- Box.test(residuals(model_auto), lag = 24, fitdf = length(coef(model_auto)), type = "Ljung-Box")
tabel_lb <- data.frame(
Statistik = c("X-squared", "df", "p-value"),
Nilai = c(round(unname(lb_test$statistic), 4),
unname(lb_test$parameter),
round(lb_test$p.value, 4))
)
knitr::kable(tabel_lb, caption = "Hasil Uji Ljung-Box pada Residual Model")
| Statistik | Nilai |
|---|---|
| X-squared | 17.3369 |
| df | 20.0000 |
| p-value | 0.6310 |
Keputusan dan kesimpulan: Diperoleh statistik \(Q^*\) sebesar 17.3369 dengan derajat bebas 20 dan p-value sebesar 0.631 pada 24 lag. Karena p-value > 0,05, maka \(H_0\) tidak ditolak. Dengan demikian, residual model dapat dianggap white noise, sehingga model SARIMA yang terbentuk telah memenuhi kriteria diagnostik residual.
Data dibagi menjadi data latih (Januari 1959–Desember 1994) dan data uji (Januari 1995–Desember 1997).
co2_train <- window(co2, end = c(1994, 12))
co2_test <- window(co2, start = c(1995, 1))
model_train <- auto.arima(co2_train, seasonal = TRUE)
forecast_test <- forecast(model_train, h = length(co2_test))
tabel_akurasi <- round(as.data.frame(accuracy(forecast_test, co2_test)), 4)
knitr::kable(tabel_akurasi, caption = "Ukuran Akurasi Forecast: Data Latih vs Data Uji")
| ME | RMSE | MAE | MPE | MAPE | MASE | ACF1 | Theil’s U | |
|---|---|---|---|---|---|---|---|---|
| Training set | 0.0169 | 0.2832 | 0.2256 | 0.0050 | 0.0675 | 0.1829 | 0.0053 | NA |
| Test set | 0.4133 | 0.5226 | 0.4470 | 0.1139 | 0.1233 | 0.3624 | 0.2939 | 0.3963 |
plot(forecast_test, main = "Forecast vs Data Aktual (1995-1997)")
lines(co2_test, col = "red")
legend("topleft", legend = c("Forecast", "Aktual"), col = c("blue", "red"), lty = 1)
Interpretasi: Pada data uji periode 1995-1997, model menghasilkan RMSE sebesar 0.5226 ppm, MAE sebesar 0.447 ppm, dan MAPE sebesar 0.1233%. RMSE dan MAE mengukur rata-rata besar kesalahan prediksi dalam satuan ppm, sedangkan MAPE menyatakannya dalam persentase relatif terhadap nilai aktual.
rmse_persen_skala <- round(tabel_akurasi["Test set","RMSE"] / diff(range(co2)) * 100, 2)
Sebagai pembanding skala, rentang konsentrasi CO2 pada keseluruhan data adalah 313.2-366.8 ppm (selisih 53.7 ppm). RMSE sebesar 0.5226 ppm hanya setara dengan 0.97% dari rentang tersebut, dan MAPE sebesar 0.1233% juga jauh di bawah ambang umum 10% yang biasa dipakai sebagai batas akurasi forecast yang baik pada literatur peramalan. Dengan demikian, kesalahan prediksi model tergolong kecil secara substantif, bukan hanya kecil karena skala ppm yang kebetulan bernilai besar.
forecast_depan <- forecast(model_auto, h = 24)
plot(forecast_depan, main = "Forecast Konsentrasi CO2 24 Bulan ke Depan")
tabel_forecast <- data.frame(
Periode = as.character(zoo::as.yearmon(time(forecast_depan$mean))),
`Forecast (ppm)` = round(as.numeric(forecast_depan$mean), 2),
`Lower 95%` = round(as.numeric(forecast_depan$lower[,2]), 2),
`Upper 95%` = round(as.numeric(forecast_depan$upper[,2]), 2),
check.names = FALSE
)
kable(tabel_forecast, caption = "Nilai Forecast Konsentrasi CO2 24 Bulan ke Depan (dengan interval 95%)")
| Periode | Forecast (ppm) | Lower 95% | Upper 95% |
|---|---|---|---|
| Jan 1998 | 365.18 | 364.61 | 365.75 |
| Feb 1998 | 365.98 | 365.29 | 366.66 |
| Mar 1998 | 366.78 | 366.00 | 367.56 |
| Apr 1998 | 368.13 | 367.29 | 368.97 |
| May 1998 | 368.70 | 367.81 | 369.59 |
| Jun 1998 | 368.01 | 367.07 | 368.96 |
| Jul 1998 | 366.51 | 365.51 | 367.51 |
| Aug 1998 | 364.46 | 363.41 | 365.50 |
| Sep 1998 | 362.60 | 361.51 | 363.69 |
| Oct 1998 | 362.73 | 361.59 | 363.86 |
| Nov 1998 | 364.16 | 362.98 | 365.33 |
| Dec 1998 | 365.57 | 364.35 | 366.78 |
| Jan 1999 | 366.62 | 365.34 | 367.90 |
| Feb 1999 | 367.46 | 366.13 | 368.79 |
| Mar 1999 | 368.32 | 366.94 | 369.70 |
| Apr 1999 | 369.67 | 368.24 | 371.09 |
| May 1999 | 370.23 | 368.76 | 371.70 |
| Jun 1999 | 369.55 | 368.04 | 371.06 |
| Jul 1999 | 368.05 | 366.49 | 369.60 |
| Aug 1999 | 365.99 | 364.40 | 367.59 |
| Sep 1999 | 364.14 | 362.50 | 365.77 |
| Oct 1999 | 364.26 | 362.59 | 365.93 |
| Nov 1999 | 365.69 | 363.98 | 367.40 |
| Dec 1999 | 367.10 | 365.35 | 368.85 |
Interpretasi: Model SARIMA(\(0,1,3\))(\(0,1,1\))\(_{12}\) memproyeksikan konsentrasi CO2 naik dari 365.18 ppm pada bulan pertama forecast menjadi 367.1 ppm pada bulan ke-24, selaras dengan trend naik jangka panjang yang teramati pada data historis. Lebar interval kepercayaan 95% pada bulan pertama adalah 1.14 ppm, dan melebar menjadi 3.5 ppm pada bulan ke-24 — menandakan ketidakpastian proyeksi meningkat seiring bertambahnya horizon peramalan, sebagaimana lazim terjadi pada model deret waktu. Nilai forecast bulanan lengkap tercantum pada Tabel di atas.
Berdasarkan seluruh tahapan analisis, model yang dipilih adalah SARIMA(\(0,1,3\))(\(0,1,1\))\(_{12}\), menggunakan differencing non-musiman sebanyak \(d=1\) kali dan musiman \(D=1\) kali dengan periode 12 bulan.
Diagnostik residual melalui uji Ljung-Box menghasilkan \(Q^*=17.3369\), derajat bebas 20, dan p-value 0.631. Karena p-value > 0,05, tidak terdapat bukti cukup adanya autokorelasi residual, sehingga residual dapat dianggap white noise.
Pada evaluasi data uji periode 1995-1997, model menghasilkan RMSE sebesar 0.5226 ppm, MAE sebesar 0.447 ppm, dan MAPE sebesar 0.1233%. Model kemudian digunakan untuk menghasilkan forecast konsentrasi CO2 selama 24 bulan ke depan
Data konsentrasi CO2 atmosfer Mauna Loa periode 1959-1997 terdiri atas 468 observasi bulanan dan menunjukkan trend naik jangka panjang serta pola musiman tahunan. Uji ADF pada data awal menghasilkan statistik Dickey-Fuller -2.8299 dengan p-value 0.2269, sehingga \(H_0\) tidak ditolak dan data pada level dinyatakan belum stasioner.
Setelah differencing non-musiman (\(d=1\)) dan musiman (\(D=1\), lag 12), uji ADF menghasilkan statistik -8.9846 dengan p-value 0.01, sehingga \(H_0\) ditolak, dan data hasil differencing dinyatakan stasioner.
Model SARIMA(\(0,1,3\))(\(0,1,1\))\(_{12}\) terpilih melalui
auto.arima(), dengan uji Ljung-Box menghasilkan \(Q^*=17.3369\) dan p-value 0.631, sehingga
residual dapat dianggap white noise. Pada data uji 1995-1997, model
menghasilkan RMSE 0.5226 ppm, MAE 0.447 ppm, dan MAPE 0.1233%. Model
selanjutnya digunakan untuk forecast konsentrasi CO2 24 bulan ke depan
berdasarkan pola historis data, dengan catatan ketidakpastian yang
membesar seiring horizon proyeksi dan tanpa memperhitungkan potensi
perubahan struktural (misalnya kebijakan iklim) di luar pola
historis.