1. Penjelasan Autokorelasi Spasial Positif dan Negatif

Autokorelasi spasial merupakan salah satu konsep utama dalam analisis spasial yang menggambarkan sejauh mana nilai suatu variabel di suatu lokasi memiliki keterkaitan dengan nilai variabel yang sama pada lokasi di sekitarnya. Konsep ini muncul karena fenomena di dunia nyata tidak tersebar secara acak, melainkan cenderung memiliki pola tertentu yang dipengaruhi oleh kedekatan ruang atau lokasi. Dengan kata lain, autokorelasi spasial mengukur apakah distribusi suatu data di ruang cenderung membentuk pola mengelompok (clustered), tersebar merata (dispersed), atau acak (random).

Dengan memahami kedua jenis autokorelasi ini, peneliti dapat menilai apakah suatu fenomena cenderung terpusat, menyebar, atau benar-benar acak. Informasi ini penting untuk perencanaan wilayah, kebijakan publik, hingga penelitian akademis.

2. Contoh Fenomena

Untuk memperjelas konsep tersebut, berikut contoh nyata dari masing-masing pola autokorelasi spasial:

3. Rumus Matematis

Beberapa ukuran autokorelasi spasial yang paling umum digunakan antara lain sebagai berikut:

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

Moran’s I mengukur derajat autokorelasi spasial secara global. Nilai positif yang signifikan menunjukkan adanya pengelompokan, sedangkan nilai negatif menunjukkan adanya pola penyebaran atau dispersi. Nilai mendekati nol menandakan distribusi acak.

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

Geary’s C juga merupakan ukuran global, tetapi lebih sensitif terhadap perbedaan lokal antar tetangga. Nilai C < 1 mengindikasikan autokorelasi positif, sementara nilai C > 1 menunjukkan autokorelasi negatif.

\[ I_i = \frac{(x_i - \bar{x})}{m_2} \sum_{j} w_{ij} (x_j - \bar{x}), \quad \text{dengan } m_2 = \frac{\sum_{i}(x_i - \bar{x})^2}{n} \]

Local Moran’s I digunakan untuk mengidentifikasi keberadaan klaster atau outlier pada tingkat lokal, misalnya untuk menemukan daerah dengan nilai tinggi yang dikelilingi oleh nilai tinggi lainnya (high-high cluster) atau daerah dengan nilai rendah yang dikelilingi nilai tinggi (low-high outlier).

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

Ukuran ini digunakan untuk mengidentifikasi klaster panas (hot spots) dan dingin (cold spots) pada suatu wilayah, dengan fokus pada intensitas nilai di sekitar suatu lokasi.

\[ G_i^* = \frac{\sum_{j} w_{ij} x_j}{\sum_{j} x_j}, \quad \text{dengan } i \in j \]

Perbedaan mendasar antara \(G_i\) dan \(G_i^*\) adalah apakah lokasi \(i\) itu sendiri dimasukkan dalam perhitungan. Nilai \(G_i^*\) memasukkan lokasi tersebut, sementara \(G_i\) tidak. Hal ini membuat \(G_i^*\) lebih sensitif dalam mendeteksi hot spot atau cold spot.

4. Perbedaan Ukuran Global dan Lokal

Perbedaan utama antara ukuran global dan lokal terletak pada cakupan analisis dan informasi yang dihasilkan. Ukuran global, seperti Moran’s I dan Geary’s C, memberikan gambaran umum mengenai pola autokorelasi spasial di seluruh wilayah studi. Hasilnya berupa satu nilai tunggal yang mewakili keseluruhan distribusi data, sehingga bermanfaat untuk menilai apakah secara umum data bersifat mengelompok, menyebar, atau acak. Namun, ukuran global tidak mampu mengungkap lokasi spesifik yang menjadi pusat pengelompokan atau anomali.

Sebaliknya, ukuran lokal seperti Local Moran’s I dan Getis–Ord \(G_i\) atau \(G_i^*\) lebih fokus pada level lokasi tertentu. Ukuran ini memungkinkan peneliti untuk mengidentifikasi di mana klaster terjadi (misalnya daerah dengan angka kriminalitas tinggi yang berdekatan dengan daerah sejenis) atau di mana terdapat outlier (misalnya daerah dengan nilai sangat rendah di tengah daerah dengan nilai tinggi). Informasi ini sangat penting dalam konteks kebijakan publik, karena memberikan dasar untuk intervensi yang lebih tepat sasaran.

