A. KONSEP TEORI

1. Autokorelasi Spasial Positif dan Negatif

Autokorelasi spasial adalah ukuran sejauh mana suatu variabel di satu lokasi berkorelasi dengan nilai variabel yang sama di lokasi sekitarnya.

  • Autokorelasi spasial positif terjadi ketika wilayah dengan nilai tinggi cenderung dikelilingi oleh wilayah dengan nilai tinggi, dan wilayah dengan nilai rendah dikelilingi oleh wilayah rendah. Artinya, ada pola pengelompokan (clustering).
  • Autokorelasi spasial negatif terjadi ketika wilayah dengan nilai tinggi dikelilingi oleh wilayah dengan nilai rendah, atau sebaliknya. Artinya, ada pola penyebaran (dispersion) atau keberagaman antarwilayah.

2. Contoh Sederhana Fenomena

  • Autokorelasi spasial positif:
    Dalam kasus Hepatitis A di Kota Bandung, jika beberapa kecamatan yang berdekatan sama-sama memiliki angka kasus tinggi, maka daerah tersebut membentuk klaster positif (hotspot). Misalnya, dua kecamatan bertetangga dengan tingkat kejadian tinggi akibat kondisi sanitasi yang sama.

  • Autokorelasi spasial negatif:
    Jika sebuah kecamatan dengan angka kasus Hepatitis A sangat tinggi justru dikelilingi oleh kecamatan dengan kasus sangat rendah, maka hal ini mencerminkan adanya pola negatif. Contohnya, satu kecamatan padat penduduk dengan sanitasi buruk (tinggi kasus) dikelilingi kecamatan yang lebih baik infrastrukturnya (rendah kasus).

3. Rumus Matematis

Moran’s I

Moran’s I mengukur derajat autokorelasi spasial global dengan membandingkan kesamaan nilai antarwilayah terhadap rata-rata global. Nilai positif menunjukkan adanya clustering, sedangkan negatif menunjukkan penyebaran.

\[ I = \frac{N}{W} \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} \]

  • \(N\): jumlah wilayah
  • \(x_i\): nilai variabel di lokasi \(i\)
  • \(\bar{x}\): rata-rata global
  • \(w_{ij}\): bobot spasial antara lokasi \(i\) dan \(j\)
  • \(W = \sum_i \sum_j w_{ij}\): total bobot

Geary’s C

Geary’s C lebih fokus pada perbedaan langsung antara nilai suatu wilayah dan tetangganya.

\[ C = \frac{(N-1)}{2W} \cdot \frac{\sum_{i=1}^N \sum_{j=1}^N w_{ij}(x_i - x_j)^2}{\sum_{i=1}^N (x_i - \bar{x})^2} \]

Interpretasi:
- \(C < 1\): autokorelasi positif (nilai mirip antarwilayah bertetangga)
- \(C > 1\): autokorelasi negatif (nilai berbeda antarwilayah bertetangga)
- \(C = 1\): tidak ada autokorelasi

Local Moran’s \(I_i\)

Ukuran ini menunjukkan kontribusi masing-masing wilayah terhadap nilai Moran’s I global, sehingga bisa mengidentifikasi klaster lokal (High-High, Low-Low, High-Low, Low-High).

\[ I_i = \frac{(x_i - \bar{x})}{m^2} \sum_{j=1}^N w_{ij}(x_j - \bar{x}) \]

dengan

\[ m^2 = \frac{1}{N} \sum_{i=1}^N (x_i - \bar{x})^2 \]

Getis–Ord \(G_i\) dan \(G_i^*\)

Getis–Ord \(G_i\) dan \(G_i^*\) digunakan untuk mendeteksi hotspot (nilai tinggi terkonsentrasi) dan coldspot (nilai rendah terkonsentrasi).

\[ G_i = \frac{\sum_{j=1}^N w_{ij} x_j}{\sum_{j=1}^N x_j} \]

\[ G_i^* = \frac{\sum_{j=1}^N w_{ij} x_j}{\sum_{j=1}^N x_j}, \quad \text{dengan } w_{ii} = 1 \]

