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:

  1. 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.

  2. 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"
)
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.

suhu_ts <- ts(
  as.vector(t(data_suhu)),
  start = c(2023, 1),
  frequency = 12
)

suhu_ts
##       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.

start(suhu_ts)
## [1] 2023    1
end(suhu_ts)
## [1] 2024   12
frequency(suhu_ts)
## [1] 12
length(suhu_ts)
## [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"
)
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
mean_2024
## [1] 28.4375
selisih_mean
## [1] 0
persen_mean
## [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
var_2024
## [1] 0.1963587
selisih_var
## [1] 0
rasio_var
## [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"
)
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

6.3 Visualisasi Autocovariance

plot(
  acov_tbl$lag,
  acov_tbl$autocovariance,
  type = "h",
  lwd = 3,
  col = "steelblue",
  xlab = "Lag",
  ylab = "Autocovariance",
  main = "Autocovariance Suhu Udara Kota Cilegon"
)
points(acov_tbl$lag, acov_tbl$autocovariance, pch = 16)
abline(h = 0, lty = 2)
grid()

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()"
)
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\)).
acf(
  suhu_ts,
  lag.max = 12,
  main = "Correlogram (Plot ACF) Suhu Udara Kota Cilegon"
)

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)"
)
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"
)
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)"
)
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"
)
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:

  1. Data suhu udara Kota Cilegon (\(X_t\)) merupakan satu realisasi proses stokastik bulanan.
  2. 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).
  3. Evaluasi informal melalui correlogram (plot ACF) memperlihatkan keberadaan komponen musiman tahunan berulang di lag 12 (\(\hat{\rho}(12) = 0,430\)).
  4. Uji formal Box-Pierce (\(p\text{-value} = 0,0062\)) dan Uji ADF (\(p\text{-value} > 0,05\)) secara konsisten mengonfirmasi bahwa data belum stasioner.
  5. Sebagai penanganan lebih lanjut, data memerlukan tindakan pembeda-an musiman (seasonal differencing) sebelum dapat dimodelkan menggunakan metode deret waktu seperti SARIMA.