Bagian A. Konsep Teori

  1. Jelaskan dengan kata-kata Anda apa yang dimaksud dengan autokorelasi spasial positif dan autokorelasi spasial negatif.

    • Autokorelasi spasial positif berarti wilayah yang berdekatan cenderung memiliki karakteristik yang serupa. Misalnya, kemiskinan suatu daerah dengan nilai tinggi biasanya dikelilingi oleh daerah bernilai tinggi pula, sedangkan daerah dengan nilai rendah juga cenderung berdekatan dengan daerah bernilai rendah. Pola ini menggambarkan adanya pengelompokan (clustering) dalam ruang.

    • Sebaliknya, autokorelasi spasial negatif muncul ketika wilayah yang berdekatan justru memiliki karakteristik yang berlawanan. Misalnya, suatu lokasi dengan nilai tinggi dikelilingi oleh lokasi bernilai rendah, atau sebaliknya. Pola ini menunjukkan adanya kecenderungan penyebaran yang saling menjauh atau bersifat menyebar (dispersi).

  2. Berikan contoh sederhana dari fenomena yang bisa menunjukkan masing-masing pola tersebut.

    • Autokorelasi spasial positif : Fenomena tingkat stunting di Jawa Barat seringkali menunjukkan pola pengelompokan. Misalnya, beberapa kabupaten di wilayah Pantura (Indramayu, Subang, dan Karawang) memiliki prevalensi stunting relatif tinggi dan saling berdekatan. Hal ini terjadi karena karakteristik sosial-ekonomi, pola konsumsi, dan akses sanitasi di wilayah tersebut relatif serupa.

    • Autokorelasi spasial negatif : Contohnya dapat ditemukan pada harga tanah di Kota Bandung dan sekitarnya. Kawasan pusat kota Bandung (misalnya Dago, Cihampelas) memiliki harga tanah yang sangat tinggi, sementara wilayah yang berbatasan langsung seperti sebagian Kabupaten Bandung atau Bandung Barat memiliki harga tanah yang jauh lebih rendah. Kondisi ini mencerminkan adanya perbedaan mencolok antar lokasi yang saling berdekatan.

  3. Tuliskan rumus matematis dari:

  1. Jelaskan perbedaan utama antara ukuran global dan lokal.

Bagian B. Analisis Data

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(sp)
## Warning: package 'sp' was built under R version 4.3.3
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(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(spData)
  1. Data spasial kecamatan di Kota Bandung
set.seed(58)
setwd("C:/Users/Fadhail/Documents/Semester 5/SPASIAL")
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
Bandung$id <- seq_len(nrow(Bandung))
Bandung_sf <- sf::st_as_sf(Bandung)

if(!exists("Bandung_sf")) {
  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
}

Bandung_sf <- sf::st_make_valid(Bandung_sf)
Bandung_sf$id <- if(!"id" %in% names(Bandung_sf)) seq_len(nrow(Bandung_sf)) else Bandung_sf$id
ggplot(Bandung_sf) + geom_sf(fill="grey90", color="white") +
labs(title="Kota Bandung") + theme_minimal()

# Membuat objek neighbor
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_sf), queen = TRUE)
# Membuat bobot spasial
lwW <- spdep::nb2listw(nb, style="W") # row-standardized
lwB <- spdep::nb2listw(nb, style="B") # binary (untuk raw G)
# Simulasi data
N <- nrow(Bandung_sf)
z <- rnorm(N)
lz <- spdep::lag.listw(lwW, z)
  1. Visualisasi
# Parameter model simulasi
beta0 <- 1.9
beta1 <- 0.75
beta2 <- 1.21

# Variabel acak untuk heterogenitas spasial
N <- nrow(Bandung_sf)
z  <- rnorm(N)
lz <- rnorm(N)

# Rata-rata (lambda) untuk kasus TBC
lambda <- exp(beta0 + beta1*scale(z) + beta2*scale(lz))

# Populasi simulasi (acak antara 3.000–8.000 per kecamatan)
pop <- round(runif(N, 3000, 8000))

# Kasus TBC per kecamatan (Poisson)
cases <- rpois(N, lambda = lambda * (pop/10000))

# Buat tabel data TBC
TBC <- dplyr::tibble(
  id     = Bandung_sf$id,
  pop    = pop,
  cases  = cases,
  rate10k = (cases/pop) * 10000
)

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

# Plot peta hasil simulasi
ggplot(Bandung_merged) +
  geom_sf(aes(fill = rate10k), color = "white", size = 0.2) +
  scale_fill_viridis_c(option = "magma") +
  labs(title = "Rate Malaria (per 10.000) – Simulasi",
       fill = "Rate") +
  theme_minimal()