B. Analisis Data (Simulasi)

library(spdep)
## Warning: package 'spdep' was built under R version 4.5.1
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.5.1
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
## Loading required package: sf
## Warning: package 'sf' was built under R version 4.5.1
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(sp)
## Warning: package 'sp' was built under R version 4.5.1
library(sf)
library(ggplot2)
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
# Arahkan ke folder kerja Anda
setwd("C:/Users/Lenovo/Semester 5/Spasial")
# Data kasus
Diare <- read.csv("Diare.csv", sep=";")
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")) {
  # Membuat bounding box
  bb <- sf::st_as_sfc(
    sf::st_bbox(
      c(xmin = 107.55, ymin = -6.98, xmax = 107.72, ymax = -6.85),
      crs = 4326
    )
  )
  
  # Membuat grid
  grid <- sf::st_make_grid(bb, n = c(6, 5)) |> 
    sf::st_as_sf() |> 
    dplyr::mutate(id = dplyr::row_number())
  
  # Menyimpan grid ke objek Bandung_sf
  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()

set.seed(36)  # agar hasil bisa direplikasi

# Misal Bandung_sf sudah berisi 30 kecamatan
n_kecamatan <- nrow(Bandung_sf)

# Simulasikan rata-rata kasus per 10.000 penduduk per kecamatan (misal 5-20)
lambda <- runif(n_kecamatan, min = 5, max = 20)

# Simulasikan kasus Poisson
Bandung_sf <- Bandung_sf %>%
  mutate(
    kasus_diare = rpois(n_kecamatan, lambda)
  )

# Tampilkan data simulasi
head(Bandung_sf[, c("id", "kasus_diare")])
# Peta kasus simulasi
ggplot(Bandung_sf) +
  geom_sf(aes(fill = kasus_diare), color = "white") +
  scale_fill_viridis_c(option = "plasma") +
  labs(title = "Simulasi Kasus Diare per 10.000 Penduduk di Kota Bandung",
       fill = "Kasus") +
  theme_minimal()

Peta choropleth yang ditampilkan menggambarkan simulasi distribusi kasus diare per 10.000 penduduk di Kota Bandung. Dari visualisasi ini, terlihat adanya variasi spasial yang signifikan antarwilayah. Beberapa kecamatan menunjukkan jumlah kasus yang tinggi, ditandai dengan warna kuning dan oranye, terutama di wilayah timur dan utara kota, sedangkan sebagian besar wilayah lain berada pada kisaran kasus rendah hingga sedang, ditandai dengan warna ungu hingga biru gelap.

Fenomena ini mengindikasikan adanya ketimpangan risiko kesehatan di Kota Bandung, yang kemungkinan dipengaruhi oleh faktor kepadatan penduduk, sanitasi, dan akses terhadap fasilitas kesehatan. Peta ini dapat menjadi dasar untuk perencanaan intervensi kesehatan yang lebih terfokus, seperti program pencegahan diare dan peningkatan layanan kesehatan di wilayah dengan kasus tinggi, sehingga upaya pengendalian penyakit dapat lebih efektif dan tepat sasaran.

C. Pengukuran Autokorelasi

Global Morans’I

set.seed(36)  # untuk reproduksi

# Pastikan Bandung_sf sudah ada dan valid
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

# Simulasi kasus diare sudah dilakukan
# Bandingkan: head(Bandung_sf[, c("id", "kasus_diare")])

# 1. Membuat neighbor list (queen contiguity)
nb <- spdep::poly2nb(sf::as_Spatial(Bandung_sf), queen = TRUE)

# 2. Mengubah menjadi listw (row-standardized dan binary)
lwW <- spdep::nb2listw(nb, style = "W")  # row-standardized
lwB <- spdep::nb2listw(nb, style = "B")  # binary

# 3. Lag spatial (optional, untuk analisis visual)
z <- Bandung_sf$kasus_diare
lz <- spdep::lag.listw(lwW, z)

