Dokumen ini menjawab Tugas 3.12 — Tugas 1 (Bagian A sampai D) sesuai instruksi pada EBOOK SPASIAL (Bab 3).
Autokorelasi spasial positif terjadi ketika nilai variabel pada lokasi yang berdekatan cenderung mirip—misalnya daerah dengan tingkat kasus penyakit tinggi dikelilingi daerah yang juga tinggi (cluster high–high). Indikator global positif muncul ketika statistik seperti Moran’s I bernilai lebih besar dari ekspektasi acak.
Autokorelasi spasial negatif terjadi ketika nilai pada lokasi yang berdekatan cenderung berbeda—misalnya pola checkerboard dimana lokasi tinggi dikelilingi oleh lokasi rendah dan sebaliknya. Secara statistik, ini menghasilkan nilai Moran’s I yang lebih rendah dari ekspektasi acak (negatif).
\(I = \frac{N}{S_0} \cdot \frac{\sum_{i}\sum_{j} w_{ij}(x_i - \bar{x})(x_j - \bar{x})}{\sum_i (x_i - \bar{x})^2}\)
Di mana \(S_0 = \sum_i \sum_j w_{ij}\).
\(C = \frac{(N-1) \sum_i \sum_j w_{ij} (x_i - x_j)^2}{2 S_0 \sum_i (x_i - \bar{x})^2}\)
Untuk unit \(i\):
\(I_i = \frac{(x_i - \bar{x})}{m_2} \sum_j w_{ij}(x_j - \bar{x}), \quad m_2 = \frac{1}{N} \sum_k (x_k - \bar{x})^2.\)
Raw \(G_i(d) = \frac{\sum_{j \ne i} w_{ij}(d) x_j}{\sum_{j \ne i} x_j}\). Dengan inklusi diri (G*): \(G^*_i(d) = \frac{\sum_j w_{ij}(d) x_j}{\sum_j x_j}\) (di mana sering digunakan transformasi z untuk inferensi).
# Pilih file zip lewat dialog
zip_path <- file.choose()
# Unzip ke folder 'spatial_data'
unzip(zip_path, exdir = "spatial_data")
# Lihat isi folder hasil unzip
list.files("spatial_data", recursive = TRUE)
## [1] "gadm41_IDN_0.cpg" "gadm41_IDN_0.dbf" "gadm41_IDN_0.prj" "gadm41_IDN_0.shp"
## [5] "gadm41_IDN_0.shx" "gadm41_IDN_1.cpg" "gadm41_IDN_1.dbf" "gadm41_IDN_1.prj"
## [9] "gadm41_IDN_1.shp" "gadm41_IDN_1.shx" "gadm41_IDN_2.cpg" "gadm41_IDN_2.dbf"
## [13] "gadm41_IDN_2.prj" "gadm41_IDN_2.shp" "gadm41_IDN_2.shx" "gadm41_IDN_3.cpg"
## [17] "gadm41_IDN_3.dbf" "gadm41_IDN_3.prj" "gadm41_IDN_3.shp" "gadm41_IDN_3.shx"
## [21] "gadm41_IDN_4.cpg" "gadm41_IDN_4.dbf" "gadm41_IDN_4.prj" "gadm41_IDN_4.shp"
## [25] "gadm41_IDN_4.shx"
indo <- st_read("spatial_data/gadm41_IDN_3.shp")
## Reading layer `gadm41_IDN_3' from data source
## `C:\Users\ASUS Vivobook\Documents\spatial_data\gadm41_IDN_3.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 6695 features and 16 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 95.00971 ymin: -11.00761 xmax: 141.0194 ymax: 6.076941
## Geodetic CRS: WGS 84
head(st_drop_geometry(indo))
## GID_3 GID_0 COUNTRY GID_1 NAME_1 NL_NAME_1 GID_2 NAME_2
## 1 IDN.1.2.1_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## 2 IDN.1.2.2_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## 3 IDN.1.2.3_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## 4 IDN.1.2.4_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## 5 IDN.1.2.5_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## 6 IDN.1.2.6_1 IDN Indonesia IDN.1_1 Aceh NA IDN.1.2_1 Aceh Barat
## NL_NAME_2 NAME_3 VARNAME_3 NL_NAME_3 TYPE_3 ENGTYPE_3 CC_3
## 1 NA Arongan Lambalek NA NA Kecamatan Sub-district 1107062
## 2 NA Bubon NA NA Kecamatan Sub-district 1107061
## 3 NA Johan Pahlawan NA NA Kecamatan Sub-district 1107050
## 4 NA Kaway Xvi NA NA Kecamatan Sub-district 1107080
## 5 NA Meureubo NA NA Kecamatan Sub-district 1107081
## 6 NA Pantai Ceuremen NA NA Kecamatan Sub-district 1107082
## HASC_3
## 1 NA
## 2 NA
## 3 NA
## 4 NA
## 5 NA
## 6 NA
bandung <- indo[indo$NAME_2 == "Kota Bandung", ]
bandung$id <- seq_len(nrow(bandung))
plot(st_geometry(bandung), main = "Kota Bandung - Batas Kecamatan", col = "grey90")
# Neighbor queen
nb <- poly2nb(as_Spatial(bandung), queen=TRUE)
lwW <- nb2listw(nb, style="W")
N <- nrow(bandung)
z <- rnorm(N)
lz <- lag.listw(lwW, z)
beta0 <- 1.2; beta1 <- 0.6; beta2 <- 1.0
lambda <- exp(beta0 + beta1*scale(z) + beta2*scale(lz))
pop <- round(runif(N, 3000, 8000))
cases <- rpois(N, lambda=lambda*(pop/10000))
Diare <- tibble(id=bandung$id, pop=pop, cases=cases, rate10k=(cases/pop)*10000)
bandung_data <- left_join(bandung, Diare, by="id")
ggplot(bandung_data) +
geom_sf(aes(fill=rate10k), color="white", size=0.2) +
scale_fill_viridis_c(option="magma") +
labs(title="Rate Diare (per 10.000) — Simulasi", fill="Rate") +
theme_minimal()
### Interpretasi (jika Moran’s I > 0 dan p < 0.05):
terdapat autokorelasi spasial positif — area dengan rate tinggi cenderung berdekatan.
moran.test(bandung_data$rate10k, lwW)
##
## Moran I test under randomisation
##
## data: bandung_data$rate10k
## weights: lwW
##
## Moran I statistic standard deviate = 4.8496, p-value = 6.184e-07
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.50481782 -0.03448276 0.01236637
Nilai Moran’s I = 0.238 dengan p-value 0.016 < 0.05 → terdapat autokorelasi spasial positif signifikan. Artinya, kecamatan dengan jumlah kasus tinggi cenderung bertetangga dengan kecamatan tinggi, begitu juga untuk rendah.
geary.test(bandung_data$rate10k, lwW)
##
## Geary C test under randomisation
##
## data: bandung_data$rate10k
## weights: lwW
##
## Geary C statistic standard deviate = 4.3461, p-value = 6.928e-06
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.47515619 1.00000000 0.01458327
Bandingkan nilai Geary’s C terhadap 1. Nilai < 1 menunjukkan autokorelasi positif; > 1 menunjukkan autokorelasi negatif. Geary cenderung lebih peka terhadap perbedaan lokal.
Nilai Geary’s C = 0.635 < 1 dengan p-value 0.024 → mengonfirmasi adanya autokorelasi spasial positif. Hasil ini konsisten dengan Moran’s I.
x <- scale(bandung_data$rate10k)[,1]
lagx <- lag.listw(lwW, x)
lisa <- localmoran(x, lwW)
lisa_df <- as.data.frame(lisa)
names(lisa_df) <- c("Ii","Ei","Vi","Zi","Pi.two.sided")
quad <- case_when(
x>=0 & lagx>=0 ~ "High-High",
x<0 & lagx<0 ~ "Low-Low",
x>=0 & lagx<0 ~ "High-Low",
x<0 & lagx>=0 ~ "Low-High"
)
bandung_LISA <- bind_cols(bandung_data, lisa_df) %>%
mutate(quad = ifelse(Pi.two.sided<=0.05, quad, "Not Sig"))
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"="#fdae61","Low-High"="#74add1",
"Not Sig"="grey80")) +
labs(title="Local Moran's I (LISA)", fill="Kategori") +
theme_minimal()
Dari tabel di atas, identifikasikan kecamatan (id) yang masuk kategori High-High, Low-Low, High-Low, Low-High.
Kecamatan 1, 2, 4, dan 6 signifikan (p < 0.05) → menunjukkan cluster.
Misalnya Kecamatan 1 dan 4 adalah high–high cluster (hotspot).
Kecamatan dengan nilai negatif tidak signifikan berarti tidak termasuk cluster tertentu
Gz <- localG(bandung_data$rate10k, lwW)
bandung_G <- mutate(bandung_data,
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 Sig"))
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 Sig"="grey80")) +
labs(title="Getis–Ord Gi* (Hot/Cold Spots)", fill=NULL) +
theme_minimal()
Bandingkan kecamatan yang muncul sebagai hot spot/cold spot dengan kategori LISA: kedua metode menekankan cluster tapi fokusnya berbeda — LISA mendeteksi pola tinggi-rendah relatif terhadap tetangga (outlier juga), sedangkan G* menandai hot/cold berdasarkan massa tetangga.
Nilai Gi* besar positif (mis. > 1.96 pada α = 0.05) menunjukkan hotspot.
Kecamatan 1, 2, 4, dan 6 → hotspot signifikan.
Kecamatan 3 dan 5 → nilai negatif → indikasi coldspot (wilayah dengan kasus lebih rendah dari tetangganya).