Deskripsi Data

Data yang digunakan adalah data tindak pidana di kabupaten/kota di Provinsi Jawa Timur dengan empat variabel utama, yaitu X1 yang menunjukkan Jumlah Kejahatan yang Dilaporkan, X2 yang merepresentasikan Persentase Penyelesaian Tindak Pidana, X3 yang menggambarkan Selang Waktu Terjadinya Tindak Pidana, dan Y sebagai variabel yang menunjukkan Risiko Penduduk Terjadi Tindak Pidana per 100.000 Penduduk. Data ini bersumber dari publikasi resmi Badan Pusat Statistik (BPS) Provinsi Jawa Timur melalui situs https://jatim.bps.go.id/. Informasi yang disajikan mencakup wilayah dari Pacitan, Ponorogo, hingga Kota Surabaya dan Kota Batu, sehingga dapat digunakan untuk menganalisis pola distribusi kejahatan, efektivitas penyelesaian kasus, serta tingkat risiko kriminalitas yang dihadapi penduduk di masing-masing wilayah.

Load Packages dan Impor Data

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(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(spatialreg)
## Warning: package 'spatialreg' was built under R version 4.4.3
## Loading required package: Matrix
## 
## Attaching package: 'spatialreg'
## The following objects are masked from 'package:spdep':
## 
##     get.ClusterOption, get.coresOption, get.mcOption,
##     get.VerboseOption, get.ZeroPolicyOption, set.ClusterOption,
##     set.coresOption, set.mcOption, set.VerboseOption,
##     set.ZeroPolicyOption
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.2
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::expand() masks Matrix::expand()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ tidyr::pack()   masks Matrix::pack()
## ✖ tidyr::unpack() masks Matrix::unpack()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tmap)
## Warning: package 'tmap' was built under R version 4.4.3
library(cluster)
## Warning: package 'cluster' was built under R version 4.4.3
data <- read.csv("C:/Kuliah/SEMESTER 6/ANALISIS SPASIAL/data anspas.csv", sep=";")
head(data)
##   Kabupaten.Kota   X1    X2   X3   Y
## 1        Pacitan  469 92.11  436 197
## 2       Ponorogo 1005 95.32 1140 120
## 3     Trenggalek  757 96.04  148 238
## 4    Tulungagung 1511 99.60  284 103
## 5         Blitar  756 89.81  144 185
## 6         Kediri 1823 86.62   92  69
str(data)
## 'data.frame':    39 obs. of  5 variables:
##  $ Kabupaten.Kota: chr  "Pacitan" "Ponorogo" "Trenggalek" "Tulungagung" ...
##  $ X1            : int  469 1005 757 1511 756 1823 2 1194 3 3 ...
##  $ X2            : num  92.1 95.3 96 99.6 89.8 ...
##  $ X3            : int  436 1140 148 284 144 92 1144 456 572 396 ...
##  $ Y             : int  197 120 238 103 185 69 78 142 48 180 ...
jatim <- st_read("C:/Users/Icha/Downloads/[geosai.my.id]Jawa_Timur_Kab")
## Reading layer `Jawa_Timur_ADMIN_BPS' from data source 
##   `C:\Users\Icha\Downloads\[geosai.my.id]Jawa_Timur_Kab' using driver `ESRI Shapefile'
## Simple feature collection with 38 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 110.8987 ymin: -8.78036 xmax: 116.2702 ymax: -5.048857
## Geodetic CRS:  WGS 84
head(jatim)
## Simple feature collection with 6 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 111.4236 ymin: -8.78036 xmax: 114.605 ymax: -5.714017
## Geodetic CRS:  WGS 84
##     ADM0_EN       date    validOn   PROVINCE  Kabupaten       PRV2
## 1 Indonesia 2019-12-20 2020-04-01 Jawa Timur  Bangkalan Jawa_Timur
## 2 Indonesia 2019-12-20 2020-04-01 Jawa Timur Banyuwangi Jawa_Timur
## 3 Indonesia 2019-12-20 2020-04-01 Jawa Timur     Blitar Jawa_Timur
## 4 Indonesia 2019-12-20 2020-04-01 Jawa Timur Bojonegoro Jawa_Timur
## 5 Indonesia 2019-12-20 2020-04-01 Jawa Timur  Bondowoso Jawa_Timur
## 6 Indonesia 2019-12-20 2020-04-01 Jawa Timur     Gresik Jawa_Timur
##                         geometry
## 1 MULTIPOLYGON (((113.036 -6....
## 2 MULTIPOLYGON (((114.2038 -8...
## 3 MULTIPOLYGON (((112.2387 -8...
## 4 MULTIPOLYGON (((111.6384 -6...
## 5 MULTIPOLYGON (((114.0114 -7...
## 6 MULTIPOLYGON (((112.551 -6....
names(jatim)
## [1] "ADM0_EN"   "date"      "validOn"   "PROVINCE"  "Kabupaten" "PRV2"     
## [7] "geometry"
jatim_data <- merge(jatim, data, by.x = "Kabupaten", by.y = "Kabupaten.Kota")
jatim_data
## Simple feature collection with 38 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 110.8987 ymin: -8.78036 xmax: 116.2702 ymax: -5.048857
## Geodetic CRS:  WGS 84
## First 10 features:
##     Kabupaten   ADM0_EN       date    validOn   PROVINCE       PRV2   X1     X2
## 1   Bangkalan Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur 1032 107.27
## 2  Banyuwangi Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur    3  78.39
## 3      Blitar Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur  756  89.81
## 4  Bojonegoro Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur 1146  98.78
## 5   Bondowoso Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur 1303  71.14
## 6      Gresik Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur    2  90.49
## 7      Jember Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur    3  97.82
## 8     Jombang Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur 2009 112.89
## 9      Kediri Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur 1823  86.62
## 10  Kota Batu Indonesia 2019-12-20 2020-04-01 Jawa Timur Jawa_Timur  536 105.97
##      X3   Y                       geometry
## 1  1248  98 MULTIPOLYGON (((113.036 -6....
## 2   396 180 MULTIPOLYGON (((114.2038 -8...
## 3   144 185 MULTIPOLYGON (((112.2387 -8...
## 4   264  38 MULTIPOLYGON (((111.6384 -6...
## 5   892 153 MULTIPOLYGON (((114.0114 -7...
## 6  1376  79 MULTIPOLYGON (((112.551 -6....
## 7   572  48 MULTIPOLYGON (((113.818 -8....
## 8   836 128 MULTIPOLYGON (((112.335 -7....
## 9    92  69 MULTIPOLYGON (((112.1216 -7...
## 10  704 984 MULTIPOLYGON (((112.5352 -7...

Exploratory Spatial Data Analysis (ESDA)

Bertujuan untuk melakukan eksplorasi pola sebaran spasial variabel risiko tindak pidana (Y) dan variabel prediktor (X1, X2, X3) di Jawa Timur melalui visualisasi peta, identifikasi struktur ketetanggaan antar wilayah, dan perhitungan lag spasial.

Eksplorasi Data Spasial

Eksplorasi Pola Area

tmap_mode("plot")
## ℹ tmap modes "plot" - "view"
## ℹ toggle with `tmap::ttm()`
tm_shape(jatim_data) + tm_polygons("Y", palette = "Reds", title = "Risiko Kejahatan") + tm_layout(frame = FALSE)
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).[v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'[cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Reds" is named
## "brewer.reds"Multiple palettes called "reds" found: "brewer.reds", "matplotlib.reds". The first one, "brewer.reds", is returned.

Peta risiko kejahatan menunjukkan adanya variasi tingkat risiko tindak pidana antar wilayah di Jawa Timur. Secara umum, sebagian besar kabupaten/kota memiliki tingkat risiko yang relatif rendah hingga sedang, yang ditunjukkan oleh warna merah muda. Namun, terdapat beberapa wilayah dengan warna merah lebih gelap yang mengindikasikan risiko kejahatan yang lebih tinggi. Wilayah dengan risiko tinggi ini cenderung terkonsentrasi di bagian tengah, menunjukkan adanya indikasi pengelompokan spasial ( spatial clustering ) dimana daerah tertentu memiliki tingkat kerawanan yang lebih besar dibandingkan wilayah sekitarnya. Sementara itu, wilayah dengan warna paling terang menunjukkan risiko yang relatif rendah dan tersebar di beberapa bagian pinggiran.

tm_shape(jatim_data) + tm_polygons("X1", palette = "Blues", title = "Jumlah Kejahatan") + tm_layout(frame = FALSE)
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Blues" is named
## "brewer.blues"
## Multiple palettes called "blues" found: "brewer.blues", "matplotlib.blues". The first one, "brewer.blues", is returned.

Peta jumlah kejahatan memperlihatkan distribusi kasus kejahatan yang cukup bervariasi antar wilayah. Wilayah dengan warna biru tua menunjukkan jumlah kejahatan yang tinggi, yang tampak terkonsentrasi di beberapa daerah tertentu, terutama di bagian tengah. Hal ini mengindikasikan adanya pusat-pusat aktivitas kejahatan yang lebih intens dibandingkan daerah lain. Di sisi lain, wilayah dengan warna biru muda hingga sangat terang menunjukkan jumlah kejahatan yang relatif rendah. Secara spasial, pola ini mengindikasikan adanya ketimpangan distribusi jumlah kejahatan, di mana tidak semua wilayah memiliki tingkat kejadian yang sama.

tm_shape(jatim_data) + tm_polygons("X2", palette = "Greens", title = "Penyelesaian") + tm_layout(frame = FALSE)
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Greens" is named
## "brewer.greens"
## Multiple palettes called "greens" found: "brewer.greens", "matplotlib.greens". The first one, "brewer.greens", is returned.

Peta persentase penyelesaian tindak pidana menunjukkan bahwa sebagian besar wilayah memiliki tingkat penyelesaian yang berada pada kategori rendah hingga sedang (warna hijau muda). Hanya sedikit wilayah yang memiliki warna hijau lebih gelap, yang menandakan tingkat penyelesaian kasus yang lebih tinggi. Hal ini menunjukkan bahwa efektivitas penyelesaian tindak pidana belum merata di seluruh wilayah. Secara spasial, wilayah dengan tingkat penyelesaian tinggi tampak terbatas dan tidak tersebar luas, sehingga mengindikasikan adanya perbedaan kapasitas atau kinerja penegakan hukum antar daerah.

tm_shape(jatim_data) + tm_polygons("X3", palette = "Purples", title = "Selang Waktu") + tm_layout(frame = FALSE)
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Purples" is named
## "brewer.purples"
## Multiple palettes called "purples" found: "brewer.purples", "matplotlib.purples". The first one, "brewer.purples", is returned.

Peta selang waktu menunjukkan variasi interval waktu terjadinya tindak pidana di setiap wilayah. Wilayah dengan warna ungu tua menunjukkan selang waktu yang lebih panjang, yang berarti kejadian tindak pidana relatif jarang terjadi. Sebaliknya, warna yang lebih terang menunjukkan selang waktu yang lebih pendek, yang mengindikasikan frekuensi kejadian yang lebih tinggi. Secara spasial, wilayah dengan selang waktu panjang cenderung terkonsentrasi di beberapa bagian tertentu, sementara wilayah dengan selang waktu pendek lebih tersebar. Pola ini mengindikasikan adanya perbedaan intensitas kejadian kejahatan antar wilayah di Jawa Timur.

Eksplorasi Pola Area

centroid <- st_centroid(jatim_data)
## Warning: st_centroid assumes attributes are constant over geometries
tm_shape(jatim_data) + tm_polygons(col = "lightgrey", border.col = "white") + tm_shape(centroid) +
  tm_dots(size = "Y", col = "Y", palette = "Reds", title = "Risiko") +
  tm_layout(title = "Pola Titik Risiko Kejahatan", frame = FALSE)
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: use 'fill' for the fill color of polygons/symbols
## (instead of 'col'), and 'col' for the outlines (instead of 'border.col').
## [tm_dots()] Argument `title` unknown.
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Reds" is named
## "brewer.reds"
## Multiple palettes called "reds" found: "brewer.reds", "matplotlib.reds". The first one, "brewer.reds", is returned.
## 
## This message is displayed once every 8 hours.

Visualisasi pola titik menggunakan centroid memperlihatkan bahwa ukuran dan warna titik merepresentasikan besar kecilnya risiko kejahatan. Titik-titik dengan ukuran besar dan warna merah tua terkonsentrasi pada beberapa wilayah tertentu, yang menunjukkan adanya daerah dengan risiko tinggi. Namun, persebarannya masih cukup menyebar dan tidak membentuk pola cluster yang sangat jelas. Hal ini mengindikasikan bahwa kejadian risiko kejahatan tidak sepenuhnya terpusat pada satu kawasan saja, melainkan tersebar di beberapa wilayah.

Struktur Spasial

Spatial Neighbors

nb <- poly2nb(jatim_data)
## Warning in poly2nb(jatim_data): neighbour object has 2 sub-graphs;
## if this sub-graph count seems unexpected, try increasing the snap argument.
summary(nb)
## Neighbour list object:
## Number of regions: 38 
## Number of nonzero links: 138 
## Percentage nonzero weights: 9.556787 
## Average number of links: 3.631579 
## 2 disjoint connected subgraphs
## Link number distribution:
## 
## 1 2 3 4 5 6 7 8 9 
## 8 6 6 6 2 7 1 1 1 
## 8 least connected regions:
## 1 11 12 14 15 16 17 35 with 1 link
## 1 most connected region:
## 23 with 9 links

Berdasarkan hasil struktur tetangga, terdapat 38 wilayah dengan total 138 hubungan bertetangga, dan rata-rata setiap wilayah memiliki sekitar 3–4 tetangga (3,63). Ditemukan juga 2 kelompok wilayah yang tidak saling terhubung ( disjoint subgraphs ), yang berarti ada bagian wilayah yang terpisah dalam struktur spasial (biasanya karena letak geografis seperti kepulauan). Selain itu, terdapat beberapa wilayah dengan hanya 1 tetangga ( least connected ), yang menunjukkan keterisolasian relatif, serta 1 wilayah dengan 9 tetangga ( most connected ) yang menunjukkan posisi sentral dalam jaringan spasial.

coords <- st_coordinates(st_centroid(jatim_data))
## Warning: st_centroid assumes attributes are constant over geometries
spdep::plot.nb(nb, coords, col = "red")
plot(jatim_data$geometry, add = TRUE, border = "grey")

Bobot Spasial

listw <- nb2listw(nb, style="W")
listw
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 38 
## Number of nonzero links: 138 
## Percentage nonzero weights: 9.556787 
## Average number of links: 3.631579 
## 2 disjoint connected subgraphs
## 
## Weights style: W 
## Weights constants summary:
##    n   nn S0       S1      S2
## W 38 1444 38 27.00053 169.545

Spatial Lag

lag_Y <- lag.listw(listw, jatim_data$Y)
lag_Y
##  [1] 109.0000 138.6667 164.5000 148.8333 167.7500 151.2500 175.7500 121.8333
##  [9] 249.6667 173.0000 185.0000  69.0000 296.0000  78.0000 338.0000 103.0000
## [17] 228.0000 100.0000 142.6000 118.0000 179.3333 247.5000 330.7778 236.8750
## [25] 128.6667 210.0000 179.0000  87.0000 375.1667 202.3333 138.0000 173.0000
## [33] 135.5000 187.0000 248.0000 140.0000  81.0000 139.2000

Nilai spatial lag (lag_Y) merupakan rata-rata tertimbang dari nilai risiko kejahatan di wilayah tetangga. Jika suatu wilayah memiliki nilai lag tinggi, artinya wilayah tersebut dikelilingi oleh wilayah dengan risiko kejahatan tinggi. Dari hasil yang diperoleh, terlihat variasi nilai lag yang cukup besar (sekitar 69 hingga 375), yang menunjukkan bahwa beberapa wilayah berada di lingkungan dengan risiko tinggi, sementara lainnya berada di lingkungan dengan risiko rendah.

Autokorelasi Spasial

Bertujuan mengidentifikasi pola keterkaitan spasial antar wilayah menggunakan Global Moran’s I dan mendeteksi cluster spasial menggunakan Local Indicators of Spatial Association (LISA).

Global Morans’s I

moran.plot(jatim_data$Y, listw,
           main = "Moran Scatterplot",
           xlab = "Risiko Kejahatan",
           ylab = "Spatial Lag")

Moran Scatterplot menunjukkan hubungan antara nilai risiko kejahatan (Y) dengan spatial lag-nya. Garis regresi yang sedikit menurun menunjukkan kecenderungan hubungan negatif yang sangat lemah. Titik-titik yang tersebar di keempat kuadran ( High-High, Low-Low, High-Low, Low-High ) tidak menunjukkan dominasi pola tertentu. Hal ini mengindikasikan bahwa tidak ada pola autokorelasi spasial yang kuat, baik berupa pengelompokan nilai tinggi maupun nilai rendah.

moran_global <- moran.test(jatim_data$Y, listw)
moran_global
## 
##  Moran I test under randomisation
## 
## data:  jatim_data$Y  
## weights: listw    
## 
## Moran I statistic standard deviate = -0.25066, p-value = 0.599
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       -0.05776284       -0.02702703        0.01503555

Hasil uji Moran’s I menunjukkan nilai Moran’s I = -0,0578, yang mendekati nol dan bernilai negatif. Nilai ini mengindikasikan adanya kecenderungan autokorelasi spasial negatif yang sangat lemah, artinya wilayah dengan nilai tinggi cenderung bertetangga dengan wilayah bernilai rendah, namun pola ini tidak kuat. Selain itu, p-value = 0,599 (> 0,05) menunjukkan bahwa hasil tersebut tidak signifikan secara statistik. Dengan demikian, dapat disimpulkan bahwa tidak terdapat autokorelasi spasial global yang signifikan pada variabel risiko kejahatan di Jawa Timur, sehingga pola persebarannya cenderung acak ( random ).

Local Indicators of Spatial Association

lisa <- localmoran(jatim_data$Y, listw)
jatim_data$Ii <- lisa[,1]
jatim_data$Z_Ii <- lisa[,4]
jatim_data$Pvalue <- lisa[,5]

jatim_data$lagY <- lag.listw(listw, jatim_data$Y)

mean_y <- mean(jatim_data$Y)
jatim_data$cluster_lisa <- "Not Significant"
jatim_data$cluster_lisa[jatim_data$Y > mean_y & jatim_data$lagY > mean_y] <- "High-High"
jatim_data$cluster_lisa[jatim_data$Y < mean_y & jatim_data$lagY < mean_y] <- "Low-Low"
jatim_data$cluster_lisa[jatim_data$Y > mean_y & jatim_data$lagY < mean_y] <- "High-Low"
jatim_data$cluster_lisa[jatim_data$Y < mean_y & jatim_data$lagY > mean_y] <- "Low-High"

jatim_data$cluster_lisa <- factor(jatim_data$cluster_lisa, levels = c("High-High", "High-Low", "Low-High", "Low-Low", "Not Significant"))

tm_shape(jatim_data) + tm_fill("cluster_lisa", style = "cat", palette = c("#08306B", "#2171B5", "#6BAED6", "#C6DBEF", "grey80")) +
  tm_borders() + tm_layout(title = "Cluster LISA Jawa Timur")
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_fill()`: instead of `style = "cat"`, use fill.scale =
## `tm_scale_categorical()`.
## ℹ Migrate the argument(s) 'palette' (rename to 'values') to
##   'tm_scale_categorical(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`

Hasil analisis autokorelasi spasial menggunakan metode Local Indicators of Spatial Association (LISA) menunjukkan bahwa variabel risiko penduduk menjadi korban tindak pidana per 100.000 penduduk Y di Provinsi Jawa Timur memiliki pola keterkaitan spasial antar wilayah. Hal ini terlihat dari terbentuknya beberapa cluster, yaitu High–High, High–Low, Low–High, dan Low–Low. Cluster High–High menunjukkan adanya wilayah dengan tingkat risiko kriminalitas tinggi yang dikelilingi oleh wilayah dengan tingkat risiko tinggi pula. Kondisi ini mengindikasikan adanya pengelompokan daerah rawan kriminalitas yang kemungkinan dipengaruhi oleh tingginya jumlah kejahatan yang dilaporkan (X1), rendahnya persentase penyelesaian tindak pidana (X2), serta frekuensi kejadian yang relatif sering (X3). Sementara itu, cluster High–Low menggambarkan wilayah dengan risiko kriminalitas tinggi namun berada di sekitar wilayah dengan risiko rendah, yang menunjukkan adanya karakteristik lokal tertentu seperti kepadatan penduduk atau aktivitas ekonomi yang tinggi. Cluster Low–High menunjukkan wilayah dengan risiko rendah tetapi dikelilingi oleh wilayah dengan risiko tinggi, yang berpotensi mengalami peningkatan risiko akibat pengaruh wilayah sekitar. Adapun cluster Low–Low menunjukkan wilayah dengan tingkat risiko kriminalitas rendah yang dikelilingi oleh wilayah dengan risiko rendah pula, yang mencerminkan kondisi wilayah yang relatif aman dan stabil.

Spatial Filtering

Bertujuan menghilangkan efek autokorelasi spasial pada model regresi.

Karena Global Moran’s I dan Residual Moran’s I tidak signifikan ( p-value > 0.05), yang berarti data tidak menunjukkan adanya dependensi spasial. Maka spatial filtering tidak diperlukan, tetapi tetap dilakukan sebagai eksplorasi.

Model OLS

model_ols <- lm(Y ~ X1 + X2 + X3, data = jatim_data)
summary(model_ols)
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3, data = jatim_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -276.44 -140.05  -66.87   58.30  771.15 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 385.97026  192.40457   2.006   0.0529 .
## X1           -0.01432    0.06591  -0.217   0.8293  
## X2           -2.03232    1.56138  -1.302   0.2018  
## X3            0.07090    0.09420   0.753   0.4568  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 231 on 34 degrees of freedom
## Multiple R-squared:  0.0597, Adjusted R-squared:  -0.02327 
## F-statistic: 0.7196 on 3 and 34 DF,  p-value: 0.5472

Berdasarkan analisis regresi, nilai koefisien determinasi sebesar 0,0597 menunjukkan bahwa hanya 5,97% variasi risiko tindak pidana dapat dijelaskan oleh ketiga variabel independen, sedangkan 94,03% dipengaruhi faktor lain. Hasil uji simultan memperoleh p-value 0,5472 > 0,05, yang berarti secara bersama-sama variabel jumlah kejahatan yang dilaporkan, persentase penyelesaian tindak pidana, dan selang waktu terjadinya tindak pidana tidak berpengaruh signifikan terhadap risiko penduduk mengalami tindak pidana.

Uji Autokorelasi Residual

moran_residual <- moran.test(residuals(model_ols), listw)
moran_residual
## 
##  Moran I test under randomisation
## 
## data:  residuals(model_ols)  
## weights: listw    
## 
## Moran I statistic standard deviate = -0.48842, p-value = 0.6874
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       -0.08692272       -0.02702703        0.01503868

Residual model regresi tidak menunjukkan ketergantungan spasial antar wilayah kabupaten/kota di Provinsi Jawa Timur, sehingga model regresi yang digunakan tidak mengalami permasalahan autokorelasi spasial pada residualnya.

Spatial Filtering

ME_filter <- ME(Y ~ X1 + X2 + X3, data = jatim_data, listw = listw, alpha = 0.9)
model_filter <- lm(Y ~ X1 + X2 + X3 + fitted(ME_filter), data = jatim_data)
summary(model_filter)
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + fitted(ME_filter), data = jatim_data)
## 
## Residuals:
##         1         2         3         4         5         6         7         8 
## -114.2592  -14.5759  -56.2390  -15.3878   18.2642   31.0930  -10.8220   44.1576 
##         9        10        11        12        13        14        15        16 
##  -67.0799   24.7868   34.4708   -4.6851   25.1096   20.2813  -34.0373   67.8156 
##        17        18        19        20        21        22        23        24 
##   45.6508  -32.9586  -32.0509   30.4075    5.2372  -35.6204  -91.4481    0.4639 
##        25        26        27        28        29        30        31        32 
##  -16.0384   50.3822   35.3743   74.6415  -17.5574    2.4719  -32.8714   74.6415 
##        33        34        35        36        37        38 
##   22.1292   17.9379 -114.2592  -59.8598   84.0259   40.4080 
## 
## Coefficients: (1 not defined because of singularities)
##                          Estimate Std. Error t value Pr(>|t|)
## (Intercept)             2866.1570  1603.2426   1.788    0.325
## X1                        -0.7304     0.5619  -1.300    0.417
## X2                       -15.9214     9.8269  -1.620    0.352
## X3                        -0.5950     0.4354  -1.366    0.402
## fitted(ME_filter)vec27  -871.6553   389.0165  -2.241    0.267
## fitted(ME_filter)vec32  -240.2525   414.4915  -0.580    0.666
## fitted(ME_filter)vec11  -419.3308   494.0809  -0.849    0.552
## fitted(ME_filter)vec38  1255.5222   756.0648   1.661    0.345
## fitted(ME_filter)vec34  -854.7833   582.8989  -1.466    0.381
## fitted(ME_filter)vec18         NA         NA      NA       NA
## fitted(ME_filter)vec8    322.3055   396.2683   0.813    0.565
## fitted(ME_filter)vec28   522.7140   466.2685   1.121    0.464
## fitted(ME_filter)vec24 -1084.1632   656.4950  -1.651    0.347
## fitted(ME_filter)vec15  -752.1338   698.8318  -1.076    0.477
## fitted(ME_filter)vec20  -311.0532   484.3248  -0.642    0.637
## fitted(ME_filter)vec17   -98.0852   338.6581  -0.290    0.821
## fitted(ME_filter)vec16  -288.7577   364.9530  -0.791    0.574
## fitted(ME_filter)vec36  -236.8155   414.0347  -0.572    0.669
## fitted(ME_filter)vec25  -851.3282   650.6555  -1.308    0.415
## fitted(ME_filter)vec21   328.9725   494.7188   0.665    0.626
## fitted(ME_filter)vec2    174.1214   334.4818   0.521    0.694
## fitted(ME_filter)vec12   539.5779   489.3806   1.103    0.469
## fitted(ME_filter)vec22  -135.9514   399.6875  -0.340    0.791
## fitted(ME_filter)vec7    661.3228   806.9263   0.820    0.563
## fitted(ME_filter)vec33   259.1558   419.1588   0.618    0.647
## fitted(ME_filter)vec13   910.9589   648.8988   1.404    0.394
## fitted(ME_filter)vec19  -262.5324   454.4898  -0.578    0.667
## fitted(ME_filter)vec14  -211.6657   373.0918  -0.567    0.671
## fitted(ME_filter)vec23  -431.1238   582.2855  -0.740    0.594
## fitted(ME_filter)vec9   -771.5309   480.4745  -1.606    0.355
## fitted(ME_filter)vec26  1034.1638   610.2000   1.695    0.339
## fitted(ME_filter)vec5    411.4316   550.7553   0.747    0.592
## fitted(ME_filter)vec29  -598.0298   372.9767  -1.603    0.355
## fitted(ME_filter)vec1    112.8402   361.6852   0.312    0.807
## fitted(ME_filter)vec35  -496.2955   734.1112  -0.676    0.622
## fitted(ME_filter)vec6    304.7450   406.5044   0.750    0.590
## fitted(ME_filter)vec37   567.3503   413.2896   1.373    0.401
## fitted(ME_filter)vec3   -994.5804   599.2455  -1.660    0.345
## 
## Residual standard error: 301.1 on 1 degrees of freedom
## Multiple R-squared:  0.953,  Adjusted R-squared:  -0.7379 
## F-statistic: 0.5636 on 36 and 1 DF,  p-value: 0.8088