# 4. Uji Moran's I (global) menggunakan variabel kasus_diare
moran_res <- spdep::moran.test(Bandung_sf$kasus_diare, lwW,
                               randomisation = TRUE,
                               alternative = "two.sided")

moran_res
## 
##  Moran I test under randomisation
## 
## data:  Bandung_sf$kasus_diare  
## weights: lwW    
## 
## Moran I statistic standard deviate = -0.12973, p-value = 0.8968
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       -0.04933026       -0.03448276        0.01309937

Interpretasi

  • Nilai Morans’I diperoleh sebesar - 0.04933026 menunjukkan bahwa tidak ada autokorelasi spasial yang jelas, dimana kecenderungan sangat lemah dispersi (kecamatan kasus tinggi cenderung bertetangga dengan kecamatan kasus rendah) tapi hampir mendekati 0

  • P-value yang diperoleh sebesar 0.8968 dimana lebih besar dari alpha (0.05) sehingga dapat diputuskan bahwa tidak signifikan maka tidak ada cukup bukti yang cukup untuk menyatakan bahwa kasus diare di Bandung membentuk pola spasial tertentu

  • Kasus diare yang disimulasikan di Bandung tidak menunjukkan pola spasial yang nyata; penyebarannya cenderung acak antar kecamatan.

Gearys’C

geary_res <- spdep::geary.test(Bandung_sf$kasus_diare, lwW,
                               randomisation = TRUE,
                               alternative = "two.sided")

geary_res
## 
##  Geary C test under randomisation
## 
## data:  Bandung_sf$kasus_diare 
## weights: lwW   
## 
## Geary C statistic standard deviate = 0.11171, p-value = 0.9111
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic       Expectation          Variance 
##        0.98688454        1.00000000        0.01378323

Interpretasi :

  • Nilai Gearys’C yang diperoleh sebesar 0.98688454 dimana mendekati nilai 1, maka nilai ini mirip bertetangga

  • P-value yang diperoleh sebesar 0.9111 dimana lebih besar dari alpha 0.05 sehingga tidak signifikan berarti pola spasial kasus diare bisa terjadi secara acak

Perbandingan :

  • Moran’s I = -0.0493, p-value = 0.8968 → juga tidak signifikan, sedikit negatif (cenderung dispersi tapi hampir 0)

  • Geary C = 0.9869, p-value = 0.9111 → juga tidak signifikan, mendekati 1 (tidak ada autokorelasi)

  • Kedua ukuran menyimpulkan tidak ada pola spasial signifikan untuk kasus diare di Bandung. Hasil konsisten antara Morans’I dan Gearys’C

Perbedaan Sensitivitas :

Ukuran Sensitivitas
Moran’s I Sensitif terhadap pola global. Memberikan gambaran apakah seluruh wilayah cenderung clustering atau tidak.
Geary’s C Sensitif terhadap perbedaan lokal antar tetangga. Lebih fokus pada seberapa berbeda nilai tiap wilayah dengan tetangganya.

Local Moran’s I (LISA)

# Standarisasi variabel kasus_diare
x <- scale(Bandung_sf$kasus_diare)[,1]

# Lag spatial
lagx <- spdep::lag.listw(lwW, x)

# Local Moran's I (LISA)
lisa <- spdep::localmoran(x, lwW, alternative = "two.sided", zero.policy = TRUE)

# Konversi hasil ke data frame
lisa_df <- as.data.frame(lisa)
names(lisa_df) <- c("Ii","Ei","Vi","Zi","Pi.two.sided")

# Tentukan kategori kuadran
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 LISA ke sf
Bandung_LISA <- dplyr::bind_cols(Bandung_sf, lisa_df) %>%
  dplyr::mutate(quad = ifelse(Pi.two.sided <= alpha, quad, "Not significant"))

# Plot LISA
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) - Kasus Diare Bandung", fill="Kategori") +
  theme_minimal()

