Bagian A. Konsep Teori

Pengertian autokorelasi spasial positif dan negatif

Autokorelasi spasial positif berarti lokasi yang berdekatan cenderung mempunyai nilai variabel yang mirip (baik sama-sama tinggi atau sama-sama rendah). Dengan kata lain, ada klasterisasi: titik-titik dengan nilai tinggi berkumpul, dan titik-titik dengan nilai rendah juga berkumpul.

Autokorelasi spasial negatif berarti lokasi yang berdekatan cenderung mempunyai nilai variabel yang berbeda (mis. tinggi di sebelah rendah). Ini mencerminkan pola dispeersi atau pengaturan bergantian (high–low–high).

(Ini ditulis dalam bahasa sederhana agar mudah dipahami dan dapat langsung dimasukkan ke laporan.)

Contoh fenomena sederhana untuk masing-masing pola

  • Positif: Penyebaran penyakit menular di kota kecil lingkungan padat dengan kasus tinggi cenderung bersebelahan sehingga muncul klaster kasus tinggi.

  • Negatif: Penempatan fasilitas layanan dengan jarak antarfasilitas yang seimbang (mis. stasiun pengisian umum) sehingga lokasi yang berdekatan biasanya memiliki tingkat layanan yang berbeda karena upaya distribusi.

  • Tidak ada autokorelasi spasial (random): Nilai kriminalitas yang acak antar-wilayah tanpa pola spasial yang jelas.

Tuliskan rumus matematis dari:

Moran’s I (global)

\[ I \;=\; \frac{n}{S_0}\; \frac{\displaystyle\sum_{i}\sum_{j} w_{ij}\,(x_i - \bar{x})\,(x_j - \bar{x})}{\displaystyle\sum_{i} (x_i - \bar{x})^2} \]

dengan

\[ S_0 \;=\; \sum_{i}\sum_{j} w_{ij}, \qquad \bar{x} \;=\; \frac{1}{n}\sum_{i} x_i \]

Geary’s C (global)

\[ C \;=\; \frac{(n-1)}{2\,S_0}\; \frac{\displaystyle\sum_{i}\sum_{j} w_{ij}\,(x_i - x_j)^2} {\displaystyle\sum_{i} (x_i - \bar{x})^2} \]

dengan

\[ S_0 \;=\; \sum_{i}\sum_{j} w_{ij}, \qquad \bar{x} \;=\; \frac{1}{n}\sum_{i} x_i. \]

Untuk Geary’s C, nilai C < 1 menandakan autokorelasi positif, C > 1 menandakan autokorelasi negatif.

Local Moran’s

\[ I_i \;=\; \frac{(x_i - \bar{x})}{m_2}\; \sum_j w_{ij}\,(x_j - \bar{x}), \]

dengan

\[ m_2 \;=\; \frac{1}{n}\sum_k (x_k - \bar{x})^2, \qquad \bar{x} \;=\; \frac{1}{n}\sum_i x_i. \]

Local Moran mengukur kontribusi tiap lokasi terhadap autokorelasi keseluruhan dan biasa dipakai untuk menemukan hot-spot (High-High), cold-spot (Low-Low), serta outlier (High-Low, Low-High).

Getis–Ord

Definisi umum (non-standar)

\[ G_i \;=\; \frac{\displaystyle \sum_j w_{ij}\, x_j}{\displaystyle \sum_j x_j} \]

Versi terstandarisasi untuk \[G_i^{*}\] (sering dipakai untuk uji signifikansi):

\[ G_i^{*} \;=\; \frac{\displaystyle \sum_j w_{ij}\, x_j \;-\; \bar{X}\,\displaystyle\sum_j w_{ij}} {\,S \; \sqrt{ \displaystyle \frac{n \sum_j w_{ij}^2 - \big(\displaystyle\sum_j w_{ij}\big)^2}{\,n-1\,} }\, }, \]

dengan

