Autokorelasi spasial adalah konsep dalam analisis geostatistik yang mengukur sejauh mana kemiripan atau keterkaitan nilai suatu variabel pada suatu lokasi geografis dengan nilai variabel yang sama di lokasi-lokasi sekitarnya. Terdapat dua jenis autokorelasi spasial yaitu :
1. Autokorelasi spasial positif Ini terjadi ketika lokasi-lokasi yang berdekatan memiliki nilai-nilai yang mirip. Misalnya, daerah dengan tingkat kemiskinan tinggi cenderung berdekatan dengan daerah lain yang juga memiliki tingkat kemiskinan tinggi. Hal ini menciptakan pola pengelompokan (clustering).
2. Autokorelasi spasial negatif Jenis ini terjadi ketika lokasi-lokasi yang berdekatan memiliki nilai-nilai yang berbeda atau tidak mirip. Misalnya, daerah dengan tingkat kepadatan penduduk tinggi berdekatan dengan daerah berpenduduk rendah. Ini menciptakan pola menyebar (dispersed).
1. Autokorelasi Positif Kasus penyakit menular, seperti demam berdarah, daerah dengan kasus tinggi sering kali dikelilingi daerah-daerah yang juga berkasus tinggi.
2. Autokorelasi Negatif penyebaran populasi predator, seekor harimau tidak akan tinggal berdekatan dengan harimau lainnya, karena predator cenderung memiliki sifat teritorial.
Moran’s I
\[
I = \frac{n}{W} \cdot \frac{\sum_i \sum_j w_{ij} (x_i - \bar{x})(x_j -
\bar{x})}{\sum_i (x_i - \bar{x})^2}
\]
Mengukur autokorelasi spasial secara global dengan membandingkan
kovariansi spasial terhadap varians total.
Geary’s C
\[
C = \frac{(n-1)}{2W} \cdot \frac{\sum_i \sum_j w_{ij} (x_i -
x_j)^2}{\sum_i (x_i - \bar{x})^2}
\]
Menekankan perbedaan lokal antara nilai tetangga; nilai kecil
menunjukkan kesamaan tinggi, nilai besar menunjukkan perbedaan
besar.
Local Moran’s \(I_i\)
\[
I_i = \frac{(x_i - \bar{x})}{m_2} \sum_j w_{ij}(x_j - \bar{x})
\]
Digunakan untuk mengidentifikasi klaster atau outlier pada lokasi
tertentu dengan melihat hubungan nilai sebuah titik dengan
tetangganya.
Getis–Ord \(G_i\) dan \(G_i^*\)
\[
G_i = \frac{\sum_j w_{ij} x_j}{\sum_j x_j}, \quad
G_i^* = \frac{\sum_j w_{ij} x_j}{\sum_j x_j}
\]
Digunakan untuk mengukur konsentrasi nilai tinggi (hot spot) atau
rendah (cold spot) di sekitar lokasi \(i\).
Perbedaan utama adalah pada definisi bobot \(w_{ij}\), apakah titik \(i\) sendiri ikut dihitung atau tidak.
**Global**Mengukur kekuatan dan arah (positif atau negatif) dari autokorelasi spasial untuk seluruh dataset. Ini memberikan satu nilai statistik yang mewakili pola keseluruhan di seluruh peta.
**Lokal**
Mengidentifikasi lokasi-lokasi spesifik yang signifikan secara
statistik, seperti hot spot, cold spot, dan outlier spasial. Ukuran ini
memberikan nilai untuk setiap lokasi individual dalam dataset.#Analisis Data (Simulasi) ## 1. Data Spasial Kota Bandung
library(sf)
## Warning: package 'sf' was built under R version 4.4.3
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
library(sp)
## Warning: package 'sp' was built under R version 4.4.3
library(spdep)
## Warning: package 'spdep' was built under R version 4.4.3
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.4.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)
##
## 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)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(spData)
# Baca data RDS level kecamatan Indonesia
Indo_Kec <- readRDS(file.choose())
# Filter hanya Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung$id <- seq_len(nrow(Bandung))
Bandung_sf <- sf::st_as_sf(Bandung)
# Jika data asli tidak ada, siapkan grid simulasi (30 poligon)
if(!exists("Bandung_sf") || nrow(Bandung_sf) == 0){
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
}
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate15k), color="white", size=0.2) +
scale_fill_viridis_c(option="magma") +
labs(title="Rate Diare (per 12.000 penduduk) — Simulasi",
fill="Rate") +
theme_minimal()
Di bagian barat laut-utara dan timur peta, terdapat klaster kecamatan dengan rate diare sangat tinggi, ditandai dengan warna krem hingga oranye. Pola ini menunjukkan adanya hotspot di wilayah tersebut. Sebaliknya, di bagian selatan peta, terdapat klaster besar dengan rate diare yang sangat rendah, ditandai dengan warna ungu gelap hingga hitam, Area-area ini dapat dianggap sebagai coldspot. peta ini menunjukkan bahwa rate diare tidak menyebar secara acak, melainkan membentuk klaster dengan heterogenitas spasial yang kuat. Keberadaan hotspot dan coldspot secara berdampingan membuktikan adanya autokorelasi spasial positif # Pengukuran Autokorelasi
moran_res <- spdep::moran.test(Bandung_merged$rate15k, lwW,
randomisation = TRUE, alternative = "two.sided")
moran_res
##
## Moran I test under randomisation
##
## data: Bandung_merged$rate15k
## weights: lwW
##
## Moran I statistic standard deviate = 5.3982, p-value = 6.733e-08
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.57968312 -0.03448276 0.01294435
Nilai Moran’s I:
Hasil perhitungan memberikan nilai Moran’s I =
0.5796.
Signifikansi Statistik (uji permutasi):
Nilai p-value = 6.733e-08⁶, jauh lebih kecil
dari 0.05.
Ini berarti pola spasial yang terdeteksi signifikan secara
statistik.
Interpretasi:
Nilai Moran’s I positif dan signifikan menunjukkan adanya
autokorelasi spasial positif.
Artinya, kecamatan dengan angka kejadian diare yang tinggi cenderung
berdekatan
dengan kecamatan lain yang juga tinggi, demikian pula sebaliknya untuk
wilayah
dengan angka kejadian rendah (cluster hotspot dan
coldspot).
geary_res <- spdep::geary.test(Bandung_merged$rate15k, lwW,
randomisation = TRUE, alternative = "two.sided")
geary_res
##
## Geary C test under randomisation
##
## data: Bandung_merged$rate15k
## weights: lwW
##
## Geary C statistic standard deviate = 4.8698, p-value = 1.117e-06
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 0.42477608 1.00000000 0.01395243
Perbandingan dengan Moran’s I:
Hasil uji memberikan nilai Geary’s C = 0.4247 dengan
p-value = 1.117e-06.
Nilai ini jauh lebih kecil dari ekspektasi (1.0), sehingga menunjukkan
adanya autokorelasi spasial positif.
Temuan ini konsisten dengan hasil Moran’s I (0.5796, signifikan),
sehingga kedua ukuran
sama-sama mendeteksi adanya clustering kasus diare di Kota
Bandung.
Perbedaan sensitivitas Moran’s I vs Geary’s C:
x <- scale(Bandung_merged$rate15k)[,1]
lagx <- spdep::lag.listw(lwW, x)
# Hitung Local Moran's I
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)"
)
# Gabungkan hasil dengan data spasial
Bandung_LISA <- dplyr::bind_cols(Bandung_merged, lisa_df) |>
dplyr::mutate(quad = ifelse(Pi.two.sided <= alpha, quad, "Not significant"))
# Ambil tabel tanpa geometry, hanya kecamatan yang signifikan
hasil_LISA_signif <- Bandung_LISA |>
dplyr::select(NAME_3, quad, Ii, Pi.two.sided) |>
sf::st_set_geometry(NULL) |>
dplyr::filter(Pi.two.sided <= 0.05)
hasil_LISA_signif
Berdasarkan hasil perhitungan Local Moran’s I dengan tingkat signifikansi 5%:
High-High (Hotspot): Ditemukan pada kecamatan Cibiru, Cicadap, Coblong, Sukajadi, dan Sukasari. Artinya, kecamatan ini memiliki angka kasus diare tinggi dan dikelilingi oleh wilayah dengan angka tinggi juga (klaster kasus tinggi di bagian barat–utara Bandung).
Low-Low (Coldspot): Muncul pada kecamatan Buahbatu. Wilayah ini menunjukkan angka kasus rendah yang juga dikelilingi oleh tetangga dengan kasus rendah.
Low-High (Outlier): Tidak ditemukan kecamatan dengan kategori ini pada tingkat signifikansi 5%.
High-Low (Outlier): Tidak ditemukan kecamatan dengan kategori ini pada tingkat signifikansi 5%.
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()
Pola High-High di barat laut-utara dan timur menunjukkan adanya hotspot kasus penyakit menular, sehingga wilayah ini berpotensi menjadi pusat penyebaran penyakit dan perlu menjadi prioritas intervensi kesehatan.
Pola Low-Low di selatan menunjukkan adanya coldspot dengan tingkat kasus rendah yang relatif konsisten, bisa menjadi contoh daerah dengan kondisi lingkungan atau program kesehatan yang efektif.
Ketiadaan pola Low-High (Outlier) signifikan menunjukkan tidak ada kecamatan dengan kasus rendah yang berada di tengah wilayah dengan kasus tinggi.
Ketiadaan pola High-Low (Outlier) signifikan menunjukkan tidak ada kecamatan dengan kasus tinggi yang berada di tengah wilayah dengan kasus rendah.
Secara keseluruhan, hasil ini mendukung hipotesis bahwa penyakit menular cenderung membentuk kluster spasial, dengan adanya wilayah hotspot dan coldspot yang jelas terlihat.
# Bangun matriks tetangga (queen)
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_sf), queen = TRUE)
lwW <- spdep::nb2listw(nb, style="W") # row-standardized weights
lwB <- spdep::nb2listw(nb, style = "B", zero.policy = TRUE) # bobot biner
x_raw <- Bandung_merged$rate15k
sum_x <- sum(x_raw)
# Matriks bobot biner (tidak distandarisasi)
Wb <- spdep::listw2mat(lwB) # diag = 0
# G_i (tanpa i)
num_G <- as.numeric(Wb %*% x_raw)
den_G <- (sum_x - x_raw)
G_raw <- num_G / den_G
# G_i^* (dengan i)
Wb_star <- Wb; diag(Wb_star) <- 1
num_Gs <- as.numeric(Wb_star %*% x_raw)
den_Gs <- sum_x
G_star_raw <- num_Gs / den_Gs
# Z-skor (spdep::localG)
Gz <- spdep::localG(x_raw, listw = lwW)
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 (p<0.05)",
z_Gistar <= -1.96 ~ "Cold spot (p<0.05)",
TRUE ~ "Not significant"
)
)
# Ringkasan hasil
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. :-2.02293 MULTIPOLYGON :30
## 1st Qu.:0.03276 1st Qu.:0.04567 1st Qu.:-1.48064 epsg:NA : 0
## Median :0.12366 Median :0.13546 Median :-0.82361 +proj=long...: 0
## Mean :0.15218 Mean :0.17598 Mean :-0.06713
## 3rd Qu.:0.22807 3rd Qu.:0.27446 3rd Qu.: 1.08666
## Max. :0.50312 Max. :0.54367 Max. : 3.53210
hasil_Gi_star <- Bandung_G |>
dplyr::select(NAME_3, z_Gistar, hotcold) |>
sf::st_set_geometry(NULL) |>
dplyr::filter(hotcold != "Not significant") |>
dplyr::arrange(desc(z_Gistar))
hasil_Gi_star
Berdasarkan nilai z_Gistar (p < 0.05):
Kecamatan Coblong (z = 3.532)
Kecamatan Sukajadi (z = 3.396)
Kecamatan Sukasari (z = 2.792)
Kecamatan Cicadap (z = 2.160)
Kecamatan Cibiru (z = 2.097)
ggplot(Bandung_G) +
geom_sf(aes(fill = G_star_raw), color="white", size=0.2) +
scale_fill_viridis_c() +
labs(title="Raw Getis–Ord Gi* (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 (p<0.05)"="#b2182b",
"Cold spot (p<0.05)"="#2166ac",
"Not significant"="grey85")) +
labs(title="Getis–Ord Gi* — Hot/Cold Spots (z-skor)", fill=NULL) +
theme_minimal()
1. Peta Raw G* - Nilai tinggi (G_raw
kuning–hijau) terkonsentrasi di bagian barat laut-utara Bandung, sedikit
berbeda dengan hasil hot spot yang juga ada pada bagian timur.
- Nilai rendah (*G*\_raw ungu–biru tua) banyak ditemukan di wilayah selatan, sejalan dengan hasil cold spot.
Perbandingan dengan Peta LISA
Konsistensi:
Pola Gi* relatif konsisten dengan peta LISA, di mana hot spot muncul di
barat laut-utara dan cold spot di selatan. Akan tetapi terdapat satu
perbedaan hasil pada bagian timur yang mana pada LISA dianggap sebagai
hotspot sementara pada Pola Gi* dianggap sebagai menengah keatas belum
menjadi hotspot
Perbedaan:
LISA dapat menunjukkan lebih banyak tipe klaster (HH, LL, HL, LH),
sementara Gi* hanya menandai area dengan konsentrasi
signifikan.
Kesimpulan
Hot spot signifikan: Coblong, Sukajadi, Sukasari, Cicadap, dan Cibiru.
Cold spot signifikan: Buahbatu.
Hasil Gi* cukup sejalan dengan peta LISA, tetapi lebih fokus pada klaster dengan konsentrasi tinggi sehingga terdapat perbedaan pada peta bagian timur dengan peta LISA.
Hasil analisis autokorelasi spasial dapat membantu Dinas Kesehatan dalam:
- Identifikasi klaster signifikan: Menentukan daerah dengan tingkat kasus tinggi (Hotspot) dan daerah dengan tingkat kasus rendah (Coldspot)
- Prioritas intervensi: dapat memilih prioritas pemberdayaan tenaga kerja kesehatan dan program kesehatan, dengan prioritas pada wilayah hotspot.
- Perencanaan pencegahan: Wilayah cold spot dijaga agar pasien dari hotspot tidak menyebar hingga ke coldspot.
- Evidensi berbasis data spasial: Membantu pengambilan keputusan berbasis dari lokasi.
Meskipun bermanfaat, analisis autokorelasi spasial memiliki sejumlah keterbatasan, di antaranya:
MAUP (Modifiable Areal Unit Problem)
Hasil analisis sangat dipengaruhi oleh skala (ukuran) dan zonasi (cara
pengelompokan) wilayah. Perubahan pada batas-batas administratif,
seperti menggabungkan atau memecah kecamatan, bisa secara signifikan
mengubah nilai statistik dan pola klaster (hotspot atau
coldspot).
Ukuran bobot spasial
Hasil analisis sangat sensitif terhadap cara mendefinisikan hubungan
antar wilayah. Pilihan metode tetangga, seperti Rook (berbagi sisi),
Queen (berbagi sisi atau titik sudut), atau k-nearest neighbors
(tetangga terdekat), dapat menghasilkan nilai autokorelasi yang berbeda,
Sehingga perlu disesuaikan dengan konteks data yang dianalisa.
Masalah multiple testing
Ketika melakukan analisis lokal seperti LISA atau Getis-Ord Gi*,
peneliti melakukan uji signifikansi statistik pada setiap lokasi secara
bersamaan. Hal ini meningkatkan kemungkinan mendapatkan hasil false
positive, di mana sebuah lokasi dianggap signifikan secara statistik
padahal sebenarnya tidak. Oleh karena itu, diperlukan metode koreksi
seperti FDR (False Discovery Rate) untuk mengendalikan tingkat eror dan
memastikan keandalan hasil yang dilaporkan.
Kesimpulan
Analisis Autokorelasi Spasial dapat membantu untuk memetakan distribusi penyakit menular di suatu daerah. Namun, hasil dari analisis tetap harus diperhatikan baik-baik agar interpretasi tetap sesuai dengan data yang digunakan dan memperhatikan juga dari keterbatasan metodologis seperti MAUP, pemilihan bobot spasial, dan isu multiple testing.