Data insiden kriminal dapat digunakan untuk melihat berbagai pola
kejahatan berdasarkan karakteristik korban, pelaku, jenis kejahatan, dan
kondisi kasus. Pada proyek ini digunakan dataset
crime_incidents_messy.csv yang terdiri dari 5.250 baris dan
33 variabel
Analisis dilakukan menggunakan pendekatan Exploratory Data Analysis (EDA) dengan terlebih dahulu melakukan pemeriksaan dan pembersihan data. Selanjutnya, data dianalisis menggunakan tabel dan grafik untuk melihat pola demografi korban dan pelaku, jenis kejahatan, tingkat keparahan, penggunaan senjata, serta penyelesaian kasus.
data <- read.csv("crime_incidents_messy.csv")
head(data)
## incident_id crime_type district city state
## 1 INC001115 asslt Sou Maplewood GA
## 2 INC004706 burglary southeast Maplewood OH
## 3 INC002249 Homocide Southwest Lakewood AZ
## 4 INC000021 Property Damage Cen Springfield AZ
## 5 INC000488 Domestc Violence North Lakewood PA
## 6 INC000661 Breaking & Entering East Hillcrest CA
## address latitude longitude incident_datetime officer_id
## 1 2830 Cedar Lane 170.28410 -77.50071 2024-04-16 08:45:03 OFF0078
## 2 2361 Park Rd 29.42272 -77.16702 2022-01-11 22:03:29 OFF0059
## 3 1067 Main St 39.41146 -98.61530 2022-04-14 11:39:24 OFF0088
## 4 4713 Washington Ave 28.63344 -99.03005 2020-12-09 15:14:24 OFF0077
## 5 1371 River Rd 34.21785 -121.61473 2021-07-24 20:08:13 OFF0083
## 6 3551 Elm Blvd 44.43860 -101.77512 05-03-2020 OFF0089
## officer_first_name officer_last_name badge_number suspect_id
## 1 Emily Davis 1342 SUS00281
## 2 Michelle Green 5133 SUS00376
## 3 Michael White 7781 SUS00560
## 4 Chris Jackson 5097 SUS00468
## 5 Susan Flores 6220 SUS00751
## 6 Jennifer Green 7082 SUS00454
## suspect_first_name suspect_last_name suspect_age suspect_gender suspect_race
## 1 Barbara Thomas 51 MALE asian
## 2 Barbara Harris -28 Other Black
## 3 Richard Scott 19 F asian
## 4 Michael Thomas 262 MALE Black
## 5 Thomas Jackson 75 female white
## 6 James Lee 73 N/A White
## victim_id victim_first_name victim_last_name victim_age victim_gender
## 1 VIC00642 Robert Torres 51 Unknown
## 2 VIC00262 John Martin 231
## 3 VIC00518 Richard Hill 29 Other
## 4 VIC00243 Susan Young 243 N/A
## 5 VIC00512 Thomas Thomas 51 M
## 6 VIC00473 Anthony Wilson 15 N/A
## victim_phone weapon_used severity case_status resolution
## 1 6223265920 Firearm 2 Open No Arrest
## 2 241-973-4826 Firearm 3 N/A
## 3 244-584-7696 KNIFE 1 CLOSED warning
## 4 5021227484 hands Low Resolved N/A
## 5 9698766873 Unarmed MEDIUM Closed Warning Issued
## 6 590-332-6488 Blunt Object high under investigation arrest made
## num_arrests property_loss_usd reported_online
## 1 NA True
## 2 2 44839.49 yes
## 3 2 15963.38 YES
## 4 5 48680.14 False
## 5 2 23513.01 YES
## 6 1 YES
## notes
## 1 Incident at 2830 Cedar Lane. Officer responded at scene.
## 2 Incident at 2361 Park Rd. Officer responded at scene.
## 3 Incident at 1067 Main St. Officer responded at scene.
## 4 Incident at 4713 Washington Ave. Officer responded at scene.
## 5
## 6 Incident at 3551 Elm Blvd. Officer responded at scene.
dim(data)
## [1] 5250 33
names(data)
## [1] "incident_id" "crime_type" "district"
## [4] "city" "state" "address"
## [7] "latitude" "longitude" "incident_datetime"
## [10] "officer_id" "officer_first_name" "officer_last_name"
## [13] "badge_number" "suspect_id" "suspect_first_name"
## [16] "suspect_last_name" "suspect_age" "suspect_gender"
## [19] "suspect_race" "victim_id" "victim_first_name"
## [22] "victim_last_name" "victim_age" "victim_gender"
## [25] "victim_phone" "weapon_used" "severity"
## [28] "case_status" "resolution" "num_arrests"
## [31] "property_loss_usd" "reported_online" "notes"
Sebelum melakukan analisis lebih lanjut, data diperiksa untuk mengetahui adanya nilai yang hilang (missing value).
missing_data <- colSums(is.na(data))
missing_data
## incident_id crime_type district city
## 0 0 0 0
## state address latitude longitude
## 0 0 258 289
## incident_datetime officer_id officer_first_name officer_last_name
## 0 0 0 0
## badge_number suspect_id suspect_first_name suspect_last_name
## 312 0 0 0
## suspect_age suspect_gender suspect_race victim_id
## 1097 0 0 0
## victim_first_name victim_last_name victim_age victim_gender
## 0 0 562 0
## victim_phone weapon_used severity case_status
## 0 0 0 0
## resolution num_arrests property_loss_usd reported_online
## 0 333 0 0
## notes
## 0
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
missing_df <- data.frame(
variable = names(missing_data),
missing = as.numeric(missing_data)
)
missing_df <- missing_df %>%
filter(missing > 0) %>%
arrange(desc(missing))
ggplot(missing_df,
aes(x = reorder(variable, missing), y = missing)) +
geom_col() +
coord_flip() +
labs(
title = "Jumlah Missing Value pada Setiap Variabel",
x = "Variabel",
y = "Jumlah Missing Value"
) +
theme_minimal()
##Interpretasi Q-Q Plot Berdasarkan grafik, kita bisa melihat bahwa
beberapa variabel memiliki jumlah missing value yang cukup
tinggi. Variabel
suspect_age memiliki jumlah nilai yang
hilang paling banyak dibandingkan variabel lainnya. Sementara itu,
latitude memiliki jumlah yang lebih sedikit. Ini
menunjukkan bahwa ke lengkapan data berbeda untuk setiap variabel.
Keberadaan missing value perlu diperhatikan sebelum melakukan analisis lebih lanjut agar tidak mengganggu hasil analisis. Penanganannya dapat disesuaikan dengan jenis dan karakteristik masing-masing variabel.
Salah satu langkah dalam pembersihan data adalah dengan menyamakan formatnya. penulisan kategori jenis kelamin agar kategori yang sama tidak dianggap sebagai kategori yang berbeda.
data <- data %>%
mutate(
victim_gender_clean = case_when(
victim_gender %in% c("M", "m", "Male", "MALE") ~ "Male",
victim_gender %in% c("F", "f", "Female", "FEMALE") ~ "Female",
TRUE ~ "Unknown"
),
suspect_gender_clean = case_when(
suspect_gender %in% c("M", "m", "Male", "MALE") ~ "Male",
suspect_gender %in% c("F", "f", "Female", "FEMALE") ~ "Female",
TRUE ~ "Unknown"
)
)
table(data$victim_gender_clean)
##
## Female Male Unknown
## 1320 1479 2451
table(data$suspect_gender_clean)
##
## Female Male Unknown
## 1298 1228 2724
## Distribusi Jenis Kelamin Korban
gender_victim <- data %>%
count(victim_gender_clean)
ggplot(gender_victim,
aes(x = victim_gender_clean,
y = n,
fill = victim_gender_clean)) +
geom_col() +
labs(
title = "Distribusi Jenis Kelamin Korban",
x = "Jenis Kelamin",
y = "Jumlah Korban",
fill = "Jenis Kelamin"
) +
scale_fill_manual(
values = c(
"Female" = "#F8766D",
"Male" = "#619CFF",
"Unknown" = "#B79F00"
)
) +
theme_minimal()
## Interpretasi Grafik Berdasarkan grafik, kategori
Tidak Diketahui memiliki jumlah korban paling banyak.
tinggi, diikuti oleh kategori Male, sedangkan kategori
Female memiliki jumlah yang paling rendah. Hal ini
menunjukkan bahwa masih terdapat banyak data jenis kelamin korban yang
belum dapat diidentifikasi belum teridentifikasi. Oleh karena itu, data
Unknown perlu diperhatikan dalam analisis demografi
korban.
ggplot(data, aes(x = victim_age)) +
geom_histogram(
bins = 30,
fill = "#4A90E2",
color = "white"
) +
labs(
title = "Distribusi Usia Korban",
x = "Usia Korban",
y = "Jumlah"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
)
)
## Warning: Removed 562 rows containing non-finite outside the scale range
## (`stat_bin()`).
##Interpretasi Grafik Berdasarkan histogram, kita dapat melihat
distribusi usia korban tersebut. sebaran jumlah korban pada berbagai
kelompok usia. Grafik ini membantu menunjukkan kelompok usia yang paling
sering muncul dalam dataset.
ggplot(data, aes(x = suspect_age)) +
geom_histogram(
bins = 30,
fill = "#FF7F7F",
color = "white"
) +
labs(
title = "Distribusi Usia Tersangka",
x = "Usia Tersangka",
y = "Jumlah Tersangka"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
)
)
## Warning: Removed 1097 rows containing non-finite outside the scale range
## (`stat_bin()`).
##Intrepretasi Grafik Berdasarkan histogram, sebagian besar usia pelaku
berada pada rentang usia dewasa dan fokus pada kisaran sekitar 20 hingga
90 tahun tahun. Namun, ada pula nilai usia di bawah 0 tahun dan di atas.
100 tahun yang tidak wajar secara biologis. Hal ini menunjukkan ada
nilai yang tidak benar atau kesalahan dalam penginputan data. sehingga
perlu dilakukan pemeriksaan dan pembersihan sebelum digunakan untuk
analisis lebih lanjut.
summary(data$victim_age)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## -90.00 27.75 49.00 52.35 71.00 298.00 562
summary(data$suspect_age)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## -75.00 29.00 46.00 48.42 62.00 298.00 1097
sum(data$victim_age < 0, na.rm = TRUE)
## [1] 223
sum(data$suspect_age < 0, na.rm = TRUE)
## [1] 173
Variabel severity digunakan untuk melihat tingkat
keparahan dari insiden kriminal yang tercatat.
severity_clean <- data %>%
mutate(
severity_clean = case_when(
severity %in% c("Crit", "Critical", "CRITICAL") ~ "Critical",
severity %in% c("High", "HIGH") ~ "High",
severity %in% c("Med", "Medium", "MEDIUM") ~ "Medium",
severity %in% c("Low", "LOW") ~ "Low",
TRUE ~ as.character(severity)
)
) %>%
count(severity_clean)
ggplot(
severity_clean,
aes(
x = severity_clean,
y = n,
fill = severity_clean
)
) +
geom_col() +
geom_text(
aes(label = n),
vjust = -0.3,
size = 4
) +
labs(
title = "Distribusi Tingkat Keparahan Kasus",
x = "Tingkat Keparahan",
y = "Jumlah Kasus"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
),
legend.position = "none"
)
##Interpretasi Grafik Berdasarkan grafik, jumlah kasus di setiap
kategori tingkat. keparahan terlihat cukup bervariasi. Kategori
Critical dan Medium memiliki jumlah kasus yang lebih banyak
dibandingkan. beberapa kategori lainnya, sedangkan kategori dua memiliki
jumlah kasus yang lebih rendah. Selain itu, masih terlihat adanya
kategori yang menggunakan angka dan kategori dengan istilah seperti
Low, Medium, High, dan
Critical. Hal ini menunjukkan bahwa Standarisasi kategori
keparahan masih diperlukan agar hasil analisis tetap akurat dan
konsisten serta dapat dibandingkan dengan lebih jelas.
Analisis ini digunakan untuk melihat jenis senjata yang paling banyak tercatat pada insiden kriminal.
weapon_count <- data %>%
count(weapon_used, sort = TRUE) %>%
slice_head(n = 10)
ggplot(
weapon_count,
aes(
x = reorder(weapon_used, n),
y = n,
fill = weapon_used
)
) +
geom_col() +
coord_flip() +
labs(
title = "10 Jenis Senjata yang Paling Banyak Digunakan",
x = "Jenis Senjata",
y = "Jumlah Kasus"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
),
legend.position = "none"
)
##Interpretasi Grafik Berdasarkan grafik, jenis senjata yang terdaftar
memiliki jumlah kasus. kategori yang relatif tinggi, yaitu
Knife, N/A, KNIFE, dan
None. termasuk yang paling banyak. Sementara itu, kategori
Gun memiliki jumlah kasus yang lebih sedikit dibandingkan
beberapa kategori lainnya.
Selain itu, ada kategori yang sebenarnya memiliki arti yang hampir
sama. tetapi ditulis berbeda, seperti Knife dan
KNIFE, serta Blunt Object dan
blunt object. Hal ini menunjukkan adanya inkonsistensi
penulisan pada variabel weapon_used, sehingga standardisasi
kategori diperlukan agar jumlah setiap jenis senjata dapat dianalisis
dengan lebih tepat.
Analisis ini digunakan untuk melihat jenis senjata yang paling banyak tercatat pada insiden kriminal.
weapon_count <- data %>%
count(weapon_used, sort = TRUE) %>%
slice_head(n = 10)
ggplot(
weapon_count,
aes(
x = reorder(weapon_used, n),
y = n,
fill = weapon_used
)
) +
geom_col() +
coord_flip() +
labs(
title = "10 Jenis Senjata yang Paling Banyak Digunakan",
x = "Jenis Senjata",
y = "Jumlah Kasus"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
),
legend.position = "none"
)
##Interpretasi Grafik Berdasarkan grafik,
Rifle adalah
jenis senjata yang memiliki. Jumlah kasus terbanyak, sedangkan Gun
memiliki jumlah kasus. yang relatif lebih rendah dibandingkan kategori
lainnya. Selain itu, Terdapat kategori Knife dan
KNIFE serta Blunt Object dan. “benda tumpul
yang sebenarnya menunjukkan jenis senjata yang sama.” tetapi ditulis
dengan format berbeda. Kategori N/A dan None
juga menunjukkan adanya senjata yang tidak terdaftar atau tidak
tercatat. tersedia. Oleh karena itu, standardisasi kategori
weapon_used diperlukan agar distribusi jenis senjata dapat
dianalisis dengan lebih baik. akurat.
Variabel resolution digunakan untuk melihat hasil
penyelesaian kasus yang tercatat dalam dataset.
resolution_count <- data %>%
count(resolution, sort = TRUE)
ggplot(
resolution_count,
aes(
x = reorder(resolution, n),
y = n,
fill = resolution
)
) +
geom_col() +
coord_flip() +
labs(
title = "Distribusi Penyelesaian Kasus",
x = "Penyelesaian Kasus",
y = "Jumlah Kasus"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
),
legend.position = "none"
)
##Interpretasi Grafik Berdasarkan grafik, terdapat beberapa kategori
penyelesaian kasus dengan jumlah yang cukup besar, khususnya
Tidak Ada Penangkapan dan Dismissed. Sementara
itu, kategori NO ARREST memiliki jumlah kasus yang lebih
sedikit dibandingkan beberapa kategori lainnya. Selain itu, ada
penulisan kategori yang tidak konsisten, seperti “tidak ditangkap” dan
“NO ARREST”, serta “Arres Made” yang merupakan variasi. penulisan dari
kategori penyelesaian kasus. Hal ini menunjukkan bahwa standardisasi
kategori resolution diperlukan agar hasil analisis dapat
dibandingkan dengan lebih jelas.
Analisis temporal dilakukan untuk melihat perubahan jumlah insiden kriminal berdasarkan waktu kejadian.
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
data$incident_datetime <- as.POSIXct(
data$incident_datetime,
format = "%m/%d/%Y %H:%M"
)
monthly_crime <- data %>%
filter(!is.na(incident_datetime)) %>%
mutate(
month = floor_date(incident_datetime, "month")
) %>%
count(month)
ggplot(
monthly_crime,
aes(x = month, y = n)
) +
geom_line(
linewidth = 1,
color = "#4A90E2"
) +
labs(
title = "Jumlah Insiden Kriminal per Bulan",
x = "Bulan",
y = "Jumlah Insiden"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
)
)
##Interpretasi Grafik Berdasarkan grafik, terdapat beberapa kategori
penyelesaian kasus dengan jumlah yang cukup besar, khususnya
Tidak Ada Penangkapan dan Dismissed. Sementara
itu, kategori NO ARREST memiliki jumlah kasus yang lebih
sedikit dibandingkan beberapa kategori lainnya. Selain itu, ada
penulisan kategori yang tidak konsisten, seperti “tidak ditangkap” dan
“NO ARREST”, serta “Arres Made” yang merupakan variasi. penulisan dari
kategori penyelesaian kasus. Hal ini menunjukkan bahwa standardisasi
kategori resolution diperlukan agar hasil analisis dapat
dibandingkan dengan lebih jelas.
Untuk melihat karakteristik demografi, distribusi jenis kelamin korban dan tersangka dibandingkan menggunakan grafik batang.
gender_compare <- bind_rows(
data %>%
count(victim_gender_clean) %>%
rename(gender = victim_gender_clean) %>%
mutate(kelompok = "Korban"),
data %>%
count(suspect_gender_clean) %>%
rename(gender = suspect_gender_clean) %>%
mutate(kelompok = "Tersangka")
)
ggplot(
gender_compare,
aes(
x = gender,
y = n,
fill = kelompok
)
) +
geom_col(position = "dodge") +
labs(
title = "Perbandingan Jenis Kelamin Korban dan Tersangka",
x = "Jenis Kelamin",
y = "Jumlah",
fill = "Kelompok"
) +
theme_minimal() +
theme(
plot.title = element_text(
face = "bold",
size = 16
)
)
##Interpretasi Grafik Grafik ini menunjukkan perbandingan jumlah korban
dan tersangka berdasarkan jenis kelamin mereka.
Korban dan tersangka hampir sama jumlahnya, sekitar 1.300 orang. Laki-laki: jumlah korban (sekitar 1.480) lebih banyak dibandingkan tersangka (sekitar 1.230). Tidak diketahui: yang tertinggi di antara keduanya, di atas 2.000.
Dari data yang diketahui, jumlah korban laki-laki lebih banyak dibandingkan tersangka laki-laki, sedangkan jumlah perempuan sama antara korban dan tersangka. Namun, kategori Unknown paling banyak terjadi, jadi pola ini harus diinterpretasikan dengan hati-hati dan data gender yang kosong sebaiknya diisi terlebih dahulu.
#Kesimpulan Dataset yang berisi 5.250 insiden kriminal mengalami masalah kualitas data, yaitu terdapat 16.478 sel yang kosong, 1.096 nilai ekstrem, 24.898 sel dengan penulisan yang tidak konsisten, serta 1.454 nilai yang tidak masuk akal. Setelah dibersihkan, jumlah korban dan tersangka perempuan hampir sama, namun korban laki-laki lebih banyak dibandingkan tersangka laki-laki. Namun, kategori gender Unknown menjadi yang paling banyak, sehingga pola ini harus diartikan dengan hati-hati. Kualitas data sangat penting untuk hasil analisis yang bisa diandalkan, jadi data yang masih kosong atau tidak benar harus diisi dan diperiksa terlebih dahulu sebelum dilakukan analisis lebih lanjut.
#Referensi [1] [Dataset] (crime_incidents_messy.csv) [2] (Kuhn, M., & Johnson, K. (2019). Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press. (one-hot encoding)