\[ \bar{X} \;=\; \frac{1}{n}\sum_j x_j, \qquad S \;=\; \sqrt{ \frac{1}{n}\sum_j x_j^2 \;-\; \bar{X}^2 }. \]

Catatan: Persamaan \(G_i^*\) sering dituliskan dalam beberapa bentuk ekivalen; rumus di atas adalah bentuk terstandarisasi yang digunakan untuk memperoleh skor z.

Perbedaan utama antara ukuran global dan lokal

  • Global (contoh: Moran’s I, Geary’s C): memberikan satu angka ringkasan yang mewakili keseluruhan area/studi. Berguna untuk mendeteksi apakah ada autokorelasi spasial secara umum pada seluruh wilayah.

  • Lokal (contoh: Local Moran’s \[I_i\], Getis–Ord \[G_i^*\]): memberikan nilai untuk setiap lokasi/unit; memungkinkan identifikasi titik/klaster spesifik (hotspot, coldspot, outlier). Lokal memberikan detail spasial yang tidak tertangkap oleh ukuran global.

Bagian B. Analisis Data (Simulasi)

Gunakan data spasial buat grid simulasi (30 unit)

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)
library(tmap)
## Warning: package 'tmap' was built under R version 4.4.3
library(stringr)
## Warning: package 'stringr' was built under R version 4.4.3
library(viridisLite)
library(viridis)
## Warning: package 'viridis' was built under R version 4.4.3
# Buat grid 6 x 5 = 30 sel (mewakili 30 kecamatan)
nx <- 6; ny <- 5
x_coords <- 1:nx; y_coords <- 1:ny

# Buat kotak (polygons) sebagai sf
grid_polys <- expand.grid(x = x_coords, y = y_coords) %>%
  mutate(id = row_number(),
         xmin = x - 1, xmax = x,
         ymin = y - 1, ymax = y) %>%
  rowwise() %>%
  mutate(geometry = list(st_polygon(list(matrix(c(xmin,ymin,
                                                   xmax,ymin,
                                                   xmax,ymax,
                                                   xmin,ymax,
                                                   xmin,ymin), ncol=2, byrow=TRUE))))) %>%
  ungroup() %>%
  st_as_sf(crs = 4326)

# Periksa
grid_polys <- grid_polys %>% st_set_geometry("geometry")
grid_polys$id <- as.integer(grid_polys$id)
grid_polys

Simulasi kasus penyakit menular (Covid) untuk 30 kecamatan

  • simulasikan populasi tiap kecamatan (mis. antara 5k–20k).

  • Rata-rata kasus covid per 10.000 penduduk dimodelkan sebagai lambda_base + efek hotspot (dua pusat yang menaikkan rata-rata).

  • Kasus yang diamati dihasilkan dari distribusi Poisson dengan mean = expected_cases.

# Populasi per unit (acak)
set.seed(0084)
grid_polys$population <- sample(5000:20000, size = nrow(grid_polys), replace = TRUE)

# Koordinat centroid untuk membuat efek spasial (hotspot)
centroids <- st_centroid(grid_polys)
## Warning: st_centroid assumes attributes are constant over geometries
coords <- st_coordinates(centroids)

# Tentukan 2 pusat hotspot (dalam koordinat integer grid)
center1 <- c(2.2, 4.0)
center2 <- c(5.0, 2.0)

# Fungsi jarak gaussian untuk menaikkan lambda di sekitar pusat
dist_to_center1 <- sqrt((coords[,1] - center1[1])^2 + (coords[,2] - center1[2])^2)
dist_to_center2 <- sqrt((coords[,1] - center2[1])^2 + (coords[,2] - center2[2])^2)

# Parameter baseline dan penguatan hotspot
lambda_base <- 2.0    # dasar: 2 kasus per 10k
hotspot_strength1 <- 6.0 # tambahan di dekat pusat1
hotspot_strength2 <- 4.0 # tambahan di dekat pusat2