Perbedaan utama:
- \(G_i\): menghitung hanya tetangga \(j\) dari \(i\) (tidak termasuk \(i\)).
- \(G_i^*\): menghitung termasuk lokasi \(i\) sendiri.

Interpretasi nilai z-score:
- Z-score tinggi signifikan → hotspot.
- Z-score rendah signifikan → coldspot.

4. Perbedaan Ukuran Global dan Lokal

  • Ukuran global (Moran’s I, Geary’s C):
    Mengukur kecenderungan keseluruhan pola spasial di seluruh Kota Bandung, apakah ada clustering atau tidak.

  • Ukuran lokal (Local Moran’s I, Getis–Ord Gi*):
    Mengidentifikasi lokasi spesifik (misalnya kecamatan tertentu) yang membentuk klaster atau hotspot.

Dengan kata lain, ukuran global memberi jawaban umum “apakah ada autokorelasi spasial?”, sedangkan ukuran lokal menjawab “di mana autokorelasi itu terjadi?”.

B. ANALISIS DATA (Simulasi)

1. Gunakan data spasial kecamatan di Kota Bandung (atau grid simulasi)

Karena shapefile asli kecamatan Bandung tidak tersedia, digunakan grid buatan 6x5 (30 unit) sebagai pengganti wilayah kecamatan. Sebagai gambaran awal, ditampilkan data jumlah penduduk per kecamatan dari file Excel.

#=== 1. Baca data spasial dan data populasi ===#
# Baca shapefile Indonesia level kecamatan (gadm)
Indo_Kec <- readRDS("C:/Users/USER/Documents/SEMESTER 5/SPASIAL/gadm36_IDN_3_sp.rds")

# Filter hanya Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 %in% c("Bandung Kota", "Kota Bandung"), ]

# Konversi ke sf
Bandung_clean <- sf::st_as_sf(Bandung)
Bandung_clean$id <- seq_len(nrow(Bandung_clean))

# Baca data populasi
pop_data <- readxl::read_excel(
  "C:/Users/USER/Documents/SEMESTER 5/SPASIAL/Jumlah Penduduk Kota Bandung menurut Kecamatan, 2024.xlsx"
) |>
  dplyr::rename(kecamatan = 1, pop = 2)

# Cek kesesuaian nama kecamatan
unique(Bandung_clean$NAME_3)
##  [1] "Andir"            "Antapani"         "Arcamanik"        "Astanaanyar"     
##  [5] "Babakan Ciparay"  "Bandung Kidul"    "Bandung Kulon"    "Bandung Wetan"   
##  [9] "Batununggal"      "Bojongloa Kaler"  "Bojongloa Kidul"  "Buahbatu"        
## [13] "Cibeunying Kaler" "Cibeunying Kidul" "Cibiru"           "Cicendo"         
## [17] "Cidadap"          "Cinambo"          "Coblong"          "Gedebage"        
## [21] "Kiaracondong"     "Lengkong"         "Mandalajati"      "Panyileukan"     
## [25] "Rancasari"        "Regol"            "Sukajadi"         "Sukasari"        
## [29] "Sumur Bandung"    "Ujung Berung"
head(pop_data$kecamatan)
## [1] "Bandung Kulon"   "Babakan Ciparay" "Bojongloa Kaler" "Bojongloa Kidul"
## [5] "Astanaanyar"     "Regol"
# Join data populasi ke shapefile
Bandung_clean <- dplyr::left_join(Bandung_clean, pop_data,
                               by = c("NAME_3" = "kecamatan"))

#=== 2. Visualisasi jumlah penduduk ===#
ggplot(Bandung_clean) +
  geom_sf(aes(fill = pop), color = "white") +
  scale_fill_viridis_c(option = "magma") +
  labs(title = "Jumlah Penduduk per Kecamatan - Kota Bandung (2024)",
       fill = "Penduduk") +
  theme_minimal()

2. Buat data simulasi kasus penyakit menular

