Policing Activity Analysis for Traffic Stop in Rhode Island

Insan Cahya Setia
10 min readApr 18, 2021
https://openpolicing.stanford.edu/

Halo sahabat data semuanya. Sepanjang kursus ini, kita akan menganalisis data perhentian lalu lintas dinegara bagian Rhode Island yang dikumpulkan oleh Stanford Open Policing Project. Library yang akan kita gunakan yaitu Pandas untuk manipulasi data dan juga Matplotlib untuk visualisasi data. Oke langsung saja pada pembahasan selanjutnya.

Sebelum memulai analisis, penting bagi kita untuk membiasakan diri dengan dataset. Dalam latihan ini, kita akan membaca dataset, memeriksa beberapa baris pertama, melihat informasi pada dataset, lalu menghitung jumlah nilai yang hilang (missing value). Untuk membaca lima baris pertama kita bisa menggunakan fungsi head().

Lima data teratas

Dari data diatas terlihat bahwa sebagian besar kolom setidaknya memiliki beberapa nilai yan hilang. Selanjutnya kita akan melihat informasi pada dataset menggunakan fungsi info() dan juga menghitung jumlah nilai yang hilang untuk setiap kolom menggunakan kombinasi fungsi isna() dan sum().

Informasi dataset

Data yang kita gunakan total memiliki 91741 baris dan 15 kolom. Data yang cukup besar. Terlihat juga tipe data untuk setiap kolom. Terlihat kolom stop_date masih bertipe data object, yang seharusnya bertipe data datetime. Nanti juga kita akan menggabungkan kolom stop_date dan stop_time menjadi satu kolom yang mendefinisikan tanggal dan waktu kejadian.

Jumlah missing value setiap kolom

Sepertinya sebagian besar kolom memiliki setidaknya beberapa nilai yang hilang. Kami akan mencari cara menangani nilai-nilai ini di latihan berikutnya!

Seringkali, data berisi kolom yang tidak berguna untuk analisis yang akan dilakukan. Kolom tersebut harus dihapus, untuk memudahkan kita fokus pada kolom yang tersisa.

Dalam latihan ini, kita akan menghapus kolom country_name karena kolom tersebut hanya berisi nilai yang hilang, dan kolom state tersebut akan dihapus karena semua pemberhentian lalu lintas terjadi dalam satu negara bagian, yaitu Rhode Island. Dengan demikian, kolom ini dapat dihapus karena tidak berisi informasi yang berguna. Gunakan fungsi drop() untuk menghapus kolom tersebut.

Dimensi data setelah penghapusan kolom

Saat kita mengetahui bahwa kolom-kolom tertentu akan sangat penting pada analisis yang kita lakukan, dan hanya sebagian kecil baris yang memiliki nilai yang hilang (missing value) di kolom tersebut, akan lebih masuk akal untuk kita menghapus baris tersebut daripada kita menghapus keseluruhan data pada kolom tersebut.

Kolom driver_gender akan menjadi sangat penting untuk banyak analisis kita kedepannya. Karena hanya sebagian kecil baris yang hilang pada kolom driver_gender, kita akan menghapus baris tersebut. Kita dapat menggunakan fungsi dropna() untuk menghapus missing value.

Jumlah missing value setelah penghapusan

Kita telah menghapus sekitar 5.000 baris, yang merupakan sebagian kecil dari data yang kita gunakan, dan sekarang hanya satu kolom yang tersisa dengan nilai yang hilang.

Kita telah melihat sebelumnya bahwa kolom is_arrested saat ini memiliki tipe data object. Dalam latihan ini, kita akan mengubah tipe data menjadi boolean, yang merupakan tipe yang paling cocok untuk kolom yang berisi nilai True dan False.

Memperbaiki tipe data akan memungkinkan kita untuk menggunakan operasi matematika pada kolom is_arrested yang tidak mungkin dilakukan sebaliknya. Gunakan astype() untuk merubah tipe data menjadi boolean.

Tipe data setelah perubahan

Saat ini, tanggal dan waktu setiap perhentian lalu lintas disimpan dalam kolom objek terpisah, yaitu stop_date dan stop_time.

Selanjutnya, kita akan menggabungkan (concatenate) dua kolom ini menjadi satu kolom, yaitu menjadi kolom stop_datetime lalu mengubahnya menjadi datetime format. Ini akan mengaktifkan atribut berbasis tanggal yang akan kita gunakan nanti dalam tahap selanjutnya.

