Konsep Teori

1. Autokorelasi Spasial

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).

2. Contoh Fenomena

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.

3. Rumus Matematis

  • 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.

4. Perbedaan Ukuran Global dan Lokal

  •   **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
}

2. Simulasi Kasus Penyakit Menular

# Bangun matriks tetangga (queen)
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_sf), queen = TRUE)
lwW <- spdep::nb2listw(nb, style="W") # row-standardized weights

# Simulasi variabel kovariat spasial
set.seed(25) 
N <- nrow(Bandung_sf)
z <- rnorm(N)                           # variabel acak normal
lz <- spdep::lag.listw(lwW, z)          # lag spasialnya

# Model rata-rata kasus (log-linear)
beta0 <- 1.2; beta1 <- 0.6; beta2 <- 1.0
lambda <- exp(beta0 + beta1*scale(z) + beta2*scale(lz))

# Simulasi populasi dan kasus
pop <- round(runif(N, 5000, 10000))       # penduduk tiap unit
cases <- rpois(N, lambda = lambda * (pop/12000))  # kasus Poisson
Diare <- dplyr::tibble(id = Bandung_sf$id, pop = pop, cases = cases,
                       rate15k = (cases/pop)*12000)

# Gabungkan ke shapefile
Bandung_merged <- dplyr::left_join(Bandung_sf, Diare, by="id")

3. Peta Choropleth

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()

4. Pola berdasarkan hasil visual

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’s I

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’s C

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:

    • Moran’s I lebih menekankan pada korelasi global antara nilai suatu lokasi dengan rata-rata tetangganya. Statistik ini mengukur sejauh mana nilai-nilai yang mirip cenderung mengelompok atau menyebar di seluruh peta. Moran’s I peka terhadap pola umum di seluruh wilayah.
    • Geary’s C lebih menekankan pada perbedaan lokal antar pasangan tetangga. Statistik ini mengukur sejauh mana nilai-nilai yang berbeda cenderung berdekatan. Oleh karena itu, Geary’s C lebih sensitif untuk mendeteksi ketidakseragaman atau diskontinuitas pada skala lokal. Dengan kata lain, jika ada perbedaan tajam antar wilayah yang bersebelahan (misalnya, nilai sangat tinggi di sebelah nilai sangat rendah), Geary’s C lebih cepat menangkapnya dibandingkan Moran’s I.

Local Moran’s I (LISA)

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.

Getis-Ord

# 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

Hasil Identifikasi Hot Spot dan Cold Spot

Berdasarkan nilai z_Gistar (p < 0.05):

  • Hot spot (z > 1.96)
    • 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)

  • Cold spot (z < -1.96)
    • Kecamatan Buahbatu (z = -2.022)
  • Tidak signifikan
    • Kecamatan lainnya di Kota Bandung.
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.
  1. Peta Z-skor (Hot/Cold Spot)
    • Hot spot signifikan (p < 0.05, merah): wilayah di barat laut-utara dan timur Kota Bandung.
    • Cold spot signifikan (p < 0.05, biru): wilayah di selatan Kota Bandung.
    • Tidak signifikan (abu-abu): kecamatan lain.

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.

Diskusi Kritis

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:

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.