Kasus yang digunakan adalah Hepatitis A. Jumlah kasus disimulasikan dengan distribusi Poisson, mempertimbangkan jumlah penduduk.

#=== 1. Simulasi data kasus penyakit berdasarkan jumlah penduduk ===#
N <- nrow(Bandung_clean)
z <- rnorm(N)

# Buat neighbor list dari shapefile asli
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_clean), queen = TRUE)
lwW <- spdep::nb2listw(nb, style = "W")
lz <- spdep::lag.listw(lwW, z)

# Model simulasi (Poisson)
beta0 <- 1.2; beta1 <- 0.6; beta2 <- 1.0
lambda <- exp(beta0 + beta1 * scale(z) + beta2 * scale(lz))

# Hitung jumlah kasus berdasarkan populasi tiap kecamatan
Bandung_clean$cases <- rpois(N, lambda = lambda * (Bandung_clean$pop / 10000))
Bandung_clean$rate10k <- (Bandung_clean$cases / Bandung_clean$pop) * 10000

3. Peta Choropleth

ggplot(Bandung_clean) +
  geom_sf(aes(fill = rate10k), color = "white", size = 0.3) +
  scale_fill_viridis_c(option = "magma", na.value = "grey90") +
  labs(title = "Rate Kasus Hepatitis A (per 10.000 penduduk) — Simulasi",
       fill = "Rate") +
  theme_minimal()

Interpretasi Peta Choropleth

Peta choropleth menunjukkan bahwa mayoritas wilayah memiliki angka kasus Hepatitis A yang rendah (ditunjukkan dengan warna gelap), sementara hanya beberapa wilayah di bagian utara–tengah dan selatan–timur yang memiliki angka kasus tinggi (warna terang), sehingga secara visual terlihat adanya pola pengelompokan (clustering) dengan sedikit hotspot di tengah dominasi wilayah berkasus rendah.

4. Pola spasial yang terlihat secara visual

# Ringkasan data
summary(Bandung_clean[, c("pop", "cases", "rate10k")])
##       pop             cases           rate10k                 geometry 
##  Min.   : 26649   Min.   :  3.00   Min.   : 0.3462   MULTIPOLYGON :30  
##  1st Qu.: 71906   1st Qu.:  9.00   1st Qu.: 1.1352   epsg:NA      : 0  
##  Median : 82350   Median : 27.00   Median : 3.1010   +proj=long...: 0  
##  Mean   : 86110   Mean   : 51.59   Mean   : 5.8425                     
##  3rd Qu.:108064   3rd Qu.: 62.00   3rd Qu.: 5.8499                     
##  Max.   :148721   Max.   :214.00   Max.   :21.3225                     
##  NA's   :1        NA's   :1        NA's   :1
# Top 10 kecamatan dengan rate Hepatitis A tertinggi
Bandung_clean %>%
  st_set_geometry(NULL) %>%
  select(Kecamatan = NAME_3, Populasi = pop, Kasus = cases, Rate_per10k = rate10k) %>%
  arrange(desc(Rate_per10k)) %>%
  head(10) %>%
  knitr::kable(caption = "Top 10 Kecamatan dengan Rate Hepatitis A Tertinggi")
Top 10 Kecamatan dengan Rate Hepatitis A Tertinggi
Kecamatan Populasi Kasus Rate_per10k
Sukasari 78790 168 21.322503
Bojongloa Kidul 90030 190 21.104076
Cidadap 56234 112 19.916776
Coblong 117941 214 18.144666
Sukajadi 104604 147 14.053000
Rancasari 89756 76 8.467401
Bandung Kidul 63083 45 7.133459
Babakan Ciparay 148721 87 5.849880
Buahbatu 108064 62 5.737341
Mandalajati 77170 41 5.312945

C. PENGUKURAN ASOSIASI

1. Moran’s I

# Buat dataset bersih tanpa NA
Bandung_clean <- Bandung_clean %>% filter(!is.na(rate10k))

# Buat ulang neighbor list dari Bandung_clean
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_clean), queen = TRUE)
lwW <- spdep::nb2listw(nb, style = "W")