# Bentuk penurunan dengan jarak (Gaussian-like)
lambda_per10k <- lambda_base +
  hotspot_strength1 * exp(- (dist_to_center1^2) / (2 * 0.9^2)) +
  hotspot_strength2 * exp(- (dist_to_center2^2) / (2 * 1.1^2))

# Expected counts = (lambda per 10k) * (population / 10000)
expected_counts <- lambda_per10k * (grid_polys$population / 10000)

# Ambil observasi nyata sebagai Poisson draw
set.seed(789)
observed_cases <- rpois(n = length(expected_counts), lambda = expected_counts)

# Simpan ke objek spatial
grid_polys$lambda_per10k <- lambda_per10k
grid_polys$expected_cases <- expected_counts
grid_polys$cases <- observed_cases
grid_polys$rate_per10k <- grid_polys$cases / grid_polys$population * 10000

# Lihat ringkasan
grid_polys %>% st_drop_geometry() %>% select(id, population, lambda_per10k, expected_cases, cases, rate_per10k) %>% head(6)

Buat peta choropleth dari data simulasi

  • Peta rate kasus Covid per 10.000 penduduk
set.seed(0084)  # reproducible

# --- 1. Baca shapefile (ambil kota bandung)
Indo_Kec <- readRDS("C:/Users/Ghozzy/Downloads/gadm36_IDN_3_sp.rds")

Bandung_sp <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung_sf <- st_as_sf(Bandung_sp)   # konversi ke sf

# nama kec
Bandung_sf <- Bandung_sf %>%
  mutate(NAME_3_clean = str_trim(NAME_3) %>% str_to_lower())

# data dummy covid
n <- nrow(Bandung_sf)
kec_list <- Bandung_sf$NAME_3

# Dummy population (5k - 25k)
pop <- sample(5000:25000, size = n, replace = TRUE)

# centroid coords untuk membuat hotspot spasial
centroids <- st_centroid(Bandung_sf)
## Warning: st_centroid assumes attributes are constant over geometries
coords <- st_coordinates(centroids)

# Definisikan 2 pusat hotspot (pilih berdasarkan bounding box)
center1 <- coords[round(n*0.25), ]   # contoh: kira-kira bagian utara
center2 <- coords[round(n*0.7), ]    # contoh: bagian lain

dist1 <- sqrt((coords[,1] - center1[1])^2 + (coords[,2] - center1[2])^2)
dist2 <- sqrt((coords[,1] - center2[1])^2 + (coords[,2] - center2[2])^2)

# baseline dan kekuatan hotspot (per 10k penduduk)
lambda_base <- 5    # baseline: 5 kasus per 10k
hot1 <- 20
hot2 <- 12

lambda_per10k <- lambda_base +
  hot1 * exp(- (dist1^2) / (2 * 0.8^2)) +
  hot2 * exp(- (dist2^2) / (2 * 1.0^2))

expected_cases <- lambda_per10k * (pop / 10000)
cases <- rpois(n = n, lambda = expected_cases)

Covid_dummy <- data.frame(
  Kecamatan = kec_list,
  Kecamatan_clean = str_trim(kec_list) %>% str_to_lower(),
  Population = pop,
  lambda_per10k = lambda_per10k,
  expected_cases = expected_cases,
  Covid_cases = cases,
  rate_per10k = cases / pop * 10000,
  stringsAsFactors = FALSE
)

# Gabungkan (left join) ke objek spatial sf
Bandung_joined <- left_join(Bandung_sf, Covid_dummy, by = c("NAME_3_clean" = "Kecamatan_clean"))

Bandung_joined$Covid_cases <- as.numeric(Bandung_joined$Covid_cases)
Bandung_joined$Population <- as.numeric(Bandung_joined$Population)
Bandung_joined$rate_per10k <- as.numeric(Bandung_joined$rate_per10k)

# Plot choropleth
p_counts <- ggplot(Bandung_joined) +
  geom_sf(aes(fill = Covid_cases), color = "grey30") +
  scale_fill_viridis_c(option = "viridis", name = "Kasus Covid (count)", na.value = "grey90") +
  ggtitle("Choropleth: Jumlah Kasus Covid - Kota Bandung (Dummy Data)") +
  theme_minimal()

p_rate <- ggplot(Bandung_joined) +
  geom_sf(aes(fill = rate_per10k), color = "grey30") +
  scale_fill_viridis_c(option = "viridis", name = "Rate\n(per 10k)", na.value = "grey90") +
  ggtitle("Choropleth: Rate Kasus Covid per 10.000 - Kota Bandung (Dummy Data)") +
  theme_minimal()

# Tampilkan
print(p_counts)

print(p_rate)

# ringkasan tabel singkat
Bandung_joined %>%
  st_drop_geometry() %>%
  select(NAME_3, Population, Covid_cases, rate_per10k) %>%
  arrange(desc(Covid_cases)) %>%
  head(10)

Apa pola spasial yang terlihat secara visual

Dari peta choropleth jumlah kasus dan rate per 10.000 penduduk terlihat pola spasial terklaster: area-area di sekitar dua pusat hotspot simulasi menunjukkan rate dan jumlah kasus yang relatif lebih tinggi dibandingkan wilayah lain (klaster High-High), sedangkan sebagian besar kecamatan di pinggiran menunjukkan nilai rendah (coldspot / Low-Low). Terdapat pula beberapa unit yang berperilaku sebagai outlier (High-Low atau Low-High) di mana nilai suatu kecamatan tinggi tetapi tetangganya rendah, atau sebaliknya. Pola ini konsisten dengan mekanisme simulasi (hotspot Gaussian) dan menunjukkan bahwa kasus tidak tersebar acak melainkan berkumpul secara spasial.

Bagian C. Pengukuran Autokorelasi

Moran’s I

# pilih variabel (ubah jika ingin Covid_cases)
varname <- "rate_per10k"
var <- Bandung_joined[[varname]]

# buat neighbors & listw (queen contiguity)
nb <- poly2nb(Bandung_joined, queen = TRUE)
listw <- nb2listw(nb, style = "W", zero.policy = TRUE)

# 1.a - Moran analitik
moran_analytic <- moran.test(var, listw, zero.policy = TRUE)
print(moran_analytic)
## 
##  Moran I test under randomisation
## 
## data:  var  
## weights: listw    
## 
## Moran I statistic standard deviate = 0.8803, p-value = 0.1893
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##        0.06133525       -0.03448276        0.01184776
# 1.b - Moran Monte Carlo (permutasi)
set.seed(2025)
moran_perm <- moran.mc(var, listw, nsim = 999, zero.policy = TRUE)
print(moran_perm)
## 
##  Monte-Carlo simulation of Moran I
## 
## data:  var 
## weights: listw  
## number of simulations + 1: 1000 
## 
## statistic = 0.061335, observed rank = 830, p-value = 0.17
## alternative hypothesis: greater
# Cetak ringkasan
cat("\nRingkasan Moran's I:\n")
## 
## Ringkasan Moran's I:
cat("Estimate (Moran I): "); print(moran_analytic$estimate["Moran I statistic"])
## Estimate (Moran I):
## Moran I statistic 
##        0.06133525
cat("P-value (analitik): "); print(moran_analytic$p.value)
## P-value (analitik):
## [1] 0.1893494
cat("P-value (perm, nsim=999): "); print(moran_perm$p.value)
## P-value (perm, nsim=999):
## [1] 0.17

Interpretasi:

“Nilai Moran’s I = 0.06133525. Uji permutasi (nsim = 999) menghasilkan p = 0.17; karena p > 0.05, autokorelasi spasial tidak signifikan secara statistik. Artinya, tidak ada bukti yang cukup bahwa kasus Covid terklaster pola kasus cenderung bisa dijelaskan sebagai acak di tingkat Kota Bandung.”

Geary’s C

