Nama : Maulana Hardy Rayyan
NPM : 140610230064
Sebelumnya, Autokorelasi Spasial merupakan ukuran kemiripian atau bedanya nilai antar lokasi dalam suatu ruang. Berarti Autokorelasi Spasial Positif berarti wilayah yang disekitarnya atau tetangganya memiliki kemiripan nilai dengan wilayah tersebut.
Contoh :
Penyakit Menular TBC (misalnya)
Misalnya terdapat jumlah kasus TBC yang tinggi di kecamatan A yang ada di Jakarta Utara, kecamatan disekitar memiliki kecenderungan untuk kasus yang tinggi juga karena penularan antar penduduk yang berdekatan
Harga Rumah dan Tanah
Misalnya rumah atau tanah di daerah pinggiran Jakarta Utara memiliki
harga yang rendah, karena dikelilingi juga dengan perumahan yang harga
rumah atau tanah nya rendah juga
Autokorelasi Spasial Negatif berarti wilayah yang disekitarnya atau tetangganya memiliki kemiripan nilai dengan wilayah tersebut.
Contoh :
Kepadatan Penduduk
Misalnya, di pusat kota jakarta memiliki kepadatan penduduk yang tinggi dibandingkan di pinggir kota jakarta yang kepadatan penduduknya rendah
Rumus Matematis :
\[ I = \frac{N}{S_0} \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} \]
dengan interpretasi :
Jika I > 0, maka nilai mirip dengan tetangga disekitar nya atau juga bisa disebut memiliki positive spatial autocorrelation
Jika I < 0, maka memiliki perbedaan nilai dengan tetangga di sekitarnya atau memiliki negative spatial autocorrelation (memiliki pola checkerboard)
Jika I \(\approx\) 0, maka nilai yang dihasilkan acak atau tidak beraturan
Rumus Matematis :
\[ C = \frac{(N - 1) \sum_{i=1}^{N} \sum_{j=1}^{N} w_{ij} (x_i - x_j)^2} {2 S_0 \sum_{i=1}^{N} (x_i - \bar{x})^2} \]
dengan interpretasi :
Jika C < 1, maka memiliki autokorelasi positif
Jika C > 1, maka memiliki autokorelasi negatif
Jika C = 1, maka tidak terdapat autokorelasi
Rumus Matematis :
\[ I_i = \frac{x_i - \bar{x}}{m^2} \sum_{j=1}^{N} w_{ij}(x_j - \bar{x}), \quad m^2 = \frac{1}{N} \sum_{k=1}^{N} (x_k - \bar{x})^2 \]
dengan interpretasi :
Jika nilai \(I_i\) > 0, maka unit spasial i memiliki nilai yang mirip dengan tetangganya dan membentuk cluster High-High atau Low-Low
Jika nilai \(I_i\) < 0, maka unit spasial i memiliki perbedaan nilai dengan tetangganya dan membentuk pola High-Low atau Low-High
Jika nilai \(I_i\) \(\approx\) 0, maka tidak terdapat pola lokal yang signifikan atau memiliki pola lokal yang acak
Tanpa memasukkan lokasi i (local \(G_i\))
\[ G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d)\, x_j} {\sum_{j \neq i} x_j} \]
Dengan memasukkan lokasi i (local \(G_i^*\))
\[ G_i^*(d) = \frac{\sum_{j=1}^{N} w_{ij}(d)\, x_j} {\sum_{j=1}^{N} x_j} \]
dengan \[ w_{ii}(d) = 1 \]
Ukuran global mengukur keterkaitan spasial secara keseluruhan dan memiliki fungsi untuk mengidentifikasi apakah data memiliki autokorelasi spasial positif, negatif atau acak dengan indeks Moran’s I dan Geary’s C
Ukuran global mengukur keterkaitan spasial di sekitar unit wilayah tertentu dan memiliki fungsi untuk mengidentifikasi lokasi spesifik klaster dengan indeks Local Moran’s I dan Getis-Ord \(G_i\) dan \(G_i^*\)
library(sf)
## Warning: package 'sf' was built under R version 4.4.3
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
library(sp)
## Warning: package 'sp' was built under R version 4.4.3
library(spdep)
## Warning: package 'spdep' was built under R version 4.4.3
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.4.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.4.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)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(mapview)
## Warning: package 'mapview' was built under R version 4.4.3
setwd("D:/Maulana Hardy Rayyan/UNPAD/Analisis Data Spasial/Praktikum 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)
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()
# Peta Choropleth rate per 10.000
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color = "white") +
scale_fill_viridis_c(option = "magma", direction = -1,
name = "Kasus per\n10.000 Penduduk") +
labs(
title = "Peta Choropleth Kasus Diare per 10.000 Penduduk",
subtitle = "30 Kecamatan di Kota Bandung (Simulasi)",
caption = "Sumber: Simulasi Distribusi Poisson"
) +
theme_minimal()
Berdasarkan peta choropleth dapat dilihat bahwa terdapat indikasi clustering yang mana kecamatan yang memiliki angka kasus diare yang tinggi berdekatan dengan kecamatan yang memiliki angka kasus diare yang tinggi juga.
# Buat struktur tetangga (queen contiguity)
nb <- poly2nb(as_Spatial(Bandung_merged), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
# Uji Moran's I
moran_test <- moran.test(Bandung_merged$rate10k, lwW)
print(moran_test)
##
## Moran I test under randomisation
##
## data: Bandung_merged$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
# Uji signifikansi dengan permutasi (Monte Carlo)
set.seed(123)
moran_perm <- moran.mc(Bandung_merged$rate10k, lwW, nsim = 999)
print(moran_perm)
##
## Monte-Carlo simulation of Moran I
##
## data: Bandung_merged$rate10k
## weights: lwW
## number of simulations + 1: 1000
##
## statistic = 0.50482, observed rank = 1000, p-value = 0.001
## alternative hypothesis: greater
Apa Artinya Bagi Pola Spasial Penyakit ?
Melihat dari hasil Moran’s I, dapat dilihat bahwa I nya sebesar 0,50482 yang mana berarti Kota Bandung memiliki autokorelasi spasial positif
# Uji Geary's C
geary_test <- geary.test(Bandung_merged$rate10k, lwW)
print(geary_test)
##
## Geary C test under randomisation
##
## data: Bandung_merged$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
Jika dilihat dari nilai statistik nya, Geary’s C dengan nilai sebesar 0,47516 dibandingkan dengan Moran’s I yang memiliki nilai sebesar 0,50482. Dari nilai tersebut kedua indeks memiliki interpretasi hasil yang saling berlawanan. Untuk Geary’s C, jika C < 0 maka memiliki autokorelasi positif atau tetangga di sekitarnya memiliki nilai yang mirip sedangkan untuk Moran’s I, jika I < 0 maka memiliki autokorelasi negatif atau memiliki nilai yang berbeda dengan tetangganya
Untuk ukuran Geary’s C memiliki sensitivitas lebih tinggi terhadap variabilitas lokal dan juga pencilan disekitarnya sedangkan untuk ukuran Moran’s I itu mengukur kemiripan pola secara global saja, dan tidak begitu peka dengan variabilitas ataupun pencilan di sekitarnya
Bandung_merged <- left_join(Bandung_sf, Diare, by = "id")
# --- 2. Struktur tetangga (queen contiguity) ---
nb <- poly2nb(as_Spatial(Bandung_merged), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
# --- 3. Hitung Local Moran’s I (LISA) ---
local_moran <- localmoran(Bandung_merged$rate10k, lwW)
Bandung_merged$Ii <- local_moran[, "Ii"]
Bandung_merged$E.Ii <- local_moran[, "E.Ii"]
Bandung_merged$Z.Ii <- local_moran[, "Z.Ii"]
Bandung_merged$Pr.z <- local_moran[, "Pr(z != E(Ii))"] # p-value
# --- 4. Klasifikasi cluster LISA ---
mean_rate <- mean(Bandung_merged$rate10k)
Bandung_merged <- Bandung_merged %>%
mutate(cluster = case_when(
rate10k >= mean_rate & lag.listw(lwW, rate10k) >= mean_rate & Pr.z < 0.05 ~ "High-High",
rate10k <= mean_rate & lag.listw(lwW, rate10k) <= mean_rate & Pr.z < 0.05 ~ "Low-Low",
rate10k >= mean_rate & lag.listw(lwW, rate10k) <= mean_rate & Pr.z < 0.05 ~ "High-Low",
rate10k <= mean_rate & lag.listw(lwW, rate10k) >= mean_rate & Pr.z < 0.05 ~ "Low-High",
TRUE ~ "Not Significant"
))
# --- 5. Tabel ringkasan klaster ---
# Gunakan NAME_3 dari shapefile GADM sebagai nama kecamatan
Bandung_clusters <- Bandung_merged %>%
st_drop_geometry() %>%
select(Kecamatan = NAME_3, rate10k, cluster) %>%
arrange(cluster)
print(Bandung_clusters)
## Kecamatan rate10k cluster
## 1 Cidadap 22.453562 High-High
## 2 Coblong 27.316663 High-High
## 3 Sukajadi 16.403785 High-High
## 4 Sukasari 24.112525 High-High
## 5 Andir 0.000000 Not Significant
## 6 Antapani 2.878526 Not Significant
## 7 Arcamanik 2.032520 Not Significant
## 8 Astanaanyar 2.287283 Not Significant
## 9 Babakan Ciparay 4.241482 Not Significant
## 10 Bandung Kidul 3.814610 Not Significant
## 11 Bandung Kulon 4.255319 Not Significant
## 12 Bandung Wetan 1.416029 Not Significant
## 13 Batununggal 1.434309 Not Significant
## 14 Bojongloa Kaler 3.846894 Not Significant
## 15 Bojongloa Kidul 20.673361 Not Significant
## 16 Buahbatu 4.881224 Not Significant
## 17 Cibeunying Kaler 7.632423 Not Significant
## 18 Cibeunying Kidul 0.000000 Not Significant
## 19 Cibiru 9.298866 Not Significant
## 20 Cicendo 9.753719 Not Significant
## 21 Cinambo 0.000000 Not Significant
## 22 Gedebage 0.000000 Not Significant
## 23 Kiaracondong 0.000000 Not Significant
## 24 Lengkong 3.154574 Not Significant
## 25 Mandalajati 5.896226 Not Significant
## 26 Panyileukan 0.000000 Not Significant
## 27 Rancasari 8.537279 Not Significant
## 28 Regol 3.865481 Not Significant
## 29 Sumur Bandung 0.000000 Not Significant
## 30 Ujung Berung 0.000000 Not Significant
# Per kategori:
HighHigh <- Bandung_clusters %>% filter(cluster == "High-High")
LowLow <- Bandung_clusters %>% filter(cluster == "Low-Low")
HighLow <- Bandung_clusters %>% filter(cluster == "High-Low")
LowHigh <- Bandung_clusters %>% filter(cluster == "Low-High")
# Tabel hasil LISA per kategori
clusters_list <- split(Bandung_clusters, Bandung_clusters$cluster)
# Tabel kategori
clusters_list$`High-High`
## Kecamatan rate10k cluster
## 1 Cidadap 22.45356 High-High
## 2 Coblong 27.31666 High-High
## 3 Sukajadi 16.40379 High-High
## 4 Sukasari 24.11253 High-High
clusters_list$`Low-Low`
## NULL
clusters_list$`High-Low`
## NULL
clusters_list$`Low-High`
## NULL
ggplot(Bandung_merged) +
geom_sf(aes(fill = cluster), color = "white") +
scale_fill_manual(values = c(
"High-High" = "red",
"Low-Low" = "blue",
"High-Low" = "orange",
"Low-High" = "lightblue",
"Not Significant" = "grey80"
)) +
labs(
title = "Peta LISA (Local Moran’s I) Kasus Diare Kota Bandung",
fill = "Cluster"
) +
theme_minimal()
Dari syntax Local Moran’s I di atas dapat disimpulkan bahwa kecamatan yang termasuk ke kategori High-High yaitu Cidadap, Coblong, Sukajadi, dan Sukasari dan sisanya terhitung tidak signifikan (sudah dicoba agar bisa muncul masing-masing kategori namun tidak bisa)
# Data
x_raw <- Bandung_merged$rate10k
sum_x <- sum(x_raw)
# --- Matriks bobot biner (tidak distandarisasi) ---
lwB <- nb2listw(nb, style = "B", zero.policy = TRUE)
Wb <- spdep::listw2mat(lwB)
# G_i (tanpa i)
num_G <- as.numeric(Wb %*% x_raw)
den_G <- (sum_x - x_raw)
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)
den_Gs <- sum_x
G_star_raw <- num_Gs / den_Gs
# Z-skor dengan spdep::localG
Gz <- spdep::localG(x_raw, listw = lwW) # z(Gi*)
# Gabungkan ke data spasial
Bandung_G <- Bandung_merged %>%
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"
)
)
# Peta raw G*
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()
# --- Peta hotspot/coldspot (z-skor) ---
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="Getis–Ord Gi* — Hot/Cold Spots (z-skor)", fill=NULL) +
theme_minimal()
Untuk kecamatan yang termasuk ke hotspot yaitu Cidadap, Coblong, Sukajadi, dan Sukasari. Selain dari keempat itu terasuk ke coldspot
Jika dilihat dari kedua peta tersebut, untuk Local Moran’s I itu merupakan kategori High-High sedangkan pada Getis-Ord \(G_i^*\) itu merupakan daerah hotspot
Dalam ukuran Getis-Ord, klaster yang signifikan dapat diartikan sebagai hotspot atau nilai yang tinggi
MAUP (Modifiable Areal Unit Problem)
MAUP dapat menjadi masalah pada hasil analisis spasial yang bergantung pada skala tertentu. Sebagai contoh, hasil autokorelasi spasial bisa memberikan hasil yang berbeda jika membandingkan hasil yang menggunakan data level kecamatan dan data level kelurahan
Ukuran Bobot Spasial (rook, queen, KNN)
Pemilihan bobot spasial ini akan memengaruhi analisis spasial yang dihasilkan. Dalam praktek nya, Local Moran’s I dan Getis-Ord akan menghasilkan hasil yang berbeda bergantung pada pemilihan bobot spasial nya
Masalah multiple testing pada analisis lokal
Pada analsis lokal seperti Local Moran’s I dan Getis-Ord pastinya akan dilakukan banyak uji signifikansi secara simultan untuk tiap wilayah yang diuji. Hal ini bisa menimbulkan masalah seperti false positive sehingga perlu kehati hatian dalam menggunakan analisis lokal agar mengurangi resiko terjadinya false positive yang dihasilkan