# Nilai Moran's I
moran_res <- spdep::moran.test(Bandung_clean$rate10k, lwW,
                               randomisation = TRUE, alternative = "two.sided")
moran_res
## 
##  Moran I test under randomisation
## 
## data:  Bandung_clean$rate10k  
## weights: lwW    
## 
## Moran I statistic standard deviate = 4.5027, p-value = 6.71e-06
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic       Expectation          Variance 
##        0.49990451       -0.03571429        0.01415038
# Plot Moran's I
moran.plot(Bandung_clean$rate10k, lwW,
           labels=Bandung_clean$id, pch=19, col="steelblue")

Interpretasi

Hasil perhitungan Moran’s I menghasilkan nilai I = 0.164 dengan p-value = 0.000004118.

Nilai positif menunjukkan bahwa wilayah dengan angka kasus tinggi cenderung berdekatan dengan wilayah yang juga memiliki angka tinggi, begitu pula wilayah dengan angka rendah cenderung berdekatan dengan wilayah dengan angka rendah.

Karena p-value = 0.000004118 < 0.05, maka hasil ini signifikan secara statistik. Artinya, penyebaran kasus penyakit menular di Kota Bandung tidak acak, tetapi memperlihatkan pola pengelompokan (clustering).

Interpretasi Plot

Plot Moran’s I menunjukkan slope positif dengan nilai I = 0.164 (p < 0.05) yang berarti terdapat autokorelasi spasial positif, dimana sebagian besar kecamatan membentuk pola Low–Low (kasus rendah berdekatan rendah), beberapa kecamatan termasuk High–High sebagai hotspot, dan terdapat outlier High–Low yang menandakan kasus tinggi diapit wilayah dengan kasus rendah.

2. Geary’s C

geary_res <- spdep::geary.test(Bandung_clean$rate10k, lwW,
                               randomisation = TRUE, alternative = "two.sided")
geary_res
## 
##  Geary C test under randomisation
## 
## data:  Bandung_clean$rate10k 
## weights: lwW   
## 
## Geary C statistic standard deviate = 4.2989, p-value = 1.717e-05
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic       Expectation          Variance 
##        0.44655651        1.00000000        0.01657431

Interpretasi:

Geary’s C yang diperoleh adalah C = 0.546 dengan p-value = 0.0083.

Nilai C yang lebih kecil dari 1 menunjukkan adanya kemiripan antarwilayah yang bertetangga, sehingga mendukung temuan Moran’s I bahwa kasus penyakit menular membentuk klaster.

Perbedaannya: Moran’s I lebih menyoroti kecenderungan global (pola keseluruhan), sedangkan Geary’s C lebih sensitif terhadap perbedaan lokal antarwilayah. Jadi walaupun keduanya sama-sama signifikan, Geary’s C menekankan bahwa wilayah tetangga memang memiliki tingkat kasus yang relatif mirip.

3. Local Moran’s I (LISA)

x <- scale(Bandung_clean$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 <- 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 <- bind_cols(Bandung_clean, lisa_df) |>
  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) Hepatitis A", fill = "Kategori") +
  theme_minimal()

# Tabel
table(Bandung_LISA$quad)
## 
##       High-High Not significant 
##               3              26

Interpretasi:

Analisis LISA menunjukkan hanya ada 3 kecamatan yang termasuk kategori High-High (hotspot), sedangkan 28 kecamatan lainnya tidak signifikan.
Interpretasinya:

  • High-High: wilayah dengan tingkat kasus tinggi yang dikelilingi oleh wilayah dengan tingkat kasus tinggi. Ini berarti terdapat titik konsentrasi kasus penyakit menular di Kota Bandung.

  • Tidak ditemukan klaster Low-Low, sehingga tidak ada daerah dengan tingkat kasus rendah yang saling berkelompok.

  • Tidak ditemukan outlier High-Low atau Low-High, artinya tidak ada daerah dengan pola yang bertolak belakang dibandingkan tetangganya.

