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.
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...
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.
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.
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.
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")
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
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.
Bertujuan mengidentifikasi pola keterkaitan spasial antar wilayah menggunakan Global Moran’s I dan mendeteksi cluster spasial menggunakan Local Indicators of Spatial Association (LISA).
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 ).
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.
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 <- 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.
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.
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.
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.