Interpretasi :

  1. Berdasarkan hasil Local Moran’s I (LISA) pada peta, terlihat bahwa hanya ada satu kecamatan yang masuk kategori Low-Low, yaitu wilayah di bagian selatan Kota Bandung yang ditandai dengan warna biru. Sementara itu, tidak ada kecamatan yang termasuk dalam kategori High-High, High-Low, maupun Low-High, karena seluruh wilayah lainnya ditampilkan dalam warna abu-abu yang menandakan kategori Not significant.

  2. Peta cluster LISA yang ditampilkan menunjukkan distribusi spasial dari kasus diare di Kota Bandung. Pada peta ini, warna biru menunjukkan adanya klaster signifikan dengan pola Low-Low, sedangkan warna abu-abu menunjukkan wilayah yang tidak signifikan secara spasial. Dengan demikian, peta cluster LISA memudahkan untuk mengidentifikasi wilayah yang memiliki pola pengelompokan kasus rendah di antara tetangga dengan kasus rendah pula.

  3. Interpretasi dari hasil ini untuk kasus penyakit menular, khususnya diare, menunjukkan bahwa di wilayah yang termasuk kategori Low-Low terdapat tingkat kasus diare yang rendah, dan wilayah sekitarnya juga memiliki kasus rendah. Hal ini berarti bahwa daerah tersebut relatif aman dari segi risiko penyebaran penyakit menular dibandingkan wilayah lain. Namun, karena tidak ditemukan klaster High-High, dapat disimpulkan bahwa pada saat analisis dilakukan tidak ada konsentrasi signifikan dari kasus diare yang tinggi. Meski begitu, hasil ini tetap penting sebagai informasi dasar dalam upaya pencegahan, sehingga pemerintah atau dinas kesehatan dapat menjaga kondisi lingkungan dan kesehatan masyarakat di wilayah Low-Low agar tetap stabil serta waspada terhadap potensi peningkatan kasus di masa depan.

Getis-Orid G

# Buat neighbors & weights
nb <- poly2nb(Bandung_sf)           # daftar neighbor
lwB <- nb2listw(nb, style = "B")    # bobot biner
lwW <- nb2listw(nb, style = "W")    # bobot terstandarisasi

Bandung_sf <- Bandung_sf %>%
  mutate(rate10k = kasus_diare)   # atau kasus_diare / penduduk * 10000 kalau ada data penduduk

x_raw <- as.numeric(Bandung_sf$rate10k)
length(x_raw)  
## [1] 30
sum_x <- sum(x_raw)

Wb <- as.matrix(listw2mat(lwB))

num_G <- as.numeric(Wb %*% x_raw)
den_G <- sum(x_raw) - 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 Getis-Ord G*
Gz <- spdep::localG(x_raw, listw = lwW)

# Tambahkan ke data spasial
Bandung_G <- Bandung_sf %>%
  mutate(
    G_raw = G_raw,
    G_star_raw = G_star_raw,
    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"
    )
  )

# Ringkasan hasil
summary(select(Bandung_G, G_raw, G_star_raw, z_Gistar))
##      G_raw           G_star_raw        z_Gistar                 geometry 
##  Min.   :0.06897   Min.   :0.1100   Min.   :-2.42970   MULTIPOLYGON :30  
##  1st Qu.:0.11789   1st Qu.:0.1513   1st Qu.:-0.66115   epsg:NA      : 0  
##  Median :0.16020   Median :0.1877   Median :-0.09603   +proj=long...: 0  
##  Mean   :0.15758   Mean   :0.1858   Mean   :-0.04682                     
##  3rd Qu.:0.18619   3rd Qu.:0.2233   3rd Qu.: 0.74206                     
##  Max.   :0.25085   Max.   :0.2848   Max.   : 1.78801
# Peta Hotspot-Coldspot
ggplot(Bandung_G) +
  geom_sf(aes(fill = hotcold), color = "white") +
  scale_fill_manual(values = c("Hot spot (p<0.05)" = "red",
                               "Cold spot (p<0.05)" = "blue",
                               "Not significant" = "grey80")) +
  labs(title = "Peta Hotspot-Coldspot Kasus Diare (Getis-Ord G*)",
       fill = "Kategori") +
  theme_minimal()