Model spatial filtering tidak signifikan secara statistik dan tidak meningkatkan penjelasan variasi risiko penduduk mengalami tindak pidana. Hal tersebut membuktikan tidak terdapat autokorelasi spasial pada data, sehingga spatial filtering sebenarnya tidak diperlukan.

Spatial Clustering

Bertujuan mengelompokkan kabupaten/kota di Jawa Timur berdasarkan kesamaan karakteristik risiko tindak pidana menggunakan metode K-Means Clustering dan mengidentifikasi prioritas intervensi pencegahan kriminalitas.

cluster_data <- data.frame(
  X1 = as.numeric(jatim_data$X1),
  X2 = as.numeric(jatim_data$X2),
  X3 = as.numeric(jatim_data$X3),
  Y  = as.numeric(jatim_data$Y)
)
str(cluster_data)
## 'data.frame':    38 obs. of  4 variables:
##  $ X1: num  1032 3 756 1146 1303 ...
##  $ X2: num  107.3 78.4 89.8 98.8 71.1 ...
##  $ X3: num  1248 396 144 264 892 ...
##  $ Y : num  98 180 185 38 153 79 48 128 69 984 ...
cluster_data <- data[, c("X1","X2","X3","Y")]

cluster_data <- scale(cluster_data)
cluster_data <- cluster_data[1:38, ]

set.seed(123)
kmeans_model <- kmeans(cluster_data, centers=3, nstart=25)
jatim_data$cluster_kmeans <- kmeans_model$cluster

tm_shape(jatim_data) + tm_fill("cluster_kmeans") + tm_borders() +
  tm_layout(title="Cluster Risiko Penduduk Terjadi Tindak Pidana di Kabupaten/Kota Jawa Timur")
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [plot mode] fit legend/component: Some legend items or map compoments do not
## fit well, and are therefore rescaled.
## ℹ Set the tmap option `component.autoscale = FALSE` to disable rescaling.

Hasil K-Means Clustering mengelompokkan kabupaten/kota ke dalam empat cluster berdasarkan tingkat risiko tindak pidana, yaitu Cluster Sangat Rendah (1,0-1,4) dengan profil terbaik dan tidak memerlukan intervensi darurat, Cluster Rendah (1,5-1,9) dengan profil menengah-rendah yang memerlukan program stabilisasi, Cluster Sedang (2,0-2,4) dengan profil menengah ke atas yang memerlukan intervensi faktor spesifik, serta Cluster Tinggi (2,5-3,0) dengan profil terburuk yang menjadi prioritas intervensi pencegahan.