varname <- "rate_per10k"
var <- Bandung_joined[[varname]]

# Pastikan listw ada (jika belum, buat seperti di chunk Moran)
nb <- poly2nb(Bandung_joined, queen = TRUE)
listw <- nb2listw(nb, style = "W", zero.policy = TRUE)

# Geary's C (analitik)
geary_analytic <- geary.test(var, listw, zero.policy = TRUE)
print(geary_analytic)
## 
##  Geary C test under randomisation
## 
## data:  var 
## weights: listw   
## 
## Geary C statistic standard deviate = 1.3484, p-value = 0.08877
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic       Expectation          Variance 
##        0.83403860        1.00000000        0.01514931
cat("\nRingkasan Geary's C:\n")
## 
## Ringkasan Geary's C:
cat("Geary C statistic: "); print(geary_analytic$statistic)
## Geary C statistic:
## Geary C statistic standard deviate 
##                           1.348375
cat("\nCatatan: Geary C < 1 menunjukkan autokorelasi positif; > 1 menunjukkan autokorelasi negatif.\n")
## 
## Catatan: Geary C < 1 menunjukkan autokorelasi positif; > 1 menunjukkan autokorelasi negatif.

Interpretasi:

Geary’s C = 0.8340386 (lihat output). Jika Geary C < 1 dan Moran I > 0 (Moran I = 0.06133525), kedua ukuran sejalan menunjukkan autokorelasi positif. Karena Geary lebih sensitif pada perbedaan pasangan tetangga, periksa apakah Geary memberi bunyi berbeda — perbedaan antara keduanya mengindikasikan bahwa sifat lokal (per-pasangan) bisa berbeda dengan pola global.

Local Moran’s I

varname <- "rate_per10k"
var <- Bandung_joined[[varname]]

# buat neighbors & listw
nb <- poly2nb(Bandung_joined, queen = TRUE)
listw <- nb2listw(nb, style = "W", zero.policy = TRUE)

# hitung Local Moran
localI <- localmoran(var, listw, zero.policy = TRUE)
# localI columns: Ii, EIi, VarIi, ZIi, Pr(z > 0)
colnames(localI)[1:5] <- c("Ii","EIi","VarIi","Zi","Pr")
Bandung_joined$Ii <- localI[,"Ii"]
Bandung_joined$local_p <- localI[,"Pr"]

# buat spatial lag dan standardized values untuk klasifikasi quadrant
lag_var <- lag.listw(listw, var, zero.policy = TRUE)
z_var <- as.numeric(scale(var))
z_lag <- as.numeric(scale(lag_var))

alpha <- 0.05
quad <- rep("NotSig", length(var))
sig <- localI[,"Pr"] < alpha
quad[sig & z_var > 0 & z_lag > 0] <- "High-High"
quad[sig & z_var < 0 & z_lag < 0] <- "Low-Low"
quad[sig & z_var > 0 & z_lag < 0] <- "High-Low"
quad[sig & z_var < 0 & z_lag > 0] <- "Low-High"
Bandung_joined$quad <- factor(quad, levels = c("High-High","Low-Low","High-Low","Low-High","NotSig"))

# ringkasan kategori
cat("Jumlah unit per kategori LISA (alpha = ", alpha, "):\n")
## Jumlah unit per kategori LISA (alpha =  0.05 ):
print(table(Bandung_joined$quad, useNA = "ifany"))
## 
## High-High   Low-Low  High-Low  Low-High    NotSig 
##         0         0         1         0        29
# peta cluster LISA (ggplot2 geom_sf)
p_lisa <- ggplot(Bandung_joined) +
  geom_sf(aes(fill = quad), color = "grey40") +
  scale_fill_manual(values = c("red","blue","orange","purple","grey90"),
                    na.value = "grey90", name = "LISA Quadrant") +
  ggtitle("Local Moran's I (LISA) — Klasifikasi") +
  theme_minimal()
print(p_lisa)

Interpretasi:

