set.seed(1234)
Autokorelasi Spasial Positif dan Negatif
Autokorelasi spasial positif terjadi ketika lokasi yang berdekatan
memiliki nilai yang mirip (contoh: kecamatan dengan kasus diare tinggi
cenderung berdekatan dengan kecamatan lain yang juga tinggi).
Sebaliknya, autokorelasi spasial negatif muncul ketika lokasi berdekatan
justru memiliki nilai yang kontras (contoh: kecamatan dengan kasus
tinggi berdekatan dengan kecamatan dengan kasus rendah).
Contoh Fenomena
Global Moran’s I digunakan untuk mengukur derajat autokorelasi spasial secara keseluruhan dalam suatu wilayah. Nilainya dapat diinterpretasikan sebagai berikut:
Geary’s C \[ 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} \] dengan:
Local Moran’s I \[ 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 \] dengan:
Local Moran’s I (𝐼ᵢ) digunakan untuk mengukur autokorelasi spasial pada tingkat lokal, yaitu pada masing-masing unit spasial. Interpretasi nilainya adalah sebagai berikut:
Getis–Ord \(G_i\)
Tanpa memasukkan lokasi i (local \(G_i\)):
\[ G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d) \, x_j}{\sum_{j \neq i} x_j} \]
dengan:
\(x_j\): nilai variabel pada
lokasi \(j\) (misalnya jumlah kasus
penyakit).
\(w_{ij}(d)\): bobot spasial,
menunjukkan hubungan atau kedekatan lokasi \(i\) dengan lokasi \(j\) pada jarak \(d\).
Perhitungan tidak memasukkan nilai lokasi \(i\) sendiri.
Lokasi \(i\) dievaluasi hanya berdasarkan nilai tetangganya.
Memasukkan lokasi i (local \(G_i^*\)): \[ G_i^*(d) = \frac{\sum_{j=1}^N w_{ij}(d) \, x_j}{\sum_{j=1}^N x_j}, \quad \text{dengan } w_{ii}(d) = 1 \]
dengan:
Nilai besar \(G_i^*\) mengindikasikan hot spot (nilai tinggi dikelilingi tinggi), sedangkan nilai kecil mengindikasikan cold spot.
Untuk inferensi, \(G_i^*\) biasanya
didistandarisasi menjadi \(z(G_i^*)\).
Bentuk z-skor (yang umum dihitung oleh perangkat lunak) adalah:
\[ 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 - (\sum_j w_{ij})^2}{N-1}}} \]
dengan:
dengan standar deviasi \(s\):
\[ s = \sqrt{\frac{\sum_k (x_k - \bar{X})^2}{N}} \]
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)
## Warning: package 'dplyr' was built under R version 4.4.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)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(mapview)
## Warning: package 'mapview' was built under R version 4.4.3
library(spData)
# Baca data peta level kecamatan
setwd("C:/Users/Owner/Downloads")
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
# Filter untuk Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung$id <- seq_len(nrow(Bandung))
Bandung_sf <- st_as_sf(Bandung)
# Plot peta dengan ggplot
ggplot(Bandung_sf) +
geom_sf(fill = "grey90", color = "white") +
labs(title = "Kota Bandung - Unit (contoh)") +
theme_minimal()
# 2. Neighbor queen
nb <- poly2nb(sf::as_Spatial(Bandung_sf), queen = TRUE)
# 3. Listw untuk analitik global/lokal
lwW <- nb2listw(nb, style = "W") # row-standardized
lwB <- nb2listw(nb, style = "B") # binary (untuk raw G)
# 4. Simulasi variabel acak
N <- nrow(Bandung_sf)
z <- rnorm(N)
lz <- lag.listw(lwW, z)
beta0 <- 1.2
beta1 <- 0.6
beta2 <- 1.0
lambda <- exp(beta0 + beta1 * scale(z) + beta2 * scale(lz))
# 5. Simulasi populasi dan kasus
pop <- round(runif(N, 3000, 8000))
cases <- rpois(N, lambda = lambda * (pop / 10000))
# 6. Buat data tibble
Diare <- tibble(
id = Bandung_sf$id,
pop = pop,
cases = cases,
rate10k = (cases / pop) * 10000
)
# 7. Merge data dengan shapefile
Bandung_merged <- left_join(Bandung_sf, Diare, by = "id")
# 8. Plot hasil simulasi
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color = "white", size = 0.2) +
scale_fill_viridis_c(option = "magma") +
labs(title = "Rate Diare (per 10.000) — Simulasi", fill = "Rate") +
theme_minimal()
Berdasarkan peta choropleth yang dihasilkan dari data simulasi, pola spasial yang terlihat secara visual adalah adanya pengelompokan (klaster) kasus yang jelas.
Klaster Kasus Tinggi (Hotspot): Terlihat konsentrasi kecamatan dengan rate diare yang tinggi (diwarnai kuning cerah dan oranye) di wilayah timur Kota Bandung. Kecamatan seperti Gedebage, Rancasari, dan sekitarnya membentuk sebuah “hotspot” di mana rate penyakit jauh lebih tinggi dibandingkan wilayah lain.
Klaster Kasus Rendah (Coldspot): Sebaliknya, sebagian besar kecamatan di wilayah barat dan utara menunjukkan rate diare yang sangat rendah (diwarnai ungu tua hingga hitam), membentuk area “dingin” atau coldspot.
Kesimpulan Pola: Sebaran kasus dalam simulasi ini tidak acak secara geografis. Adanya klaster ini menunjukkan adanya autokorelasi spasial positif, di mana lokasi yang berdekatan cenderung memiliki nilai rate yang serupa. Dalam skenario nyata, pola seperti ini bisa mengindikasikan adanya faktor risiko lingkungan atau sosial yang terlokalisasi di area tersebut (misalnya, sumber air, sanitasi, dll.).
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
Berdasarkan output uji statistik autokorelasi spasial, berikut adalah interpretasi hasilnya:
Berapa nilai Moran’s I?
Nilai Moran’s I statistic adalah
0.39085537. Nilai ini positif dan jauh
lebih tinggi dari nilai harapan (ekspektasi) di bawah asumsi acak
(-0.03448276), yang menjadi indikasi awal adanya
autokorelasi spasial positif.
Apakah signifikan secara statistik (uji permutasi)?
Ya, hasilnya sangat signifikan secara statistik.
Nilai p-value adalah 2.72e-05 (atau
0.0000272). Karena nilai ini jauh lebih kecil dari ambang
batas signifikansi umum (misalnya, \(\alpha =
0.05\)), kita dapat dengan yakin menolak hipotesis
nol. Hipotesis nol dalam uji ini menyatakan bahwa data tersebar
secara acak di seluruh wilayah tanpa pola tertentu. Hasil ini memberikan
wawasan penting mengenai pola spasial penyakit diare:
Pola Tidak Acak: Sebaran rate diare di wilayah studi bukanlah acak.
Adanya Pengelompokan (Clustering): Nilai Moran’s I yang positif dan signifikan mengonfirmasi adanya autokorelasi spasial positif. Artinya, kecamatan-kecamatan dengan rate diare yang tinggi cenderung berdekatan satu sama lain, dan sebaliknya, kecamatan-kecamatan dengan rate diare yang rendah juga cenderung saling berdekatan.
Secara sederhana, hasil ini membuktikan secara statistik apa yang terlihat secara visual pada peta: terdapat klaster atau pengelompokan kasus diare yang signifikan di Kota Bandung.
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
Setelah melakukan uji Moran’s I, uji Geary’s C dilakukan sebagai pembanding untuk memperkuat analisis autokorelasi spasial.
Hasil uji Geary’s C mengonfirmasi kesimpulan yang
sama dengan uji Moran’s I: terdapat autokorelasi
spasial positif yang signifikan (atau pengelompokan) pada data.
Nilai statistik Geary’s C adalah 0.586,
yang lebih kecil dari nilai harapan (1), dan nilai p-value
(0.00144) menunjukkan signifikansi statistik yang
tinggi.
Perbedaan mendasar antara keduanya terletak pada sensitivitas mereka terhadap pola data yang berbeda.
Moran’s I mengukur kovariansi spasial dengan membandingkan nilai
suatu lokasi dan tetangganya terhadap rata-rata global.
Formulanya secara konseptual mirip dengan
(nilai_lokasi - rata_rata) * (nilai_tetangga - rata_rata).
Geary’s C berfokus pada jumlah kuadrat perbedaan antara
nilai-nilai yang bertetangga, dengan formula konseptual seperti
(nilai_lokasi - nilai_tetangga)². Statistik ini tidak
menggunakan rata-rata global.
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()
# Tabel ringkas nama kecamatan per kategori
Bandung_LISA_summary <- Bandung_LISA %>%
st_set_geometry(NULL) %>% # hilangkan geometry supaya gampang ditampilkan
select(NAME_3, rate10k, quad, Pi.two.sided) %>%
arrange(quad)
Bandung_LISA_summary
## NAME_3 rate10k quad Pi.two.sided
## 6208 Cinambo 11.940299 High-High 0.0027505032
## 6211 Gedebage 48.880479 High-High 0.0009279768
## 6215 Panyileukan 33.210977 High-High 0.0217139063
## 6216 Rancasari 22.607385 High-High 0.0291607312
## 6221 Arcamanik 4.361099 Low-High (Outlier) 0.0020932229
## 6199 Andir 0.000000 Not significant 0.0862708903
## 6210 Antapani 15.581178 Not significant 0.6157487013
## 6223 Astanaanyar 0.000000 Not significant 0.1227090869
## 6224 Babakan Ciparay 0.000000 Not significant 0.2187774733
## 6225 Bandung Kidul 1.530925 Not significant 0.2222519040
## 6226 Bandung Kulon 0.000000 Not significant 0.3726771288
## 6227 Bandung Wetan 0.000000 Not significant 0.1170166384
## 6228 Batununggal 0.000000 Not significant 0.2609151801
## 6200 Bojongloa Kaler 1.717328 Not significant 0.1951702138
## 6201 Bojongloa Kidul 0.000000 Not significant 0.2468191217
## 6202 Buahbatu 5.359057 Not significant 0.7377181212
## 6203 Cibeunying Kaler 0.000000 Not significant 0.3571524867
## 6204 Cibeunying Kidul 1.445922 Not significant 0.7348295955
## 6205 Cibiru 2.898551 Not significant 0.1371976061
## 6206 Cicendo 1.786991 Not significant 0.1940025147
## 6207 Cidadap 0.000000 Not significant 0.7578799826
## 6209 Coblong 2.172496 Not significant 0.1896032752
## 6212 Kiaracondong 5.241090 Not significant 0.6754597403
## 6213 Lengkong 5.597015 Not significant 0.2320921445
## 6214 Mandalajati 21.545920 Not significant 0.9781082670
## 6217 Regol 0.000000 Not significant 0.2338896860
## 6218 Sukajadi 2.021427 Not significant 0.4014959669
## 6219 Sukasari 10.979359 Not significant 0.4766714509
## 6220 Sumur Bandung 0.000000 Not significant 0.1166396617
## 6222 Ujung Berung 4.010159 Not significant 0.0917193990
Analisis Indikator Lokal Autokorelasi Spasial (LISA) dilakukan untuk mengidentifikasi lokasi spesifik dari klaster spasial dan outlier. Berdasarkan hasil yang signifikan secara statistik, berikut adalah identifikasi dan interpretasinya.
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()
Berdasarkan hasil analisis Getis–Ord Gi* terhadap kasus penyakit menular di Kota Bandung, diperoleh temuan sebagai berikut:
Hot spot (p < 0.05): Kecamatan Cinambo, Gedebage, Panyileukan, dan Rancasari. Artinya, di wilayah ini terdapat konsentrasi kasus yang signifikan tinggi dibandingkan dengan wilayah sekitarnya.
Cold spot (p < 0.05): Tidak ada kecamatan yang termasuk dalam kategori cold spot signifikan.
Wilayah lain dikategorikan sebagai tidak signifikan, sehingga distribusi kasusnya dianggap relatif acak.
Hasil LISA sebelumnya juga mengidentifikasi klaster High-High signifikan di kecamatan yang sama: Cinambo, Gedebage, Panyileukan, dan Rancasari.
Tidak ada wilayah yang masuk kategori Low-Low signifikan pada hasil LISA, yang konsisten dengan hasil Gi* yang juga tidak menemukan adanya cold spot.
Hasil LISA juga mengidentifikasi satu outlier spasial Low-High (Kecamatan Arcamanik), yang tidak terdeteksi oleh analisis Gi*.
Terdapat perbedaan wilayah signifikan antara hasil analisis Getis–Ord Gi* dan LISA. Perbedaan tersebut adalah kemampuan LISA untuk mendeteksi outlier spasial (Low-High), sementara Gi* hanya fokus pada klaster nilai sejenis (hotspot/coldspot).
Meskipun demikian, kedua metode sama-sama menegaskan bahwa wilayah tenggara Kota Bandung merupakan hotspot utama penyakit menular, sehingga perlu menjadi fokus prioritas intervensi kesehatan masyarakat.
Hasil analisis autokorelasi spasial (Moran’s I, LISA, dan Getis–Ord Gi*) menunjukkan bahwa kasus penyakit menular di Kota Bandung tidak tersebar secara acak, melainkan membentuk klaster signifikan. Informasi ini penting bagi dinas kesehatan dalam menyusun strategi pencegahan dan intervensi, karena:
Identifikasi Wilayah Prioritas Hotspot signifikan di wilayah timur (misalnya Cinambo,Penyileukan,Gedebage, Rancasari) dapat ditetapkan sebagai fokus utama intervensi, sementara coldspot di pusat kota cukup dipantau.
Efisiensi Alokasi Sumber Daya Program vaksinasi, surveilans aktif, fogging, dan penyuluhan kesehatan dapat diarahkan terutama ke wilayah klaster, sehingga sumber daya digunakan lebih efisien.
Pengendalian Penularan Antarwilayah Karena kasus tinggi cenderung muncul berdekatan, strategi pencegahan sebaiknya dilakukan lintas kecamatan yang bertetangga, bukan hanya per kecamatan secara terpisah.
Perbaikan Faktor Lingkungan & Sosial Klaster penyakit sering berkaitan dengan kepadatan penduduk,sanitasi, dan mobilitas, sehingga hasil analisis dapat menjadi dasar kolaborasi lintas sektor (lingkungan, pekerjaan umum,perencanaan wilayah).
Perencanaan Jangka Panjang Pola hotspot yang konsisten dapat dimasukkan ke dalam rencana pembangunan jangka menengah (RPJMD) bidang kesehatan, terutama untuk perbaikan sanitasi dan infrastruktur di wilayah timur.
Kesimpulan:
Analisis autokorelasi spasial memberikan dinas kesehatan peta
risiko berbasis data yang membantu menentukan wilayah
prioritas, mengoptimalkan alokasi sumber daya, serta merancang program
pencegahan dan intervensi yang lebih efektif, efisien, dan tepat
sasaran bagi Kota Bandung.
Meskipun analisis autokorelasi spasial bermanfaat dalam mengidentifikasi pola klaster penyakit, terdapat beberapa keterbatasan penting yang perlu diperhatikan:
Kesimpulan: Analisis autokorelasi spasial memberikan informasi penting mengenai pola penyakit, namun hasilnya harus ditafsirkan dengan hati-hati. Keterbatasan terkait MAUP, pemilihan bobot spasial, dan masalah multiple testing perlu dipertimbangkan, serta dikombinasikan dengan pemahaman epidemiologis dan konteks lokal sebelum digunakan sebagai dasar pengambilan kebijakan.