Autokorelasi spasial positif adalah kondisi di mana nilai-nilai yang mirip (misalnya, nilai tinggi dengan nilai tinggi atau nilai rendah dengan nilai rendah) cenderung berkumpul atau berdekatan satu sama lain di ruang geografis. Hal ini menunjukkan adanya pola pengelompokan (clustering).
Autokorelasi spasial negatif adalah kondisi di mana nilai-nilai yang berlawanan cenderung berdekatan. Ini menciptakan pola seperti papan catur (checkerboard) di mana nilai tinggi dikelilingi oleh nilai rendah, atau sebaliknya.
Autokorelasi Spasial Positif: - Tingkat kasus penyakit menular yang tinggi di suatu wilayah cenderung berdekatan dengan wilayah lain dengan tingkat kasus yang tinggi. - Harga properti yang tinggi di satu lingkungan cenderung berdekatan dengan properti lain yang juga memiliki harga tinggi.
Autokorelasi Spasial Negatif: - Sebuah toko yang memiliki penjualan sangat tinggi berlokasi di sebelah toko lain yang penjualannya sangat rendah. - Di suatu wilayah dengan ketersediaan air minum yang terbatas, populasi tikus yang tinggi di satu area bisa berdekatan dengan populasi tikus yang rendah di area lain.
Dinas Kesehatan Kota Bandung sedang menghadapi kekhawatiran terkait penyebaran Demam Berdarah Dengue (DBD) di seluruh kota. Untuk mengatasi hal ini, mereka mengumpulkan data kasus DBD dan populasi dari setiap 30 kecamatan. Dengan data ini, para analis dapat mengidentifikasi pola spasial, seperti di mana kasus tinggi mengelompok (hotspot), sehingga dinas kesehatan dapat menyusun strategi intervensi dan alokasi sumber daya dengan lebih tepat sasaran di area yang paling membutuhkan. ## 2. Data Simulasi & Distribusi Poisson
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(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(viridis)
## Warning: package 'viridis' was built under R version 4.3.3
## Loading required package: viridisLite
# Membuat peta simulasi 30 poligon
set.seed(123)
bb <- st_bbox(c(xmin = 107.55, ymin = -6.98, xmax = 107.72, ymax = -6.85), crs = 4326)
Bandung_sf <- st_make_grid(bb, n = c(6, 5), what = "polygons") %>%
st_as_sf() %>%
mutate(id = row_number())
# Membuat matriks bobot spasial (Queen contiguity)
nb <- poly2nb(as_Spatial(Bandung_sf), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
# Mensimulasikan penyakit dengan pola spasial
N <- nrow(Bandung_sf)
pop <- round(runif(N, 5000, 15000)) # Populasi simulasi
# Menghasilkan variabel dengan autokorelasi spasial
z <- rnorm(N)
lag_z <- lag.listw(lwW, z)
# Menggunakan model Poisson untuk mensimulasikan kasus penyakit (lag_z)
beta0 <- 1.5
beta1 <- 0.8
beta2 <- 1.2
lambda <- exp(beta0 + beta1 * scale(z) + beta2 * scale(lag_z)) * (pop / 10000)
cases <- rpois(N, lambda)
# Menggabungkan data simulasi dengan spasial
Penyakit_Simulasi <- tibble(
id = Bandung_sf$id,
pop = pop,
cases = cases,
rate_per_10k = (cases / pop) * 10000
)
Bandung_merged <- left_join(Bandung_sf, Penyakit_Simulasi, by = "id")
setwd("D:/SEMESTER 5/Spasial")
peta_bandung_sf <- st_read("BANDUNG.shp")
## Reading layer `BANDUNG' from data source `D:\SEMESTER 5\Spasial\BANDUNG.shp' using driver `ESRI Shapefile'
## Simple feature collection with 30 features and 12 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 107.5453 ymin: -6.969748 xmax: 107.7395 ymax: -6.840746
## Geodetic CRS: WGS84 Lat/Long's, Degrees, -180 ==> +180
peta_bandung_sf <- peta_bandung_sf %>%
mutate(id = row_number())
Bandung_merged <- peta_bandung_sf %>%
left_join(Penyakit_Simulasi, by = "id")
ggplot(data = Bandung_merged) +
geom_sf(aes(fill = rate_per_10k), color = "white", size = 0.2) +
scale_fill_viridis(option = "magma", name = "Laju (per 10K)") +
labs(title = "Peta Laju Penyakit DBD Kota Bandung") +
theme_minimal() +
theme(axis.text = element_blank(),
axis.title = element_blank(),
panel.grid.major = element_line(color = "grey80"),
panel.grid.minor = element_blank())
## 4. Pola spasial yang terlihat secara visual Berdasarkan visualisasi,
pola spasial yang terlihat adalah adanya clustering atau pengelompokan.
Wilayah dengan laju penyakit Demam Berdarah Dengue (DBD) yang tinggi
(ditandai dengan warna kuning muda) cenderung terkumpul di satu area,
sementara wilayah dengan laju penyakit rendah (ditandai dengan warna
ungu gelap hingga hitam) juga cenderung berkelompok bersama di area
lain. Pola ini menunjukkan adanya autokorelasi spasial positif, di mana
nilai laju penyakit di suatu kecamatan memiliki kemiripan dengan nilai
laju penyakit di kecamatan-kecamatan tetangganya.
nb <- poly2nb(as_Spatial(peta_bandung_sf), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
moran_test_result <- moran.test(Bandung_merged$rate_per_10k, listw = lwW,
randomisation = TRUE, alternative = "two.sided")
moran_test_result
##
## Moran I test under randomisation
##
## data: Bandung_merged$rate_per_10k
## weights: lwW
##
## Moran I statistic standard deviate = 0.9964, p-value = 0.3191
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.053324882 -0.034482759 0.007766015
Interpretasi: Berdasarkan hasil uji Moran’s I, nilai Moran’s I adalah 0.0533. Nilai ini mendekati 0, yang menunjukkan adanya pola yang cenderung acak. Secara statistik, hasil ini tidak signifikan, karena nilai p-value (0.3191) jauh lebih besar dari batas signifikansi umum (α = 0.05). Oleh karena itu, kita tidak memiliki cukup bukti untuk menolak hipotesis bahwa pola laju penyakit DBD di kecamatan-kecamatan Kota Bandung tersebar secara acak. Ini berarti, secara global, tidak ada pengelompokan yang signifikan dari kasus DBD yang tinggi atau rendah di wilayah yang berdekatan.
nb <- poly2nb(as_Spatial(peta_bandung_sf), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
# Geary's C
geary_test_result <- geary.test(Bandung_merged$rate_per_10k, listw = lwW,
randomisation = TRUE, alternative = "two.sided")
geary_test_result
##
## Geary C test under randomisation
##
## data: Bandung_merged$rate_per_10k
## weights: lwW
##
## Geary C statistic standard deviate = -0.55475, p-value = 0.5791
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 1.07636807 1.00000000 0.01895065
Moran’s I tidak signifikan (p-value 0.3191) dan Geary’s C juga tidak signifikan (p-value 0.5791). Kedua hasil ini konsisten dalam menunjukkan bahwa tidak ada autokorelasi spasial yang signifikan secara global pada data laju penyakit DBD simulasi. ### Perbedaan Moran’s I tidak signifikan dan Geary’s C - Moran’s I lebih sensitif terhadap kovariansi atau kemiripan nilai antar lokasi. Moran’s I mengukur seberapa besar nilai variabel di suatu lokasi berkorelasi dengan nilai rata-rata dari tetangganya. - Geary’s C lebih sensitif terhadap perbedaan atau variabilitas nilai antar lokasi yang berdekatan. Geary’s C mengukur seberapa besar perbedaan kuadrat antara nilai suatu lokasi dengan nilai tetangganya. Ini membuatnya lebih peka terhadap “kontras” atau variasi lokal.
Local Moran’s I (LISA) digunakan untuk mengidentifikasi klaster dan outlier spasial lokal secara spesifik. Dengan LISA, kita bisa menemukan di mana klaster “panas” (High-High) dan “dingin” (Low-Low) berada, serta di mana outlier (High-Low, Low-High) mungkin ada.
nb <- poly2nb(as_Spatial(peta_bandung_sf), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
lisa_result <- localmoran(Bandung_merged$rate_per_10k, lwW, alternative = "two.sided")
x_scaled <- scale(Bandung_merged$rate_per_10k)[, 1]
lag_x <- lag.listw(lwW, x_scaled)
p_value <- lisa_result[, 5]
lisa_quadrant <- case_when(
p_value > 0.05 ~ "Not significant",
x_scaled >= 0 & lag_x >= 0 ~ "High-High",
x_scaled < 0 & lag_x < 0 ~ "Low-Low",
x_scaled >= 0 & lag_x < 0 ~ "High-Low (Outlier)",
x_scaled < 0 & lag_x >= 0 ~ "Low-High (Outlier)"
)
Bandung_LISA <- Bandung_merged %>%
mutate(lisa_quadrant = lisa_quadrant)
Peta Klaster LISA
ggplot(Bandung_LISA) +
geom_sf(aes(fill = lisa_quadrant), color = "white", size = 0.2) +
scale_fill_manual(values = c(
"High-High" = "#b2182b",
"Low-Low" = "#2166ac",
"High-Low (Outlier)" = "#fddbc7",
"Low-High (Outlier)" = "#92c5de",
"Not significant" = "grey85"
)) +
labs(title = "Local Moran's I (LISA) Kota Bandung", fill = "Klaster") +
theme_minimal()
Interpretasi: - Klaster Hotspot (High-High): Area berwarna merah adalah
klaster hotspot. Ini mengidentifikasi kecamatan di mana laju kasus
penyakit tinggi dikelilingi oleh tetangga yang juga memiliki laju kasus
tinggi. Area ini harus menjadi prioritas utama bagi dinas kesehatan
untuk intervensi, alokasi sumber daya, dan kampanye pencegahan yang
intensif. - Outlier Spasial (Low-High): Area berwarna biru muda adalah
outlier. Wilayah ini memiliki laju kasus rendah meskipun dikelilingi
oleh tetangga dengan laju kasus tinggi. Pola ini bisa menunjukkan
keberhasilan program pencegahan di area tersebut. - Area Tidak
Signifikan: Wilayah berwarna abu-abu menunjukkan tidak adanya pola
spasial yang signifikan secara statistik. Di area ini, laju kasus
penyakit tersebar secara acak, tanpa kecenderungan untuk mengelompok
dengan nilai yang mirip.
nb <- poly2nb(as_Spatial(peta_bandung_sf), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
# Getis-Ord Gi*
Gz <- localG(Bandung_merged$rate_per_10k, lwW)
alpha <- 0.05
# Ambang batas z-skor
z_threshold <- qnorm(1 - alpha / 2)
hotcold <- case_when(
Gz >= z_threshold ~ "Hot spot (p<0.05)",
Gz <= -z_threshold ~ "Cold spot (p<0.05)",
TRUE ~ "Not significant"
)
Bandung_G <- Bandung_merged %>%
mutate(hotcold = hotcold)
ggplot(data = 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() +
theme(axis.text = element_blank(),
axis.title = element_blank(),
panel.grid.major = element_line(color = "grey80"),
panel.grid.minor = element_blank())
### Tentukan kecamatan yang termasuk hot spot dan cold spot. Peta
Getis-Ord Gi* ini menunjukkan bahwa wilayah hotspot ditandai dengan
warna merah. Hotspot adalah area di mana terjadi konsentrasi nilai yang
sangat tinggi. Sebaliknya, tidak ada area yang ditandai sebagai coldspot
(konsentrasi nilai sangat rendah) pada peta. Pada gambar di atas, hanya
klaster nilai-nilai tinggi yang signifikan secara statistik. ###
Bandingkan hasilnya dengan peta LISA Secara umum, hasil dari Getis-Ord
Gi* konsisten dengan hasil dari Local Moran’s I (LISA). Kedua peta
menunjukkan bahwa klaster signifikan berada di wilayah yang sama, yaitu
di bagian selatan dan tenggara Kota Bandung. - Peta Getis-Ord secara
langsung mengidentifikasi klaster nilai tinggi sebagai hotspot. - Peta
LISA mengidentifikasi klaster yang sama sebagai klaster High-High.
Hotspot dan High-High, merujuk pada fenomena yang sama: wilayah dengan
nilai tinggi yang dikelilingi oleh wilayah dengan nilai tinggi lainnya.
### Apakah ada perbedaan wilayah yang ditandai sebagai klaster
signifikan? Ya, ada perbedaan signifikan dalam wilayah yang
diidentifikasi sebagai klaster oleh kedua metode tersebut, meskipun
keduanya menunjukkan klaster di area yang sama. Peta LISA mampu
mengidentifikasi outlier spasial (wilayah dengan nilai yang sangat
berbeda dari tetangganya) seperti klaster Low-High, di mana wilayah
dengan kasus rendah berada di tengah-tengah wilayah dengan kasus tinggi.
Sebaliknya, peta Getis-Ord Gi* tidak mengklasifikasikan wilayah tersebut
sebagai klaster signifikan karena Getis-Ord hanya berfokus pada
konsentrasi nilai-nilai yang sama (hotspot atau coldspot), bukan pada
anomali nilai.
Hasil analisis dapat berubah secara signifikan tergantung pada bagaimana unit geografisnya (misalnya, kecamatan, kelurahan) dibagi atau dikelompokkan. Pola yang terlihat pada level kecamatan bisa berbeda atau bahkan menghilang jika analisis dilakukan pada level yang lebih kecil (misalnya, kelurahan) atau jika batas-batasnya diubah. ### Ukuran Bobot Spasial Pilihan matriks bobot spasial (seperti rook, queen, atau k-nearest neighbors) dapat memengaruhi hasil analisis. Bobot queen menganggap tetangga yang berbagi sisi atau sudut, sementara rook hanya yang berbagi sisi. Setiap pilihan bobot akan menghasilkan matriks bobot yang berbeda, yang pada gilirannya dapat mengubah nilai Moran’s I atau lokasi klaster yang terdeteksi. ### Masalah Multiple Testing Pada analisis lokal (LISA atau Getis-Ord), kita melakukan uji statistik di setiap lokasi (dalam kasus ini, 30 kecamatan) secara terpisah. Ini meningkatkan kemungkinan terjadinya galat tipe I (menolak hipotesis nol padahal seharusnya tidak). Artinya, beberapa klaster yang ditemukan mungkin muncul hanya karena kebetulan statistik, bukan karena pola spasialyang sesungguhnya.