Mahasiswa memahami konsep dasar autokorelasi spasial, mampu menghitung ukuran global dan lokal (Moran’s I, Geary’s C, Local Moran’s I, Getis–Ord), serta menginterpretasikan hasil dalam konteks nyata.
Menurut saya autokorelasi spasial positif terjadi ketika suatu wilayah memiliki nilai yang mirip dengan wilayah di sekitarnya. Misalnya daerah dengan angka tinggi dikelilingi oleh daerah dengan angka tinggi juga, atau sebaliknya daerah rendah dikelilingi daerah rendah. Jadi, ada kecenderungan nilai berkelompok (clustering).
Sebaliknya, autokorelasi spasial negatif muncul ketika suatu wilayah justru memiliki nilai yang berlawanan dengan tetangganya. Contohnya, daerah dengan nilai tinggi dikelilingi oleh nilai rendah, atau sebaliknya. Pola ini sering disebut checkerboard karena pola tinggi-rendahnya saling bergantian.
\[ 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} \]
Keterangan:
- \(N\) = jumlah unit spasial
(wilayah)
- \(x_i\) = nilai variabel pada unit
\(i\)
- \(\bar{x}\) = rata-rata dari seluruh
nilai
- \(w_{ij}\) = bobot spasial antara
unit \(i\) dan \(j\)
- \(S_0 = \sum_i \sum_j w_{ij}\) =
total bobot spasial
\[ C = \frac{(N-1)\sum_{i=1}^{N}\sum_{j=1}^{N} w_{ij}(x_i - x_j)^2} {2S_0 \sum_{i=1}^{N}(x_i - \bar{x})^2} \]
Keterangan:
- \(N\) = jumlah unit spasial
- \(x_i, x_j\) = nilai variabel pada
unit \(i\) dan \(j\)
- \(w_{ij}\) = bobot spasial
- \(S_0\) = total bobot spasial
- Fokus pada perbedaan nilai antar tetangga (kontras lokal).
\[
I_i = \frac{(x_i-\bar{x})}{m^2}
\sum_{j=1}^{N} w_{ij}(x_j-\bar{x}),
\quad m^2 = \frac{1}{N}\sum_{k=1}^{N}(x_k-\bar{x})^2
\] Keterangan:
- \(I_i\) = nilai indeks Moran lokal
pada unit \(i\)
- \(m^2\) = varians rata-rata dari
variabel \(x\)
- \(w_{ij}\) = bobot spasial
- Mengukur apakah unit \(i\) mirip atau
berbeda dengan tetangganya (cluster atau outlier).
\[
G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d) x_j}{\sum_{j \neq i} x_j}
\] Keterangan:
- \(G_i(d)\) = statistik Getis–Ord pada
jarak \(d\)
- \(w_{ij}(d)\) = bobot spasial (1 jika
\(j\) tetangga \(i\) pada jarak \(d\), 0 jika tidak)
- \(x_j\) = nilai variabel pada unit
\(j\)
- Mengukur konsentrasi nilai tinggi/rendah di sekitar unit \(i\), tetapi tidak termasuk \(i\) itu sendiri.
\[
G_i^*(d) = \frac{\sum_{j=1}^{N} w_{ij}(d) x_j}{\sum_{j=1}^{N} x_j}
\] Keterangan:
- \(G_i^*(d)\) = statistik Getis–Ord
dengan memasukkan unit \(i\)
- \(w_{ij}(d)\) = bobot spasial pada
jarak \(d\)
- \(x_j\) = nilai variabel pada unit
\(j\)
- Nilai tinggi \(G_i^*\)
mengindikasikan hotspot (nilai tinggi dikelilingi tinggi),
sedangkan nilai rendah menunjukkan coldspot.
Ukuran global (seperti Moran’s I dan Geary’s C) memberikan gambaran umum tentang apakah ada pola spasial secara keseluruhan dalam data. Jadi sifatnya menyeluruh untuk seluruh wilayah studi.
Sedangkan ukuran lokal (seperti Local Moran’s I dan Getis–Ord Gi*) fokus pada tiap lokasi atau unit wilayah. Ukuran ini membantu kita tahu bagian mana yang menjadi hotspot, coldspot, atau bahkan outlier spasial. Jadi, ukuran lokal lebih detail karena mengungkapkan di mana pola spasial itu terjadi.
setwd("/Users/Imamul Caesar/Downloads/SPASIAL")
# Load shapefile rds
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
# Ambil Kota Bandung (periksa nama di data, biasanya "Kota Bandung")
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
# Tambahkan id
Bandung$id <- seq_len(nrow(Bandung))
# Konversi ke sf
Bandung_sf <- sf::st_as_sf(Bandung)
# Jika data asli tidak ada (untuk knit demo), buat grid dummy
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
}
# Validasi geometri
Bandung_sf <- sf::st_make_valid(Bandung_sf)
# Pastikan ada kolom id
if (!"id" %in% names(Bandung_sf)) {
Bandung_sf$id <- seq_len(nrow(Bandung_sf))
}
# Plot pakai ggplot
ggplot(Bandung_sf) +
geom_sf(fill = "grey90", color = "white") +
labs(title = "Kota Bandung - Unit (contoh)") +
theme_minimal()
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color="white", size=0.2) +
scale_fill_viridis_c(option="magma") +
labs(title="Rate TBC (per 10.000 Penduduk) — Simulasi", fill="Rate") +
theme_minimal()
Secara umum, distribusi kasus TBC di Kota Bandung tidak merata. Ada beberapa kecamatan yang terlihat menonjol dengan warna lebih terang (kuning–oranye) yang menandakan angka kasus tinggi, dan kecamatan tersebut letaknya saling berdekatan, terutama di bagian utara dan selatan kota. Hal ini menunjukkan adanya indikasi cluster kasus tinggi atau bisa disebut hotspot.
Sementara itu, sebagian besar wilayah lainnya didominasi oleh warna ungu tua hingga hitam, yang berarti angka kasusnya relatif rendah. Kecamatan-kecamatan dengan kasus rendah ini juga terlihat saling berdekatan, membentuk kelompok wilayah dengan tingkat kejadian TBC yang rendah (coldspot).
Dengan kata lain, secara visual peta ini menunjukkan adanya autokorelasi spasial positif, di mana kecamatan dengan nilai tinggi cenderung bersebelahan dengan kecamatan bernilai tinggi juga, dan sebaliknya untuk kecamatan bernilai rendah. Jadi, pola penyebarannya tidak acak, melainkan cenderung mengelompok (clustering).
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 = 5.3025, p-value = 1.142e-07
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.55946066 -0.03448276 0.01254663
Nilai Moran’s I yang diperoleh adalah 0.559.
Ya, signifikan. Hal ini terlihat dari p-value = 1.142e-07 yang jauh lebih kecil daripada taraf signifikan (0,05). Artinya, hipotesis nol ditolak, yaitu tidak ada autokorelasi spasial.
Nilai Moran’s I yang positif (0.559) dan signifikan menunjukkan adanya autokorelasi spasial positif. Dengan kata lain, kejadian penyakit (TBC per 10.000 penduduk) di Kota Bandung tidak tersebar acak, tetapi cenderung mengelompok (clustering). Kecamatan dengan angka kasus tinggi cenderung berdekatan dengan kecamatan yang juga tinggi, begitu juga untuk kasus rendah yang berdekatan dengan rendah.
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.9583, p-value = 7.112e-07
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 0.40528598 1.00000000 0.01438652
Nilai Geary’s C = 0.405. Karena nilainya < 1, ini menunjukkan adanya autokorelasi spasial positif.
Hasil ini konsisten dengan uji Moran’s I = 0.559 sebelumnya yang juga menunjukkan autokorelasi positif.
Bedanya hanya pada skala interpretasi: Moran’s I punya range -1 sampai +1, sedangkan Geary’s C berpusat di 1 (di mana nilai < 1 berarti positif, dan > 1 berarti negatif). Jadi walaupun angkanya berbeda, kesimpulan keduanya sama: ada clustering spasial pada kasus TBC.
Moran’s I lebih peka terhadap pola global (clustering secara keseluruhan). Artinya Moran’s I menangkap apakah nilai tinggi/rendah secara umum cenderung berdekatan di seluruh wilayah studi.
Geary’s C lebih peka terhadap perbedaan lokal antara suatu unit dengan tetangganya. Jadi, ukuran ini lebih sensitif kalau ada variasi kecil atau kontras antar kecamatan yang bersebelahan.
Dengan kata lain, meskipun keduanya sama-sama mendeteksi autokorelasi spasial, Moran’s I lebih global sementara Geary’s C lebih lokal dalam cara kerjanya.
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()
Pada peta yang dihasilkan terlihat bahwa wilayah yang signifikan hanya berada di bagian utara Kota Bandung, ditandai warna merah dengan kategori High–High. Artinya, kecamatan-kecamatan di utara ini memiliki angka kasus TBC tinggi dan dikelilingi oleh tetangga dengan kasus tinggi juga.
Untuk kategori Low–Low, High–Low, dan Low–High, tidak ada kecamatan yang muncul signifikan (semuanya ditampilkan abu-abu = Not significant).
Peta cluster LISA terlampir di atas.
x_raw <- Bandung_merged$rate10k
sum_x <- sum(x_raw)
# Matriks bobot biner (tidak distandarisasi)
Wb <- spdep::listw2mat(lwW) # 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.008807 Min. :0.01687 Min. :-1.7088 MULTIPOLYGON :30
## 1st Qu.:0.016617 1st Qu.:0.02451 1st Qu.:-1.1567 epsg:NA : 0
## Median :0.021757 Median :0.04168 Median :-0.7578 +proj=long...: 0
## Mean :0.034013 Mean :0.06540 Mean :-0.1448
## 3rd Qu.:0.042738 3rd Qu.:0.07648 3rd Qu.: 0.4792
## Max. :0.120036 Max. :0.21994 Max. : 4.1281
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()
Bandung_G$hotcold <- recode(Bandung_G$hotcold,
"Hot spot (p\uffff0.05)" = "Hot spot (p<0.05)",
"Coldspot" = "Cold spot (p<0.05)"
)
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()
Hot Spot Terlihat jelas pada peta Gi* (z-score) bahwa wilayah bagian utara—beberapa kecamatan di ujung utara (misalnya kecamatan A, B, C sesuai batas administrasi asli data)—berwarna merah tua. Artinya nilai variabel yang dianalisis (misal kasus penyakit/kejadian) tinggi dan dikelilingi nilai tinggi secara signifikan.
Cold Spot Tidak ada area yang berwarna biru atau kategori cold spot signifikan. Jadi tidak ditemukan cold spot signifikan.
Peta LISA menunjukkan klaster High–High (merah) di lokasi yang sama dengan hot spot pada peta Gi*. Artinya, kecamatan utara tersebut memiliki nilai tinggi yang dikelilingi tetangga bernilai tinggi, dan signifikan secara lokal.
Tidak ada perbedaan besar: area yang ditandai sebagai hot spot pada Getis–Ord Gi* sejalan dengan klaster High–High pada LISA.
Perbedaan kecil mungkin hanya pada batas presisi/tingkat signifikansi, tetapi secara spasial wilayahnya konsisten.
Keterbatasan pertama adalah masalah MAUP, yaitu hasil analisis spasial sangat dipengaruhi oleh skala dan pembagian wilayah. Pola yang tampak pada level kecamatan bisa berubah atau bahkan hilang ketika dianalisis pada level kabupaten. Fenomena ini terjadi karena adanya scale effect (perbedaan hasil akibat ukuran unit spasial) dan zoning effect (perbedaan hasil akibat cara pembagian atau batas wilayah). Dengan demikian, interpretasi autokorelasi spasial hanya berlaku pada level analisis yang digunakan dan tidak dapat langsung digeneralisasi ke skala lain.
Hasil autokorelasi spasial juga sangat bergantung pada definisi bobot spasial yang dipakai, misalnya rook, queen, atau k-nearest neighbors. Pemilihan bobot yang berbeda bisa menghasilkan kesimpulan yang berbeda, misalnya suatu wilayah terdeteksi sebagai hotspot dengan definisi queen tetapi tidak dengan rook. Karena tidak ada standar universal, pemilihan bobot spasial sering kali subjektif dan bisa saja tidak mencerminkan hubungan nyata antarwilayah, seperti interaksi sosial atau mobilitas penduduk.
Keterbatasan lainnya muncul pada analisis lokal, seperti Local Moran’s I atau Getis–Ord Gi*, karena setiap wilayah diuji secara terpisah. Hal ini menimbulkan masalah multiple testing, yaitu semakin banyak uji dilakukan semakin besar kemungkinan muncul hasil signifikan secara kebetulan (false positive). Akibatnya, peta hotspot atau coldspot bisa menampilkan wilayah “signifikan” yang sebenarnya hanya noise. Untuk mengurangi bias ini, biasanya dilakukan koreksi signifikansi atau interpretasi hasil dengan lebih hati-hati.