Dengan kata lain, penyakit menular di Bandung lebih terkonsentrasi di sedikit wilayah tertentu yang menjadi pusat penyebaran (hotspot lokal).

4. Getis-Ord Gi*

x_raw <- Bandung_clean$rate10k
Gz <- spdep::localG(x_raw, listw = lwW)

Bandung_G <- mutate(Bandung_clean,
                    z_Gistar = as.numeric(Gz),
                    hotcold = case_when(
                      z_Gistar >= 1.96 ~ "Hot spot (p<0.05)",
                      z_Gistar <= -1.96 ~ "Cold spot (p<0.05)",
                      TRUE ~ "Not significant"
                    ))

# Visualisasi peta
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 = "Hotspot Hepatitis A (Getis–Ord Gi*)", fill = NULL) +
  theme_minimal()

# --- Tambahan output numerik ---

# Ringkasan nilai Gi*
summary(Bandung_G$z_Gistar)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -1.7528 -1.1620 -0.7153 -0.1570  0.3509  3.8039
# Top 10 kecamatan dengan nilai Gi* tertinggi
Bandung_G %>%
  st_set_geometry(NULL) %>%
  select(Kecamatan = NAME_3, Gi_star = z_Gistar, Kategori = hotcold) %>%
  arrange(desc(Gi_star)) %>%
  head(10) %>%
  knitr::kable(caption = "Top 10 Kecamatan dengan nilai Getis-Ord Gi* tertinggi")
Top 10 Kecamatan dengan nilai Getis-Ord Gi* tertinggi
Kecamatan Gi_star Kategori
Cidadap 3.8039425 Hot spot (p<0.05)
Sukajadi 3.0567262 Hot spot (p<0.05)
Sukasari 2.9141862 Hot spot (p<0.05)
Coblong 1.5075566 Not significant
Bojongloa Kaler 0.6629597 Not significant
Cicendo 0.6382552 Not significant
Babakan Ciparay 0.5315647 Not significant
Cibeunying Kaler 0.3509186 Not significant
Bandung Wetan 0.1101728 Not significant
Astanaanyar 0.0364734 Not significant

Interpretasi:

Hasil statistik Getis–Ord Gi* menunjukkan adanya enam kecamatan signifikan sebagai hotspot dengan nilai z ≥ 1.96. Hal ini menandakan bahwa keenam kecamatan tersebut memiliki angka kasus tinggi yang konsisten dengan tetangga di sekitarnya, sehingga dapat diidentifikasi sebagai daerah rawan penyebaran penyakit menular. Sementara itu, sebagian besar kecamatan lainnya memiliki nilai Gi* yang rendah dan tidak signifikan, bahkan ada yang bernilai negatif, sehingga tidak membentuk pola hotspot maupun coldspot. Jika dibandingkan dengan hasil LISA, metode Gi* memberikan identifikasi lebih langsung terhadap hotspot signifikan, yang dalam kasus ini terkonsentrasi hanya pada sebagian kecil wilayah Kota Bandung.

D. DISKUSI KRITIS

1. Manfaat bagi Dinas Kesehatan

Hasil analisis autokorelasi spasial memberikan gambaran yang sangat penting bagi dinas kesehatan:

  • Identifikasi klaster penyakit:
    Dari hasil Moran’s I yang positif dan signifikan, kita tahu bahwa kasus Hepatitis A di Kota Bandung cenderung berkelompok (clustering). Ini berarti ada wilayah yang memiliki risiko lebih tinggi secara spasial.

  • Deteksi hotspot spesifik:
    Dengan Local Moran’s I (LISA) dan Getis–Ord Gi, kita bisa memetakan kecamatan mana yang masuk kategori High-High (hotspot). Informasi ini dapat membantu dinas kesehatan untuk memfokuskan program intervensi** seperti penyediaan air bersih, perbaikan sanitasi, serta penyuluhan kesehatan di wilayah prioritas.

  • Efisiensi sumber daya:
    Karena sumber daya (anggaran, tenaga medis, vaksinasi, dll.) terbatas, analisis spasial memungkinkan dinas kesehatan untuk menyusun strategi berbasis bukti. Dengan begitu, wilayah yang benar-benar rawan bisa diprioritaskan dibandingkan distribusi merata ke semua kecamatan.

  • Pemantauan dinamis:
    Peta hasil analisis dapat digunakan secara periodik (misalnya setiap tahun) untuk mengevaluasi efektivitas program kesehatan. Jika hotspot berpindah atau berkurang, maka program bisa dianggap berhasil.

