Data yang digunakan dalam penelitian ini merupakan data kriminalitas di Indonesia tahun 2024 yang diperoleh dari publikasi resmi Badan Pusat Statistik (BPS). Dataset ini menggambarkan kondisi kriminalitas pada tingkat provinsi yang bersumber dari instansi terkait seperti kepolisian, sehingga memiliki tingkat keandalan yang tinggi untuk analisis.
Dataset terdiri dari 34 observasi (provinsi) dan 5 variabel numerik, yaitu Jumlah_Kejahatan, Kejahatan_Diselesaikan, Persentase_Penyelesaian, Persentase_Korban, dan Resiko_Terkena. Seluruh variabel tersebut digunakan untuk merepresentasikan berbagai aspek kriminalitas, mulai dari jumlah kejadian hingga tingkat risiko masyarakat terhadap kejahatan.
Variabel Jumlah_Kejahatan menunjukkan total kasus kejahatan yang terjadi, sedangkan Kejahatan_Diselesaikan menunjukkan jumlah kasus yang berhasil diselesaikan. Persentase_Penyelesaian merepresentasikan tingkat keberhasilan penanganan kasus, sementara Persentase_Korban dan Resiko_Terkena menggambarkan tingkat kerentanan masyarakat terhadap tindak kejahatan di masing-masing provinsi.
# Input Data
data_kriminal <- read.csv("C:/Users/dals/OneDrive - untirta.ac.id/KULIAH/Sem 6/Visdat lanjut/Data/Data Kriminalitas Provinsi Indonesia Tahun 2024.csv", sep = ";")
head(data_kriminal)
# Package
library(psych)
library(corrplot)
summary(data_kriminal)
## Provinsi Jumlah_Kejahatan Kejahatan_Diselesaikan Resiko_Terkena
## Length:34 Min. : 1593 Min. : 532 Min. : 89.0
## Class :character 1st Qu.: 5477 1st Qu.: 2366 1st Qu.:177.0
## Mode :character Median : 8608 Median : 5128 Median :249.0
## Mean :16529 Mean : 9428 Mean :250.8
## 3rd Qu.:15667 3rd Qu.: 9920 3rd Qu.:305.5
## Max. :77261 Max. :53083 Max. :540.0
## Persentase_Penyelesaian Persentase_Korban
## Min. : 5.62 Min. :0.2400
## 1st Qu.:40.20 1st Qu.:0.4400
## Median :57.19 Median :0.6250
## Mean :55.39 Mean :0.6682
## 3rd Qu.:70.98 3rd Qu.:0.8675
## Max. :90.10 Max. :1.3100
str(data_kriminal)
## 'data.frame': 34 obs. of 6 variables:
## $ Provinsi : chr "Aceh" "Sumatera Utara" "Sumatera Barat" "Riau" ...
## $ Jumlah_Kejahatan : int 11934 60724 13099 17799 7592 25154 5323 16249 2645 5294 ...
## $ Kejahatan_Diselesaikan : int 9920 36863 10200 9977 2658 4087 3375 9841 1495 2123 ...
## $ Resiko_Terkena : int 207 423 242 273 197 253 276 186 194 282 ...
## $ Persentase_Penyelesaian: num 83.1 60.7 77.9 56 35 ...
## $ Persentase_Korban : num 0.34 0.63 0.74 0.67 0.83 0.79 0.88 0.88 0.8 0.71 ...
describe(data_kriminal[,-1])
Berdasarkan statistik deskriptif, terlihat bahwa variabel Jumlah_Kejahatan dan Kejahatan_Diselesaikan memiliki rata-rata yang jauh lebih tinggi dibandingkan median, yang mengindikasikan distribusi data yang condong ke kanan (positively skewed). Hal ini diperkuat oleh nilai skewness yang cukup tinggi (>1), sehingga menunjukkan bahwa terdapat beberapa provinsi dengan jumlah kejahatan dan penyelesaian kasus yang sangat tinggi dibandingkan mayoritas provinsi lainnya. Selain itu, nilai standar deviasi yang besar juga mencerminkan tingginya variasi antar provinsi.
Pada variabel Resiko_Terkena, rata-rata dan median yang relatif berdekatan menunjukkan distribusi yang lebih seimbang, meskipun masih terdapat sedikit kecenderungan skewness positif. Hal ini mengindikasikan bahwa tingkat risiko kejahatan antar provinsi relatif lebih merata dibandingkan jumlah kejahatan absolut. Sementara itu, variabel Persentase_Penyelesaian memiliki skewness negatif, yang berarti sebagian besar provinsi memiliki tingkat penyelesaian yang cukup tinggi, meskipun masih terdapat beberapa daerah dengan nilai yang rendah. Variabel Persentase_Korban menunjukkan variasi yang cukup besar, namun dengan distribusi yang relatif lebih stabil dibandingkan variabel lainnya.
Secara keseluruhan, hasil ini menunjukkan adanya ketimpangan yang cukup signifikan pada variabel berbasis jumlah (jumlah kejahatan dan penyelesaiannya), sementara variabel berbasis persentase cenderung lebih stabil. Hal ini mengindikasikan bahwa perbedaan utama antar provinsi lebih terletak pada skala kejadian kejahatan, bukan hanya pada efektivitas penanganan atau tingkat risiko semata.
# 1. Histogram
hist(data_kriminal$Resiko_Terkena,
xlab = "Risiko Terkena Kejahatan",
ylab = "Frekuensi",
main = "Distribusi Risiko Terkena Kejahatan",
col = "pink",
border = "navy")
# 2. Boxplot
boxplot(data_kriminal$Jumlah_Kejahatan,
main = "Boxplot Jumlah Kejahatan Yang Terjadi",
horizontal = TRUE,
col = "lightblue")
# 3. Barplot
top10_prov <- data_kriminal[order(-data_kriminal$Resiko_Terkena), ][1:10,]
barplot(top10_prov$Resiko_Terkena,
names.arg = top10_prov$Provinsi,
las = 2,
col = "beige",
border = "maroon",
main = "10 Provinsi dengan Risiko Terkena Kejahatan Tertinggi",
cex.names = 0.7)
# 4. Scatter Plot
plot(data_kriminal$Jumlah_Kejahatan, data_kriminal$Resiko_Terkena,
xlab = "Jumlah Kejahatan",
ylab = "Risiko Terkena Kejahatan",
main = "Total Kejahatan vs Risiko Terkena Kejahatan",
col = rgb(1,0,0,0.6))
grid()
# 5. Pie Chart
kategori_korban <- ifelse(data_kriminal$Persentase_Korban > median(data_kriminal$Persentase_Korban), "Rendah", "Tinggi")
freq <- table(kategori_korban)
persentase <- round(prop.table(freq) * 100, 2)
label <- paste(names(freq), "\n", persentase, "%")
pie(freq,
labels = label,
col = c("purple3", "yellow2"),
main = "Distribusi Tingkat Korban Kejahatan")
# 6. Heatmap Korelasi
matrix_kor <- cor(data_kriminal[, -1])
corrplot(matrix_kor,
method = "color",
addCoef.col = "black",
tl.cex = 0.8,
number.cex = 0.7,
title = "Matriks Korelasi",
mar = c(0,0,1,0))
Histogram
Histogram menunjukkan bahwa distribusi Risiko Terkena Kejahatan cenderung terkonsentrasi pada nilai menengah (sekitar 150–300), dengan beberapa nilai ekstrem di sisi kanan (di atas 400). Pola ini mengindikasikan distribusi yang sedikit miring ke kanan (right skewed), yang berarti terdapat beberapa provinsi dengan tingkat risiko jauh lebih tinggi dibanding mayoritas lainnya.
Boxplot
Boxplot memperlihatkan bahwa sebagian besar provinsi memiliki jumlah kejahatan pada rentang rendah hingga menengah, namun terdapat beberapa outlier dengan nilai yang sangat tinggi. Pola ini menunjukkan adanya ketimpangan antar provinsi, di mana hanya sedikit provinsi yang menyumbang jumlah kejahatan sangat besar dibanding yang lain.
Barplot
Barplot menunjukkan bahwa terdapat perbedaan yang cukup jelas antar provinsi dengan risiko tertinggi, di mana beberapa provinsi memiliki nilai yang jauh lebih tinggi dibanding lainnya. Pola ini mengindikasikan bahwa risiko kejahatan tidak merata dan cenderung terkonsentrasi pada provinsi tertentu yang bisa menjadi prioritas dalam penanganan.
Scatter Plot
Scatter plot menunjukkan bahwa tidak terdapat hubungan linear yang kuat antara jumlah kejahatan dan risiko terkena kejahatan. Titik-titik data tersebar cukup acak, meskipun ada kecenderungan bahwa jumlah kejahatan yang tinggi tidak selalu diikuti oleh risiko yang tinggi. Ini mengindikasikan bahwa risiko kejahatan kemungkinan dipengaruhi oleh faktor lain, tidak hanya jumlah kejadian.
Pie Chart
Pie chart menunjukkan distribusi yang seimbang antara kategori “Tinggi” dan “Rendah” (masing-masing sekitar 50%). Pola ini mengindikasikan bahwa data tidak mengalami ketimpangan kelas (balanced).
Heatmap Korelasi
Heatmap korelasi menunjukkan bahwa hubungan antar variabel umumnya lemah hingga sedang. Korelasi yang paling terlihat adalah antara Jumlah Kejahatan dan Kejahatan Diselesaikan (cukup kuat positif), yang wajar karena semakin banyak kejahatan, semakin banyak yang diselesaikan. Namun, Risiko Terkena memiliki korelasi yang relatif lemah dengan variabel lain, yang mengindikasikan bahwa variabel ini tidak sepenuhnya dijelaskan oleh faktor-faktor yang digunakan.
\[ \text{Resiko_Terkena} = \beta_0 + \beta_1 \cdot \text{Jumlah_Kejahatan} + \beta_2 \cdot \text{Kejahatan_Diselesaikan} + \beta_3 \cdot \text{Persentase_Penyelesaian} + \beta_4 \cdot \text{Persentase_Korban} + \varepsilon \]
# Package
library(lmtest)
library(car)
library(corrplot)
# Model Regresi Linier Berganda
model_regresi <- lm(Resiko_Terkena ~ Jumlah_Kejahatan +
Kejahatan_Diselesaikan +
Persentase_Penyelesaian +
Persentase_Korban,
data = data_kriminal)
summary(model_regresi)
##
## Call:
## lm(formula = Resiko_Terkena ~ Jumlah_Kejahatan + Kejahatan_Diselesaikan +
## Persentase_Penyelesaian + Persentase_Korban, data = data_kriminal)
##
## Residuals:
## Min 1Q Median 3Q Max
## -179.43 -66.54 -15.55 38.48 273.76
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 275.842837 81.110649 3.401 0.00198 **
## Jumlah_Kejahatan 0.002640 0.002633 1.002 0.32446
## Kejahatan_Diselesaikan -0.003396 0.004455 -0.762 0.45199
## Persentase_Penyelesaian -0.741583 1.154397 -0.642 0.52566
## Persentase_Korban 6.559393 72.184568 0.091 0.92822
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 110.6 on 29 degrees of freedom
## Multiple R-squared: 0.1081, Adjusted R-squared: -0.01496
## F-statistic: 0.8784 on 4 and 29 DF, p-value: 0.4889
Berdasarkan hasil regresi linier berganda, variabel dependen yang digunakan adalah Resiko_Terkena, dengan variabel independen meliputi Jumlah_Kejahatan, Kejahatan_Diselesaikan, Persentase_Penyelesaian, dan Persentase_Korban.
Hasil estimasi menunjukkan bahwa seluruh variabel independen tidak berpengaruh signifikan terhadap Resiko_Terkena (p-value > 0.05). Secara arah hubungan, Jumlah_Kejahatan dan Persentase_Korban memiliki hubungan positif terhadap risiko kejahatan, sedangkan Kejahatan_Diselesaikan dan Persentase_Penyelesaian memiliki hubungan negatif, meskipun pengaruhnya lemah.
Nilai R-squared sebesar 0.1081 menunjukkan bahwa model hanya mampu menjelaskan sekitar 10.81% variasi Resiko_Terkena, sehingga sebagian besar variasi dipengaruhi oleh faktor lain di luar model. Selain itu, hasil uji F menunjukkan bahwa model secara keseluruhan tidak signifikan (p-value = 0.4889).
Dari sisi residual, penyebaran residual terlihat cukup acak, namun terdapat beberapa nilai ekstrem yang mengindikasikan kemungkinan adanya pelanggaran asumsi, khususnya pada normalitas residual.
# Uji Asumsi
# Normalitas
shapiro.test(residuals(model_regresi))
##
## Shapiro-Wilk normality test
##
## data: residuals(model_regresi)
## W = 0.9329, p-value = 0.03801
qqnorm(residuals(model_regresi))
qqline(residuals(model_regresi), col = "green")
Berdasarkan hasil uji normalitas menggunakan Shapiro-Wilk, diperoleh nilai p-value sebesar 0.03801 (< 0.05), sehingga dapat disimpulkan bahwa residual tidak berdistribusi normal. Hal ini juga didukung oleh plot Q-Q yang menunjukkan bahwa titik-titik tidak sepenuhnya mengikuti garis diagonal, terutama pada bagian ekor, sehingga mengindikasikan adanya penyimpangan dari normalitas.
# Multikolinearitas
vif(model_regresi)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## 6.596902 7.740466 1.837175
## Persentase_Korban
## 1.013317
Pada uji multikolinearitas, nilai VIF untuk variabel Jumlah_Kejahatan (6.59) dan Kejahatan_Diselesaikan (7.74) berada di atas 5, yang menunjukkan adanya indikasi multikolinearitas sedang antar variabel tersebut. Sementara itu, variabel lainnya memiliki nilai VIF di bawah 5, sehingga tidak mengalami masalah multikolinearitas.
# Heteroskedastisitas
bptest(model_regresi)
##
## studentized Breusch-Pagan test
##
## data: model_regresi
## BP = 1.3421, df = 4, p-value = 0.8542
Hasil uji heteroskedastisitas menggunakan Breusch-Pagan menunjukkan p-value sebesar 0.8542 (> 0.05), sehingga dapat disimpulkan bahwa tidak terdapat masalah heteroskedastisitas dalam model. Varians residual cenderung konstan.
# Autokorelasi
dwtest(model_regresi)
##
## Durbin-Watson test
##
## data: model_regresi
## DW = 1.725, p-value = 0.1756
## alternative hypothesis: true autocorrelation is greater than 0
Uji autokorelasi menggunakan Durbin-Watson menghasilkan p-value sebesar 0.1756 (> 0.05), yang menunjukkan bahwa tidak terdapat autokorelasi pada residual model
# Penanganan Normalitas
data_kriminal$log_resiko <- log(data_kriminal$Resiko_Terkena)
log_regresi <- lm(log_resiko ~ Jumlah_Kejahatan +
Kejahatan_Diselesaikan +
Persentase_Penyelesaian +
Persentase_Korban,
data = data_kriminal)
summary(log_regresi)
##
## Call:
## lm(formula = log_resiko ~ Jumlah_Kejahatan + Kejahatan_Diselesaikan +
## Persentase_Penyelesaian + Persentase_Korban, data = data_kriminal)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.95560 -0.22099 0.02532 0.22435 0.78931
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.543e+00 3.282e-01 16.889 <2e-16 ***
## Jumlah_Kejahatan 1.230e-05 1.066e-05 1.154 0.258
## Kejahatan_Diselesaikan -1.951e-05 1.803e-05 -1.082 0.288
## Persentase_Penyelesaian -2.237e-03 4.671e-03 -0.479 0.636
## Persentase_Korban -1.158e-02 2.921e-01 -0.040 0.969
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4477 on 29 degrees of freedom
## Multiple R-squared: 0.1195, Adjusted R-squared: -0.001957
## F-statistic: 0.9839 on 4 and 29 DF, p-value: 0.4317
shapiro.test(residuals(log_regresi))
##
## Shapiro-Wilk normality test
##
## data: residuals(log_regresi)
## W = 0.97184, p-value = 0.5141
Untuk mengatasi pelanggaran asumsi normalitas pada model sebelumnya, dilakukan transformasi logaritma pada variabel dependen Resiko_Terkena menjadi log_resiko. Setelah transformasi, model regresi dibangun kembali dengan variabel yang sama.
Berdasarkan hasil uji normalitas Shapiro-Wilk pada model baru, diperoleh p-value sebesar 0.5141 (> 0.05), sehingga dapat disimpulkan bahwa residual sudah berdistribusi normal. Hal ini menunjukkan bahwa transformasi log berhasil memperbaiki pelanggaran asumsi normalitas pada model sebelumnya.
Dari hasil model regresi setelah transformasi, terlihat bahwa seluruh variabel independen masih belum berpengaruh signifikan terhadap log_resiko (p-value > 0.05). Nilai R-squared sebesar 0.1195 menunjukkan bahwa model hanya mampu menjelaskan sekitar 11.95% variasi data, yang berarti masih tergolong rendah. Selain itu, uji F juga menunjukkan bahwa model secara keseluruhan tidak signifikan (p-value = 0.4317).
# Scatter Plot + Garis Regresi
plot(data_kriminal$Jumlah_Kejahatan, data_kriminal$log_resiko,
xlab = "Jumlah Kejahatan",
ylab = "Risiko Terkena Kejahatan",
main = "Scatter Plot dengan Garis Regresi",
col = "palevioletred2",
pch = 16)
abline(lm(log_resiko ~ Jumlah_Kejahatan, data = data_kriminal),
col = "violetred4",
lwd = 2)
Berdasarkan scatter plot antara Jumlah_Kejahatan dan Risiko Terkena Kejahatan (dalam bentuk log), terlihat bahwa titik data menyebar cukup acak dan tidak membentuk pola linear yang jelas. Garis regresi yang hampir datar menunjukkan bahwa peningkatan jumlah kejahatan tidak diikuti oleh perubahan signifikan pada risiko terkena kejahatan. Hal ini mengindikasikan bahwa hubungan antara kedua variabel cenderung lemah, sehingga secara visual sudah terlihat bahwa variabel Jumlah_Kejahatan bukan prediktor yang kuat terhadap risiko.
# Plot Residual
plot(log_regresi$fitted.values, residuals(log_regresi),
xlab = "Fitted",
ylab = "Residual",
main = "Residual Plot",
col = "thistle4",
pch = 16)
abline(h = 0, col = "orchid3")
Pada residual plot, titik-titik residual terlihat menyebar di sekitar garis nol tanpa pola tertentu yang jelas, meskipun masih terdapat sedikit penyebaran yang tidak sepenuhnya merata. Secara umum, pola ini menunjukkan bahwa model tidak mengalami masalah serius seperti heteroskedastisitas atau pola non-linear yang kuat. Namun, adanya beberapa titik yang cukup jauh dari garis nol mengindikasikan kemungkinan adanya variasi yang belum mampu dijelaskan oleh model secara optimal.
# Heatmap
kor_matrix <- cor(data_kriminal[, -1])
corrplot(kor_matrix,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
number.cex = 0.7,
col = colorRampPalette(c("blue", "white", "red"))(200),
title = "Heatmap Korelasi Antar Variabel",
mar = c(0,0,2,0))
round(matrix_kor, 3)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Resiko_Terkena
## Jumlah_Kejahatan 1.000 0.873 0.116
## Kejahatan_Diselesaikan 0.873 1.000 -0.038
## Resiko_Terkena 0.116 -0.038 1.000
## Persentase_Penyelesaian 0.067 0.386 -0.267
## Persentase_Korban -0.017 -0.066 0.039
## Persentase_Penyelesaian Persentase_Korban
## Jumlah_Kejahatan 0.067 -0.017
## Kejahatan_Diselesaikan 0.386 -0.066
## Resiko_Terkena -0.267 0.039
## Persentase_Penyelesaian 1.000 -0.041
## Persentase_Korban -0.041 1.000
Heatmap menunjukkan bahwa sebagian besar hubungan antar variabel memiliki korelasi yang lemah hingga sedang. Korelasi paling kuat terlihat antara Jumlah_Kejahatan dan Kejahatan_Diselesaikan, yang menandakan hubungan positif yang cukup tinggi. Sementara itu, variabel Risiko_Terkena memiliki korelasi yang rendah dengan variabel lainnya, sehingga mengindikasikan bahwa tidak ada hubungan linear yang kuat antara variabel independen dengan variabel target. Selain itu, adanya korelasi tinggi antar variabel independen menjadi indikasi awal potensi multikolinearitas yang perlu diperhatikan dalam pemodelan regresi.
Berdasarkan hasil analisis regresi linier berganda, model awal menunjukkan bahwa seluruh variabel independen tidak berpengaruh signifikan terhadap Resiko_Terkena. Selain itu, nilai R-squared yang rendah mengindikasikan bahwa model belum mampu menjelaskan variasi data dengan baik. Dari sisi asumsi, ditemukan adanya pelanggaran pada normalitas residual, sehingga model belum memenuhi asumsi klasik secara optimal.
Untuk mengatasi permasalahan tersebut, dilakukan transformasi logaritma pada variabel dependen menjadi log_resiko. Transformasi ini bertujuan untuk memperbaiki distribusi residual agar lebih mendekati normal. Setelah dilakukan transformasi, model regresi dibangun kembali dengan variabel yang sama.
Hasil pengujian menunjukkan bahwa setelah transformasi, asumsi normalitas telah terpenuhi, yang ditunjukkan oleh nilai p-value Shapiro-Wilk yang lebih besar dari 0.05. Hal ini mengindikasikan bahwa transformasi log berhasil memperbaiki distribusi residual. Namun demikian, dari sisi hasil model, seluruh variabel independen tetap tidak menunjukkan pengaruh yang signifikan terhadap variabel dependen.
Selain itu, nilai R-squared setelah transformasi hanya mengalami sedikit peningkatan dan masih tergolong rendah, sehingga model tetap memiliki keterbatasan dalam menjelaskan variasi data. Dengan demikian, meskipun transformasi berhasil memperbaiki asumsi normalitas, kualitas model secara keseluruhan belum mengalami peningkatan yang berarti.
\[ \ln \left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 \cdot \text{Jumlah_Kejahatan} + \beta_2 \cdot \text{Persentase_Penyelesaian} + \beta_3 \cdot \text{Persentase_Korban}\ \]
\[ p = \frac{1}{1 + e^{-(\beta_0 + \beta_1 \cdot \text{Jumlah_Kejahatan} + \beta_2 \cdot \text{Persentase_Penyelesaian} + \beta_3 \cdot \text{Persentase_Korban})}} \]
# Package
library(car)
library(caret)
library(pROC)
# Transformasi Data
data_kriminal$Kategori_Risiko <- ifelse(
data_kriminal$Resiko_Terkena > median(data_kriminal$Resiko_Terkena), "Tinggi", "Rendah"
)
data_kriminal$Kategori_Risiko <- as.factor(data_kriminal$Kategori_Risiko)
Pada tahap ini, variabel Resiko_Terkena diubah menjadi variabel kategorik Kategori_Risiko dengan membagi data berdasarkan nilai median. Observasi dengan nilai di atas median dikategorikan sebagai “Tinggi”, sedangkan di bawah median sebagai “Rendah”. Transformasi ini dilakukan karena metode klasifikasi seperti regresi logistik membutuhkan variabel target dalam bentuk kategorik, sehingga pendekatan ini memungkinkan analisis prediksi terhadap tingkat risiko secara lebih terstruktur.
# Melihat Distribusi Data
table(data_kriminal$Kategori_Risiko)
##
## Rendah Tinggi
## 17 17
Berdasarkan hasil distribusi, jumlah data untuk kategori Rendah dan Tinggi masing-masing sebanyak 17 observasi, sehingga proporsinya seimbang (50:50). Kondisi ini menunjukkan bahwa tidak terdapat masalah imbalanced class, yang penting dalam klasifikasi karena ketidakseimbangan kelas dapat menyebabkan model cenderung bias terhadap kelas mayoritas. Dengan distribusi yang seimbang, model yang dibangun diharapkan memiliki performa yang lebih adil dalam memprediksi kedua kategori.
# Split Data
set.seed(165)
index_log <- createDataPartition(data_kriminal$Kategori_Risiko, p = 0.7, list = FALSE)
train <- data_kriminal[index_log, ]
test <- data_kriminal[-index_log, ]
Data kemudian dibagi menjadi dua bagian, yaitu data training (70%)
dan data testing (30%) menggunakan fungsi
createDataPartition. Pembagian ini bertujuan untuk melatih
model pada sebagian data (training) dan menguji performa model pada data
yang belum pernah dilihat sebelumnya (testing). Teknik ini penting untuk
mengevaluasi kemampuan generalisasi model, sehingga hasil klasifikasi
tidak hanya baik pada data pelatihan, tetapi juga pada data baru.
# Regresi Logistik
model_logistik <- glm(Kategori_Risiko ~ Jumlah_Kejahatan +
Kejahatan_Diselesaikan +
Persentase_Penyelesaian +
Persentase_Korban,
data = train,
family = binomial)
summary(model_logistik)
##
## Call:
## glm(formula = Kategori_Risiko ~ Jumlah_Kejahatan + Kejahatan_Diselesaikan +
## Persentase_Penyelesaian + Persentase_Korban, family = binomial,
## data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.4575321 3.1799691 -1.402 0.161
## Jumlah_Kejahatan 0.0004418 0.0003819 1.157 0.247
## Kejahatan_Diselesaikan -0.0007114 0.0006335 -1.123 0.261
## Persentase_Penyelesaian 0.0429259 0.0481463 0.892 0.373
## Persentase_Korban 2.6380139 2.0934186 1.260 0.208
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 33.271 on 23 degrees of freedom
## Residual deviance: 26.769 on 19 degrees of freedom
## AIC: 36.769
##
## Number of Fisher Scoring iterations: 7
Berdasarkan hasil model regresi logistik, seluruh variabel independen memiliki nilai p-value > 0,05, sehingga tidak terdapat variabel yang berpengaruh signifikan terhadap kategori risiko. Meskipun demikian, arah koefisien menunjukkan bahwa Jumlah_Kejahatan dan Persentase_Penyelesaian cenderung meningkatkan peluang risiko tinggi, sedangkan Kejahatan_Diselesaikan cenderung menurunkan risiko.
Dari sisi kecocokan model, nilai Residual Deviance (23.496) lebih kecil dibandingkan Null Deviance (33.271), yang berarti model mampu menjelaskan data lebih baik dibanding tanpa prediktor, meskipun peningkatannya tidak terlalu besar. Nilai AIC sebesar 33.496 juga menunjukkan bahwa model masih belum optimal.
# Uji Asumsi
# Multikolinearitas
vif(model_logistik)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## 112.631296 120.189865 3.554379
## Persentase_Korban
## 1.006889
# Linearitas
plot(train$Jumlah_Kejahatan, train$Kategori_Risiko)
# Imbalance Kelas
prop.table(table(train$Kategori_Risiko))
##
## Rendah Tinggi
## 0.5 0.5
Multikolinearitas
Berdasarkan nilai VIF, terlihat bahwa variabel Jumlah_Kejahatan dan Kejahatan_Diselesaikan memiliki nilai VIF yang sangat tinggi (>10), sehingga menunjukkan adanya masalah multikolinearitas yang kuat. Hal ini mengindikasikan bahwa kedua variabel saling berkorelasi tinggi dan dapat mengganggu kestabilan model, sehingga perlu dilakukan perbaikan.
Linearitas
Dari plot antara Jumlah_Kejahatan dan Kategori_Risiko, tidak terlihat pola hubungan yang jelas karena variabel target bersifat kategorik (hanya 0 dan 1). Hal ini menunjukkan bahwa secara visual sulit menilai asumsi linearitas, sehingga diperlukan pendekatan lain (seperti logit atau Box-Tidwell) untuk pengujian yang lebih tepat.
Imbalance Kelas
Hasil proporsi menunjukkan bahwa data memiliki distribusi yang seimbang (50% Rendah dan 50% Tinggi). Hal ini menandakan tidak terdapat masalah imbalance, sehingga model tidak cenderung bias terhadap salah satu kelas.
# Perbaikan Model
logistik_model <- glm(Kategori_Risiko ~ Jumlah_Kejahatan +
Persentase_Penyelesaian +
Persentase_Korban,
data = train,
family = binomial)
summary(logistik_model)
##
## Call:
## glm(formula = Kategori_Risiko ~ Jumlah_Kejahatan + Persentase_Penyelesaian +
## Persentase_Korban, family = binomial, data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.392e+00 1.728e+00 -0.806 0.421
## Jumlah_Kejahatan 1.838e-05 2.416e-05 0.761 0.447
## Persentase_Penyelesaian -1.359e-02 2.290e-02 -0.594 0.553
## Persentase_Korban 2.807e+00 2.077e+00 1.351 0.177
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 33.271 on 23 degrees of freedom
## Residual deviance: 30.097 on 20 degrees of freedom
## AIC: 38.097
##
## Number of Fisher Scoring iterations: 3
vif(logistik_model)
## Jumlah_Kejahatan Persentase_Penyelesaian Persentase_Korban
## 1.006291 1.040234 1.033905
Setelah mengatasi multikolinearitas dengan menghapus variabel Kejahatan_Diselesaikan, model menunjukkan nilai VIF yang seluruhnya < 10, sehingga dapat disimpulkan bahwa masalah multikolinearitas telah berhasil diatasi. Hal ini membuat model menjadi lebih stabil dan interpretasi koefisien lebih dapat dipercaya.
Namun, berdasarkan hasil uji signifikansi, seluruh variabel masih memiliki p-value > 0,05, yang menunjukkan bahwa tidak ada variabel yang berpengaruh signifikan terhadap kategori risiko. Selain itu, nilai Residual Deviance (29.711) tidak jauh berbeda dari Null Deviance (33.271), serta nilai AIC (37.711) yang relatif lebih besar, mengindikasikan bahwa performa model masih belum optimal.
Secara keseluruhan, meskipun model sudah lebih baik dari sisi asumsi (tidak ada multikolinearitas), kemampuan model dalam menjelaskan dan memprediksi kategori risiko masih tergolong rendah.
# Prediksi
prob <- predict(logistik_model, test, type = "response")
pred <- ifelse(prob > 0.5, "Tinggi", "Rendah")
pred <- factor(pred, levels = c("Rendah", "Tinggi"))
test$Kategori_Risiko <- factor(test$Kategori_Risiko, levels = c("Rendah", "Tinggi"))
# Confussion Matrix
conf_logistik <- confusionMatrix(pred, test$Kategori_Risiko)
# Confussion Matrix
print(conf_logistik)
## Confusion Matrix and Statistics
##
## Reference
## Prediction Rendah Tinggi
## Rendah 3 1
## Tinggi 2 4
##
## Accuracy : 0.7
## 95% CI : (0.3475, 0.9333)
## No Information Rate : 0.5
## P-Value [Acc > NIR] : 0.1719
##
## Kappa : 0.4
##
## Mcnemar's Test P-Value : 1.0000
##
## Sensitivity : 0.6000
## Specificity : 0.8000
## Pos Pred Value : 0.7500
## Neg Pred Value : 0.6667
## Prevalence : 0.5000
## Detection Rate : 0.3000
## Detection Prevalence : 0.4000
## Balanced Accuracy : 0.7000
##
## 'Positive' Class : Rendah
##
Berdasarkan hasil confusion matrix, model menghasilkan akurasi sebesar 0.5, yang berarti hanya mampu mengklasifikasikan 50% data dengan benar. Dari data uji, terdapat 2 data kelas Rendah yang diprediksi dengan benar dan 3 data kelas Tinggi yang juga diprediksi dengan benar. Namun, masih terdapat kesalahan klasifikasi yang cukup besar, yaitu 2 data Tinggi diprediksi sebagai Rendah dan 3 data Rendah diprediksi sebagai Tinggi, sehingga menunjukkan bahwa model belum mampu membedakan kedua kelas secara konsisten.
Nilai sensitivity sebesar 0.4 menunjukkan kemampuan model dalam mendeteksi kelas Rendah masih rendah, sedangkan specificity sebesar 0.6 menunjukkan model sedikit lebih baik dalam mengenali kelas Tinggi. Selain itu, nilai precision sebesar 0.5 serta Kappa = 0 mengindikasikan bahwa performa model tidak lebih baik dibandingkan tebakan acak. Secara keseluruhan, hasil ini menunjukkan bahwa model masih memiliki tingkat kesalahan yang tinggi dan kinerja klasifikasi yang belum optimal, sehingga diperlukan perbaikan model atau penambahan variabel yang lebih relevan.
# ROC
roc_log <- roc(test$Kategori_Risiko, prob)
plot(roc_log, col = "firebrick4", main = "Kurva ROC")
auc(roc_log)
## Area under the curve: 0.6
Berdasarkan kurva ROC, diperoleh nilai AUC sebesar 0.6, yang menunjukkan bahwa kemampuan model dalam membedakan kelas Rendah dan Tinggi masih tergolong lemah (poor classification). Kurva yang tidak jauh dari garis diagonal menandakan bahwa model belum memiliki kemampuan diskriminasi yang kuat.
Berdasarkan hasil analisis klasifikasi menggunakan regresi logistik, model yang dibangun masih menunjukkan kinerja yang kurang optimal dalam membedakan kategori risiko kejahatan. Hal ini terlihat dari nilai akurasi sebesar 0.5, yang berarti kemampuan model hanya setara dengan tebakan acak. Selain itu, nilai sensitivity dan specificity yang relatif rendah menunjukkan bahwa model belum mampu mengklasifikasikan kedua kelas (Rendah dan Tinggi) secara konsisten. Nilai AUC sebesar 0.6 juga mengindikasikan bahwa kemampuan diskriminasi model masih lemah.
Secara keseluruhan, dapat disimpulkan bahwa variabel-variabel yang digunakan dalam model belum cukup kuat untuk menjelaskan kategori risiko secara akurat. Meskipun data sudah seimbang dan asumsi dasar telah diperiksa, model masih mengalami keterbatasan dalam menangkap pola yang signifikan. Oleh karena itu, diperlukan pengembangan lebih lanjut, seperti penambahan variabel yang lebih relevan, transformasi fitur, atau penggunaan metode klasifikasi lain agar diperoleh hasil yang lebih baik.
\[ J = \sum_{k=1}^{K} \sum_{i \in C_k} \Big[(Jumlah\_Kejahatan_i - \mu_{k1})^2 +(Kejahatan\_Diselesaikan_i - \mu_{k2})^2 +(Persentase\_Penyelesaian_i - \mu_{k3})^2 +(Persentase\_Korban_i - \mu_{k4})^2 +(Resiko\_Terkena_i - \mu_{k5})^2\Big] \]
\[ \mu_k =\left(\frac{1}{n_k} \sum_{i \in C_k} Jumlah\_Kejahatan_i,\;\frac{1}{n_k} \sum_{i \in C_k} Kejahatan\_Diselesaikan_i,\;\frac{1}{n_k} \sum_{i \in C_k} Persentase\_Penyelesaian_i,\;\frac{1}{n_k} \sum_{i \in C_k} Persentase\_Korban_i,\;\frac{1}{n_k} \sum_{i \in C_k} Resiko\_Terkena_i\right) \]
# Package
library(cluster)
library(factoextra)
library(plotly)
data_cluster <- data_kriminal[, c("Jumlah_Kejahatan",
"Kejahatan_Diselesaikan",
"Persentase_Penyelesaian",
"Persentase_Korban",
"Resiko_Terkena")]
head(data_cluster, 10)
Data menunjukkan adanya variasi yang cukup besar antar provinsi pada variabel Jumlah_Kejahatan dan Kejahatan_Diselesaikan, yang mengindikasikan perbedaan tingkat kriminalitas yang signifikan. Sementara itu, Persentase_Penyelesaian dan Persentase_Korban juga bervariasi, mencerminkan perbedaan efektivitas penanganan kasus dan dampak kejahatan di tiap wilayah.
Menariknya, Resiko_Terkena tidak selalu sejalan dengan jumlah kejahatan, sehingga menunjukkan bahwa risiko tidak hanya dipengaruhi oleh banyaknya kasus, tetapi juga faktor lain seperti penyelesaian dan dampak korban. Hal ini menjadi dasar penting untuk dilakukan klasterisasi guna mengelompokkan provinsi berdasarkan pola kriminalitas yang lebih spesifik.
# Uji Asumsi
# Skala Data
summary(data_cluster)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## Min. : 1593 Min. : 532 Min. : 5.62
## 1st Qu.: 5477 1st Qu.: 2366 1st Qu.:40.20
## Median : 8608 Median : 5128 Median :57.19
## Mean :16529 Mean : 9428 Mean :55.39
## 3rd Qu.:15667 3rd Qu.: 9920 3rd Qu.:70.98
## Max. :77261 Max. :53083 Max. :90.10
## Persentase_Korban Resiko_Terkena
## Min. :0.2400 Min. : 89.0
## 1st Qu.:0.4400 1st Qu.:177.0
## Median :0.6250 Median :249.0
## Mean :0.6682 Mean :250.8
## 3rd Qu.:0.8675 3rd Qu.:305.5
## Max. :1.3100 Max. :540.0
# Outlier
boxplot(data_cluster, main = "Deteksi Outlier")
apply(data_cluster, 2, function(x) length(boxplot.stats(x)$out))
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## 6 6 0
## Persentase_Korban Resiko_Terkena
## 0 1
Berdasarkan hasil summary, terlihat bahwa skala antar variabel cukup berbeda signifikan. Variabel seperti Jumlah_Kejahatan dan Kejahatan_Diselesaikan memiliki rentang nilai yang sangat besar (ribuan hingga puluhan ribu), sedangkan Persentase_Korban dan Persentase_Penyelesaian berada pada skala yang jauh lebih kecil. Perbedaan skala ini dapat menyebabkan variabel dengan nilai besar mendominasi proses klasterisasi, sehingga diperlukan standarisasi agar semua variabel memiliki kontribusi yang seimbang.
Berdasarkan boxplot dan perhitungan jumlah outlier, terdapat beberapa outlier pada variabel Jumlah_Kejahatan dan Kejahatan_Diselesaikan (masing-masing 6 data), serta 1 outlier pada Resiko_Terkena, sementara variabel lainnya tidak menunjukkan outlier. Hal ini menunjukkan adanya beberapa provinsi dengan nilai ekstrem, yang kemungkinan merepresentasikan wilayah dengan tingkat kriminalitas sangat tinggi. Dalam konteks klasterisasi, keberadaan outlier ini tidak selalu dihapus karena justru dapat menjadi ciri penting dalam membentuk klaster tersendiri, namun tetap perlu diwaspadai karena dapat mempengaruhi hasil pengelompokan.
# Standarisasi
cluster_scaled <- scale(data_cluster)
summary(cluster_scaled)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## Min. :-0.79506 Min. :-0.7395 Min. :-2.2006
## 1st Qu.:-0.58831 1st Qu.:-0.5870 1st Qu.:-0.6718
## Median :-0.42167 Median :-0.3574 Median : 0.0795
## Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.:-0.04588 3rd Qu.: 0.0409 3rd Qu.: 0.6895
## Max. : 3.23277 Max. : 3.6289 Max. : 1.5349
## Persentase_Korban Resiko_Terkena
## Min. :-1.5943 Min. :-1.47288
## 1st Qu.:-0.8497 1st Qu.:-0.67163
## Median :-0.1610 Median :-0.01607
## Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.7419 3rd Qu.: 0.49837
## Max. : 2.3893 Max. : 2.63350
Hasil standarisasi menunjukkan bahwa seluruh variabel telah memiliki rata-rata (mean) mendekati 0, sehingga perbedaan skala antar variabel berhasil dihilangkan. Nilai minimum dan maksimum pada setiap variabel kini berada dalam rentang yang relatif sebanding, meskipun masih terdapat beberapa nilai ekstrem (ditunjukkan oleh nilai maksimum yang cukup tinggi).
Dengan kondisi ini, setiap variabel memiliki kontribusi yang lebih seimbang dalam proses klasterisasi, sehingga hasil pengelompokan tidak lagi didominasi oleh variabel dengan skala besar seperti Jumlah_Kejahatan. Standarisasi ini merupakan langkah penting agar hasil K-Means menjadi lebih akurat dan representatif dalam menggambarkan pola kriminalitas antar provinsi.
# Menentukan Jumlah Klaster Optimal
# ELbow
wss <- numeric(10)
for(k in 1:10) {
model_kmeans <- kmeans(cluster_scaled, centers = k, nstart = 25)
wss[k] <- model_kmeans$tot.withinss
}
plot(1:10, wss, type = "b", pch = 19,
xlab = "Jumlah Klaster",
ylab = "Total Within SS",
main = "Metode Elbow")
abline(v = 2, col = "red", lty = 2)
text(2, wss[2], labels = "k = 2", pos = 4, col = "red")
# Silhouette
sil <- numeric(10)
for(k in 2:10) {
km <- kmeans(cluster_scaled, centers = k, nstart = 25)
ss <- silhouette(km$cluster, dist(cluster_scaled))
sil[k] <- mean(ss[, 3])
}
plot(2:10, sil[2:10], type = "b",
xlab = "Jumlah Klaster",
ylab = "Skor Silhouette",
main = "Metode Silhouette")
k_terbaik <- which.max(sil)
print(k_terbaik)
## [1] 2
Metode Elbow
Berdasarkan grafik Elbow, terlihat bahwa penurunan nilai Total Within Sum of Squares (WSS) sangat signifikan dari k = 1 ke k = 2, kemudian mulai melandai setelahnya. Titik “siku” (elbow) berada pada k = 2, yang menunjukkan bahwa penambahan jumlah klaster setelah titik tersebut tidak memberikan penurunan WSS yang signifikan. Hal ini mengindikasikan bahwa 2 klaster sudah cukup optimal dalam merepresentasikan struktur data.
Metode Silhouette
Hasil metode Silhouette menunjukkan bahwa nilai rata-rata silhouette tertinggi juga berada pada k = 2. Nilai ini mencerminkan bahwa pemisahan antar klaster pada k = 2 adalah yang paling baik dibandingkan jumlah klaster lainnya, dengan tingkat kemiripan dalam klaster yang tinggi dan perbedaan antar klaster yang cukup jelas.
Berdasarkan kedua metode (Elbow dan Silhouette) yang konsisten menunjukkan hasil yang sama, maka dapat disimpulkan bahwa jumlah klaster optimal untuk data ini adalah 2 klaster. Hal ini menunjukkan bahwa data kriminalitas dapat dikelompokkan ke dalam dua pola utama yang berbeda.
# K-Means
set.seed(165)
k_means <- kmeans(cluster_scaled, centers = 2, nstart = 25)
data_kriminal$Klaster <- as.factor(k_means$cluster)
table(k_means$cluster)
##
## 1 2
## 28 6
prop.table(table(k_means$cluster))
##
## 1 2
## 0.8235294 0.1764706
Hasil K-Means menunjukkan bahwa data terbagi menjadi 2 klaster, dengan distribusi anggota yang tidak seimbang. Klaster 1 terdiri dari 28 provinsi (82,35%), sedangkan klaster 2 hanya terdiri dari 6 provinsi (17,65%). Hal ini menunjukkan bahwa sebagian besar provinsi memiliki karakteristik yang relatif serupa, sementara sebagian kecil lainnya memiliki pola yang berbeda atau lebih ekstrem.
Ketidakseimbangan jumlah anggota klaster mengindikasikan bahwa klaster kedua kemungkinan merepresentasikan provinsi dengan karakteristik kriminalitas yang lebih menonjol, seperti tingkat kejahatan atau risiko yang lebih tinggi. Sementara itu, klaster pertama cenderung menggambarkan kondisi kriminalitas yang lebih umum atau relatif stabil. Hal ini menjadi dasar penting untuk analisis lebih lanjut terkait karakteristik masing-masing klaster.
# Sentroid
sentroid <- k_means$centers
print(sentroid)
## Jumlah_Kejahatan Kejahatan_Diselesaikan Persentase_Penyelesaian
## 1 -0.4133913 -0.4030926 -0.07263949
## 2 1.9291595 1.8810990 0.33898427
## Persentase_Korban Resiko_Terkena
## 1 -0.01736333 -0.005336787
## 2 0.08102886 0.024905007
Nilai centroid menunjukkan bahwa klaster 1 memiliki nilai negatif pada hampir seluruh variabel, yang berarti berada di bawah rata-rata, sehingga merepresentasikan provinsi dengan tingkat kriminalitas dan penyelesaian kasus yang relatif lebih rendah. Sebaliknya, klaster 2 memiliki nilai positif yang cukup tinggi terutama pada Jumlah_Kejahatan dan Kejahatan_Diselesaikan, yang menunjukkan karakteristik provinsi dengan tingkat kriminalitas lebih tinggi dan aktivitas penanganan kasus yang lebih intens.
Secara keseluruhan, hasil ini mengindikasikan bahwa data berhasil terbagi menjadi dua kelompok utama, yaitu kelompok kriminalitas rendah (klaster 1) dan kelompok kriminalitas tinggi (klaster 2), sehingga dapat digunakan sebagai dasar dalam pengambilan kebijakan yang lebih terarah.
# Scatter Plot
plot(cluster_scaled[, "Jumlah_Kejahatan"],
cluster_scaled[, "Resiko_Terkena"],
col = data_kriminal$Klaster,
pch = 19,
xlab = "Jumlah Kejahatan",
ylab = "Risiko Terkena Kejahatan",
main = "Visualisasi Klaster")
points(sentroid[, "Jumlah_Kejahatan"],
sentroid[, "Resiko_Terkena"],
col = 1:nrow(sentroid),
pch = 9,
cex = 2)
Visualisasi menunjukkan pemisahan yang cukup jelas antara dua klaster. Klaster 1 cenderung berada pada nilai Jumlah Kejahatan dan Risiko Terkena yang lebih rendah, sedangkan klaster 2 terkonsentrasi pada nilai yang lebih tinggi. Titik centroid memperkuat perbedaan ini, di mana pusat klaster 2 berada jauh dari klaster 1. Insight-nya, terdapat segmentasi nyata antara wilayah dengan tingkat kriminalitas rendah dan tinggi.
fviz_cluster(k_means,
data = cluster_scaled,
geom = "point",
palette = "Set2",
main = "Visualisasi Klaster K-Means")
Plot ini memperlihatkan pemisahan klaster yang cukup baik dengan batas area yang relatif jelas, meskipun masih ada sedikit kedekatan antar titik di tepi klaster. Dimensi utama sudah mampu menangkap variasi data (terlihat dari proporsi varian pada sumbu). Insight-nya, metode K-Means cukup efektif dalam mengelompokkan data, walaupun tidak sepenuhnya terpisah sempurna.
# Visualisasi 3D
plot_ly(data = data_kriminal,
x = ~Jumlah_Kejahatan,
y = ~Kejahatan_Diselesaikan,
z = ~Resiko_Terkena,
color = ~Klaster,
colors = c("lightpink2", "thistle3", "indianred1"),
type = "scatter3d",
mode = "markers") %>%
layout(title = "Visualisasi 3D Klaster Kriminalitas",
scene = list(
xaxis = list(title = "Jumlah Kejahatan"),
yaxis = list(title = "Kejahatan Diselesaikan"),
zaxis = list(title = "Risiko Terkena")
))
Pada visualisasi 3D, terlihat bahwa klaster 2 memiliki nilai lebih tinggi pada Jumlah Kejahatan dan Kejahatan Diselesaikan, serta cenderung diikuti Risiko Terkena yang lebih tinggi. Klaster 1 lebih terkonsentrasi pada nilai rendah–menengah. Insight yang didapat adalah wilayah dengan tingkat kejahatan tinggi juga memiliki jumlah penyelesaian tinggi, namun tetap diiringi risiko yang relatif tinggi.
# Karakteristik Klaster
aggregate(data_cluster,
by = list(Klaster = data_kriminal$Klaster),
mean)
Berdasarkan rata-rata tiap variabel, klaster 1 merepresentasikan wilayah dengan tingkat kejahatan, penyelesaian, dan risiko yang lebih rendah (kelompok “relatif aman”), sedangkan klaster 2 menunjukkan wilayah dengan tingkat kejahatan dan penyelesaian tinggi serta risiko sedikit lebih tinggi (kelompok “rawan”). Insight utamanya, segmentasi ini dapat digunakan untuk penentuan prioritas kebijakan—klaster 2 membutuhkan perhatian lebih dalam pengendalian kriminalitas.
Hasil analisis K-Means menunjukkan bahwa data kriminalitas terbagi menjadi 2 klaster optimal, di mana klaster 1 mendominasi dengan mayoritas provinsi yang memiliki tingkat kejahatan relatif rendah hingga sedang, sedangkan klaster 2 berisi sejumlah kecil provinsi dengan tingkat kejahatan dan penyelesaian kasus yang jauh lebih tinggi. Perbedaan utama antar klaster terletak pada skala jumlah kejahatan dan penyelesaiannya, sementara variabel lain seperti persentase korban dan risiko relatif tidak terlalu berbeda signifikan. Insight yang diperoleh adalah adanya segmentasi wilayah berdasarkan intensitas kriminalitas, sehingga kebijakan penanganan dapat lebih difokuskan, terutama pada klaster dengan tingkat kejahatan tinggi.
Berdasarkan keseluruhan analisis yang dilakukan, dapat disimpulkan bahwa hubungan antar variabel kriminalitas cenderung lemah hingga sedang, di mana model regresi linier tidak mampu menjelaskan variasi risiko secara signifikan (R² rendah). Setelah dilakukan transformasi, asumsi model menjadi lebih baik, namun kekuatan prediksi tetap terbatas. Pada analisis klasifikasi menggunakan regresi logistik, model menunjukkan kinerja yang masih rendah (akurasi 50% dan AUC 0.6), sehingga belum optimal dalam membedakan kategori risiko tinggi dan rendah. Sementara itu, analisis klasterisasi berhasil memberikan segmentasi yang lebih jelas terhadap data, mengungkap adanya kelompok wilayah dengan karakteristik kriminalitas yang berbeda. Secara keseluruhan, pendekatan eksploratif seperti klasterisasi memberikan insight yang lebih kuat dibandingkan model prediktif dalam dataset ini, terutama untuk memahami pola dan segmentasi kriminalitas.