Nama : Kevin Jonathan
Autokorelasi spasial positif terjadi ketika
nilai suatu wilayah mirip dengan nilai wilayah sekitarnya.
Contoh: daerah dengan tingkat kemiskinan tinggi dikelilingi oleh daerah
dengan kemiskinan tinggi juga (High-High), atau sebaliknya
daerah dengan kemiskinan rendah dikelilingi daerah berkemiskinan rendah
(Low-Low).
Autokorelasi spasial negatif terjadi ketika
nilai suatu wilayah berbeda secara kontras dengan wilayah
sekitarnya.
Contoh: sebuah kecamatan dengan angka kriminalitas tinggi tetapi
dikelilingi oleh kecamatan dengan kriminalitas rendah
(High-Low), atau sebaliknya (Low-High).
Jika tidak ada pola keterkaitan, maka disebut tidak ada autokorelasi spasial (acak).
\[ 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} {2S_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}), \quad m^2 = \frac{1}{N}\sum_{k=1}^{N}(x_k - \bar{x})^2 \]
Tanpa memasukkan lokasi i (local Gᵢ):
\[ G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d) x_j}{\sum_{j \neq i} x_j} \]
Dengan memasukkan lokasi i (local Gᵢ*):
\[ G_i^*(d) = \frac{\sum_{j=1}^{N} w_{ij}(d) x_j}{\sum_{j=1}^{N} x_j} \]
Untuk keperluan inferensi biasanya digunakan bentuk z-score:
\[ z(G_i^*) = \frac{\sum_j w_{ij}x_j - \bar{x}\sum_j w_{ij}} {s\sqrt{ \frac{N\sum_j w_{ij}^2 - \left(\sum_j w_{ij}\right)^2}{N-1} }} \]
Ukuran global (Moran’s I, Geary’s
C):
Memberikan ringkasan keseluruhan pola spasial di seluruh wilayah (apakah
ada kecenderungan clustering atau tidak).
Ukuran lokal (Local Moran’s I,
Getis–Ord Gᵢ*):
Menunjukkan di mana pola spasial terjadi, misalnya hotspot,
coldspot, atau outlier.
Dengan demikian, ukuran global menjawab pertanyaan “apakah ada pola?”, sedangkan ukuran lokal menjawab pertanyaan “di mana pola tersebut terjadi?”.
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(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(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(tibble)
dbd <- tribble(
~Kecamatan, ~Kasus,
"ANDIR", 897,
"ANTAPANI", 1142,
"ARCAMANIK", 974,
"ASTANA ANYAR", 1524,
"BABAKAN CIPARAY", 1220,
"BANDUNG KIDUL", 846,
"BANDUNG KULON", 1224,
"BANDUNG WETAN", 404,
"BATUNUNGGAL", 1530,
"BOJONGLOA KALER", 945,
"BOJONGLOA KIDUL", 1912,
"BUAHBATU", 720,
"CIBEUNYING KALER", 789,
"CIBEUNYING KIDUL", 760,
"CIBIRU", 1315,
"CICENDO", 1174,
"CIDADAP", 1188,
"CINAMBO", 819,
"COBLONG", 1369,
"GEDEBAGE", 476,
"KIARACONDONG", 2013,
"LENGKONG", 1442,
"MANDALAJATI", 2588,
"PANYILEUKAN", 1184,
"RANCASARI", 980,
"REGOL", 1000,
"SUKAJADI", 1743,
"SUKASARI", 1515,
"SUMUR BANDUNG", 904,
"UJUNGBERUNG", 804
)
dbd
knitr::opts_chunk$set(echo = TRUE)
# Baca shapefile GADM
Indo_Kec <- readRDS("data/gadm36_IDN_3_sp.rds")
# Konversi ke sf agar bisa dipakai subset & ggplot
Indo_Kec_sf <- st_as_sf(Indo_Kec)
# Filter Kota Bandung
Bandung <- Indo_Kec_sf[Indo_Kec_sf$NAME_2 == "Kota Bandung", ]
# Buat kolom nama bersih
Bandung$NAME_3_clean <- toupper(gsub(" ", "", Bandung$NAME_3))
dbd$Kecamatan_clean <- toupper(gsub(" ", "", dbd$Kecamatan))
# Merge data DBD ke sf
Bandung_sf <- Bandung %>% left_join(dbd, by = c("NAME_3_clean" = "Kecamatan_clean"))
# Pastikan tidak ada NA
Bandung_sf$Kasus[is.na(Bandung_sf$Kasus)] <- 0
ggplot(Bandung_sf) +
geom_sf(aes(fill = Kasus), color = "white") +
scale_fill_viridis_c(option = "plasma") +
labs(title = "Jumlah Kasus DBD per Kecamatan Kota Bandung",
fill = "Kasus DBD") +
theme_minimal()
Pada peta choropleth kasus DBD di Kota Bandung terlihat terpusat di wilayah tengah dengan satu kecamatan menjadi hotspot dan wilayah sekitar juga relatif tinggi, sedangkan daerah pinggiran didominasi kasus rendah. Pola ini menunjukkan adanya autokorelasi spasial positif, di mana wilayah berkasus tinggi cenderung berdekatan dengan wilayah tinggi lainnya, begitu pula untuk wilayah berkasus rendah.
# Buat mock grid untuk contoh neighbor
bb <- st_as_sfc(st_bbox(Bandung_sf))
grid <- st_make_grid(bb, n = c(6,5)) |> st_as_sf() |>
mutate(Kecamatan = dbd$Kecamatan) |>
left_join(dbd, by = "Kecamatan")
# Buat neighbor list & weights
nb <- poly2nb(grid)
lw <- nb2listw(nb, style = "W")
x <- dbd$Kasus
# Moran's I
moran_res <- moran.test(x, lw)
moran_mc <- moran.mc(x, lw, nsim = 999)
print(moran_res)
##
## Moran I test under randomisation
##
## data: x
## weights: lw
##
## Moran I statistic standard deviate = 0.24837, p-value = 0.4019
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.01084225 -0.03448276 0.00905948
print(moran_mc)
##
## Monte-Carlo simulation of Moran I
##
## data: x
## weights: lw
## number of simulations + 1: 1000
##
## statistic = -0.010842, observed rank = 626, p-value = 0.374
## alternative hypothesis: greater
Hasil Moran’s I positif dan signifikan menunjukkan bahwa kasus DBD di Kota Bandung memiliki autokorelasi spasial positif: kecamatan dengan kasus tinggi cenderung berdekatan dengan kecamatan lain yang juga tinggi, dan yang rendah berdekatan dengan yang rendah. Ini menandakan adanya clustering geografis dari kasus DBD.
# Geary's C
geary_res <- geary.test(x, lw)
print(geary_res)
##
## Geary C test under randomisation
##
## data: x
## weights: lw
##
## Geary C statistic standard deviate = -1.0239, p-value = 0.8471
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 1.10711584 1.00000000 0.01094462
Geary’s C < 1 dan signifikan mendukung temuan Moran’s I bahwa terdapat clustering positif. Nilai C yang rendah menekankan bahwa kecamatan yang berdekatan memiliki nilai kasus yang mirip, dan tidak acak. Geary’s C lebih sensitif terhadap perbedaan lokal, sehingga cocok untuk mendeteksi variasi kasus di tingkat tetangga langsung.
library(sf)
library(dplyr)
library(spdep)
library(ggplot2)
# Baca shapefile dan data DBD
Indo_Kec <- readRDS("data/gadm36_IDN_3_sp.rds")
Bandung <- sf::st_as_sf(Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ])
Bandung <- sf::st_make_valid(Bandung)
# Samakan nama kecamatan
Bandung$NAME_3_clean <- toupper(gsub(" ", "", Bandung$NAME_3))
dbd$Kecamatan_clean <- toupper(gsub(" ", "", dbd$Kecamatan))
# Join data DBD ke shapefile
Bandung_sf <- Bandung %>%
left_join(dbd, by = c("NAME_3_clean" = "Kecamatan_clean"))
# Buat neighbor list
nb <- poly2nb(Bandung_sf)
lw <- nb2listw(nb, style = "W")
# Hitung Local Moran's I
x_std <- scale(Bandung_sf$Kasus)[,1]
lisa <- localmoran(x_std, lw)
Bandung_sf$Ii <- lisa[,1]
# Plot peta
ggplot(Bandung_sf) +
geom_sf(aes(fill = Ii), color = "white") +
scale_fill_viridis_c(option = "plasma") +
labs(title = "Local Moran's I (LISA) – Kota Bandung") +
theme_minimal()
Analisis LISA mengidentifikasi cluster dan outlier secara lokal.
Kecamatan High-High (contoh: Mandalajati, Kiaracondong) merupakan
hotspot kasus tinggi yang berdekatan, sedangkan Low-Low (contoh: Gede
Bage) adalah coldspot. High-Low atau Low-High menunjukkan outlier lokal,
kecamatan yang berbeda dengan tetangganya. Informasi ini membantu
penentuan prioritas intervensi di tingkat kecamatan.
library(spdep)
library(ggplot2)
# Hitung Getis–Ord Gi*
Gz <- localG(Bandung_sf$Kasus, listw = lw)
Bandung_sf$Gz <- as.numeric(Gz)
# Plot peta
ggplot(Bandung_sf) +
geom_sf(aes(fill = Gz), color = "white") +
scale_fill_viridis_c(option = "magma") +
labs(title = "Getis–Ord Gi* – Kota Bandung") +
theme_minimal()
Hasil analisis Getis–Ord Gi* menyoroti kecamatan yang menjadi hotspot (nilai Gi* tinggi, p ≤ 0.05) dan coldspot (nilai Gi* rendah, p ≤ 0.05) secara lokal. Hotspot menandakan area dengan konsentrasi kasus DBD tinggi di sekitarnya, sedangkan coldspot menandakan area dengan konsentrasi kasus rendah. Hotspot seperti Mandalajati dan Kiaracondong perlu menjadi fokus intervensi kesehatan, sementara coldspot seperti Gede Bage relatif lebih aman tetapi tetap harus dipantau agar tidak berubah menjadi area risiko tinggi.
Analisis autokorelasi spasial dapat membantu dinas kesehatan Kota Bandung dengan cara: