Pendahuluan

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.

Memuat Data

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.

Ukuran Dataset

dim(data)
## [1] 5250   33

Variabel dalam Dataset

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"

Pemeriksaan Kualitas Data

Sebelum melakukan analisis lebih lanjut, data diperiksa untuk mengetahui adanya nilai yang hilang (missing value).

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

Visualisasi Missing Value

   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.

Data Cleaning

Salah satu langkah dalam pembersihan data adalah dengan menyamakan formatnya. penulisan kategori jenis kelamin agar kategori yang sama tidak dianggap sebagai kategori yang berbeda.

Standardisasi Gender

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.

Distribusi Usia 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.

Distribusi Usia Tersangka

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.

Pemeriksaan Nilai Usia

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

Analisis Tingkat Keparahan Kasus

Variabel severity digunakan untuk melihat tingkat keparahan dari insiden kriminal yang tercatat.

Distribusi Tingkat Keparahan

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 Senjata

Analisis ini digunakan untuk melihat jenis senjata yang paling banyak tercatat pada insiden kriminal.

10 Jenis Senjata yang Paling Banyak Digunakan

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 Senjata

Analisis ini digunakan untuk melihat jenis senjata yang paling banyak tercatat pada insiden kriminal.

10 Jenis Senjata yang Paling Banyak Digunakan

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.

Analisis Penyelesaian Kasus

Variabel resolution digunakan untuk melihat hasil penyelesaian kasus yang tercatat dalam dataset.

Distribusi Penyelesaian Kasus

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 Berdasarkan Waktu

Analisis temporal dilakukan untuk melihat perubahan jumlah insiden kriminal berdasarkan waktu kejadian.

Jumlah Insiden per Bulan

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.

Perbandingan Korban dan Tersangka

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)