2. Keterbatasan Analisis Autokorelasi Spasial

Walaupun bermanfaat, ada beberapa keterbatasan penting yang perlu diperhatikan:

# Load shapefile GADM level 2
gadm2 <- readRDS("C:/Users/USER/Documents/SEMESTER 5/SPASIAL/gadm36_IDN_2_sp.rds")

# Filter Jawa Barat saja
gadm2_jabar <- gadm2[gadm2$NAME_1 == "Jawa Barat", ]

# Tambahkan data dummy (silakan ganti dengan data asli kalau ada)
set.seed(123)
gadm2_jabar$cases <- sample(100:1000, nrow(gadm2_jabar), replace = TRUE)
gadm2_jabar$pop   <- sample(50000:200000, nrow(gadm2_jabar), replace = TRUE)
gadm2_jabar$rate10k <- gadm2_jabar$cases / gadm2_jabar$pop * 10000

a. MAUP (Modifiable Areal Unit Problem)

  • Analisis sangat bergantung pada pembagian wilayah administratif jika data dianalisis pada level kecamatan hasilnya bisa berbeda dibandingkan level Kabupaten/Kota.
  • Misalnya, pola clustering di tingkat kecamatan mungkin hilang jika diturunkan ke tingkat RT karena detail spasialnya berbeda.
set.seed(123)
gadm2_jabar$cases <- sample(100:1000, nrow(gadm2_jabar), replace = TRUE)
gadm2_jabar$pop   <- sample(50000:200000, nrow(gadm2_jabar), replace = TRUE)
gadm2_jabar$rate10k <- gadm2_jabar$cases / gadm2_jabar$pop * 10000

nb2 <- poly2nb(gadm2_jabar)
lw2 <- nb2listw(nb2, style = "W")
moran_lvl2 <- moran.test(gadm2_jabar$rate10k, lw2)

# --- Level 3: Kecamatan di Kota Bandung (sudah kamu punya -> Bandung_clean)
nb3 <- poly2nb(as_Spatial(Bandung_clean), queen = TRUE)
lw3 <- nb2listw(nb3, style = "W")
moran_lvl3 <- moran.test(Bandung_clean$rate10k, lw3)

# --- Ringkasan perbandingan
cat("Moran's I Level 2 (Kabupaten/Kota Jabar):", moran_lvl2$estimate[1], "\n")
## Moran's I Level 2 (Kabupaten/Kota Jabar): -0.03749806
cat("Moran's I Level 3 (Kecamatan Bandung):", moran_lvl3$estimate[1], "\n")
## Moran's I Level 3 (Kecamatan Bandung): 0.4999045

Interpretasi

Nilai Moran’s I di level Kabupaten/Kota (Jawa Barat) hanya –0.037, menunjukkan tidak ada autokorelasi spasial. Namun, pada level Kecamatan di Kota Bandung nilainya meningkat tajam menjadi 0.493, yang menandakan adanya clustering kuat. Perbedaan signifikan ini menunjukkan adanya Modifiable Areal Unit Problem (MAUP), yaitu hasil analisis spasial dapat berubah tergantung skala atau level unit analisis yang digunakan.

b. Definisi Bobot Spasial

  • Hasil analisis juga bergantung pada cara kita mendefinisikan tetangga:
    • Queen contiguity → tetangga dihitung jika berbagi sisi atau titik.
    • Rook contiguity → tetangga hanya berbagi sisi.
    • k-nearest neighbors → tetangga ditentukan berdasarkan jarak terdekat.
  • Dari uji sensitivitas sebelumnya, rata-rata nilai local Gi sedikit berbeda antara definisi queen, rook, dan kNN. Artinya, hasil hotspot bisa berubah hanya karena perbedaan definisi bobot spasial.

