Autokorelasi spasial positif berarti nilai variabel di lokasi-lokasi yang berdekatan cenderung mirip satu sama lain, misalnya wilayah dengan angka kasus tinggi dikelilingi oleh wilayah lain yang juga tinggi (clustering). Autokorelasi spasial negatif berarti nilai yang berdekatan cenderung berbeda pola seperti checkerboard, di mana tinggi-dan-rendah saling berdekatan. (Referensi rumus dan konsep: materi kursus Spatial Statistics).
Positif: Penyakit menular (misal: diare) menyebar melalui kontak lokal sehingga kecamatan berdekatan menunjukkan tingkat kasus tinggi.
Negatif: Zonasi penggunaan lahan yang saling bergantian (mis industri vs perumahan) memberi nilai variabel yang berseberangan pada tetangga sehingga terlihat pola negatif.
\[ I = \frac{N}{S_0} \cdot \frac{\sum_{i=1}^{N}\sum_{j=1}^{N} w_{ij}(x_i - \bar{x})(x_j - \bar{x})} {\sum_{i=1}^{N}(x_i - \bar{x})^2} \]
\[ C = \frac{(N-1)\sum_{i=1}^{N}\sum_{j=1}^{N} w_{ij}(x_i - x_j)^2} {2 S_0 \sum_{i=1}^{N}(x_i - \bar{x})^2} \]
\[ I_i = \frac{(x_i - \bar{x})}{m^2} \sum_{j=1}^{N} w_{ij}(x_j - \bar{x}), \qquad m^2 = \frac{1}{N} \sum_{k=1}^{N}(x_k - \bar{x})^2 \]
\[ G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d) \, x_j} {\sum_{j \neq i} x_j} \]
\[ G_i^*(d) = \frac{\sum_{j=1}^{N} w_{ij}(d) \, x_j} {\sum_{j=1}^{N} x_j} \]
Tabel berikut merangkum perbedaan utama antara ukuran global dan lokal dalam autokorelasi spasial:
## Warning: package 'knitr' was built under R version 4.3.3
## Warning: package 'kableExtra' was built under R version 4.3.3
| Aspek | Ukuran.Global | Ukuran.Lokal |
|---|---|---|
| Cakupan | Menghasilkan satu nilai ringkasan untuk seluruh wilayah studi. Menunjukkan kecenderungan umum apakah wilayah dengan nilai tinggi berdekatan dengan wilayah tinggi lainnya, atau sebaliknya. | Menghasilkan nilai statistik untuk setiap unit wilayah (misalnya kecamatan). Menunjukkan apakah suatu unit merupakan bagian dari cluster atau outlier dibandingkan tetangganya. |
| Tujuan Utama | Menentukan ada atau tidaknya autokorelasi spasial secara keseluruhan di wilayah penelitian. | Mengidentifikasi lokasi spesifik yang membentuk pola spasial, seperti hotspot (nilai tinggi dikelilingi tinggi), coldspot (nilai rendah dikelilingi rendah), atau outlier (tinggi di antara rendah, atau rendah di antara tinggi). |
| Contoh Ukuran | Moran’s I, Geary’s C | Local Moran’s Ii, Getis–Ord Gi, Getis–Ord Gi* |
| Interpretasi | Jika signifikan, artinya terdapat pola spasial global (misalnya clustering atau pola papan catur). Namun, tidak memberikan informasi lokasi spesifik. | Jika signifikan, dapat menunjukkan unit wilayah tertentu yang membentuk cluster atau outlier. Misalnya, kecamatan A signifikan High-High, kecamatan B signifikan Low-Low. |
| Sensitivitas | Lebih menekankan pada kecenderungan rata-rata global. Kurang sensitif terhadap variasi kecil di tingkat lokal. | Lebih sensitif terhadap variasi spasial lokal dan heterogenitas antar wilayah. Mampu mendeteksi pola yang tidak tampak pada ukuran global. |
| Keterbatasan | Tidak dapat menunjukkan lokasi spesifik cluster; hanya menyatakan ada atau tidaknya autokorelasi secara umum. | Karena dilakukan banyak uji statistik (satu per unit wilayah), rentan terhadap masalah multiple testing sehingga interpretasi p-value perlu hati-hati. |
Peta Kota Bandung diambil dari shapefile resmi, dan untuk keperluan analisis spasial, dibuat grid simulasi berbentuk persegi yang terdiri dari 30 unit wilayah sebagai representasi kecamatan. Grid ini akan diplot di atas peta asli.
library(sf)
library(dplyr)
library(ggplot2)
setwd("D:/Semester 5/Spasial/Spatial")
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
Bandung <- subset(Indo_Kec, NAME_2 %in% c("Kota Bandung", "Bandung"))
if(nrow(Bandung) == 0){
stop("Data Kota Bandung tidak ditemukan di RDS!")
}
Bandung$id <- seq_len(nrow(Bandung))
Bandung_sf <- sf::st_as_sf(Bandung)
if(!exists("Bandung_sf")) {
bb <- sf::st_as_sfc(
sf::st_bbox(
c(xmin = 107.55, ymin = -6.98,
xmax = 107.72, ymax = -6.85),
crs = 4326
)
)
grid <- sf::st_make_grid(bb, n = c(6, 5)) |>
sf::st_as_sf() |>
dplyr::mutate(id = dplyr::row_number())
Bandung_sf <- grid
}
Bandung_sf <- sf::st_make_valid(Bandung_sf)
Bandung_sf$id <- if(!"id" %in% names(Bandung_sf)) seq_len(nrow(Bandung_sf)) else Bandung_sf$id
ggplot(Bandung_sf) + geom_sf(fill="grey90", color="white") +
labs(title="Kota Bandung") + theme_minimal()
Kita buat data simulasi jumlah kasus diare per 10.000 penduduk. Kita menggunakan distribusi Poisson dengan rata-rata berbeda antar wilayah. Jumlah penduduk tiap wilayah dibuat acak (3.000–8.000).
library(sf)
library(dplyr)
library(ggplot2)
library(viridis)
set.seed(123) # biar reproducible
# Baca Shapefile Level 3 (Kecamatan)
adm3 <- st_read("C:/Users/Fauzan L/Downloads/gadm41_IDN_shp/gadm41_IDN_3.shp", quiet = TRUE)
# Filter Khusus Kota Bandung
bandung <- adm3 %>% filter(NAME_2 == "Kota Bandung")
n_units <- nrow(bandung) # jumlah kecamatan
n_units
## [1] 30
set.seed(2025)
# Populasi Acak Per Kecamatan (3.000 - 8.000 Penduduk)
bandung <- bandung %>%
mutate(pop = round(runif(n(), 3000, 8000)))
# Buat Lambda Berbeda Tiap Kecamatan
lambda_base <- runif(n_units, 1, 3)
lambda_base[1:5] <- lambda_base[1:5] + 4
lambda_base[(n_units-4):n_units] <- lambda_base[(n_units-4):n_units] - 0.8
lambda_base <- pmax(lambda_base, 0.1)
# Simulasi Kasus
cases <- rpois(n_units, lambda = lambda_base * (bandung$pop/10000))
rate10k <- (cases / bandung$pop) * 10000
bandung <- bandung %>%
mutate(lambda = lambda_base,
cases = cases,
rate10k = rate10k)
# Ringkasan
bandung %>% st_drop_geometry() %>%
select(pop, lambda, cases, rate10k) %>% summary()
## pop lambda cases rate10k
## Min. :3119 Min. :0.9038 Min. :0.000 Min. : 0.000
## 1st Qu.:4754 1st Qu.:1.3547 1st Qu.:0.000 1st Qu.: 0.000
## Median :5546 Median :2.0610 Median :1.000 Median : 1.709
## Mean :5666 Mean :2.5646 Mean :1.367 Mean : 2.333
## 3rd Qu.:6865 3rd Qu.:2.8484 3rd Qu.:2.000 3rd Qu.: 3.096
## Max. :7762 Max. :6.3238 Max. :7.000 Max. :12.565
Peta Choropleth dari Data Simulasi
ggplot(bandung) +
geom_sf(aes(fill = rate10k), color = "white", size = 0.3) +
scale_fill_viridis_c(option = "plasma", name = "Kasus per 10k") +
labs(
title = "Peta Simulasi Kasus Diare per 10.000 Penduduk",
subtitle = "Data simulasi untuk 30 kecamatan di Kota Bandung"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 11)
)
Pola Spasial (Visual)
Dari peta simulasi di atas, kita bisa mengamati:
Hitung Moran’s I untuk data simulasi kasus diare di Kota Bandung.
library(spdep) # untuk moran, geary, localmoran
library(sf)
library(dplyr)
library(ggplot2)
library(viridis)
# Neighbors & Weights
nb <- poly2nb(bandung) # daftar tetangga antar kecamatan
lw <- nb2listw(nb, style = "W") # bobot spasial (row-standardized)
# 1. Moran’s I
moran <- moran.test(bandung$rate10k, lw, randomisation = TRUE)
moran
##
## Moran I test under randomisation
##
## data: bandung$rate10k
## weights: lw
##
## Moran I statistic standard deviate = 2.1334, p-value = 0.01645
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.19011328 -0.03448276 0.01108287
Interpretasi:
# 2. Geary’s C
geary <- geary.test(bandung$rate10k, lw, randomisation = TRUE)
geary
##
## Geary C test under randomisation
##
## data: bandung$rate10k
## weights: lw
##
## Geary C statistic standard deviate = 0.69337, p-value = 0.244
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.91233812 1.00000000 0.01598416
Interpretasi:
**Perbedaan dengan Moran’s I:**
Moran’s I lebih sensitif terhadap **pola global** (klaster luas)Geary’s C lebih sensitif terhadap **perbedaan lokal antar tetangga langsung**.
Jadi, hasil ini menunjukkan pola klaster mungkin ada di tingkat global, tapi perbedaan lokal antar kecamatan tidak terlalu kuat.
# 3. Local Moran’s I (LISA)
local_moran <- localmoran(bandung$rate10k, lw)
bandung$Ii <- local_moran[,1] # nilai statistik
bandung$Ii_p <- local_moran[,5] # p-value
bandung$lag_rate <- lag.listw(lw, bandung$rate10k) # rata-rata tetangga
# Kategorisasi cluster
bandung$quad_sig <- NA
bandung$quad_sig[bandung$rate10k >= mean(bandung$rate10k) &
bandung$lag_rate >= mean(bandung$lag_rate) &
bandung$Ii_p <= 0.05] <- "High-High"
bandung$quad_sig[bandung$rate10k <= mean(bandung$rate10k) &
bandung$lag_rate <= mean(bandung$lag_rate) &
bandung$Ii_p <= 0.05] <- "Low-Low"
bandung$quad_sig[bandung$rate10k >= mean(bandung$rate10k) &
bandung$lag_rate <= mean(bandung$lag_rate) &
bandung$Ii_p <= 0.05] <- "High-Low"
bandung$quad_sig[bandung$rate10k <= mean(bandung$rate10k) &
bandung$lag_rate >= mean(bandung$lag_rate) &
bandung$Ii_p <= 0.05] <- "Low-High"
# Peta LISA
ggplot(bandung) +
geom_sf(aes(fill = quad_sig), color="white") +
scale_fill_manual(values=c("High-High"="red",
"Low-Low"="blue",
"High-Low"="orange",
"Low-High"="lightblue"),
na.value="grey90",
name="Cluster LISA")
Interpretasi:
# 4. Getis–Ord Gi*
gi <- localG(bandung$rate10k, lw)
bandung$GiZ <- as.numeric(gi)
# Hotspot/Coldspot
bandung$Gi_cat <- ifelse(bandung$GiZ > 1.65, "Hotspot",
ifelse(bandung$GiZ < -1.65, "Coldspot", "Not Sig"))
# Peta Getis–Ord Gi*
ggplot(bandung) +
geom_sf(aes(fill = Gi_cat), color="white") +
scale_fill_manual(values=c("Hotspot"="red",
"Coldspot"="blue",
"Not Sig"="grey90"),
name="Getis-Ord Gi*") +
labs(title="Peta Hotspot/Coldspot (Getis–Ord Gi*)",
subtitle="Simulasi kasus diare per 10.000 penduduk") +
theme_minimal()
Interpretasi:
- Kecamatan dengan Hotspot, signifikan kasus tinggi
yang dikelilingi tinggi.
- Kecamatan dengan Coldspot, signifikan rendah yang
dikelilingi rendah.
- Perbandingan dengan LISA:
- LISA bisa mendeteksi outlier (High-Low, Low-High).
- Gi* hanya fokus pada hotspot/coldspot, jadi hasilnya
bisa lebih sederhana tetapi lebih fokus untuk pemetaan wilayah rawan
penyakit.
Hasil analisis autokorelasi spasial, baik ukuran global (Moran’s I, Geary’s C) maupun lokal (Local Moran’s I, Getis–Ord Gi*), sangat bermanfaat bagi dinas kesehatan dalam menyusun strategi pencegahan dan intervensi penyakit menular di Kota Bandung.
Meskipun berguna, terdapat beberapa keterbatasan yang perlu diperhatikan:
MAUP (Modifiable Areal Unit Problem):
Hasil analisis sangat dipengaruhi oleh skala dan cara pengelompokan
wilayah. Misalnya, analisis di tingkat kecamatan bisa menghasilkan pola
berbeda dibandingkan analisis di tingkat kelurahan. Hal ini dapat
menyebabkan bias interpretasi jika tidak dipertimbangkan dengan
hati-hati.
Ukuran bobot spasial:
Hasil autokorelasi bergantung pada definisi tetangga (rook, queen, atau
k-nearest neighbors). Pemilihan bobot yang berbeda bisa menghasilkan
hasil yang berbeda pula. Oleh karena itu, analisis sebaiknya diuji
dengan beberapa definisi bobot spasial untuk memastikan konsistensi
hasil.
Masalah multiple testing pada analisis
lokal:
Dalam analisis LISA, setiap unit wilayah diuji secara terpisah. Hal ini
menimbulkan risiko false positive (menyatakan ada klaster
padahal tidak ada) karena banyaknya uji statistik yang dilakukan secara
simultan. Oleh karena itu, interpretasi hasil harus hati-hati, misalnya
dengan menerapkan koreksi p-value atau mengutamakan pola yang konsisten
secara spasial.
Kesimpulan:
Analisis autokorelasi spasial memberikan wawasan penting dalam memahami
pola penyebaran penyakit menular. Namun, penggunaannya harus
mempertimbangkan keterbatasan metodologis agar strategi kesehatan yang
dirumuskan benar-benar akurat dan efektif.