Nama: Khalisha Syahla Putri Marindra
NPM: 140610230008
Mata Kuliah: Spasial
Dosen Pengampu: Dr. I Gede Nyoman Mindra Jaya,
M.Si.
Autokorelasi spasial positif adalah kondisi ketika suatu wilayah memiliki nilai yang mirip dengan wilayah sekitarnya (misalnya tinggi–tinggi atau rendah–rendah). Autokorelasi spasial negatif adalah kondisi ketika suatu wilayah memiliki nilai yang berlawanan dengan wilayah sekitarnya (misalnya tinggi dikelilingi rendah atau sebaliknya).
\[
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}
\]
\[
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}
\] ### Keterangan: - \(N\) :
jumlah unit spasial (misalnya kecamatan).
- \(x_i, x_j\) : nilai variabel pada
lokasi \(i\) dan \(j\).
- \(\bar{x}\) : rata-rata nilai
variabel seluruh lokasi.
- \(w_{ij}\) : bobot spasial antara
lokasi \(i\) dan \(j\).
- \(S_0 = \sum_{i=1}^{N} \sum_{j=1}^{N}
w_{ij}\) : total bobot spasial.
\[ 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 \]
\[ G_i(d) = \frac{\sum_{j \neq i} w_{ij}(d)\, x_j}{\sum_{j \neq i} x_j} \]
\[ G_i^*(d) = \frac{\sum_{j=1}^{N} w_{ij}(d)\, x_j}{\sum_{j=1}^{N} x_j}, \quad \text{dengan } w_{ii}(d) = 1 \]
\(x_j\) : nilai variabel pada
lokasi \(j\).
\(w_{ij}(d)\) : bobot spasial
berdasarkan jarak \(d\) (biasanya \(w_{ij} \in \{0,1\}\)).
\(N\) : jumlah unit spasial.
Ukuran global mengukur autokorelasi spasial secara keseluruhan di seluruh wilayah (gambaran umum).
Ukuran lokal mengukur autokorelasi spasial di tiap lokasi, sehingga bisa menunjukkan letak cluster atau outlier.
| #Bagian B. Analisis Data (Simulasi) 1. Gunakan data spasial kecamatan di Kota Bandung (atau gunakan grid simulasi jika data asli tidak tersedia). 2. Buat data simulasi kasus penyakit menular (misalnya diare per 10.000 penduduk) untuk 30 kecamatan di Kota Bandung. Gunakan distribusi Poisson dengan rata-rata berbeda antar kecamatan. 3. Buat peta choropleth dari data simulasi tersebut. 4. Apa pola spasial yang terlihat secara visual? |
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(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(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')`
getwd()
## [1] "C:/Users/khalisha marindra/Downloads"
setwd("C:/Users/khalisha marindra/Documents")
setwd("C:/Users/khalisha marindra/Documents")
"~/datafix.csv"
## [1] "~/datafix.csv"
data_sim<-read.csv("C:/Users/khalisha marindra/Documents/datafix.csv",sep = ";",dec = ".")
attach(data_sim)
# 1. Load shapefile
Indo_Kec <- readRDS("gadm36_IDN_3_sp.rds")
# 2. Ambil hanya Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung", ]
# 3. Ubah ke sf
Bandung_sf <- st_as_sf(Bandung)
# 4. Samakan nama join
Bandung_sf <- Bandung_sf %>%
mutate(Kecamatan = NAME_3)
# 5. Join dengan data_sim
Bandung_merged <- left_join(Bandung_sf, data_sim, by = "Kecamatan")
# Tambahkan ID 1:30 di shapefile Bandung
Bandung_sf$id <- 1:30
# Tambahkan juga id di data_sim
data_sim$id <- 1:30
# Join berdasarkan id
Bandung_merged <- left_join(Bandung_sf, data_sim, by = "id")
# Plot
ggplot(Bandung_merged) +
geom_sf(aes(fill = TB), color = "white") +
scale_fill_gradient(low = "grey", high = "red") +
theme_bw() +
labs(title = "Peta Jumlah Kasus Kota Bandung",
fill = "Jumlah Kasus")
`
Berdasarkan peta jumlah kasus penyakit menular (TB) di Kota Bandung, terlihat bahwa distribusi kasus tidak merata di seluruh kecamatan. Beberapa wilayah, khususnya di bagian utara dan selatan kota, menunjukkan intensitas kasus yang lebih tinggi dengan warna merah tua, sementara wilayah lainnya, terutama di bagian tengah dan barat, didominasi oleh kasus sedang hingga rendah. Pola ini mengindikasikan adanya konsentrasi atau pengelompokan kasus di wilayah tertentu, meskipun sebagian besar kecamatan lainnya tampak tersebar acak. Dengan kata lain, terdapat indikasi awal adanya kluster kasus tinggi di beberapa daerah, yang kemungkinan berkaitan dengan faktor kepadatan penduduk, kondisi lingkungan, atau perilaku kesehatan masyarakat. Temuan ini penting sebagai dasar untuk analisis lebih lanjut agar intervensi kesehatan dapat difokuskan pada wilayah dengan konsentrasi kasus yang lebih tinggi.
library(spdep)
nb <- poly2nb(as_Spatial(Bandung_merged), queen = TRUE)
lwW <- nb2listw(nb, style = "W")
moran_res <- spdep::moran.test(Bandung_merged$TB, lwW,
randomisation = TRUE, alternative = "two.sided")
moran_res
##
## Moran I test under randomisation
##
## data: Bandung_merged$TB
## weights: lwW
##
## Moran I statistic standard deviate = -2.0172, p-value = 0.04367
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## -0.26858682 -0.03448276 0.01346826
Hasil uji Moran’s I menunjukkan nilai Moran’s I sebesar –0,2686 dengan p-value 0,0437, yang berarti signifikan pada taraf kepercayaan 5 persen. Hal ini mengindikasikan bahwa penyebaran kasus TB di Kota Bandung tidak bersifat acak, melainkan terdapat autokorelasi spasial negatif.
Hasil uji Moran’s I untuk kasus TB di Bandung menunjukkan bahwa distribusi penyakit ini signifikan secara statistik dengan p-value 0,0437, mengindikasikan bahwa wilayah dengan angka TB tinggi cenderung berada di dekat wilayah dengan angka TB rendah, bukan berkumpul. Dengan kata lain, kasus TB tidak membentuk klaster tertentu, melainkan tersebar di berbagai wilayah kota. Pola ini penting untuk diketahui karena menunjukkan bahwa intervensi pengendalian TB tidak bisa hanya difokuskan pada satu atau beberapa klaster saja, melainkan perlu pendekatan yang menyeluruh di berbagai area untuk mencegah penyebaran lebih lanjut.
geary_res <- spdep::geary.test(Bandung_merged$TB, lwW,
randomisation = TRUE,
alternative = "two.sided")
geary_res
##
## Geary C test under randomisation
##
## data: Bandung_merged$TB
## weights: lwW
##
## Geary C statistic standard deviate = -2.1156, p-value = 0.03438
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 1.24472071 1.00000000 0.01338061
Hasil uji Geary’s C untuk kasus TB di Bandung menunjukkan bahwa distribusi penyakit ini cenderung menyebar dan tidak membentuk klaster. Nilai Geary’s C sebesar 1,245 dengan p-value 0,034 menandakan bahwa perbedaan angka TB antar wilayah yang berdekatan lebih besar daripada yang diharapkan secara acak, sehingga pola ini signifikan secara statistik. Dengan kata lain, wilayah dengan angka TB tinggi biasanya berada dekat dengan wilayah yang angkanya rendah, bukan berkumpul bersama. Hasil ini sejalan dengan temuan Moran’s I sebelumnya, yang juga menunjukkan pola penyebaran secara global.
Perbedaan utama antara Moran’s I dan Geary’s C terletak pada sensitivitasnya terhadap pola spasial. Moran’s I lebih fokus pada pola global, artinya ia melihat keseluruhan distribusi TB di seluruh wilayah untuk mengetahui apakah daerah dengan angka TB tinggi atau rendah cenderung berkumpul secara luas. Sementara itu, Geary’s C lebih sensitif pada pola lokal, jadi ia menekankan perbedaan antar wilayah yang bersebelahan. Dengan kata lain, Geary’s C akan cepat mendeteksi jika dua wilayah tetangga memiliki angka TB yang sangat berbeda, meskipun secara keseluruhan kota terlihat tidak ada klaster besar. Pada kasus TB di Bandung, kedua ukuran ini konsisten: TB tidak membentuk klaster besar dan ada perbedaan nyata antar wilayah yang berdekatan.
# Standardisasi nilai rate10k
x <- scale(Bandung_merged$TB)[,1]
# Hitung lag spasial
lagx <- spdep::lag.listw(lwW, x)
# Hitung Local Moran's I
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")
# Tentukan 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 ke data spasial grid_data
grid_LISA <- dplyr::bind_cols(Bandung_merged, lisa_df) |>
dplyr::mutate(quad = ifelse(Pi.two.sided <= alpha, quad, "Not significant"))
# Plot peta cluster LISA
ggplot(grid_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)", fill="Kategori") +
theme_minimal()
x_raw <- Bandung_merged$TB
sum_x <- sum(x_raw)
lwB <- spdep::nb2listw(nb, style = "B", zero.policy = TRUE)
# Matriks bobot biner (tidak distandarisasi)
Wb <- spdep::listw2mat(lwB) # diag=0 secara default
# G_i (tanpa i)
num_G <- as.numeric(Wb %*% x_raw) # Σ_{ji} w_ij x_j
den_G <- (sum_x - x_raw) # Σ_{ji} x_j
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) # Σ_j w_ij^* x_j
den_Gs <- sum_x # Σ_j x_j
G_star_raw <- num_Gs / den_Gs
# Z-skor (yang dihitung spdep::localG)
Gz <- spdep::localG(x_raw, listw = lwW) # z(G_i^*) dengan listw yang diberikan
Bandung_G <- dplyr::mutate(Bandung_merged,
G_raw = G_raw,
G_star_raw = G_star_raw,
z_Gistar = as.numeric(Gz),
hotcold = dplyr::case_when(
z_Gistar >= 1.96 ~ "Hot spot (p0.05)",
z_Gistar <= -1.96 ~ "Cold spot (p0.05)",
TRUE ~ "Not significant"
))
summary(dplyr::select(Bandung_G, G_raw, G_star_raw, z_Gistar))
## G_raw G_star_raw z_Gistar geometry
## Min. :0.05727 Min. :0.08045 Min. :-1.8173 MULTIPOLYGON :30
## 1st Qu.:0.13287 1st Qu.:0.16229 1st Qu.:-0.6196 epsg:NA : 0
## Median :0.15895 Median :0.18994 Median : 0.2348 +proj=long...: 0
## Mean :0.16576 Mean :0.19359 Mean : 0.2335
## 3rd Qu.:0.19814 3rd Qu.:0.23073 3rd Qu.: 0.9914
## Max. :0.30479 Max. :0.31955 Max. : 2.2301
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()
ggplot(Bandung_G) +
geom_sf(aes(fill = hotcold), color="white", size=0.2) +
scale_fill_manual(values=c("Hot spot (p0.05)"="#b2182b",
"Cold spot (p0.05)"="#2166ac",
"Not significant"="grey85")) +
labs(title="Getis–Ord Gi* — Hot/Cold Spots (z-skor)", fill=NULL) +
theme_minimal()
Secara umum distribusi kasus penyakit menular di wilayah ini cenderung acak, namun terdapat indikasi penting. Peta LISA menunjukkan adanya wilayah outlier (low-high), sementara peta Getis-Ord Gi* menegaskan adanya hotspot signifikan di dua kecamatan. Artinya, meskipun tidak terbentuk klaster besar, ada beberapa titik wilayah yang patut menjadi perhatian khusus karena memiliki kecenderungan konsentrasi kasus tinggi dalam pola penyebarannya.
Terdapat perbedaan wilayah yang ditandai signifikan antara hasil analisis LISA dan Getis-Ord Gi. Pada peta LISA, wilayah signifikan muncul sebagai kategori low-high outlier, yaitu kecamatan dengan jumlah kasus rendah tetapi dikelilingi oleh wilayah dengan kasus tinggi. Pola ini lebih menekankan adanya perbedaan karakteristik lokal dibandingkan dengan tetangganya. Sementara itu, pada peta Getis-Ord Gi wilayah signifikan ditunjukkan sebagai hotspot, yaitu kecamatan yang memang memiliki konsentrasi kasus tinggi secara signifikan, bukan sekadar dipengaruhi oleh kondisi wilayah sekitar. Dengan demikian, meskipun kedua metode sama-sama menandai dua kecamatan sebagai signifikan, hasilnya berbeda baik dari segi lokasi maupun jenis pola spasial yang teridentifikasi.
Pola autokorelasi bisa berubah jika kita menggunakan batas kecamatan vs kelurahan vs desa.
Skala dan cara agregasi data bisa memunculkan pola yang berbeda (misalnya hot spot di tingkat desa bisa hilang ketika datanya diagregasi ke kecamatan).
Interpretasi bisa bias karena hasil “terlihat signifikan” hanya akibat definisi unit spasial, bukan fenomena yang sebenarnya
Rook (hanya sisi) dan queen (sisi + sudut) bisa kasih hasil berbeda.
K-nearest neighbors sensitif terhadap jumlah k yang dipilih.
Tidak ada aturan baku, jadi bisa menimbulkan hasil yang subyektif.
Karena tiap wilayah diuji sendiri-sendiri, makin banyak wilayah makin besar kemungkinan ada hasil “palsu signifikan”.
Misalnya, dari 100 wilayah dengan α = 0,05, bisa ada sekitar 5 wilayah yang “kelihatan signifikan” hanya karena kebetulan.
Koreksi bisa dilakukan (Bonferroni atau FDR), tapi sering jadi terlalu ketat sehingga klaster kecil jadi tidak terdeteksi.