Analisis Deret Waktu Suhu Udara Rata-rata Bulanan Kota Cilegon
1 Pendahuluan
Analisis ini membahas data suhu udara rata-rata bulanan Kota Cilegon selama periode Januari 2023 sampai Desember 2024. Data terdiri atas 24 observasi bulanan dengan satuan derajat Celsius.
1.1 Proses Stokastik dan Stasioneritas
Secara teoritis, data suhu udara bulanan (\(X_t\)) dipandang sebagai satu realisasi (sample path) dari suatu proses stokastik, yaitu koleksi/himpunan variabel acak \(\{X_t, t \in T\}\) yang diindeks oleh waktu \(t\).
Dalam analisis runtun waktu, evaluasi kestasioneran proses dibedakan menjadi dua jenis:
Stasioneritas Kuat (Strict / Strong Stationarity): Suatu proses stokastik dikatakan stasioner kuat jika distribusi probabilitas bersama (joint probability distribution) dari \((X_{t_1}, X_{t_2}, \dots, X_{t_k})\) bersifat invariansi terhadap pergeseran waktu. Artinya, untuk setiap pergeseran waktu \(h\), berlaku: \[F_{X_{t_1}, \dots, X_{t_k}}(x_1, \dots, x_k) = F_{X_{t_1+h}, \dots, X_{t_k+h}}(x_1, \dots, x_k)\] Syarat ini sangat ketat dan hampir mustahil dibuktikan pada data riil di lapangan.
Stasioneritas Lemah (Weak / Covariance Stationarity): Dalam praktik, analisis runtun waktu mengacu pada stasioneritas lemah yang hanya mensyaratkan kestabilan pada tiga momen utama:
- Rata-rata konstan: \(\mathbb{E}[X_t] = \mu\) untuk semua \(t\).
- Variansi terhingga dan konstan: \(\text{Var}(X_t) = \sigma^2 < \infty\) untuk semua \(t\).
- Autocovariance hanya tergantung pada lag (\(k\)): \(\text{Cov}(X_t, X_{t-k}) = \gamma(k)\), bukan pada titik waktu \(t\).
Fokus utama analisis ini adalah mengevaluasi karakteristik stasioneritas lemah (weak stationarity) data suhu Kota Cilegon melalui eksplorasi visual, struktur autokorelasi, dan pengujian hipotesis statistik formal.
2 Persiapan Data
2.1 Memasukkan Data
Data suhu dimasukkan dalam bentuk matriks dengan baris sebagai tahun dan kolom sebagai bulan.
library(tidyverse)
library(forecast)
library(tseries)
library(knitr)
library(kableExtra)
library(scales)
options(scipen = 999)
nama_bulan <- c(
"Jan", "Feb", "Mar", "Apr", "Mei", "Jun",
"Jul", "Agu", "Sep", "Okt", "Nov", "Des"
)
data_suhu <- matrix(
c(
27.8, 27.9, 28.3, 28.9, 29.1, 28.6, 28.0, 28.1, 28.4, 28.7, 28.2, 27.9,
28.0, 28.1, 28.6, 29.2, 29.4, 28.8, 28.2, 28.3, 28.6, 28.9, 28.4, 28.1
),
nrow = 2,
byrow = TRUE,
dimnames = list(c("2023", "2024"), nama_bulan)
)
data_suhu## Jan Feb Mar Apr Mei Jun Jul Agu Sep Okt Nov Des
## 2023 27.8 27.9 28.3 28.9 29.1 28.6 28.0 28.1 28.4 28.7 28.2 27.9
## 2024 28.0 28.1 28.6 29.2 29.4 28.8 28.2 28.3 28.6 28.9 28.4 28.1
2.2 Membentuk Data Long Format
Format long digunakan agar data lebih fleksibel untuk eksplorasi dan visualisasi.
data_long <- data_suhu |>
as.data.frame() |>
rownames_to_column("tahun") |>
pivot_longer(
cols = all_of(nama_bulan),
names_to = "bulan",
values_to = "suhu"
) |>
mutate(
tahun = as.integer(tahun),
bulan = factor(bulan, levels = nama_bulan),
indeks = row_number()
)
kable(
data_long,
caption = "Data suhu udara rata-rata bulanan Kota Cilegon"
)| tahun | bulan | suhu | indeks |
|---|---|---|---|
| 2023 | Jan | 27.8 | 1 |
| 2023 | Feb | 27.9 | 2 |
| 2023 | Mar | 28.3 | 3 |
| 2023 | Apr | 28.9 | 4 |
| 2023 | Mei | 29.1 | 5 |
| 2023 | Jun | 28.6 | 6 |
| 2023 | Jul | 28.0 | 7 |
| 2023 | Agu | 28.1 | 8 |
| 2023 | Sep | 28.4 | 9 |
| 2023 | Okt | 28.7 | 10 |
| 2023 | Nov | 28.2 | 11 |
| 2023 | Des | 27.9 | 12 |
| 2024 | Jan | 28.0 | 13 |
| 2024 | Feb | 28.1 | 14 |
| 2024 | Mar | 28.6 | 15 |
| 2024 | Apr | 29.2 | 16 |
| 2024 | Mei | 29.4 | 17 |
| 2024 | Jun | 28.8 | 18 |
| 2024 | Jul | 28.2 | 19 |
| 2024 | Agu | 28.3 | 20 |
| 2024 | Sep | 28.6 | 21 |
| 2024 | Okt | 28.9 | 22 |
| 2024 | Nov | 28.4 | 23 |
| 2024 | Des | 28.1 | 24 |
3 Pembentukan Objek Deret Waktu
3.1 Membuat Objek
ts
Karena observasi dilakukan setiap bulan dan dimulai pada Januari
2023, objek ts dibentuk dengan frekuensi 12.
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2023 27.8 27.9 28.3 28.9 29.1 28.6 28.0 28.1 28.4 28.7 28.2 27.9
## 2024 28.0 28.1 28.6 29.2 29.4 28.8 28.2 28.3 28.6 28.9 28.4 28.1
Objek tersebut memiliki 24 observasi dengan frekuensi 12, sehingga satu siklus penuh merepresentasikan satu tahun.
## [1] 2023 1
## [1] 2024 12
## [1] 12
## [1] 24
4 Pemeriksaan Rata-rata dan Variansi
4.1 Statistik Deskriptif Tahunan
stat_tahunan <- data_long |>
group_by(tahun) |>
summarise(
n = n(),
rata_rata = mean(suhu),
variansi = var(suhu),
simpangan_baku = sd(suhu),
minimum = min(suhu),
maksimum = max(suhu),
rentang = max(suhu) - min(suhu),
.groups = "drop"
)
kable(
stat_tahunan,
digits = 4,
caption = "Statistik suhu berdasarkan tahun"
)| tahun | n | rata_rata | variansi | simpangan_baku | minimum | maksimum | rentang |
|---|---|---|---|---|---|---|---|
| 2023 | 12 | 28.325 | 0.1784 | 0.4224 | 27.8 | 29.1 | 1.3 |
| 2024 | 12 | 28.550 | 0.2045 | 0.4523 | 28.0 | 29.4 | 1.4 |
4.2 Perbandingan Rata-rata
mean_2023 <- mean(suhu_ts)
mean_2024 <- mean(suhu_ts)
selisih_mean <- mean_2024 - mean_2023
persen_mean <- abs(selisih_mean / mean_2023) * 100
mean_2023## [1] 28.4375
## [1] 28.4375
## [1] 0
## [1] 0
Rata-rata suhu tahun 2023 adalah 28,325 °C, sedangkan tahun 2024 sebesar 28,550 °C. Dengan demikian terdapat kenaikan rata-rata sekitar 0,225 °C.
Secara absolut, perubahan tersebut relatif kecil dibandingkan level suhu sekitar 28 °C. Namun, dalam konteks analisis deret waktu, perubahan mean tetap perlu diperhatikan karena stasioneritas tidak ditentukan hanya berdasarkan besar-kecilnya perubahan secara praktis. Yang lebih penting adalah apakah karakteristik probabilistik proses dapat dianggap konstan terhadap waktu.
4.3 Perbandingan Variansi
var_2023 <- var(suhu_ts)
var_2024 <- var(suhu_ts)
selisih_var <- var_2024 - var_2023
rasio_var <- var_2024 / var_2023
var_2023## [1] 0.1963587
## [1] 0.1963587
## [1] 0
## [1] 1
Variansi tahun 2023 sekitar 0,1784, sedangkan variansi tahun 2024 sekitar 0,2045. Perbedaan variansi tidak terlalu besar, sehingga dari sisi variabilitas tahunan dapat dikatakan relatif stabil secara deskriptif.
5 Visualisasi Runtun Waktu
5.1 Plot Suhu Bulanan
plot(
suhu_ts,
type = "o",
pch = 16,
lwd = 1.5,
col = "steelblue",
xlab = "Tahun",
ylab = "Suhu rata-rata (°C)",
main = "Runtun Waktu Suhu Udara Rata-rata Kota Cilegon"
)
grid()ggplot(data_long, aes(x = indeks, y = suhu)) +
geom_line(linewidth = 0.8, color = "darkblue") +
geom_point(size = 2, color = "darkblue") +
geom_hline(
data = stat_tahunan,
aes(yintercept = rata_rata, color = factor(tahun)),
linetype = "dashed",
linewidth = 1
) +
labs(
x = "Indeks Bulanan (1-24)",
y = "Suhu (°C)",
color = "Rata-rata Tahun",
title = "Plot Suhu Udara Bulanan Kota Cilegon dengan Garis Rata-rata Tahunan"
) +
theme_minimal()5.2 Interpretasi
Secara visual, suhu menunjukkan pola yang terstruktur dengan puncak sekitar April–Mei dan penurunan menuju pertengahan/akhir tahun. Terdapat indikasi pola musiman tahunan serta sedikit kenaikan level suhu pada tahun 2024 dibandingkan 2023.
6 Autocovariance
6.1 Konsep Autocovariance
Autocovariance pada lag ke-\(k\) (\(\hat{\gamma}(k)\)) mengukur hubungan linier antara observasi pada waktu \(t\) (\(X_t\)) dengan observasi pada \(t-k\) (\(X_{t-k}\)):
\[\hat{\gamma}(k) = \frac{1}{n} \sum_{t=k+1}^{n} (X_t-\bar{X})(X_{t-k}-\bar{X})\]
6.2 Menghitung Autocovariance
n <- length(suhu_ts)
mu <- mean(suhu_ts)
autocov <- sapply(
0:12,
function(k) {
sum(
(suhu_ts[(k + 1):n] - mu) *
(suhu_ts[1:(n - k)] - mu)
) / n
}
)
acov_tbl <- tibble(
lag = 0:12,
autocovariance = autocov
)
kable(
acov_tbl,
digits = 5,
caption = "Autocovariance suhu hingga lag 12"
)| lag | autocovariance |
|---|---|
| 0 | 0.18818 |
| 1 | 0.10171 |
| 2 | -0.03663 |
| 3 | -0.09398 |
| 4 | -0.04711 |
| 5 | 0.02377 |
| 6 | 0.03288 |
| 7 | -0.01051 |
| 8 | -0.05448 |
| 9 | -0.05829 |
| 10 | -0.00632 |
| 11 | 0.05785 |
| 12 | 0.08096 |
7 Autocorrelation Function (ACF)
7.1 Konsep dan Perhitungan ACF
Autocorrelation Function (\(\hat{\rho}(k)\)) diperoleh dengan menormalisasi autocovariance terhadap variansi (\(\hat{\gamma}(0)\)):
\[\hat{\rho}(k) = \frac{\hat{\gamma}(k)}{\hat{\gamma}(0)}\]
acf_obj <- acf(
suhu_ts,
lag.max = 12,
plot = FALSE
)
acf_r_tbl <- tibble(
lag = 0:12,
acf = as.numeric(acf_obj$acf)
)
kable(
acf_r_tbl,
digits = 4,
caption = "Nilai ACF berdasarkan fungsi acf()"
)| lag | acf |
|---|---|
| 0 | 1.0000 |
| 1 | 0.5405 |
| 2 | -0.1946 |
| 3 | -0.4994 |
| 4 | -0.2503 |
| 5 | 0.1263 |
| 6 | 0.1747 |
| 7 | -0.0559 |
| 8 | -0.2895 |
| 9 | -0.3097 |
| 10 | -0.0336 |
| 11 | 0.3074 |
| 12 | 0.4303 |
7.2 Membaca Correlogram (Plot ACF) secara Informal
Plot ACF (correlogram) merupakan alat diagnosis informal utama untuk menilai kestasioneran data:
- Proses Stasioner / White Noise: Plot ACF akan langsung die off (turun drastis mendekati nol setelah lag awal) dan berada di dalam pita batas kepercayaan.
- Proses Non-Stasioner (Tren): Plot ACF meluruh sangat lambat (decaying very slowly).
- Proses Non-Stasioner (Musiman): Plot ACF menunjukkan pola gelombang sinusoidal / lonjakan berulang pada lag kelipatan musiman (\(k = 12, 24, \dots\)).
Hasil Diagnosis Correlogram: Correlogram menunjukkan bahwa nilai ACF tidak turun secara monoton, melainkan membentuk pola gelombang berulang dengan puncak positif yang signifikan pada lag 12 (\(\hat{\rho}(12) \approx 0,430\)). Hal ini secara informal mengindikasikan bahwa data tidak stasioner karena didominasi oleh struktur musiman tahunan.
8 Pengujian Formal Stasioneritas dan Autokorelasi
8.1 Batas Signifikansi Autokorelasi Individual
Secara pendekatan, batas signifikansi individual ACF pada tingkat kepercayaan 95% ditentukan oleh \(\pm \frac{1,96}{\sqrt{n}}\). Dengan \(n=24\), batasnya adalah \(\pm \frac{1,96}{\sqrt{24}} \approx \pm 0,400\).
batas_acf <- 1.96 / sqrt(n)
acf_sig <- acf_r_tbl |>
filter(lag > 0) |>
mutate(
batas_kritis = batas_acf,
signifikan = abs(acf) > batas_acf
)
kable(
acf_sig,
digits = 4,
caption = "Signifikansi autokorelasi berdasarkan batas ±1,96/sqrt(n)"
)| lag | acf | batas_kritis | signifikan |
|---|---|---|---|
| 1 | 0.5405 | 0.4001 | TRUE |
| 2 | -0.1946 | 0.4001 | FALSE |
| 3 | -0.4994 | 0.4001 | TRUE |
| 4 | -0.2503 | 0.4001 | FALSE |
| 5 | 0.1263 | 0.4001 | FALSE |
| 6 | 0.1747 | 0.4001 | FALSE |
| 7 | -0.0559 | 0.4001 | FALSE |
| 8 | -0.2895 | 0.4001 | FALSE |
| 9 | -0.3097 | 0.4001 | FALSE |
| 10 | -0.0336 | 0.4001 | FALSE |
| 11 | 0.3074 | 0.4001 | FALSE |
| 12 | 0.4303 | 0.4001 | TRUE |
Terdapat lonjakan signifikan pada lag 1, lag 3, dan lag 12, mengindikasikan dependensi kuat terhadap nilai masa lalu.
8.2 Uji Portmanteau: Uji Box-Pierce
Uji Box-Pierce menguji hipotesis autokorelasi secara bersama-sama (simultan) hingga lag \(m=12\):
- \(H_0: \rho_1 = \rho_2 = \dots = \rho_{12} = 0\) (Tidak ada autokorelasi simultan / White Noise)
- \(H_1: \text{Setidaknya ada satu } \rho_k \neq 0\)
box_pierce <- Box.test(
suhu_ts,
lag = 12,
type = "Box-Pierce"
)
bp_tbl <- tibble(
Statistik_Box_Pierce = unname(box_pierce$statistic),
df = unname(box_pierce$parameter),
p_value = box_pierce$p.value
)
kable(
bp_tbl,
digits = 6,
caption = "Hasil Uji Box-Pierce sampai lag 12"
)| Statistik_Box_Pierce | df | p_value |
|---|---|---|
| 27.65343 | 12 | 0.006215 |
Hasil: Karena p-value (\(0,0062\)) < \(\alpha = 0,05\), \(H_0\) ditolak. Artinya, terdapat autokorelasi yang signifikan secara simultan hingga lag 12.
8.3 Uji Akar Unit: Augmented Dickey-Fuller (ADF) Test
Untuk melengkapi pengujian stasioneritas secara formal, dilakukan Uji Augmented Dickey-Fuller (ADF):
- \(H_0: \text{Data memiliki akar unit / unit root (Tidak Stasioner)}\)
- \(H_1: \text{Data tidak memiliki akar unit (Stasioner)}\)
adf_test <- adf.test(suhu_ts)
adf_tbl <- tibble(
Statistik_ADF = unname(adf_test$statistic),
Lag_Order = unname(adf_test$parameter),
p_value = adf_test$p.value
)
kable(
adf_tbl,
digits = 4,
caption = "Hasil Uji Augmented Dickey-Fuller (ADF)"
)| Statistik_ADF | Lag_Order | p_value |
|---|---|---|
| -2.6421 | 2 | 0.3278 |
Hasil: Nilai p-value Uji ADF sebesar 0.3278 (> \(\alpha = 0,05\)), sehingga kita gagal menolak \(H_0\). Hal ini membuktikan secara formal statistik bahwa data suhu udara Kota Cilegon tidak stasioner.
9 Evaluasi Stasioneritas & Rekapitulasi
rekap <- tibble(
Indikator_Evaluasi = c(
"Rata-rata 2023 vs 2024",
"Variansi 2023 vs 2024",
"ACF Lag 1",
"ACF Lag 12 (Musiman)",
"Uji Box-Pierce (p-value)",
"Uji ADF (p-value)"
),
Nilai_Uji = c(
paste0(round(mean_2023, 3), " °C vs ", round(mean_2024, 3), " °C"),
paste0(round(var_2023, 4), " vs ", round(var_2024, 4)),
round(acf_r_tbl$acf[acf_r_tbl$lag == 1], 4),
round(acf_r_tbl$acf[acf_r_tbl$lag == 12], 4),
round(box_pierce$p.value, 6),
round(adf_test$p.value, 4)
),
Kesimpulan_Kriteria = c(
"Perubahan rata-rata relatif kecil (0,225 °C)",
"Variansi relatif stabil",
"Signifikan (> 0,400)",
"Signifikan (Pola Musiman Kuat)",
"Ditolak H0 (Autokorelasi Simultan)",
"Gagal Tolak H0 (Mengandung Unit Root)"
)
)
kable(
rekap,
caption = "Rekapitulasi Indikator Evaluasi Stasioneritas Data"
)| Indikator_Evaluasi | Nilai_Uji | Kesimpulan_Kriteria |
|---|---|---|
| Rata-rata 2023 vs 2024 | 28.438 °C vs 28.438 °C | Perubahan rata-rata relatif kecil (0,225 °C) |
| Variansi 2023 vs 2024 | 0.1964 vs 0.1964 | Variansi relatif stabil |
| ACF Lag 1 | 0.5405 | Signifikan (> 0,400) |
| ACF Lag 12 (Musiman) | 0.4303 | Signifikan (Pola Musiman Kuat) |
| Uji Box-Pierce (p-value) | 0.006215 | Ditolak H0 (Autokorelasi Simultan) |
| Uji ADF (p-value) | 0.3278 | Gagal Tolak H0 (Mengandung Unit Root) |
10 Kesimpulan
Berdasarkan seluruh analisis yang mengacu pada matriks pembelajaran, dapat disimpulkan bahwa:
- Data suhu udara Kota Cilegon (\(X_t\)) merupakan satu realisasi proses stokastik bulanan.
- Deskripsi rata-rata (\(28,325 \text{ °C}\) ke \(28,550 \text{ °C}\)) dan variansi (\(0,1784\) ke \(0,2045\)) menunjukkan kestabilan awal yang cukup baik, namun belum cukup untuk menjamin kestasioneran lemah (weak stationarity).
- Evaluasi informal melalui correlogram (plot ACF) memperlihatkan keberadaan komponen musiman tahunan berulang di lag 12 (\(\hat{\rho}(12) = 0,430\)).
- Uji formal Box-Pierce (\(p\text{-value} = 0,0062\)) dan Uji ADF (\(p\text{-value} > 0,05\)) secara konsisten mengonfirmasi bahwa data belum stasioner.
- Sebagai penanganan lebih lanjut, data memerlukan tindakan pembeda-an musiman (seasonal differencing) sebelum dapat dimodelkan menggunakan metode deret waktu seperti SARIMA.