Pembuatan kolom stop_datetime

Terlihat bahwa kolom stop_datetime sudah terbentuk dan bertipe data datetime, sesuai yang kita harapkan.

Langkah terakhir yang akan kita ambil dalam bab ini adalah menjadikan kolom stop_datetime sebagai indeks DataFrame. Dengan mengganti indeks default dengan sebuah DateTimeIndex, kita akan lebih mudah menganalisis set data berdasarkan tanggal dan waktu. Kita bisa gunakan fungsi set_index() untuk menjadikan kolom stop_datetime menjadi index.

Set index

Memeriksa pelanggaran lalu lintas

Sebelum membandingkan pelanggaran yang dilakukan berdasarkan jenis kelamin, kita harus memeriksa pelanggaran yang dilakukan oleh semua pengemudi untuk mendapatkan pemahaman dasar tentang data.

Dalam latihan ini, kita akan menghitung nilai unik di kolom violation, lalu secara terpisah menyatakan jumlah tersebut sebagai proporsi.

Jumlah pelangaran lalu lintas dan proporsinya

Kita mendapatkan fakta yang menarik, ternyata setengah dari semua pelanggaran adalah untuk ngebut, diikuti oleh pelanggaran bergerak lainnya dan pelanggaran peralatan.

Pertanyaan yang coba kita jawab adalah apakah pengemudi pria dan wanita cenderung melakukan jenis pelanggaran lalu lintas yang berbeda?

Dalam latihan ini, pertama-tama kita akan membuat DataFrame untuk setiap jenis kelamin, lalu menganalisis pelanggaran di setiap DataFrame secara terpisah.

Proporsi pelanggaran berdasarkan jenis kelamin

Sekitar dua pertiga dari pelanggaran lalu lintas wanita adalah karena ngebut, sedangkan pelanggaran lalu lintas pria lebih seimbang di antara enam kategori. Ini tidak berarti bahwa perempuan lebih sering mengebut daripada laki-laki, karena kita tidak memperhitungkan jumlah pemberhentian atau pengemudi.

Apakah jenis kelamin mempengaruhi siapa yang ditilang ngebut?

Ketika seorang pengemudi diberhentikan karena ngebut, banyak orang percaya bahwa jenis kelamin berdampak pada apakah pengemudi akan menerima tilang atau peringatan. Dapatkah kita menemukan buktinya?

Pertama, kita akan membuat dua DataFrames pengemudi yang dihentikan karena ngebut: satu berisi wanita dan yang lainnya berisi pria.

Kemudian, untuk setiap jenis kelamin, kita akan menggunakan stop_outcome untuk menghitung persentase berhenti yang menghasilkan “Citation” (berarti tilang) dan sebuah “Warning” (peringatan).

Fakta yang menarik! Jumlahnya sama untuk pria dan wanita: sekitar 95% pemberhentian karena ngebut mendapatkan surat tilang. Dengan demikian, data gagal menunjukkan bahwa jenis kelamin berdampak pada siapa yang ditilang karena ngebut.

Apakah jenis kelamin mempengaruhi kendaraan siapa yang dicari?

Saat terjadi perhentian lalu lintas, petugas polisi terkadang melakukan penggeledahan terhadap kendaraan tersebut. Kali ini kita akan menghitung persentase semua perhentian yang menghasilkan pencarian kendaraan, juga dikenal sebagai search_rate.

Sepertinya tingkat pencarian hanya sekitar 3,8%. Selanjutnya, kita akan memeriksa apakah tingkat pencarian bervariasi berdasarkan jenis kelamin pengemudi.

Membandingkan tingkat pencarian berdasarkan jenis kelamin

Dalam latihan ini, Anda akan membandingkan tingkat pencarian pengemudi wanita dan pria selama perhentian lalu lintas. Ingatlah bahwa tingkat pencarian kendaraan di semua perhentian adalah sekitar 3,8%.

Pertama, kita akan memfilter DataFrame menurut jenis kelamin dan menghitung tingkat pencarian untuk setiap grup secara terpisah. Kemudian, kita akan melakukan penghitungan yang sama untuk kedua jenis kelamin sekaligus menggunakan fungsi groupby().

Pengemudi pria ditemukan dua kali lebih sering daripada pengemudi wanita untuk tingkat pencarian. Mengapa demikian?

Menambahkan faktor lain ke dalam analisis