Interpretasi :

  1. Berdasarkan hasil analisis Getis-Ord G*, terlihat bahwa hanya ada satu kecamatan yang masuk kategori cold spot signifikan (p<0,05), yaitu wilayah di bagian selatan Kota Bandung yang ditandai dengan warna biru pada peta. Tidak ada kecamatan yang teridentifikasi sebagai hot spot, karena tidak ada z-score positif yang signifikan pada taraf 5%. Sementara itu, kecamatan lainnya masuk dalam kategori not significant.

  2. Jika dibandingkan dengan hasil peta Local Moran’s I (LISA), pola yang muncul relatif serupa: pada analisis LISA juga hanya ada satu wilayah di bagian selatan yang masuk kategori signifikan, yakni Low-Low cluster, sementara wilayah lain tidak menunjukkan klaster spasial yang berarti. Dengan kata lain, baik LISA maupun Getis-Ord G* sama-sama menandai daerah selatan Bandung sebagai area dengan kasus rendah yang dikelilingi wilayah dengan kasus rendah pula.

  3. Dari perbandingan ini dapat disimpulkan bahwa tidak ada perbedaan besar dalam penentuan wilayah signifikan antara kedua metode. Perbedaannya hanya terletak pada istilah kategorisasi: LISA mengidentifikasi wilayah tersebut sebagai Low-Low cluster, sedangkan Getis-Ord G* mengidentifikasinya sebagai cold spot. Namun secara substansi keduanya menunjukkan hal yang sama, yakni konsentrasi rendah kasus diare di wilayah selatan Kota Bandung.

D. Diskusi Kritis

1. Pemanfaatan analisis autokorelasi spasial untuk dinas kesehatan
Hasil analisis autokorelasi spasial, seperti Moran’s I atau Getis-Ord G*, dapat membantu dinas kesehatan dalam mengidentifikasi area-area yang menjadi klaster signifikan kasus penyakit menular. Misalnya, wilayah dengan pola hot spot menandakan konsentrasi kasus tinggi yang berdekatan, sehingga prioritas intervensi bisa difokuskan di sana, misalnya dengan peningkatan penyediaan air bersih, sanitasi, penyuluhan kesehatan, atau penempatan fasilitas medis tambahan. Sebaliknya, area yang terdeteksi sebagai cold spot dapat dijadikan contoh praktik baik yang mungkin bisa direplikasi di wilayah lain. Dengan demikian, analisis ini memberikan dasar spasial untuk menyusun strategi pencegahan, alokasi sumber daya, dan intervensi yang lebih efektif serta berbasis bukti.

2a. Keterbatasan terkait MAUP (Modifiable Areal Unit Problem)
Analisis autokorelasi spasial rentan terhadap masalah MAUP, yaitu hasil yang berbeda dapat muncul tergantung pada bagaimana wilayah analisis dibagi atau di-skala-kan. Misalnya, analisis berdasarkan tingkat kecamatan bisa memberikan hasil berbeda dibandingkan jika dilakukan pada tingkat kelurahan atau RW. Hal ini berarti keputusan tentang unit spasial yang digunakan akan memengaruhi hasil interpretasi, sehingga perlu kehati-hatian dalam menyimpulkan klaster penyakit.

2b. Keterbatasan ukuran bobot spasial
Pemilihan matriks bobot spasial—apakah menggunakan rook contiguity, queen contiguity, atau k-nearest neighbors—dapat memengaruhi hasil analisis. Bobot spasial mendefinisikan siapa yang dianggap tetangga bagi setiap wilayah, dan berbeda definisi bisa menghasilkan pola autokorelasi yang berbeda pula. Karena tidak ada satu ukuran bobot yang “paling benar”, hasil analisis bisa bervariasi dan interpretasinya harus mempertimbangkan konteks geografis dan epidemiologis setempat.

2c. Keterbatasan terkait multiple testing pada analisis lokal
Analisis lokal seperti Local Moran’s I atau Getis-Ord G* melakukan uji signifikansi pada banyak lokasi secara simultan. Hal ini menimbulkan risiko multiple testing problem, yaitu meningkatnya kemungkinan menemukan hasil signifikan secara kebetulan (false positives). Jika tidak diperbaiki dengan koreksi statistik (misalnya Bonferroni atau FDR), hasil bisa menyesatkan karena terlalu banyak wilayah yang tampak signifikan padahal tidak.