Dari Local Moran, kecamatan yang tergolong High-High (hotspot lokal) adalah: tidak ada dan
kecamatan Low-Low (coldspot) adalah: tidak ada. peta LISA menunjukkan satu area High-Low (ditandai warna merah di peta bagian barat/selatan-barat Kota Bandung), artinya ada kecamatan dengan rate tinggi yang dikelilingi tetangga bernilai rendah. Peta LISA memperlihatkan lokasi-lokasi yang mendorong clustering lokal; High-High (jika ada) menunjukkan kecamatan dengan rate tinggi dikelilingi tetangga juga tinggi ini mengindikasikan area konsentrasi penularan lokal yang perlu prioritas intervensi. Dalam kasus ini, meskipun tidak ditemukan High-High/Low-Low, area High-Low tersebut tetap layak ditindaklanjuti (verifikasi data, penyelidikan lokal, testing/trace terfokus).

Getis-Ord

varname <- "rate_per10k"
var <- Bandung_joined[[varname]]

nb <- poly2nb(Bandung_joined, queen = TRUE)
listw <- nb2listw(nb, style = "W", zero.policy = TRUE)

# Hitung local G* (z-scores)
Gstar_z <- localG(var, listw, zero.policy = TRUE)
Bandung_joined$Gstar_z <- as.numeric(Gstar_z)
Bandung_joined$Gstar_p <- 2 * pnorm(-abs(Bandung_joined$Gstar_z))

# Klasifikasi (z threshold 1.96)
z_thr <- 1.96
Bandung_joined$Gi_cat <- "NotSig"
Bandung_joined$Gi_cat[Bandung_joined$Gstar_z > z_thr]  <- "Hotspot"
Bandung_joined$Gi_cat[Bandung_joined$Gstar_z < -z_thr] <- "Coldspot"
Bandung_joined$Gi_cat <- factor(Bandung_joined$Gi_cat, levels = c("Hotspot","Coldspot","NotSig"))

# Ringkasan
cat("Jumlah Hotspot / Coldspot (z>|1.96|):\n")
## Jumlah Hotspot / Coldspot (z>|1.96|):
print(table(Bandung_joined$Gi_cat, useNA = "ifany"))
## 
##  Hotspot Coldspot   NotSig 
##        0        1       29
# Peta G* z-scores dan kategori
p_gstar_z <- ggplot(Bandung_joined) +
  geom_sf(aes(fill = Gstar_z), color = "grey30") +
  scale_fill_viridis_c(option = "viridis", name = "G* z-score", na.value = "grey90") +
  ggtitle(paste0("Getis-Ord G* z-scores (", varname, ")")) +
  theme_minimal()
print(p_gstar_z)

p_gi_cat <- ggplot(Bandung_joined) +
  geom_sf(aes(fill = Gi_cat), color = "grey30") +
  scale_fill_manual(values = c("red","blue","grey90"), name = "G* category") +
  ggtitle(paste0("Getis-Ord G* categories (Hotspot / Coldspot) - ", varname)) +
  theme_minimal()
print(p_gi_cat)

# Bandingkan hasil G* dengan LISA (irisan Hotspot vs High-High)
overlap_hot <- Bandung_joined %>% st_drop_geometry() %>%
  filter(Gi_cat == "Hotspot" & quad == "High-High") %>%
  select(NAME_3, !!sym(varname), Gstar_z, Gstar_p, quad)
cat("\nHotspot (G*) & High-High (LISA) intersection:\n")
## 
## Hotspot (G*) & High-High (LISA) intersection:
print(overlap_hot)
## [1] NAME_3      rate_per10k Gstar_z     Gstar_p     quad       
## <0 rows> (or 0-length row.names)

Interpretasi:

  • Hotspot (G* z > 1.96): tidak ada kecamatan yang memenuhi ambang ini pada peta (tidak terlihat warna kuning/emas yang sangat terang atau label z > 1.96).

  • Coldspot (G* z < -1.96): terdapat satu/lebih kecamatan di bagian barat-daya (wilayah berwarna ungu tua pada peta) yang memenuhi kriteria coldspot.