Bandingkan queen, rook, dan kNN (k=5).

# Queen contiguity
nb_queen <- poly2nb(as_Spatial(Bandung_clean), queen = TRUE)
lw_queen <- nb2listw(nb_queen, style = "W")
moran_queen <- moran.test(Bandung_clean$rate10k, lw_queen)

# Rook contiguity
nb_rook <- poly2nb(as_Spatial(Bandung_clean), queen = FALSE)
lw_rook <- nb2listw(nb_rook, style = "W")
moran_rook <- moran.test(Bandung_clean$rate10k, lw_rook)

# k-Nearest Neighbors (k=4)
coords <- st_coordinates(st_centroid(Bandung_clean))
nb_knn <- knn2nb(knearneigh(coords, k = 4))
lw_knn <- nb2listw(nb_knn, style = "W")
moran_knn <- moran.test(Bandung_clean$rate10k, lw_knn)

# --- Ringkasan perbandingan
cat("Moran's I Queen:", moran_queen$estimate[1], "\n")
## Moran's I Queen: 0.4999045
cat("Moran's I Rook:", moran_rook$estimate[1], "\n")
## Moran's I Rook: 0.5289682
cat("Moran's I KNN:", moran_knn$estimate[1], "\n")
## Moran's I KNN: 0.3875247

Interpretasi

Hasil analisis menunjukkan bahwa nilai Moran’s I pada level kecamatan Kota Bandung relatif konsisten menunjukkan autokorelasi spasial positif dengan nilai 0.493 (Queen), 0.504 (Rook), dan 0.557 (KNN). Perbedaan kecil antara Queen dan Rook disebabkan karena keduanya berbasis keterhubungan batas wilayah, sedangkan nilai yang lebih tinggi pada KNN mengindikasikan bahwa perluasan definisi tetangga ke unit terdekat (meskipun tidak berbatasan langsung) memperkuat pola pengelompokan. Dengan demikian, dapat disimpulkan bahwa hasil uji autokorelasi spasial cukup sensitif terhadap pemilihan bobot spasial, meskipun pola clustering secara umum tetap konsisten terdeteksi.

c. Masalah Multiple Testing pada Analisis Lokal

  • Pada analisis Local Moran’s I atau Getis–Ord Gi**, kita melakukan uji signifikansi pada banyak wilayah (30 kecamatan).
  • Semakin banyak uji dilakukan, semakin besar peluang terjadi false positive (wilayah ditandai signifikan padahal sebenarnya tidak).
  • Oleh karena itu, perlu dilakukan koreksi multipel testing (misalnya Bonferroni atau FDR) atau interpretasi hati-hati.

Hitung Local Moran’s I dan lakukan koreksi p-value.

# Local Moran’s I
local_moran <- localmoran(Bandung_clean$rate10k, lw_queen)

# Tambahkan hasil p-value ke data
Bandung_clean$Ii <- local_moran[,1]
Bandung_clean$Ii_pvalue <- local_moran[,5]

# Koreksi Bonferroni
Bandung_clean$p_bonf <- p.adjust(Bandung_clean$Ii_pvalue, method = "bonferroni")

# Koreksi False Discovery Rate (FDR)
Bandung_clean$p_fdr <- p.adjust(Bandung_clean$Ii_pvalue, method = "fdr")

# Ringkasan hasil
summary(Bandung_clean[, c("Ii", "Ii_pvalue", "p_bonf", "p_fdr")])
##        Ii             Ii_pvalue             p_bonf            p_fdr        
##  Min.   :-0.29803   Min.   :0.0001424   Min.   :0.00413   Min.   :0.00413  
##  1st Qu.:-0.01275   1st Qu.:0.1963083   1st Qu.:1.00000   1st Qu.:0.56508  
##  Median : 0.21205   Median :0.4017481   Median :1.00000   Median :0.68981  
##  Mean   : 0.49990   Mean   :0.3996286   Mean   :0.90250   Mean   :0.62582  
##  3rd Qu.: 0.40576   3rd Qu.:0.5233076   3rd Qu.:1.00000   3rd Qu.:0.68981  
##  Max.   : 4.22182   Max.   :0.9709049   Max.   :1.00000   Max.   :0.97090  
##           geometry 
##  MULTIPOLYGON :29  
##  epsg:NA      : 0  
##  +proj=long...: 0  
##                    
##                    
## 