Meskipun tingkat penelusuran untuk pria jauh lebih tinggi daripada wanita, mungkin saja perbedaannya sebagian besar disebabkan oleh faktor lain.

Misalnya, Anda mungkin mempunyai hipotesis bahwa tingkat pencarian bervariasi menurut jenis pelanggaran, dan perbedaan tingkat pencarian antara pria dan wanita karena mereka cenderung melakukan pelanggaran yang berbeda.

Kita dapat menguji hipotesis ini dengan memeriksa tingkat pencarian untuk setiap kombinasi jenis kelamin dan pelanggaran. Jika hipotesis ini benar, kita akan menemukan bahwa pria dan wanita ditelusuri pada tingkat yang hampir sama untuk setiap pelanggaran.

Ternyata untuk semua jenis pelanggaran, tingkat penelusuran untuk pria lebih tinggi daripada wanita, ini menyangkal hipotesis kita diatas.

Apakah gender memengaruhi siapa yang digeledah selama penelusuran?

Selama penggeledahan kendaraan, petugas polisi mungkin menanyakan kepada pengemudi untuk memeriksa apakah mereka memiliki senjata. Ini dikenal sebagai “protective loss”.

Dalam latihan ini, pertama-tama kita akan memeriksa untuk melihat berapa kali “Protective Frisk” adalah satu-satunya jenis pencarian. Kemudian, kita akan menggunakan metode string untuk menemukan semua contoh di mana pengemudi digeledah dan simpan hasil tersebut di kolom baru, yaitu frisk.

Sepertinya ada 303 pengemudi yang digeledah. Selanjutnya, Anda akan memeriksa apakah jenis kelamin memengaruhi siapa yang digeledah.

Dalam latihan ini, kita akan membandingkan proporsi di mana pengemudi wanita dan pria digeledah selama pencarian. Apakah pria lebih sering digeledah daripada wanita, mungkin karena petugas polisi menganggap pria berisiko lebih tinggi?

Sebelum melakukan penghitungan apa pun, penting untuk memfilter DataFrame agar hanya menyertakan subset data yang relevan, yaitu perhentian saat pencarian dilakukan (search_conducted).

Proporsi penggeledahan berdasarkan jenis kelamin

Dari hasil diatas ternyata tingkat penggeledahan lebih tinggi untuk pria daripada wanita, meskipun kita tidak dapat menyimpulkan bahwa perbedaan ini disebabkan oleh jenis kelamin pengemudi.

Menghitung tingkat penangkapan per jam

Ketika seorang petugas polisi menghentikan seorang pengemudi, sebagian kecil dari pemberhentian tersebut berakhir dengan penangkapan. Ini dikenal sebagai tingkat penangkapan. Tingkat penangkapan terdapat pada kolom is_arrested. Dalam latihan ini, kita akan mengetahui apakah tingkat penangkapan bervariasi menurut waktu dalam sehari.

Pertama, kita akan menghitung tingkat penangkapan di semua perhentian. Kemudian, kita akan menghitung tingkat penangkapan per jam dengan menggunakan attribut index.hour. Waktu (hour) berkisar dari 0 sampai 23, di mana:

  • 0 = tengah malam
  • 12 = tengah hari
  • 23 = 11 malam

Kita akan melakukan grouping ke dalam bentuk per jam menggunakan index.hour, lalu menghitung rata-rata penangkapan untuk setiap jam.

Rata-rata penangkapan per jam

Visualisasi tingkat penangkapan per jam

Selanjutnya, kita akan membuat plot garis dari hasil tingkat penangkapan per jam diatas. Kita akan menggunakan plot garis karena data tersebut menunjukkan bagaimana kuantitas berubah seiring waktu (time-series).

Nantinya plot ini akan membantu kita menemukan beberapa tren yang mungkin tidak terlihat jelas saat data tersaji dalam bentuk angka.

Pada visualisasi diatas ternyata tingkat penangkapan mengalami lonjakan yang signifikan pada malam hari, dan kemudian turun di pagi hari.

Apakah pemberhentian terkait obat sedang meningkat?

Di sebagian kecil penghentian lalu lintas, obat (narkotika) ditemukan di dalam kendaraan selama pencarian. Dalam latihan ini, kita akan menilai apakah penghentian terkait obat ini menjadi lebih umum dari waktu ke waktu.

Kolom drug_related_stop menunjukkan apakah obat (narkotika) ditemukan selama penghentian tertentu. Kita akan menghitung rata-rata penemuan obat secara tahunan, lalu kita akan menggunakan plot garis untuk memvisualisasikan bagaimana nilai tersebut berubah dari setiap tahunnya.