Perbandingan dengan peta LISA (High-High):

  • Beberapa lokasi tidak sepenuhnya tumpang tindih. Mis. area barat-daya yang berwarna ungu tua pada peta G* tercatat sebagai coldspot oleh G* tetapi pada peta LISA sebelumnya muncul sebagai High–Low (nilai lokal tinggi dikelilingi tetangga rendah).

  • Ini konsisten dengan perbedaan metodologis: G* menilai konsentrasi nilai tinggi/ rendah di sekitar unit i (mengakumulasi kontribusi tetangga), sedangkan LISA menilai asosiasi lokal antara nilai unit dan lag-nya (mendeteksi pola High–High / High–Low dsb.). Karena itu, ketidaksesuaian menunjukkan bahwa sifat lokal (per-pasangan/tetangga) berbeda dengan pola konsentrasi ruang yang lebih luas.

Bagian D. Diskusi Kritis

Peran hasil autokorelasi spasial untuk strategi kesehatan

Hasil analisis autokorelasi spasial (Moran’s I, Geary’s C, Local Moran’s I, dan Getis–Ord G*) memberikan informasi penting mengenai ada tidaknya klaster penyakit di Kota Bandung. Dengan mengetahui wilayah yang masuk kategori High-High (hotspot) atau teridentifikasi sebagai G hotspot*, dinas kesehatan dapat:

  • Memprioritaskan intervensi pada kecamatan dengan konsentrasi kasus tinggi, misalnya dengan memperbanyak tenaga medis, melakukan penyemprotan disinfektan, atau memperketat tracing kontak.

  • Mengalokasikan sumber daya secara efisien, karena program pencegahan (misalnya kampanye perilaku hidup bersih dan sehat atau distribusi vaksin) bisa difokuskan pada wilayah yang terbukti menjadi pusat penyebaran.

  • Memonitor dinamika penyebaran: jika pola spasial berubah dari waktu ke waktu, pemerintah dapat menilai efektivitas kebijakan atau mendeteksi munculnya klaster baru lebih dini.

Dengan demikian, analisis ini tidak hanya deskriptif, tetapi juga menjadi alat perencanaan berbasis bukti dalam epidemiologi spasial.

Keterbatasan analisis autokorelasi spasial

Meskipun berguna, analisis ini memiliki sejumlah keterbatasan yang perlu diperhatikan:

  • MAUP (Modifiable Areal Unit Problem): hasil analisis sangat tergantung pada unit analisis spasial (misalnya kecamatan). Jika batas wilayah diubah (misalnya menggunakan kelurahan), pola klaster bisa berbeda. Ini bisa memunculkan bias interpretasi.

  • Definisi bobot spasial (spatial weights): hasil Moran’s I, Geary’s C, maupun LISA dipengaruhi oleh cara kita mendefinisikan hubungan tetangga. Menggunakan queen contiguity, rook contiguity, atau k-nearest neighbors bisa menghasilkan perbedaan pola klaster.

  • Data kualitas & skala waktu: data dummy atau data riil yang tidak konsisten (under-reporting, delay pelaporan) akan memengaruhi keandalan analisis.

  • Sifat statis: analisis ini umumnya snapshot pada satu periode, sehingga tidak langsung menangkap dinamika temporal penyebaran penyakit.

  • Interpretasi sebab-akibat: autokorelasi spasial hanya menunjukkan pola klaster, bukan alasan mengapa klaster itu terjadi. Faktor sosial, ekonomi, dan lingkungan tetap perlu dianalisis lebih lanjut.

Jadi, meskipun analisis autokorelasi spasial membantu memetakan risiko wilayah prioritas, penggunaannya harus diiringi dengan kesadaran akan keterbatasan metodologisnya agar kebijakan yang diambil tidak salah arah.