Peta simulasi ini menggambarkan distribusi tingkat malaria per 10.000 penduduk di suatu wilayah. Terlihat adanya variasi spasial yang cukup mencolok: sebagian besar kecamatan berada pada kategori rendah hingga sangat rendah (ditunjukkan dengan warna ungu tua hingga hitam), sementara beberapa kecamatan tertentu di bagian barat dan utara menunjukkan tingkat malaria yang jauh lebih tinggi (dengan gradasi oranye hingga kuning terang). Pola ini mengindikasikan adanya kemungkinan pengelompokan kasus malaria di lokasi tertentu yang dapat berkaitan dengan kondisi lingkungan, kepadatan penduduk, maupun faktor akses kesehatan. Dengan kata lain, fenomena ini menekankan pentingnya analisis spasial lebih lanjut, baik pada level global untuk melihat kecenderungan keseluruhan maupun pada level lokal untuk mengidentifikasi hot spot malaria yang memerlukan prioritas intervensi.

Bagian C. Pengukuran Autokorelasi

  1. Hitung Moran’s I untuk data simulasi kasus diare di Kota Bandung.
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 = -0.97624, p-value = 0.3289
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      -0.126730947      -0.034482759       0.008929054
  1. Hitung Geary’s C.
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 = -0.54121, p-value = 0.5884
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic       Expectation          Variance 
##        1.07328340        1.00000000        0.01833497
  1. Hitung Local Moran’s I (Lisa)
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()

Interpretasi : Hasil analisis Local Moran’s I (LISA) menunjukkan adanya satu kecamatan di bagian utara Kota Bandung yang termasuk kategori Low–High (outlier), yaitu wilayah dengan kasus penyakit menular relatif rendah tetapi dikelilingi oleh kecamatan dengan kasus lebih tinggi. Hasil ini mengindikasikan adanya anomali spasial, di mana wilayah tersebut tidak mengikuti pola tetangganya. Dalam konteks epidemiologi, kondisi ini dapat ditafsirkan sebagai tanda bahwa kecamatan tersebut mungkin memiliki faktor protektif tertentu—seperti intervensi kesehatan, kondisi lingkungan, atau perilaku masyarakat yang lebih baik—namun di sisi lain juga berpotensi menjadi wilayah rentan apabila terjadi mobilitas penduduk yang tinggi dari area sekitarnya.

  1. Hitung Getis-Ord \(G_i^*\)
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.01461   Min.   :0.03105   Min.   :-0.9921   MULTIPOLYGON :30  
##  1st Qu.:0.05193   1st Qu.:0.10152   1st Qu.:-0.7634   epsg:NA      : 0  
##  Median :0.10808   Median :0.13231   Median :-0.4385   +proj=long...: 0  
##  Mean   :0.14092   Mean   :0.17160   Mean   :-0.1248                     
##  3rd Qu.:0.18705   3rd Qu.:0.27236   3rd Qu.: 0.1846                     
##  Max.   :0.33443   Max.   :0.33835   Max.   : 2.3459

Nilai statistik \(z_{G_i^*}\) yang diperoleh berkisar antara -0.9921 hingga 2.3459, dengan rata-rata sekitar -0.1248. Dalam aturan interpretasi, lokasi dengan \(z > 1.96\) dikategorikan sebagai hot spot signifikan (pola pengelompokan nilai tinggi), sedangkan lokasi dengan \(z < -1.96\) dianggap cold spot signifikan (pola pengelompokan nilai rendah). Dari hasil ini, terdapat setidaknya satu wilayah dengan nilai z = 2.3459 yang masuk kategori hot spot (p < 0.05), sementara tidak ditemukan wilayah yang mencapai kategori cold spot karena nilai minimum hanya -0.9921.

Visualisasi

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

Bagian D. Diskusi Kritis

  1. Bagaimana hasil analisis autokorelasi spasial bisa membantu dinas kesehatan dalam menyusun strategi pencegahan dan intervensi penyakit menular di Kota Bandung?

    Analisis autokorelasi spasial dapat membantu dinas kesehatan mengidentifikasi apakah kasus penyakit menular di Kota Bandung cenderung membentuk pola tertentu, seperti pengelompokan (hot spot) atau penyebaran acak. Dengan mengetahui lokasi yang menjadi hot spot, dinas kesehatan dapat memprioritaskan intervensi, misalnya peningkatan surveilans, distribusi sumber daya kesehatan, kampanye pencegahan, atau perbaikan fasilitas sanitasi di wilayah yang paling berisiko. Sebaliknya, wilayah yang terdeteksi sebagai cold spot dapat dijadikan contoh praktik baik (best practice) untuk diadaptasi di daerah lain. Dengan demikian, analisis spasial menjadi dasar ilmiah dalam menyusun kebijakan berbasis bukti (evidence-based policy) untuk pengendalian penyakit menular.
  2. Sebutkan keterbatasan dari analisis autokorelasi spasial, misalnya terkait dengan: