Autokorelasi spasial positif terjadi ketika unit-unit ruang yang berdekatan atau “tetangga” (spatial neighbors) cenderung memiliki nilai karakteristik (misalnya variabel X) yang serupa (baik sama-sama tinggi atau sama-sama rendah). Dengan kata lain, nilai tinggi “berkumpul” dengan nilai tinggi, dan nilai rendah dengan nilai rendah.
Autokorelasi spasial negatif terjadi ketika unit-unit yang berdekatan cenderung memiliki nilai yang berbeda (misalnya tinggi dekat dengan rendah). Jadi nilai tinggi di satu lokasi cenderung dikelilingi oleh nilai rendah, dan sebaliknya.
Dengan autokorelasi spasial positif, pola ruang menunjukkan klaster homogen; dengan autokorelasi negatif, pola ruang menunjukkan semacam “dispersi” atau variasi teratur di antara tetangga.
Contoh autokorelasi spasial positif:
Misalnya dalam data pendapatan per kapita di kota-kota dalam suatu
provinsi. Kota-kota yang berdekatan kemungkinan memiliki karakter
ekonomi yang mirip (infrastruktur, industri, akses pasar), sehingga kota
dengan pendapatan tinggi di satu lokasi sering dikelilingi oleh
kota-kota lain dengan pendapatan tinggi, dan yang rendah dikelilingi
yang rendah.
Contoh autokorelasi spasial negatif:
Misalnya dalam data kepadatan penduduk di pemukiman: kalau satu blok
sangat padat (banyak rumah), tetangganya mungkin memiliki kepadatan
relatif rendah (misalnya area taman atau ruang terbuka). Atau dalam
pertanian: petak tanah dengan hasil sangat tinggi mungkin dikelilingi
petak dengan kondisi tanah dan hasil lebih rendah, sehingga ada variasi
“ziko-pola” (tall-short neighbor pattern)
Berikut beberapa rumus klasik untuk indikator autokorelasi spasial (global dan lokal). (Catatan: ada variasi penormalan atau standardisasi tergantung literatur.)
Rumus umum:
\[ I = \frac{N}{W} \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} \]
Keterangan:
Salah satu bentuk formula klasik Geary’s C adalah:
\[ C = \frac{(N-1)\,\sum_{i=1}^{N}\sum_{j=1}^{N} w_{ij}\,(x_i - x_j)^2} {2\,W \,\sum_{i=1}^{N} (x_i - \bar{x})^2} \]
Keterangan:
Local Moran’s I untuk unit \(i\) (versi klasik) dapat ditulis:
\[ 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 \]
Keterangan:
Rumus dasar untuk statistik Getis–Ord lokal (versi non-standar) adalah:
\[ G_i = \frac{\sum_{j \neq i} w_{ij} x_j}{\sum_{j \neq i} x_j} \]
\[ G_i^* = \frac{\sum_{j=1}^{N} w_{ij} x_j}{\sum_{j=1}^{N} x_j} \]
Keterangan:
Beberapa poin pembeda:
simulasi jika data asli tidak tersedia).
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(sp)
## Warning: package 'sp' was built under R version 4.3.3
library(spdep)
## Warning: package 'spdep' was built under R version 4.3.3
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.3.3
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(spData)
# ==== Opsi A: menggunakan file RDS Anda ====
setwd("C:/M Naufal/Spasial/Spatial")
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung$id <- seq_len(nrow(Bandung))
Bandung_sf <- sf::st_as_sf(Bandung)
# Untuk keperluan *knit* tanpa data eksternal, siapkan grid mock 30 poligon (DEMO).
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 - Unit (contoh)") + theme_minimal()
# Peta choropleth kasus TBC
library(ggplot2)
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color = "white", size = 0.3) +
scale_fill_viridis_c(option = "magma", direction = -1) +
labs(
title = "Peta Choropleth Kasus TBC (per 10.000 penduduk) - Simulasi",
fill = "Rate TBC"
) +
theme_minimal()
Interpretasi:
Kesimpulan
Pola spasial menunjukkan pengelompokan kasus tinggi di
selatan–timur wilayah, sedangkan wilayah barat–utara relatif rendah,
sehingga distribusi kasus TBC cenderung membentuk klaster spasial dan
tidak acak.
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.1958, p-value = 2.72e-05
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.39085537 -0.03448276 0.01027659
Intepretasi:
Moran’s I statistic = 0.3909
Angka positif dan cukup tinggi (maksimum teoritis = +1). Artinya ada
autokorelasi spasial positif, yaitu wilayah dengan angka TBC tinggi
cenderung berdekatan dengan wilayah yang juga tinggi, dan wilayah dengan
angka rendah cenderung berdekatan dengan wilayah yang rendah.
Expectation = -0.0345
Nilai harapan Moran’s I di bawah asumsi random distribution
(tidak ada pola spasial). Karena nilai aktual (0.3909) jauh lebih besar
dari ekspektasi, ini menunjukkan adanya penyimpangan signifikan dari
acak.
Variance = 0.01028
Varians ini digunakan untuk menghitung z-score.
Standard deviate (z) = 4.1958
Z-score jauh di atas 1.96 (batas 95% CI), menunjukkan signifikansi yang
kuat.
p-value = 2.72e-05 (≈ 0.000027)
Sangat kecil (<0.001), berarti hasilnya sangat signifikan secara
statistik.
Apakah signifikan secara statistik (uji permutasi)?
Ya, hasil Moran’s I signifikan secara statistik pada taraf signifikansi konvensional (misalnya 5% bahkan 1%), karena p-value ≈ 0.000027 < 0.05. Artinya, pola spasial yang muncul tidak terjadi secara kebetulan semata.
Apa artinya bagi pola spasial penyakit?
Karena nilai Moran’s I positif (0.39) dan signifikan, ini menunjukkan adanya autokorelasi spasial positif. Artinya, daerah dengan tingkat penyakit tinggi cenderung bertetangga dengan daerah yang juga tinggi, dan daerah dengan tingkat rendah cenderung bertetangga dengan daerah yang rendah. Dengan kata lain, distribusi kasus penyakit membentuk pola klaster (bukan acak dan bukan juga pola penyebaran menyebar/terdispersi).
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 = 3.1866, p-value = 0.00144
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 0.58618326 1.00000000 0.01686418
Interpretasi:
Arah autokorelasi
Geary’s C bekerja berlawanan dengan Moran’s I:
Karena nilai C = 0.586 (< 1), maka hasil ini menunjukkan autokorelasi spasial positif.
Makna dalam konteks penyakit
Artinya, wilayah dengan angka kasus tinggi cenderung berdekatan dengan
wilayah lain yang juga tinggi, sementara wilayah dengan angka kasus
rendah cenderung berdekatan dengan wilayah yang rendah. Dengan kata
lain, ada indikasi pembentukan klaster penyakit di Bandung.
Bagaimana perbandingannya dengan Moran’s I?
Moran’s I = 0.3909 (p < 0.0001) → autokorelasi spasial positif (klaster).
Geary’s C = 0.586 (p = 0.0014) → autokorelasi spasial positif (klaster).
Keduanya konsisten: sama-sama menunjukkan adanya pola pengelompokan penyakit di Bandung, bukan pola acak.
Jelaskan perbedaan sensitivitas kedua ukuran ini.
Moran’s I
Geary’s C
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"))
ggplot(Bandung_LISA) +
geom_sf(aes(fill = quad), color="white", size=0.2) +
scale_fill_manual(values=c(
"High-High"="#d73027","Low-Low"="#4575b4",
"High-Low (Outlier)"="#fdae61","Low-High (Outlier)"="#74add1",
"Not significant"="grey85"
)) +
labs(title="Local Moran's I (LISA)", fill="Kategori") +
theme_minimal()
Identifikasi kecamatan yang masuk kategori High-High, Low-Low, High-Low, dan Low-High
Buat peta cluster LISA
Apa interpretasi hasil ini untuk kasus penyakit menular?
High-High cluster (selatan & tenggara
Bandung):
Daerah ini adalah hotspot penyakit menular, karena
tingkat kasusnya tinggi dan dikelilingi oleh wilayah lain yang juga
tinggi. Hal ini mengindikasikan adanya penyebaran
spasial di kawasan tersebut. Dalam konteks epidemiologi,
wilayah ini harus menjadi prioritas intervensi
kesehatan (misalnya peningkatan fasilitas kesehatan,
penyemprotan, kampanye pencegahan).
Low-High outlier (tengah–timur Bandung):
Daerah ini memiliki kasus rendah, tetapi dikelilingi oleh wilayah dengan
kasus tinggi. Hal ini bisa berarti:
Wilayah tersebut memiliki perlindungan atau program pencegahan yang baik, sehingga kasus lebih rendah meskipun dikelilingi wilayah berisiko.
Bisa juga mencerminkan adanya under-reporting
(data kasus tidak tercatat lengkap).
Daerah ini menarik untuk diteliti lebih lanjut, karena bisa memberi
pelajaran penting tentang faktor protektif atau
kelemahan dalam pencatatan kasus.
Tidak ada Low-Low atau High-Low:
Menunjukkan tidak ada area “dingin” yang jelas (Low-Low) maupun outlier
High-Low. Pola utama adalah konsentrasi kasus tinggi di wilayah
selatan–tenggara.
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.00000 Min. :-1.7154 MULTIPOLYGON :30
## 1st Qu.:0.01741 1st Qu.:0.02948 1st Qu.:-1.2275 epsg:NA : 0
## Median :0.06439 Median :0.06943 Median :-0.8652 +proj=long...: 0
## Mean :0.14625 Mean :0.16909 Mean :-0.1056
## 3rd Qu.:0.21543 3rd Qu.:0.25709 3rd Qu.: 0.4811
## Max. :0.65444 Max. :0.66187 Max. : 3.3115
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)"="#b2182b",
"Cold spot (p0.05)"="#2166ac",
"Not significant"="grey85")) +
labs(title="Getis–Ord Gi* — Hot/Cold Spots (z-skor)", fill=NULL) +
theme_minimal()
Sensitivitas bobot spasial
# Rook: buat ulang neighbor dengan queen = FALSE
nb_rook <- spdep::poly2nb(sf::as_Spatial(Bandung_sf), queen = FALSE)
lw_rook <- spdep::nb2listw(nb_rook, style="W")
# kNN (k = 4)
coords <- sf::st_coordinates(sf::st_centroid(Bandung_sf))
## Warning: st_centroid assumes attributes are constant over geometries
nb_knn <- spdep::knn2nb(spdep::knearneigh(coords, k = 4))
lw_knn <- spdep::nb2listw(nb_knn, style="W")
# Bandingkan rata-rata z(Gi*) untuk tiga bobot
c(
mean_z_queen = mean(spdep::localG(Bandung_merged$rate10k, lwW)),
mean_z_rook = mean(spdep::localG(Bandung_merged$rate10k, lw_rook)),
mean_z_knn4 = mean(spdep::localG(Bandung_merged$rate10k, lw_knn))
)
## mean_z_queen mean_z_rook mean_z_knn4
## -0.10564947 -0.06100198 -0.12533993
Interpretasi:
Tentukan kecamatan yang termasuk hot spot dan cold spot
Bandingkan hasilnya dengan peta LISA
Kesamaan:
Baik LISA maupun Getis–Ord Gi* sama-sama menunjukkan wilayah selatan dan tenggara Bandung sebagai klaster signifikan kasus tinggi.
Keduanya mengindikasikan adanya pola hotspot penyakit menular.
Perbedaan:
Apakah ada perbedaan wilayah yang ditandai sebagai klaster signifikan?
Ya, ada perbedaan kecil:
LISA: selain klaster High-High (selatan–tenggara), juga mendeteksi satu Low-High outlier di wilayah tengah-timur.
Getis–Ord Gi*: hanya menandai hot spot di selatan–tenggara, tidak menampilkan outlier maupun cold spot.
1. Bagaimana hasil analisis autokorelasi spasial bisa membantu dinas kesehatan dalam menyusun strategi pencegahan dan intervensi penyakit menular di Kota Bandung?
Identifikasi wilayah prioritas (hotspot)
Deteksi outlier untuk evaluasi kebijakan
Hasil LISA mengungkap adanya wilayah Low-High (kasus rendah di tengah wilayah tinggi).
Dinas kesehatan bisa meneliti apakah daerah ini:
memang memiliki praktik pencegahan yang efektif (misalnya sanitasi lebih baik, cakupan imunisasi lebih tinggi), atau
justru ada under-reporting kasus.
Perencanaan intervensi berbasis spasial
Dengan mengetahui klaster penyakit, dinas bisa menyusun intervensi berbasis wilayah, misalnya:
Pemantauan efektivitas program
Dasar advokasi dan penganggaran
Peta klaster penyakit menjadi alat komunikasi visual yang kuat untuk pemerintah daerah.
Dinas kesehatan dapat menunjukkan bukti spasial ketika mengajukan anggaran tambahan atau dukungan lintas sektor (PU untuk sanitasi, DLH untuk lingkungan, dll).
2. Sebutkan keterbatasan dari analisis autokorelasi spasial!
MAUP (Modifiable Areal Unit Problem)
Ukuran bobot spasial (rook, queen, k-nearest neighbors)
Masalah multiple testing pada analisis lokal