Nama : Fazila Azra Anggina
NPM : 140610230039
Mata Kuliah : Spasial
Dosen Pengampu : Dr. I Gede Nyoman Mindra Jaya,
M.Si.
Autokorelasi spasial digunakan untuk ukuran hubungan antar lokasi berdasarkan kedekatan spasial. Tujuannya adalah melihat apakah nilai suatu variabel di sebuah lokasi mirip atau berbeda dengan nilai lokasi tetangga.
Autokorelasi spasial positif terjadi ketika lokasi-lokasi yang berdekatan memiliki kemiripan nilai. Fenomena-nya bisa berupa “tinggi” dengan “tinggi” atau “rendah” dengan “rendah”. Sehingga, pola yang terbentuk tidak menyebar acak tetapi berkelompok (cluster).
Autokorelasi sosial negatif terjadi ketika lokasi-lokasi yang berdekatan memiliki nilai yang berlawanan. Fenomena-nya bisa berupa satu lokasi bernilai “tinggi” tetapi sekitarnya bernilai “rendah”, begitu pula sebaliknya.
Moran’s I
\[ 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} \]
Keterangan:
Menunjukkan pola global.
Geary’s C
\[ 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} \]
\(C < 1\): autokorelasi positif
\(C > 1\): autokorelasi negatif
\(C = 1\): tidak ada autokorelasi
Local Moran’s \(I_i\)
\[ 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 \]
Menunjukkan pola lokal.
Getis-Ord \(G_i\) dan \(G_i^*\)
\[ G_i = \frac{\sum_{j \neq i} w_{ij} x_j}{\sum_{j \neq i} x_j} \]
\[
G^*_i = \frac{\sum_{j=1}^N w_{ij} x_j}{\sum_{j=1}^N x_j}
\]
Nilai besar \(G^*_i\) : hot spot atau nilai tinggi dikelilingi tinggi.
Nilai kecil \(G^*_i\) : cold spot atau nilai rendah dikelilingi rendah.
| Ukuran global | Ukuran lokal |
| Bertujuan untuk mengukur bagaimana pola autokorelasi spasial secara keseluruhan lokasi. | Bertujuan untuk mengukur bagaimana pola autokorelasi spasial di suatu lokasi spesifik. |
| Sebagai contoh, terdapat suatu analisis kasus tuberkulosis di 40 kecamatan provinsi A. Melalui hasil Moran’s I, terdapat indikasi autokorelasi positif global yang menandakan bahwa lokasi dengan kasus tinggi cenderung berdekatan pula dengan lokasi berkasus tinggi, begitupun dengan yang berlokasi rendah. Akan tetapi, Moran’s I tidak memberitahukan kecamatan mana yang membentuk pola cluster spasial. | Dengan contoh kasus yang sama seperti ukuran global, ukuran lokal lebih ingin menganalisis pola cluster jenis apa yang terbentuk dalam suatu kecamatan. Misalnya, pada kecamatan 1 teridentifikasi pola hotspot, kecamatan 2 teridentifikasi pola coldspot, kecamatan 3 dan 4 teridentifikasi pola tinggi-rendah. Dengan kata lain, ukuran lokal memetakan hasil pola spasial secara spesifik per lokasi. |
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')`
## Loading required package: 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(sf)
# Contoh data shapefile
nc <- st_read(system.file("shape/nc.shp", package="sf"))
## Reading layer `nc' from data source
## `C:\Users\hp\AppData\Local\R\win-library\4.4\sf\shape\nc.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS: NAD27
# Membuat matriks bobot Queen contiguity
nb <- poly2nb(nc, queen=TRUE)
W <- nb2mat(nb, style="W") # Normalisasi row-standardized
# Menampilkan matriks bobot
print(W[1:5, 1:5])
## 1 2 3 4 5
## 1 0.0000000 0.3333333 0.0000000 0 0
## 2 0.3333333 0.0000000 0.3333333 0 0
## 3 0.0000000 0.2000000 0.0000000 0 0
## 4 0.0000000 0.0000000 0.0000000 0 0
## 5 0.0000000 0.0000000 0.0000000 0 0
library(spdep)
library(sp)
## Warning: package 'sp' was built under R version 4.4.3
library(sf)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
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\\hp\\Documents\\New folder\\SMT 5\\SPASIAL\\Spatial")
# Data kasus
tuber <- read.csv("TB_Sim.csv", sep=";")
tuber
## id Kecamatan Terobati
## 1 1 Andir 80
## 2 2 Antapani 88
## 3 3 Arcamanik 149
## 4 4 Astanaanyar 46
## 5 5 Babakan Ciparay 137
## 6 6 Bandung Kidul 186
## 7 7 Bandung Kulon 131
## 8 8 Bandung Wetan 9
## 9 9 Batununggal 80
## 10 10 Bojongloa Kaler 169
## 11 11 Bojongloa Kidul 70
## 12 12 Buahbatu 269
## 13 13 Cibeunying Kaler 109
## 14 14 Cibeunying Kidul 240
## 15 15 Cibiru 51
## 16 16 Cicendo 251
## 17 17 Cidadap 24
## 18 18 Cinambo 133
## 19 19 Coblong 192
## 20 20 Gedebage 123
## 21 21 Kiaracondong 333
## 22 22 Lengkong 25
## 23 23 Mandalajati 24
## 24 24 Panyileukan 476
## 25 25 Rancasari 151
## 26 26 Regol 118
## 27 27 Sukajadi 72
## 28 28 Sukasari 75
## 29 29 Sumur Bandung 92
## 30 30 Ujungberung 162
# Peta administratif Indonesia level kecamatan (gadm36 level 3)
Indo_Kec <- readRDS('gadm36_IDN_3_sp.rds')
# Ambil hanya Kota Bandung
Bandung <- Indo_Kec[Indo_Kec$NAME_2 == "Kota Bandung",]
plot(Bandung)
# Tambahkan id untuk join
Bandung$id <- c(1:30)
# Ubah ke format sf
Bandung_sf <- st_as_sf(Bandung)
# Gabungkan dengan data kasus
Bandung_merged <- Bandung_sf %>%
left_join(tuber, by = "id")
ggplot() +
geom_sf(data=Bandung_merged, aes(fill = Terobati), color=NA) + theme_bw() +
scale_fill_gradient(low = "yellow", high = "purple") +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
legend.position = "right") +
labs(title = "Peta Kasus Pengobatan Tuberkulosis Kota Bandung", fill = "Jumlah Kasus")
# Interval kategori
breaks <- quantile(tuber$Terobati, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm=TRUE)
labels <- c("Very Low", "Low", "High", "Very High")
# Buat variabel diskrit
Bandung_merged$tuber_Discrete <- cut(Bandung_merged$Terobati,
breaks = breaks,
include.lowest = TRUE,
labels = labels,
right = TRUE)
ggplot() +
geom_sf(data=Bandung_merged, aes(fill = tuber_Discrete), color=NA) +
theme_bw() +
scale_fill_manual(values = c("Very Low" = "yellow",
"Low" = "pink",
"High" = "purple",
"Very High" = "purple3")) +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
legend.position = "right") +
labs(title = "Kategori Kasus Pengobatan Tuberkulosis Kota Bandung",
fill = "Kategori")
ggplot(Bandung_merged) +
geom_sf(aes(fill = rate10k), color="white", size=0.2) +
scale_fill_viridis_c(option="magma") +
labs(title="Rate Pengobatan Tuberkulosis (per 10.000) — Simulasi", fill="Rate") +
theme_minimal()
leaflet(Bandung_merged) %>%
addTiles() %>%
addPolygons(fillColor = ~colorNumeric("viridis", rate10k)(rate10k),
color = "black", weight = 1,
popup = ~paste0("Kecamatan: ", NAME_3,
"<br>Rate: ", round(rate10k,2)))
## Warning: sf layer has inconsistent datum (+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs).
## Need '+proj=longlat +datum=WGS84'
Berdasarkan peta choropleth tersebut, terlihat adanya variasi pola spasial yang cukup mencolok antar kecamatan di Kota Bandung. Sebagian besar wilayah, khususnya di bagian utara, timur, serta sebagian tengah kota, memiliki warna ungu tua hingga hitam yang menandakan angka pengobatan tuberkulosis relatif rendah, mendekati 0 hingga 5 kasus per 10.000 penduduk.
Sebaliknya, pada bagian selatan hingga barat daya tampak beberapa kecamatan berwarna oranye hingga kuning, yang mengindikasikan angka pengobatan TB cukup tinggi, di atas 20 per 10.000 penduduk. Hal ini menunjukkan adanya ketidakmerataan spasial, di mana sebagian wilayah menjadi hot spot pengobatan tuberkulosis sementara sebagian besar kecamatan lainnya justru menunjukkan capaian pengobatan yang rendah. Fenomena ini dapat disebabkan oleh keberadaan fasilitas kesehatan rujukan di wilayah tertentu sehingga lebih banyak pasien yang terdeteksi dan diobati, atau justru karena angka kasus tuberkulosis memang lebih tinggi di daerah tersebut. Sebaliknya, rendahnya angka pengobatan di wilayah lain bisa jadi terkait dengan keterbatasan akses layanan kesehatan atau jumlah kasus tuberkulosis yang lebih sedikit.
Secara keseluruhan, peta ini menegaskan adanya ketimpangan spasial dalam penanganan tuberkulosis di Kota Bandung, sehingga perlu evaluasi lebih lanjut terkait distribusi fasilitas kesehatan dan pemerataan akses layanan pengobatan tuberkulosis.
moran_res <- spdep::moran.test(Bandung_merged$rate10k, lwW,
randomisation = TRUE, alternative = "two.sided")
moran_res
##
## Moran I test under randomisation
##
## data: Bandung_merged$rate10k
## weights: lwW
##
## Moran I statistic standard deviate = 3.8551, p-value = 0.0001157
## alternative hypothesis: two.sided
## sample estimates:
## Moran I statistic Expectation Variance
## 0.37675865 -0.03448276 0.01137973
Apakah signifikan secara statistik (uji permutasi)?
Karena hasil p-value dari uji Moran’s I yaitu 0.0001157 lebih kecil dibandingkan alpha, maka uji permutasi signifikan.
Apa artinya bagi pola spasial penyakit?
Dalam konteks spasial, uji permutasi yang signifikan menandakan bahwa terdapat autokorelasi spasial positif pada kasus pengobatan tuberkulosis. Tuberkulosis cenderung berkelompok di lokasi tertentu dan terdapat hot spot yang signifikan. Dan karena penyakit ini merupakan penyakit menular, maka kedekatan spasial memengaruhi risiko terjadinya kasus pada lokasi tetangganya.
geary_res <- spdep::geary.test(Bandung_merged$rate10k, lwW,
randomisation = TRUE, alternative = "two.sided")
geary_res
##
## Geary C test under randomisation
##
## data: Bandung_merged$rate10k
## weights: lwW
##
## Geary C statistic standard deviate = 3.4263, p-value = 0.0006119
## alternative hypothesis: two.sided
## sample estimates:
## Geary C statistic Expectation Variance
## 0.57123053 1.00000000 0.01566015
Bagaimana perbandingannya dengan Moran’s I?
Kedua metode menghasilkan uji permutasi yang sama-sama signifikan dengan p-value lebih kecil daripada alpha. Namun, nilai p-value Moran’s I lebih kecil daripada Geary’s C yang menandakan bahwa Moran’s I lebih kuat mendeteksi adanya pola spasial pada kasus tuberkulosis berikut.
Jelaskan perbedaan sensitivitas kedua ukuran ini.
| Moran’s I | Geary’s C |
|---|---|
| Lebih sensitif terhadap pola autokorelasi spasial global | Lebih sensitif terhadap pola autokorelasi spasial lokal antara nilai suatu kecamatan terhadap tetangganya |
| Lebih baik untuk digunakan untuk melihat kecenderungan umum clustering di tahap global | Jika terdapat satu kecamatan yang sangat berbeda dengan tetangganya, maka metode ini lebih cepat menangkap ketidaksamaan itu |
| Mengindikasikan adanya pola clustering global | Mengindikasikan bahwa perbedaan antar tetangga juga penting sehingga perlu diperhatikan |
x <- scale(Bandung_merged$rate10k)[,1]
lagx <- spdep::lag.listw(lwW, x)
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")
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)"
)
Bandung_LISA <- dplyr::bind_cols(Bandung_merged, lisa_df) |>
dplyr::mutate(quad = ifelse(Pi.two.sided <= alpha, quad, "Not significant"))
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)", fill="Kategori") +
theme_minimal()
Apa interpretasi hasil ini untuk kasus penyakit menular?
Berdasarkan metode LISA, kasus penyakit menular di kota bandung tidak menyebar merata melainkan membentuk cluster signifikan Tinggi-Tinggi. Hal ini menegaskan terdapat daerah dengan risiko tinggi yang perlu menjadi prioritas utama dalam strategi pencegahan dan pengendalian penyakit tuberkulosis. Ini juga bisa disebabkan oleh mobilitas penduduk tinggi, kepadatan penduduk, atau akses kesehatan yang kurai memadai.
x_raw <- Bandung_merged$rate10k
sum_x <- sum(x_raw)
# Matriks bobot biner (tidak distandarisasi)
Wb <- spdep::listw2mat(lwB) # diag=0 secara default
# 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) # Σ_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 (p 0.05)",
z_Gistar <= -1.96 ~ "Cold spot (p 0.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.03161 Min. :0.03930 Min. :-1.613549 MULTIPOLYGON :30
## 1st Qu.:0.07652 1st Qu.:0.08713 1st Qu.:-0.908201 epsg:NA : 0
## Median :0.12551 Median :0.13820 Median :-0.455698 +proj=long...: 0
## Mean :0.16053 Mean :0.18604 Mean : 0.003154
## 3rd Qu.:0.21883 3rd Qu.:0.23907 3rd Qu.: 0.678779
## Max. :0.45972 Max. :0.48351 Max. : 3.792516
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 (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()
data_rate <- Bandung_merged$rate10
data_rate
## [1] 4.500450 0.000000 3.788836 7.634753 11.329305 20.173492 8.084074
## [8] 1.494992 2.920561 16.216216 26.903417 0.000000 0.000000 3.400204
## [15] 2.717391 0.000000 0.000000 7.833307 8.813161 1.649893 2.371354
## [22] 9.006304 2.163566 0.000000 1.376462 6.014133 6.185567 7.524454
## [29] 2.405581 8.909253
# weights matriks tetangga
lw <- nb2listw(nb, style="W")
# uji Local Getis-Ord Gi*
gi_star <- localG(data_rate, lw)
# gabung hasil ke data frame
hasil_gi <- data.frame(
Kecamatan = Bandung_merged$NAME_3,
GiZScore = as.numeric(gi_star)
)
# tentukan kategori
hasil_gi$Kategori <- ifelse(hasil_gi$GiZScore > 1.96, "Hot Spot",
ifelse(hasil_gi$GiZScore < -1.96, "Cold Spot",
"Tidak signifikan"))
hasil_gi
## Kecamatan GiZScore Kategori
## 1 Andir 0.7365265 Tidak signifikan
## 2 Antapani -1.3253871 Tidak signifikan
## 3 Arcamanik -1.2846994 Tidak signifikan
## 4 Astanaanyar 2.9911774 Hot Spot
## 5 Babakan Ciparay 2.8305543 Hot Spot
## 6 Bandung Kidul 1.6395828 Tidak signifikan
## 7 Bandung Kulon 0.5055366 Tidak signifikan
## 8 Bandung Wetan -1.2088051 Tidak signifikan
## 9 Batununggal -0.1558677 Tidak signifikan
## 10 Bojongloa Kaler 2.5271055 Hot Spot
## 11 Bojongloa Kidul 3.7925163 Hot Spot
## 12 Buahbatu -0.3797001 Tidak signifikan
## 13 Cibeunying Kaler -0.4071573 Tidak signifikan
## 14 Cibeunying Kidul -1.5599328 Tidak signifikan
## 15 Cibiru -0.3275126 Tidak signifikan
## 16 Cicendo -0.5042396 Tidak signifikan
## 17 Cidadap 0.4410494 Tidak signifikan
## 18 Cinambo -0.7121024 Tidak signifikan
## 19 Coblong -1.5882398 Tidak signifikan
## 20 Gedebage -0.9020011 Tidak signifikan
## 21 Kiaracondong -1.6135493 Tidak signifikan
## 22 Lengkong 0.7431298 Tidak signifikan
## 23 Mandalajati -0.8498607 Tidak signifikan
## 24 Panyileukan -0.2387789 Tidak signifikan
## 25 Rancasari -1.1816045 Tidak signifikan
## 26 Regol 1.1353815 Tidak signifikan
## 27 Sukajadi -0.8406348 Tidak signifikan
## 28 Sukasari -0.5994443 Tidak signifikan
## 29 Sumur Bandung -0.6581419 Tidak signifikan
## 30 Ujung Berung -0.9102672 Tidak signifikan
Berdasarkan hasil di atas, tidak ada kecamatan yang termasuk ke dalam cold spot. Akan tetapi, terdapat beberapa kecamatan yang termasuk ke dalam wilayah hot spot di antaranya adalah kecamatan Astanaanyar, Babakan Ciparay, Bojongloa Kaler, dan Bojongloa Kidul.
Bandingkan hasilnya dengan peta LISA.
Peta LISA menunjukkan hubungan nilai suatu kecamatan dengan tetangganya atau mengidentidikasi pola interaksi lokal antar kecamatan. Sedangkan peta Getis-Ord lebih menunjukkan konsentrasi hot spot atau cold spot tanpa membedakan pola interaksi antar kecamatan.
Apakah ada perbedaan wilayah yang ditandai sebagai klaster signifikan?
Baik metode LISA maupun Getis-Ord sama-sama mengidentifikasi wilayah selatan barat-daya Bandung sebagai klaster signifikan kasus tuberkulosis. Sehingga, tidak ada perbedaan wilayah dalam lokasi klaster signifikan.
MAUP
Hasil analisis sangat dipengaruhi oleh skala dan agregasi data. Dalam kasus ini, apabila batas administratif yang digunakan berubah, maka nilai autokorelasi spasial bisa berubah dan interpretasi menjadi rentan untuk diambil.
Ukuran bobot spasial
Pemilihan matriks bobot spasial yang berbeda bisa menghasilkan pola korelasi yang berbeda pula.
Masalah multiple testing pada analisis lokal
Semakin banyak wilayah yang diuji, maka semakin tinggi peluang terjadinya kesalahan tipe I (bisa ada wilayah yang tampak signifikan hanya karena faktor kebetulan).