Autokorelasi spasial adalah ukuran sejauh mana suatu nilai variabel di lokasi tertentu berhubungan dengan nilai variabel yang sama di lokasi-lokasi sekitarnya. Konsep ini penting dalam analisis data spasial (misalnya data peta, citra satelit, atau data wilayah).
Contoh Autokorelasi spasial positif:
Harga tanah per meter di kota besar → kawasan pusat bisnis biasanya mahal, dan daerah tetangganya juga mahal.
Tingkat kemiskinan desa/kelurahan → daerah miskin cenderung berdekatan dengan daerah miskin lainnya.
Polusi udara (PM2.5) di perkotaan → daerah dekat jalan raya padat sama-sama tinggi polusi.
Contoh Autokorelasi spasial negatif:
Warna cat rumah di komplek → acak, tidak ada pola mirip atau berbeda.
Nomor plat kendaraan parkir → acak, tidak menunjukkan pola spasial.
\[ I = \frac{n}{S_0} \cdot \frac{\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{n} w_{ij} \, (x_i - \bar{x}) (x_j - \bar{x})} {\displaystyle\sum_{i=1}^{n} (x_i - \bar{x})^{2}} \]
Interpretasi:
\(I > 0\) → indikasi autokorelasi spasial positif (lokasi berdekatan cenderung mirip).
\(I < 0\) → indikasi autokorelasi spasial negatif (lokasi berdekatan cenderung berbeda).
\(I \approx E[I]\) → tidak ada autokorelasi spasial yang signifikan.
Ekspektasi Moran’s I (di bawah hipotesis nol autokorelasi spasial acak):
\[ E[I] = -\frac{1}{n-1} \]
(Variance \(Var(I)\) memiliki bentuk rumit yang tergantung pada bobot \(w_{ij}\) dan momen ke-2 dan ke-4 dari data — biasanya dihitung oleh paket statistik.)
Geary’s C mengukur perbedaan nilai antar pasangan tetangga langsung, dirumuskan sebagai:
\[ C = \frac{(n-1)}{2 S_0} \cdot \frac{\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{n} w_{ij} \, (x_i - x_j)^{2}} {\displaystyle\sum_{i=1}^{n} (x_i - \bar{x})^{2}} \]
Interpretasi:
\(C < 1\) → autokorelasi spasial positif (karena perbedaan antar tetangga relatif kecil).
\(C > 1\) → autokorelasi spasial negatif (perbedaan antar tetangga relatif besar).
\(C \approx 1\) → tidak ada autokorelasi spasial.
\[ I_i = \frac{(x_i - \bar{x})}{m_2} \sum_{j=1}^{n} w_{ij} (x_j - \bar{x}) \]
dengan
\[ m_2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2 \]
Interpretasi:
\[ G_i = \frac{\sum_{j=1}^{n} w_{ij} x_j} {\sum_{j=1}^{n} x_j} \]
\[ G_i^* = \frac{\sum_{j=1}^{n} w_{ij} x_j}{\sum_{j=1}^{n} x_j} \quad \text{dengan } i \text{ termasuk dalam perhitungan bobot } w_{ij}. \]
Interpretasi:
Ukuran Global (mis. Moran’s I, Geary’s C):
Mengukur autokorelasi spasial secara keseluruhan di seluruh area studi.
Hasilnya adalah satu nilai agregat untuk seluruh data.
Ukuran Lokal (mis. Local Moran’s \(I_i\), Getis–Ord \(G_i\), \(G_i^*\)):
Mengukur autokorelasi spasial pada tingkat individu/lokasi tertentu.
Berguna untuk mendeteksi hotspot (nilai tinggi dikelilingi
nilai tinggi), coldspot (nilai rendah dikelilingi nilai
rendah), atau outlier spasial (nilai berbeda dari tetangganya).
# Data kasus campak
data <- read.csv("C:/Users/tatya/Downloads/Campak.csv", header = TRUE, sep = ",")
attach(data)
# Data shapefile
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
# Ambil hanya Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung$id <- 1:30
Bandung_sf <- st_as_sf(Bandung)
# Gabungkan dengan data kasus
Campak_df <- data.frame(
id = Bandung_sf$id, # atau vektor ID lain yang benar
kasus = Campak # vektor integer kasus campak
)
Bandung_merged <- Bandung_sf %>%
dplyr::left_join(Campak_df, by = "id")
ggplot(Bandung_merged) +
geom_sf(aes(fill = Campak), color = NA) +
scale_fill_gradient(low = "yellow", high = "red") +
theme_bw() +
labs(title = "Peta Kasus Campak Kota Bandung", fill = "Jumlah Kasus")
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color="black", size=0.2) +
scale_fill_viridis_c(option="magma") +
labs(title="Rate Campak (per 10.000) — Simulasi", fill="Rate") +
theme_minimal()
leaflet(Bandung_merged) %>%
addTiles() %>%
addPolygons(fillColor = ~colorNumeric("viridis", rate10k)(rate10k),
color = "black", weight = 1,
popup = ~paste0("Kecamatan: ", NAME_3,
"<br>Rate: ", round(rate10k,2)))
Interpretasi visual: Warna semakin terang (kuning–oranye) menunjukkan rate campak yang lebih tinggi per 10.000 penduduk. Dari peta terlihat bahwa beberapa wilayah di utara memiliki
Berapa nilai Moran’s I?
moran_res <- spdep::moran.test(Bandung_merged$rate10k, lwW,
randomisation = TRUE, alternative = "two.sided")
moran_res
##
## Moran I test under randomisation
##
## data: Bandung_merged$rate10k
## weights: lwW
##
## Moran I statistic standard deviate = 4.8496, p-value = 1.237e-06
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.50481782 -0.03448276 0.01236637
Interpretasi:
Hasil perhitungan Moran’s I secara analitik menunjukkan nilai sebesar 0.50481782. Angka 0,50 menunjukkan autokorelasi spasial positif yang cukup kuat. Artinya, wilayah dengan angka kejadian penyakit tinggi cenderung berdekatan dengan wilayah yang juga tinggi, begitu pula untuk wilayah dengan angka rendah.
Apakah signifikan secara statistik (uji permutasi)?
Karena p-value (1.237e-06) jauh lebih kecil dari batas umum α = 0,05 (bahkan 0,01), hasilnya sangat signifikan. Sehingga menolak hipotesis nol yang menyatakan bahwa distribusi kasus penyakit bersifat acak
Apa artinya bagi pola spasial penyakit?
Kasus penyakit (rate per 10 000 penduduk) tidak tersebar secara acak. Terdapat pengelompokan spasial (clustering): daerah dengan tingkat kejadian tinggi dikelilingi daerah tinggi lainnya, sedangkan daerah rendah dikelilingi daerah rendah.
Perlu perhatian lebih pada wilayah yang membentuk “hot spot” karena penularan atau faktor risiko di area sekitar bisa saling memperkuat. Analisis lanjutan (misal Local Moran’s I/LISA) dapat digunakan untuk mengidentifikasi lokasi spesifik klaster penyakit.
Bagaimana perbandingannya dengan Moran’s I?
# Geary's C analytic test (spdep)
geary_res <- spdep::geary.test(Bandung_merged$rate10k, lwW,
randomisation = TRUE, alternative = "two.sided")
geary_res
##
## Geary C test under randomisation
##
## data: Bandung_merged$rate10k
## weights: lwW
##
## Geary C statistic standard deviate = 4.3461, p-value = 1.386e-05
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 0.47515619 1.00000000 0.01458327
Interpretasi:
Uji Geary’s C menghasilkan nilai 0,48 dengan ekspektasi acak 1,0 dan p-value 1,39 × 10⁻⁵, sehingga menunjukkan autokorelasi spasial positif yang signifikan, sama seperti kesimpulan uji Moran’s I yang memberi nilai 0,50 (p ≈ 1,2 × 10⁻⁶). Artinya wilayah dengan tingkat kasus penyakit per 10 ribu penduduk yang tinggi cenderung dikelilingi wilayah bernilai tinggi, dan yang rendah dikelilingi rendah, menandakan pola pengelompokan (clustering).
Jelaskan perbedaan sensitivitas kedua ukuran ini.
Moran’s I menilai kesamaan global antara suatu lokasi dan rata-rata tetangganya sehingga lebih peka terhadap pola klaster besar di seluruh peta, sedangkan Geary’s C menghitung selisih kuadrat antar-tetangga secara langsung, sehingga lebih peka mendeteksi perbedaan atau kontras lokal. Dengan kata lain, Moran’s I memberi gambaran “makro” pola pengelompokan, sedangkan Geary’s C menyoroti variasi “mikro” di perbatasan antarwilayah.
Identifikasi kecamatan yang masuk kategori High-High, Low-Low,High-Low, dan Low-High.
x <- scale(Bandung_merged$rate10k)[,1]
lagx <- spdep::lag.listw(lwW, x)
lisa <- spdep::localmoran(x, lwW, alternative = "two.sided", zero.policy = TRUE)
lisa_df <- as.data.frame(lisa)
names(lisa_df) <- c("Ii","Ei","Vi","Zi","Pi.two.sided")
alpha <- 0.05
quad <- dplyr::case_when(
x >= 0 & lagx >= 0 ~ "High-High",
x < 0 & lagx < 0 ~ "Low-Low",
x >= 0 & lagx < 0 ~ "High-Low (Outlier)",
x < 0 & lagx >= 0 ~ "Low-High (Outlier)"
)
Bandung_LISA <- dplyr::bind_cols(Bandung_merged, lisa_df) |>
dplyr::mutate(quad = ifelse(Pi.two.sided <= alpha, quad, "Not significant"))
Buat peta cluster LISA
ggplot(Bandung_LISA) +
geom_sf(aes(fill = quad), color="white", size=0.2) +
scale_fill_manual(values=c(
"High-High"="purple","Low-Low"="magenta",
"High-Low (Outlier)"="orange","Low-High (Outlier)"="red","Not significant"="grey85"
)) +
labs(title="Local Moran's I (LISA)", fill="Kategori") +
theme_minimal()
Interpretasi:
Peta Local Moran’s I (LISA) menunjukkan bahwa wilayah di bagian utara peta membentuk klaster “High–High” yang ditandai warna ungu, artinya daerah tersebut memiliki tingkat kasus penyakit yang tinggi dan dikelilingi oleh daerah tetangga dengan tingkat kasus tinggi pula. Sementara itu, area lain yang berwarna abu-abu tergolong “Not significant”, menandakan tidak ditemukan pola spasial yang berbeda dari acak. Interpretasi ini memperkuat temuan Moran’s I global bahwa penyebaran penyakit tidak merata, dengan fokus pengelompokan signifikan yang terkonsentrasi di utara sebagai hot spot yang penting untuk pemantauan dan intervensi kesehatan masyarakat.
Apa interpretasi hasil ini untuk kasus penyakit menular?
Hasil Local Moran’s I ini menunjukkan bahwa penyakit menular di wilayah studi tidak menyebar secara acak, tetapi membentuk klaster signifikan di bagian utara. Daerah berwarna ungu (“High-High”) memiliki angka kejadian tinggi dan dikelilingi oleh tetangga yang juga tinggi, menandakan adanya hot spot penularan. Bagi kasus penyakit menular, pola seperti ini mengisyaratkan kemungkinan transmisi lokal yang kuat, misalnya karena mobilitas penduduk, kepadatan, atau kondisi lingkungan yang serupa antarwilayah tetangga. Temuan ini penting untuk perencanaan kesehatan masyarakat: upaya pengendalian, surveilans, dan intervensi pencegahan sebaiknya diprioritaskan pada klaster utara dan area sekitarnya agar dapat menekan laju penyebaran ke wilayah lain.
x_raw <- Bandung_merged$rate10k
sum_x <- sum(x_raw)
# Matriks bobot biner (tidak distandarisasi)
Wb <- spdep::listw2mat(lwB) # diag=0 secara default
# G_i (tanpa i)
num_G <- as.numeric(Wb %*% x_raw) # Σ_{ji} w_ij x_j
den_G <- (sum_x - x_raw) # Σ_{ji} x_j
G_raw <- num_G / den_G
# G_i^* (dengan i) — set w_ii = 1
Wb_star <- Wb; diag(Wb_star) <- 1
num_Gs <- as.numeric(Wb_star %*% x_raw) # Σ_j w_ij^* x_j
den_Gs <- sum_x # Σ_j x_j
G_star_raw <- num_Gs / den_Gs
# Z-skor (yang dihitung spdep::localG)
Gz <- spdep::localG(x_raw, listw = lwW) # z(G_i^*) dengan listw yang diberikan
Bandung_G <- dplyr::mutate(Bandung_merged,
G_raw = G_raw,
G_star_raw = G_star_raw,
z_Gistar = as.numeric(Gz),
hotcold = dplyr::case_when(
z_Gistar >= 1.96 ~ "Hot spot (p0.05)",
z_Gistar <= -1.96 ~ "Cold spot (p0.05)",
TRUE ~ "Not significant"
))
summary(dplyr::select(Bandung_G, G_raw, G_star_raw, z_Gistar))
## G_raw G_star_raw z_Gistar geometry
## Min. :0.00000 Min. :0.01069 Min. :-1.7571 MULTIPOLYGON :30
## 1st Qu.:0.05115 1st Qu.:0.07107 1st Qu.:-1.1364 epsg:NA : 0
## Median :0.09574 Median :0.11959 Median :-0.9334 +proj=long...: 0
## Mean :0.13832 Mean :0.16419 Mean :-0.2353
## 3rd Qu.:0.16788 3rd Qu.:0.18923 3rd Qu.: 0.1827
## Max. :0.48942 Max. :0.53346 Max. : 4.1541
ggplot(Bandung_G) +
geom_sf(aes(fill = G_star_raw), color="white", size=0.2) +
scale_fill_viridis_c() +
labs(title="Raw Getis–Ord G* (proporsi massa tetangga)", fill="G*_raw") +
theme_minimal()
ggplot(Bandung_G) +
geom_sf(aes(fill = hotcold), color="white", size=0.2) +
scale_fill_manual(values=c("Hot spot (p0.05)"="maroon",
"Cold spot (p0.05)"="yellow",
"Not significant"="grey85")) +
labs(title="Getis–Ord Gi* — Hot/Cold Spots (z-skor)", fill=NULL) +
theme_minimal()
Tentukan kecamatan yang termasuk hot spot dan cold spot.
Peta Getis–Ord Gi* menandai kecamatan di bagian utara sebagai hot spot signifikan (p < 0,05), terlihat dengan warna merah pada peta kedua. Tidak ditemukan kecamatan dengan z-score negatif yang signifikan, sehingga tidak ada cold spot dalam analisis ini.
Bandingkan hasilnya dengan peta LISA.
Wilayah yang terdeteksi sebagai hot spot Gi* tersebut sama dengan klaster “High–High” pada peta Local Moran’s I (LISA), yaitu deretan kecamatan di bagian utara yang memiliki tingkat kasus tinggi dan dikelilingi tetangga dengan nilai tinggi pula.
Apakah ada perbedaan wilayah yang ditandai sebagai klaster signifikan?
Secara spasial tidak terdapat perbedaan berarti: baik Gi* maupun LISA menyoroti area utara sebagai pusat konsentrasi penyakit menular. Perbedaan hanya pada metode—Gi* menekankan kepadatan hotspot, sedangkan LISA mengukur autokorelasi lokal—namun keduanya mengarah pada lokasi risiko tinggi yang sama.
MAUP (Modifiable Areal Unit Problem)
Hasil uji autokorelasi spasial dapat berubah tergantung pada cara wilayah dibagi (skala dan batas administrasi). Misalnya, jika analisis dilakukan per‐RT, per‐kelurahan, atau per‐kecamatan, nilai Moran’s I atau identifikasi hot spot bisa berbeda. Perubahan batas atau penggabungan unit analisis bisa menimbulkan pola “buatan” yang tidak merefleksikan proses penularan sebenarnya.
Ukuran bobot spasial (rook, queen, k-nearest neighbors)
Matriks bobot (rook, queen, k-nearest neighbors, jarak tertentu) sangat memengaruhi hasil.
Rook vs. Queen: rook hanya menghubungkan sisi bersinggungan, sedangkan queen juga mempertimbangkan sudut.
k-nearest neighbors: jumlah tetangga tetap walaupun jarak fisiknya berbeda-beda.
Perbedaan definisi “tetangga” dapat menghasilkan nilai statistik dan peta klaster yang berbeda, sehingga keputusan kebijakan juga bisa berubah.
Masalah multiple testing pada analisis lokal
Analisis lokal seperti LISA atau Getis-Ord Gi* melakukan banyak uji signifikansi sekaligus untuk setiap unit wilayah. Tanpa koreksi (misalnya Bonferroni atau False Discovery Rate), peluang menemukan “klaster signifikan” secara kebetulan meningkat, sehingga beberapa hot spot atau cold spot mungkin false positive.
Kesimpulannya, hasil autokorelasi spasial perlu ditafsirkan dengan hati-hati dan, bila memungkinkan, diuji sensitivitasnya terhadap skala wilayah, definisi bobot, dan koreksi untuk pengujian ganda.