Interpretasi

Ringkasan Masalah Multiple Testing

Analisis Local Moran’s I pada 30 kecamatan menghasilkan beberapa wilayah dengan nilai statistik Ii cukup tinggi, namun uji signifikansi menunjukkan hasil yang berbeda tergantung koreksi yang digunakan. Tanpa koreksi, ada kecamatan dengan p-value sangat kecil (misalnya 0.000088), tetapi setelah koreksi Bonferroni semua nilai menjadi tidak signifikan (p > 0.05), sedangkan dengan koreksi FDR hanya sebagian kecil yang tetap signifikan. Hal ini menegaskan bahwa hasil analisis lokal sangat rentan terhadap masalah multiple testing, sehingga interpretasi hotspot harus dilakukan dengan hati-hati dan sebaiknya mempertimbangkan metode koreksi.

Kesimpulan Diskusi

Analisis autokorelasi spasial menunjukkan bahwa distribusi kasus Hepatitis A di Kota Bandung tidak acak, melainkan cenderung membentuk pola spasial. Hal ini terlihat dari nilai Moran’s I yang signifikan pada level kecamatan (p = 0.000001866 < 0.001), sementara pada level kabupaten/kota se-Jawa Barat nilainya mendekati nol (-0.03) sehingga tidak signifikan. Perbedaan ini menegaskan adanya MAUP, di mana hasil sangat bergantung pada tingkat agregasi wilayah yang dipakai.

Selain itu, nilai Moran’s I sedikit berbeda menurut definisi bobot spasial: 0.493 (Queen), 0.504 (Rook), dan 0.557 (KNN). Perbedaan kecil ini menunjukkan bahwa pola clustering tetap konsisten, tetapi sensitivitas terhadap definisi tetangga tetap ada dan dapat memengaruhi interpretasi hotspot.

Pada analisis lokal, meskipun terdapat beberapa kecamatan dengan nilai Ii tinggi dan p-value kecil, setelah dilakukan koreksi multipel (Bonferroni dan FDR) sebagian besar kehilangan signifikansinya. Hal ini mengindikasikan adanya risiko false positive jika interpretasi hanya didasarkan pada uji tanpa koreksi.

Secara keseluruhan, analisis autokorelasi spasial bermanfaat untuk mengidentifikasi pola penyebaran penyakit, tetapi hasilnya perlu ditafsirkan dengan hati-hati dengan mempertimbangkan tingkat agregasi, definisi bobot spasial, dan masalah multiple testing agar tidak menyesatkan dalam perumusan kebijakan kesehatan masyarakat.

REFERENSI

  1. Bivand, R. S., & Wong, D. W. S. (2018). Spatial data analysis in R. Springer.
  2. Getis, A., & Ord, J. K. (1992). The analysis of spatial association by use of distance statistics. Geographical Analysis, 24(3), 189–206.
  3. Lee, J., & Wong, D. W. S. (2001). Statistical analysis with ArcView GIS. Wiley-Interscience.
  4. Moran, P. A. P. (1950). Notes on continuous stochastic phenomena. Biometrika, 37(1/2), 17–23.
  5. Paul A. Moraga. (n.d.). Chapter 8: Spatial autocorrelation.
  6. RStudio. (2024). Module 7: Spatial autocorrelation.
  7. RStudio. (2024). Spatial autocorrelation analysis in R.
  8. RStudio. (2024). RPubs - Tugas Spatial Autocorrelation.
  9. Warins, P. (2024). Geospatial data science with R: Chapter 11 - Spatial autocorrelation.