Dari visualisasi diatas terlihat bahwa tingkat penghentian terkait obat hampir dua kali lipat selama 10 tahun terakhir. Mengapa demikian?

Membandingkan Obat dan Tingkat Pencarian

Seperti yang kita lihat pada latihan diatas, tingkat penghentian terkait obat (narkotika) meningkat secara signifikan antara tahun 2005 dan 2015. Kita mungkin berhipotesis bahwa tingkat penelusuran kendaraan juga meningkat, yang akan menyebabkan peningkatan penghentian terkait obat bahkan jika lebih banyak pengemudi tidak membawa narkoba.

Kita dapat menguji hipotesis ini dengan menghitung tingkat pencarian tahunan, dan kemudian memplotkannya terhadap tingkat penemuan obat tahunan. Jika hipotesisnya benar, Anda akan melihat kedua rasio tersebut meningkat seiring waktu.

Tingkat penghentian terkait obat meningkat meskipun tingkat pencarian menurun, menyangkal hipotesis kami.

Pelanggaran apa yang terjadi di setiap distrik?

Negara bagian Rhode Island dipecah menjadi enam distrik, yang juga dikenal sebagai zona. Bagaimana zona-zona tersebut dibandingkan dalam hal pelanggaran apa yang ditangkap oleh polisi?

Dalam latihan ini, kita akan membuat tabel frekuensi untuk menentukan berapa banyak pelanggaran dari setiap jenis yang terjadi di masing-masing zona. Kemudian, kita akan memfilter tabel untuk fokus pada zona “K”, yang akan kita periksa lebih lanjut di latihan berikutnya.

The number of violation per district
The number of violation per district “K”

Visualisasi pelanggaran menurut distrik

Sekarang setelah kita membuat tabel frekuensi yang difokuskan pada zona “K”, kita akan memvisualisasikan data untuk membantu kita membandingkan pelanggaran apa yang ditangkap di setiap zona.

Kita akan membuat plot batang, yang merupakan jenis plot yang paling sesuai karena kita membandingkan data kategorikal.

Violation by district

Berdasarkan visualisasi diatas, sebagian besar pemberhentian lalu lintas di Zona K1 adalah untuk ngebut, dan Zona K2 dan K3 sangat mirip satu sama lain dalam hal pelanggaran.

Berapa lama waktu penghentian karena pelanggaran?

Dalam dataset traffic stop, kolom stop_duration memberi tahu kita kira-kira berapa lama pengemudi ditahan oleh petugas. Sayangnya, durasi disimpan sebagai string, seperti ‘0-15 min’. Bagaimana kita dapat membuat data ini lebih mudah dianalisis?

Dalam latihan ini, kita akan mengubah durasi berhenti menjadi bilangan bulat. Karena durasi yang tepat tidak tersedia, kita harus memperkirakan angkanya menggunakan nilai yang masuk akal:

  • Ubah ‘0-15 min’ ke 8
  • Ubah ‘16-30 min’ke 23
  • Ubah ‘30+ min’ ke 45

Untuk hasil diatas kita akan simpan ke dalam kolom baru, yaitu stop_minutes. Lalu untuk mengecek apakah data sudah dimasukkan dengan benar, kita akan membandingkan nilai unik pada kolom stop_duration dan stop_minutes.

Kita bisa lihat bahwa data sudah benar dimasukkan ke dalam kolom stop_minutes. Data hanya mengandung nilai 8, 23, dan 45.

Selanjutnya kita akan memvisualisasikan lamanya waktu rata-rata pengemudi dihentikan untuk setiap jenis pelanggaran menggunakan variabel yang sudah kita buat sebelumnya, yaitu kolom stop_minutes. Kita akan menggunakan kolom violation_raw karena berisi deskripsi pelanggaran yang lebih rinci.

Selesai sudah pembahasan kita pada data penghentian lalu lintas kali ini. Dari analisis yang sudah kita lakukan diatas, apakah Kamu menemukan insight yang menarik?

Baik untuk kali ini pembahasan yang kita lakukan cukup sampai disini. Bagi kalian yang ingin melihat full project nya kalian bisa lihat disini.

Sampai jumpa di lain kesempatan, tunggu pembahasan-pembahasan lain yang akan saya paparkan di waktu yang akan datang. So stay tune… #dontstoptolearn

--

--