library(sf)
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(readxl)
library(spdep)
## Loading required package: spData
## 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)
##
## 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(raster)
## Loading required package: sp
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
library(sp)
library(spdep)
library(patchwork)
##
## Attaching package: 'patchwork'
## The following object is masked from 'package:raster':
##
## area
A. Joint Count Statistics
Joint count merupakan metode paling dasar dalam menentukan autokorelasi spasial antar area. Penjelasan lebih lengkap mengenai metode ini dapat dilihat pada Lizazaro (2016). Ilustrasi berikut ini diadaptasi dari Lizazaro (2016). Untuk melakukan analisis joint count, terlebih dulu kita load beberapa package pada R.
pri <- rep(1,12)
seg <- rep(0,4)
ter <- rep(1,2)
cua <- rep(0,4)
qui <- rep(1,2)
sex <- rep(0,12)
A <- matrix(c(pri, seg, ter, cua ,qui, sex), nrow=6, byrow=FALSE)
A
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 1 0 0 0 0
## [2,] 1 1 0 0 0 0
## [3,] 1 1 0 0 0 0
## [4,] 1 1 0 0 0 0
## [5,] 1 1 1 1 0 0
## [6,] 1 1 1 1 0 0
Selanjutnya matriks A dikonversi menjadi raster
menggunakan fungsi raster().
rA <- raster(A)
rA
## class : RasterLayer
## dimensions : 6, 6, 36 (nrow, ncol, ncell)
## resolution : 0.1666667, 0.1666667 (x, y)
## extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : layer
## values : 0, 1 (min, max)
Berikut ini adalah plot dari area A.
plot(rA)
text(coordinates(rA), labels=rA[ ], cex=1.5)
pA <- rasterToPolygons(rA, dissolve=FALSE)
pA
## class : SpatialPolygonsDataFrame
## features : 36
## extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
## crs : NA
## variables : 1
## names : layer
## min values : 0
## max values : 1
spA <- SpatialPolygons(pA@polygons)
nb1 <- poly2nb(spA, queen = T)
nb1
## Neighbour list object:
## Number of regions: 36
## Number of nonzero links: 220
## Percentage nonzero weights: 16.97531
## Average number of links: 6.111111
par(mai=c(0,0,0,0))
plot(spA, col='gray', border='blue')
xy <- coordinates(spA)
plot(nb1, xy, col='red', lwd=2, add=TRUE)
nb2 <- poly2nb(spA, queen = FALSE)
nb2
## Neighbour list object:
## Number of regions: 36
## Number of nonzero links: 120
## Percentage nonzero weights: 9.259259
## Average number of links: 3.333333
par(mai=c(0,0,0,0))
plot(spA, col='gray', border='blue')
xy <- coordinates(spA)
plot(nb2, xy, col='green', lwd=2, add=TRUE)
wl1 <- nb2listw(nb1, style='B')
wl2 <- nb2listw(nb2, style='B')
jc_test1 <- joincount.test(as.factor(pA$layer), wl1)
jc_test1
##
## Join count test under nonfree sampling
##
## data: as.factor(pA$layer)
## weights: wl1
##
## Std. deviate for 0 = 5.1529, p-value = 1.282e-07
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 53.00000 33.17460 14.80263
##
##
## Join count test under nonfree sampling
##
## data: as.factor(pA$layer)
## weights: wl1
##
## Std. deviate for 1 = 4.7634, p-value = 9.52e-07
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 37.00000 20.95238 11.34999
jc_test2 <- joincount.test(as.factor(pA$layer), wl2)
jc_test2
##
## Join count test under nonfree sampling
##
## data: as.factor(pA$layer)
## weights: wl2
##
## Std. deviate for 0 = 5.4677, p-value = 2.28e-08
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 30.000000 18.095238 4.740611
##
##
## Join count test under nonfree sampling
##
## data: as.factor(pA$layer)
## weights: wl2
##
## Std. deviate for 1 = 5.1203, p-value = 1.525e-07
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 22.000000 11.428571 4.262554
Berdasarkan kedua output di atas, dengan p-value yang sangat kecil,
artinya kita dapat menolak hipotesis nol yang menyatakan bahwa tidak
terdapat autokorelasi. Sesuai dengan output di
atas, alternative hypothesis: greater, artinya kita dapat
menyimpulkan bahwa terdapat cukup bukti untuk menyatakan bahwa terdapat
autokorelasi pada taraf nyata 5%.
Pengujian hipotesis dapat pula dilakukan dengan melibatkan algoritma monte carlo seperti di bawah ini.
Global Autocorrelation
Sebagai ilustrasi, kita masih akan menggunakan data yang sama.
Seandainya kita ingin menguji autokorelasi menggunakan pendekatan indeks
moran, maka kita dapat menggunakan fungsi moran.test().
I1 <- moran.test(pA$layer,wl1)
I1
##
## Moran I test under randomisation
##
## data: pA$layer
## weights: wl1
##
## Moran I statistic standard deviate = 7.4654, p-value = 4.151e-14
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.624090909 -0.028571429 0.007643049
Sama halnya seperti yang telah diperlihatkan pada uji dengan metode joint count, uji moran juga dapat dilakukan dengan melibatkan simulasi monte carlo.
set.seed(123)
MC<- moran.mc(pA$layer, wl1, nsim=599)
# View results (including p-value)
MC
##
## Monte-Carlo simulation of Moran I
##
## data: pA$layer
## weights: wl1
## number of simulations + 1: 600
##
## statistic = 0.62409, observed rank = 600, p-value = 0.001667
## alternative hypothesis: greater
Geary’s C merupakan alternatif dari indeks Moran, yang memiliki nilai antara 0 s.d 2. Nilai 0 menunjukkan autokorelasi positif, 1 menunjukkan tidak ada autokorelasi, dan 2 menunjukkan autokorelasi negatif.
C1 <- geary.test(pA$layer,wl1)
C1
##
## Geary C test under randomisation
##
## data: pA$layer
## weights: wl1
##
## Geary C statistic standard deviate = 7.4869, p-value = 3.526e-14
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.357954545 1.000000000 0.007354046
GS1 <- geary.mc(pA$layer, wl1, nsim=599)
GS1
##
## Monte-Carlo simulation of Geary C
##
## data: pA$layer
## weights: wl1
## number of simulations + 1: 600
##
## statistic = 0.35795, observed rank = 1, p-value = 0.001667
## alternative hypothesis: greater
Local Autocorrelation
Pendekatan ini termasuk ke dalam Local Indicators for Spatial Association (LISA), yang mengindentifikasi autokorelasi pada tingkat lokal.
oid <- order(pA$layer)
resI <- localmoran(pA$layer, wl1)
head(resI)
## Ii E.Ii Var.Ii Z.Ii Pr(z != E(Ii))
## 1 3.75 -0.10714286 3.500600 2.0615528 0.03925033
## 2 1.75 -0.17857143 5.469688 0.8246211 0.40958672
## 3 0.40 -0.11428571 3.547275 0.2730593 0.78480760
## 4 4.00 -0.11428571 3.547275 2.1844747 0.02892738
## 5 4.00 -0.11428571 3.547275 2.1844747 0.02892738
## 6 2.40 -0.06857143 2.270256 1.6383560 0.10134744
pA$z.li <- resI[,4]
pA$pvalue <- resI[,5]
lm.palette <- colorRampPalette(c("white","orange", "red"), space = "rgb")
spplot(pA, zcol="z.li", col.regions=lm.palette(20), main="Local Moran")
moran.plot(pA$layer,wl1)
Menurut Mendez (2020), pendekatan Getis-ord Gi dapat membantu mengidentifikasi pola penggerombolan berdasarkan ukuran autokorelasi pada level lokal.
local_g <- localG(pA$layer, wl1)
local_g
## [1] 2.0615528 0.8246211 -0.2730593 -2.1844747 -2.1844747 -1.6383560
## [7] 2.7487371 1.2598378 -0.5233637 -2.9126330 -2.9126330 -2.1844747
## [13] 2.7487371 1.2598378 -0.5233637 -2.9126330 -2.9126330 -2.1844747
## [19] 2.7487371 2.0615528 1.0694824 -1.3197868 -2.1162099 -2.1844747
## [25] 2.7487371 2.8632678 2.0615528 -0.3435921 -1.3197868 -2.1844747
## [31] 2.0615528 2.7487371 2.7487371 0.8246211 -0.2730593 -1.6383560
## attr(,"internals")
## Gi E(Gi) V(Gi) Z(Gi) Pr(z != E(Gi))
## [1,] 0.2000000 0.08571429 0.003073229 2.0615528 0.039250330
## [2,] 0.2000000 0.14285714 0.004801921 0.8246211 0.409586724
## [3,] 0.1250000 0.14285714 0.004276711 -0.2730593 0.784807601
## [4,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [5,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [6,] 0.0000000 0.08571429 0.002737095 -1.6383560 0.101347443
## [7,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [8,] 0.3333333 0.22857143 0.006914766 1.2598378 0.207727870
## [9,] 0.1875000 0.22857143 0.006158463 -0.5233637 0.600721155
## [10,] 0.0000000 0.22857143 0.006158463 -2.9126330 0.003583956
## [11,] 0.0000000 0.22857143 0.006158463 -2.9126330 0.003583956
## [12,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [13,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [14,] 0.3333333 0.22857143 0.006914766 1.2598378 0.207727870
## [15,] 0.1875000 0.22857143 0.006158463 -0.5233637 0.600721155
## [16,] 0.0000000 0.22857143 0.006158463 -2.9126330 0.003583956
## [17,] 0.0000000 0.22857143 0.006158463 -2.9126330 0.003583956
## [18,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [19,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [20,] 0.4000000 0.22857143 0.006914766 2.0615528 0.039250330
## [21,] 0.3125000 0.22857143 0.006158463 1.0694824 0.284852347
## [22,] 0.1250000 0.22857143 0.006158463 -1.3197868 0.186906206
## [23,] 0.0625000 0.22857143 0.006158463 -2.1162099 0.034326960
## [24,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [25,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [26,] 0.4666667 0.22857143 0.006914766 2.8632678 0.004192960
## [27,] 0.4000000 0.22857143 0.006914766 2.0615528 0.039250330
## [28,] 0.2000000 0.22857143 0.006914766 -0.3435921 0.731153040
## [29,] 0.1250000 0.22857143 0.006158463 -1.3197868 0.186906206
## [30,] 0.0000000 0.14285714 0.004276711 -2.1844747 0.028927383
## [31,] 0.2000000 0.08571429 0.003073229 2.0615528 0.039250330
## [32,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [33,] 0.3333333 0.14285714 0.004801921 2.7487371 0.005982535
## [34,] 0.2000000 0.14285714 0.004801921 0.8246211 0.409586724
## [35,] 0.1250000 0.14285714 0.004276711 -0.2730593 0.784807601
## [36,] 0.0000000 0.08571429 0.002737095 -1.6383560 0.101347443
## attr(,"cluster")
## [1] High High Low Low Low Low High High Low Low Low Low High High Low
## [16] Low Low Low High High Low Low Low Low High High High High Low Low
## [31] High High High High Low Low
## Levels: Low High
## attr(,"gstari")
## [1] FALSE
## attr(,"call")
## localG(x = pA$layer, listw = wl1)
## attr(,"class")
## [1] "localG"
pA$localg <- as.numeric(local_g)
lm.palette <- colorRampPalette(c("white","orange", "red"), space = "rgb")
spplot(pA, zcol="localg", col.regions=lm.palette(20), main="Local Gi")
Data yang digunakan dalam praktik ini merupakan data sekunder berupa data kependudukan yang diperoleh dari Badan Pusat Statistik (BPS) dan peta shapefile berisi peta Provinsi Jawa Barat. Berdasarkan data tersebut, tahap awal yaitu proses menggabungkan data bentuk geometri wilayah (peta shp Jawa Barat) dengan data statistik atribut dalam format xlsx. Dataset mencakup informasi spasial dan tabular tingkat kabupaten/kota di Provinsi Jawa Barat untuk tahun 2015 dan 2016. Praktik ini melibatkan variabel utama, yaitu %Kemiskinan tahun 2015.
# load data
shp_jabar <- st_read("petaJabar2/Jabar2.shp")
## Reading layer `Jabar2' from data source
## `/Users/rositariarusesta/Desktop/Tugas_spasial/petaJabar2/Jabar2.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 26 features and 7 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 106.3705 ymin: -7.823398 xmax: 108.8338 ymax: -5.91377
## CRS: NA
data_jabar <- read_excel("data_jabar.xlsx")
data_jabar$KABKOTNO <- as.character(data_jabar$KABKOTNO)
# join
data_spasial <- shp_jabar %>%
left_join(data_jabar, by = "KABKOTNO") %>%
na.omit()
Mengonstruksi matriks bobot spasial (W) yang mendefinisikan struktur interaksi antarwilayah berdasarkan kriteria jarak terdekat (k-Nearest Neighbors). Dengan menetapkan pusat gravitasi atau centroid pada setiap poligon dan mengidentifikasi k=4 tetangga terdekat, algoritma ini memastikan setiap unit observasi memiliki jumlah tetangga yang konsisten, sehingga menghindari masalah wilayah terisolasi yang sering terjadi pada data kepulauan atau wilayah dengan batas administratif yang tidak beraturan. Standardisasi baris (row-standardization) yang diterapkan pada tahap akhir berfungsi untuk menyeimbangkan pengaruh spasial antarwilayah, yang menjadi fondasi krusial bagi analisis autokorelasi seperti uji Moran’s I maupun pengembangan model regresi spasial guna memahami pola persebaran kemiskinan secara lebih akurat.
# spatial weight
coords <- st_coordinates(st_centroid(data_spasial))
## Warning: st_centroid assumes attributes are constant over geometries
knn <- knearneigh(coords, k = 4)
nb_knn <- knn2nb(knn)
lw <- nb2listw(nb_knn, style = "W")
Selain dalam jenis data asal berupa numerik, %kemiskinan dijadikan 2 kategori berdasarkan rata-rata. Bernilai 1 jika diatas rata-rata dan bernilai 0 untuk sebaliknya. Kemudian dilakukan visualisasi untuk mengeksplorasi sebaran spasial %kemiskinan.
threshold <- mean(data_spasial$p.miskin15)
data_spasial$miskin_bin <- ifelse(data_spasial$p.miskin15 > threshold, 1, 0)
x <- factor(data_spasial$miskin_bin)
# 1. Plot Data Asli (Spektrum Warna/Kontinu)
plot_asli <- ggplot(data = data_spasial) +
geom_sf(aes(fill = p.miskin15), color = "white", linewidth = 0.2) +
scale_fill_viridis_c(option = "magma", name = "Persentase (%)") + # Spektrum warna dari rendah ke tinggi
theme_minimal() +
labs(title = "Data Asli (Kontinu)",
subtitle = "Persentase Kemiskinan",
x = "Longitude", y = "Latitude") +
theme(legend.position = "bottom")
# 2. Plot Binary (Berdasarkan Threshold - Kode Anda sebelumnya)
plot_binary <- ggplot(data = data_spasial) +
geom_sf(aes(fill = factor(miskin_bin)), color = "white", linewidth = 0.2) +
scale_fill_manual(values = c("0" = "#E0E0E0", "1" = "#E41A1C"),
name = "Status",
labels = c("Aman", "Di Atas Rata-rata")) +
theme_minimal() +
labs(title = "Data Kategorik (Biner)",
subtitle = "Berdasarkan Threshold Rata-rata",
x = "Longitude", y = "Latitude") +
theme(legend.position = "bottom")
# 3. Menggabungkan kedua plot
(plot_asli | plot_binary) +
plot_annotation(title = "Visualisasi Sebaran %Kemiskinan Jawa Barat",
theme = theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5)))
Analisis Joint Count adalah metode statistik non-parametrik yang sangat spesifik digunakan untuk menguji autokorelasi spasial pada data biner (seperti 0 dan 1). Jika Moran’s I mengukur korelasi berdasarkan nilai kontinu, Joint Count mengukur korelasi berdasarkan kontiguitas (persentuhan) antar kategori. Sebelum dilakukan analisis, dapat dilihat visualisasi dari ketetanggaaan k-Nearest Neighbors (k=4) yang kemudian digunakan untuk matriks pembobot (W) pada Joint Count.
colors <- ifelse(data_spasial$miskin_bin == 0, "lightgrey", "red")
# 2. Plot peta dasar (poligon wilayah) dengan warna fill yang telah ditentukan
plot(st_geometry(data_spasial),
col = colors, # Mewarnai poligon sesuai vektor colors
border = "white", # Garis batas wilayah berwarna putih
lwd = 0.5, # Ketebalan garis batas wilayah
main = "Ketetanggaan KNN (k=4) Berdasarkan Status Kemiskinan")
# 3. Plot garis ketetanggaan (links) di atas peta dasar
# nb_knn: objek tetangga
# coords: koordinat centroid
plot(nb_knn, coords,
add = TRUE, # Menambahkan di atas plot yang sudah ada
col = "blue", # Warna garis tetangga
points = FALSE, # Tidak menampilkan titik centroid
lwd = 1.5) # Ketebalan garis tetangga
Dilakukan perhitungan berapa banyak sisi (edges) yang menghubungkan wilayah dengan kategori yang sama:
Same-color joins (1-1 dan 0-0): Jika jumlah hubungan 1-1 (wilayah miskin bertetangga dengan miskin) jauh lebih banyak daripada ekspektasi teoretis, maka terdapat klaster spasial positif.
Different-color joins (1-0): Jika hubungan ini yang dominan, maka terdapat pola negatif (sebaran catur/dispersi).
Dalam proses ini, akan didapatkan nilai Z-score dan P-value.
# joint count test
jc <- joincount.test(x, lw)
jc
##
## Join count test under nonfree sampling
##
## data: x
## weights: lw
##
## Std. deviate for 0 = 1.3205, p-value = 0.09334
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 2.7500000 2.2500000 0.1433824
##
##
## Join count test under nonfree sampling
##
## data: x
## weights: lw
##
## Std. deviate for 1 = 2.4001, p-value = 0.008194
## alternative hypothesis: greater
## sample estimates:
## Same colour statistic Expectation Variance
## 2.6250000 1.7500000 0.1329044
Hasil uji Join Count menunjukkan adanya autokorelasi spasial positif yang signifikan pada kategori wilayah miskin (Kategori 1) dengan p-value=0.0082 < 0.05, yang berarti wilayah dengan tingkat kemiskinan di atas rata-rata cenderung mengelompok secara geografis membentuk klaster kemiskinan di Jawa Barat. Sebaliknya, pada kategori wilayah aman (Kategori 0), hasil uji tidak menunjukkan signifikansi statistik (p-value=0,093 > 0.05), mengindikasikan bahwa wilayah dengan kemiskinan rendah cenderung tersebar secara lebih acak tanpa pola pengelompokan yang kuat. Hal ini memberikan informasi bahwa fenomena kemiskinan di lokasi penelitian memiliki autokorelasi spasial.
# joint count dengan simulasi monte carlo
set.seed(123)
jc_mc <- joincount.mc(x, lw, nsim = 999)
jc_mc
##
## Monte-Carlo simulation of join-count statistic
##
## data: x
## weights: lw
## number of simulations + 1: 1000
##
## Join-count statistic for 0 = 2.75, rank of observed statistic = 910.5,
## p-value = 0.0895
## alternative hypothesis: greater
## sample estimates:
## mean of simulation variance of simulation
## 2.2506256 0.1318101
##
##
## Monte-Carlo simulation of join-count statistic
##
## data: x
## weights: lw
## number of simulations + 1: 1000
##
## Join-count statistic for 1 = 2.625, rank of observed statistic = 990.5,
## p-value = 0.0095
## alternative hypothesis: greater
## sample estimates:
## mean of simulation variance of simulation
## 1.7374875 0.1350512
Hasil simulasi Monte Carlo memperkuat uji sebelumnya dengan pendekatan yang lebih tangguh (robust), karena tidak bergantung pada asumsi distribusi normal melainkan pada 999 kali pengacakan data secara empiris.
Setelah sebelumnya menggunakan Joint Count untuk data biner (0 dan 1), kini beralih ke Global Moran’s I, untuk menguji autokorelasi pada data kontinu (%kemiskinan tanpa dikategorikan)
Global Moran’s I mengukur hubungan antara nilai suatu variabel di sebuah lokasi dengan nilai variabel yang sama di lokasi tetangganya. Nilainya berkisar antara -1 hingga +1:
Nilai Positif (+): Menunjukkan adanya pengelompokan (Clustering). Wilayah dengan persentase kemiskinan tinggi dikelilingi wilayah yang juga tinggi.
Nilai Negatif (-): Menunjukkan pola menyebar (Dispersed). Wilayah dengan nilai tinggi dikelilingi oleh nilai rendah (seperti papan catur).
Nilai Nol (0): Menunjukkan pola acak (Random). Tidak ada keterkaitan spasial.
#========================================
#Global Moran I
#========================================
moran.test(data_spasial$p.miskin15, lw)
##
## Moran I test under randomisation
##
## data: data_spasial$p.miskin15
## weights: lw
##
## Moran I statistic standard deviate = 2.8407, p-value = 0.002251
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.34343214 -0.06250000 0.02042008
#uji moran dengan simulasi monte carlo
set.seed(123)
MC<- moran.mc(data_spasial$p.miskin15, lw, nsim=599)
MC
##
## Monte-Carlo simulation of Moran I
##
## data: data_spasial$p.miskin15
## weights: lw
## number of simulations + 1: 600
##
## statistic = 0.34343, observed rank = 596, p-value = 0.006667
## alternative hypothesis: greater
Hasil uji Global Moran’s I menunjukkan adanya autokorelasi spasial positif yang signifikan pada persentase kemiskinan dengan nilai indeks sebesar 0,3434 ( p-value =0,0022 < 0.05), yang secara empiris diperkuat oleh simulasi Monte Carlo dengan peringkat observasi 596 dari 600 percobaan (p-value=0,0067 < 0.05). Hal ini mengonfirmasi bahwa fenomena kemiskinan di Jawa Barat tidak tersebar secara acak, melainkan membentuk pola pengelompokan (clustering) yang kuat di mana wilayah dengan intensitas kemiskinan tinggi cenderung bertetangga dengan wilayah berkarakteristik serupa.
Jika Moran’s I fokus pada penyimpangan nilai dari rata-rata (mirip korelasi), Geary’s C lebih fokus pada perbedaan kuadrat antar nilai tetangga (mirip prinsip varians atau semivariogram).
Nilai 0<C<1: Menunjukkan autokorelasi spasial positif (wilayah yang bertetangga memiliki nilai yang mirip/homogen).
Nilai C=1: Menunjukkan tidak ada autokorelasi (acak).
Nilai C>1: Menunjukkan autokorelasi spasial negatif (wilayah bertetangga memiliki nilai yang sangat berbeda/heterogen).
Menghitung statistik C untuk mengetahui tingkat kemiripan nilai
persentase kemiskinan antarwilayah yang bertetangga dan membandingkan
perbedaan nilai antar-poligon yang terhubung oleh matriks
bobot lw.
#========================================
#Global Geary’s C
#========================================
C1 <- geary.test(data_spasial$p.miskin15, lw)
C1
##
## Geary C test under randomisation
##
## data: data_spasial$p.miskin15
## weights: lw
##
## Geary C statistic standard deviate = 2.9909, p-value = 0.001391
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.57006259 1.00000000 0.02066342
#uji Geary’s C dengan simulasi monte carlo
set.seed(123)
GS1 <- geary.mc(data_spasial$p.miskin15, lw, nsim=599)
GS1
##
## Monte-Carlo simulation of Geary C
##
## data: data_spasial$p.miskin15
## weights: lw
## number of simulations + 1: 600
##
## statistic = 0.57006, observed rank = 4, p-value = 0.006667
## alternative hypothesis: greater
Hasil uji Global Geary’s C menghasilkan nilai statistik 0,5700 (p-value = 0,0013 < 0.05) , yang secara signifikan berada di bawah nilai harapan 1, sehingga mengonfirmasi adanya homogenitas atau kemiripan karakteristik kemiskinan yang kuat antarwilayah bertetangga. Validasi melalui simulasi Monte Carlo memperkuat temuan ini dengan peringkat observasi 4 dari 600 percobaan yang menghasilkan nilai statistik 0,57006 (p-value=0,0067 < 0.05), membuktikan bahwa pola klaster lokal ini bukan terjadi secara kebetulan. Secara statistik, hasil ini melengkapi Moran’s I dalam menegaskan bahwa fenomena kemiskinan di Jawa Barat memiliki autokorelasi spasial,
Penerapan Local Moran’s I bertujuan untuk membedah
pola autokorelasi global ke dalam unit-unit observasi yang lebih kecil
guna mengidentifikasi heterogenitas spasial pada data kemiskinan di Jawa
Barat. Dengan melakukan kalkulasi
skor Z (z.li) dan P-value pada tiap wilayah, metode ini
mampu mendeteksi keberadaan indikator asosiasi spasial lokal
atau LISA, yang secara teknis memisahkan antara wilayah
yang menjadi bagian dari klaster signifikan dengan wilayah yang bersifat
acak.
Tahapan ekstraksi data ini sangat krusial dalam alur kerja sains data karena menjadi dasar dalam pengklasifikasian kuadran Hotspot dan Coldspot, yang memungkinkan analisis lebih mendalam mengenai faktor lokal apa yang menyebabkan sebuah wilayah memiliki tingkat kemiskinan yang secara signifikan lebih tinggi atau lebih rendah dibandingkan rata-rata wilayah di sekitarnya
#========================================
#local moran
#========================================
oid <- order(data_spasial$p.miskin15)
resI <- localmoran(data_spasial$p.miskin15, lw)
head(resI)
## Ii E.Ii Var.Ii Z.Ii Pr(z != E(Ii))
## 1 1.27585405 -0.0989976131 0.3032700914 2.4965545 0.01254064
## 2 0.29366453 -0.0170499022 0.0569812902 1.3016532 0.19303497
## 3 1.02723011 -0.1343387004 0.3953921675 1.8472723 0.06470769
## 4 0.41667348 -0.0359515480 0.1178407163 1.3185326 0.18732541
## 5 -0.01348771 -0.0001924233 0.0006541132 -0.5198420 0.60317369
## 6 -0.09087487 -0.0043770537 0.0148168433 -0.7106034 0.47733004
data_spasial$z.li <- resI[,4]
data_spasial$pvalue <- resI[,5]
Identifikasi Klaster Signifikan: Melalui p-value, dapat diidentifikasi unit wilayah yang memiliki ketergantungan spasial signifikan. Sebagai contoh, pada unit observasi pertama, diperoleh nilai Z-score sebesar 2,49 dengan p-value=0,0125 (<0,05). Hal ini menunjukkan bahwa wilayah tersebut merupakan pusat klaster yang signifikan secara statistik, di mana karakteristik tingkat kemiskinannya memiliki kemiripan yang kuat dengan wilayah-wilayah di sekitarnya.
Pola Pengelompokan (Indeks Ii): Nilai Ii yang positif pada beberapa baris awal (seperti pada observasi 1 hingga 4) mengindikasikan adanya asosiasi spasial positif, yang berarti wilayah-wilayah tersebut dikelilingi oleh tetangga yang memiliki nilai persentase kemiskinan yang mirip
Variansi dan Distribusi Lokal: Keberadaan wilayah dengan p-value > 0,05 menunjukkan bahwa tidak semua wilayah di Jawa Barat membentuk klaster. Wilayah-wilayah tersebut dikategorikan sebagai wilayah yang memiliki pola sebaran acak secara spasial, di mana tingkat kemiskinannya tidak dipengaruhi secara signifikan oleh kondisi wilayah tetangganya.
# Buat plot
ggplot(data = data_spasial) +
geom_sf(aes(fill = z.li), color = "black", linewidth = 0.3) +
scale_fill_stepsn(
colors = c("#ffffff", "#fef0d9", "#fdbb84", "#fc8d59", "#e34a33", "#b30000"),
n.breaks = 20,
name = NULL
) +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
legend.position = "right",
legend.key.height = unit(1.5, "cm") # Memanjangkan legenda
) +
labs(title = "Local Moran")
moran.plot(data_spasial$p.miskin15,lw)
localG(data_spasial$p.miskin15, lw):
Fungsi ini menghitung statistik Gi∗ lokal. Hasil yang dikeluarkan secara
otomatis dalam bentuk Z-score. Karena Z-score mengikuti
distribusi normal standar, kita bisa langsung menentukan
signifikansinya:
Z>1.96: Hotspot signifikan (Confidence Level 95%).
Z<−1.96: Coldspot signifikan (Confidence Level 95%).
−1.96<Z<1.96: Tidak signifikan secara spasial.
#========================================
#Getis-Ord Gi
#========================================
local_g <- localG(data_spasial$p.miskin15, lw)
local_g
## [1] 2.49655451 1.30165318 1.84727228 1.31853263 0.51984202 -0.71060340
## [7] -1.62044928 -1.18559891 -2.26434951 -0.81197560 0.06131463 1.52570656
## [13] -1.86072899 -1.90537281 -0.07378118 1.20868799 2.03433502
## attr(,"internals")
## Gi E(Gi) V(Gi) Z(Gi) Pr(z != E(Gi))
## [1,] 0.09148252 0.0625 0.0001347691 2.49655451 0.01254064
## [2,] 0.07798074 0.0625 0.0001414467 1.30165318 0.19303497
## [3,] 0.08363659 0.0625 0.0001309206 1.84727228 0.06470769
## [4,] 0.07812600 0.0625 0.0001404475 1.31853263 0.18732541
## [5,] 0.06864298 0.0625 0.0001396417 0.51984202 0.60317369
## [6,] 0.05405104 0.0625 0.0001413682 -0.71060340 0.47733004
## [7,] 0.04450262 0.0625 0.0001233525 -1.62044928 0.10513580
## [8,] 0.04848862 0.0625 0.0001396646 -1.18559891 0.23578073
## [9,] 0.03618569 0.0625 0.0001350507 -2.26434951 0.02355263
## [10,] 0.05293281 0.0625 0.0001388298 -0.81197560 0.41680563
## [11,] 0.06316906 0.0625 0.0001190701 0.06131463 0.95110864
## [12,] 0.08064018 0.0625 0.0001413648 1.52570656 0.12708296
## [13,] 0.04173740 0.0625 0.0001245080 -1.86072899 0.06278246
## [14,] 0.04328474 0.0625 0.0001017027 -1.90537281 0.05673163
## [15,] 0.06166940 0.0625 0.0001267340 -0.07378118 0.94118450
## [16,] 0.07588858 0.0625 0.0001226990 1.20868799 0.22678274
## [17,] 0.08607714 0.0625 0.0001343189 2.03433502 0.04191783
## attr(,"cluster")
## [1] High High High High Low High Low High Low Low Low High Low Low Low
## [16] High Low
## Levels: Low High
## attr(,"gstari")
## [1] FALSE
## attr(,"call")
## localG(x = data_spasial$p.miskin15, listw = lw)
## attr(,"class")
## [1] "localG"
data_spasial$localg <- as.numeric(local_g)
palet_krem_merah <- c("#ffffff", "#fef0d9", "#fdbb84", "#fc8d59", "#e34a33", "#b30000")
# 3. Membuat Plot
ggplot(data = data_spasial) +
geom_sf(aes(fill = localg), color = "black", linewidth = 0.3) +
# Menggunakan scale_fill_stepsn untuk membuat efek kotak-kotak pada legenda
scale_fill_stepsn(
colors = palet_krem_merah,
n.breaks = 18, # Menyesuaikan jumlah kotak warna pada legenda di gambar
name = NULL # Menghilangkan teks judul di atas legenda
) +
theme_void() + # Menghilangkan background abu-abu dan grid koordinat
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 20),
legend.position = "right",
legend.key.height = unit(1.2, "cm"), # Memanjangkan ukuran kotak legenda
legend.text = element_text(size = 10)
) +
labs(title = "Hot Spot Analysis (Gi*)")
Perbandingan antara peta Local Moran’s I dan Hot Spot Analysis(Gi∗) terlihat adanya konsistensi spasial yang kuat, di mana wilayah bagian timur dan tenggara teridentifikasi sebagai pusat klaster kemiskinan (hotspot) dengan nilai Z-score di atas 2,00. Sementara Local Moran’s I mampu menangkap heterogenitas lokal dan batas-batas klaster secara lebih tajam, analisis Getis-Ord Gi∗ memberikan gambaran yang lebih menyeluruh mengenai intensitas sebaran fenomena tersebut. Sinkronisasi kedua hasil ini membuktikan bahwa pengelompokan kemiskinan di wilayah tersebut bukan merupakan anomali acak, melainkan sebuah struktur spasial yang nyata, sehingga wilayah dengan gradasi warna merah pekat pada kedua peta tersebut harus menjadi prioritas utama dalam intervensi kebijakan berbasis kewilayahan.