Analyzing Police Activity with pandas 案例實作(一)– 如何高效進行數據分析

學.誌|Chris Kang
不止數據|Not Only Data
8 min readNov 13, 2019

--

Photo by Matt from Unsplash

當初想到數據分析可能需要懂 excel、Python 甚至是專業的 BI 軟體,總是覺得很害怕。但這一次,我想要來挑戰看看,能不能讓大部分的讀者都看懂。

因此,這一篇分析會希望以簡單的實例說明,透過 Pandas 來分析。當然程式碼的地方可以跳過,但我會盡量說明清楚給讀者們看懂。

此次的數據是來自於 THE STANFORDOPEN POLICING PROJECT 。裡面有美國各洲的執法單位相關數據,有興趣的讀者也能到官網來讀一讀,甚至可以自己抓資料來練習!

在開始分析之前,要做的事…

通常在拿到數據之後,最常先跳進去數據裡開始整理、分析甚至嘗試挖掘洞見。這樣的作法不是不行,但會有兩個問題:

  1. 效率不彰:因為不知道要分析什麼數據?如何分析?希望得出什麼結果?
  2. 深度不夠:看著資料解釋,最常出現「確認偏誤」的謬區。因此當我們看到數據的結果時,就只會知道數據長這樣,而不會思考為什麼,更不會去質疑數據是否有誤?或是本身的分析方式不正確。

那要怎麼做,才不會不小心掉進陷阱裡呢?其實不難,只要在分析前先確實思考過下列問題(建議寫下來),綜合評估後再進行分析,就能大幅降低無用分析的機率。

那在分析之前,要思考哪幾個問題呢?有幾個方向是:

  1. 這次分析的目的是什麼?我希望得出什麼結果?
  2. 如果上述的目的足夠清晰,那我需要設立哪些假說來證明?哪些數據能佐證?有沒有不足的數據需要補充?
  3. 這次的決策,是不是一定要分析才能得到解答?亦即 — — 如果不分析會怎樣
  4. 如果要分析,有多少資源與時間可以投入?甚至可以用 5W2H 法條列。

可能還有一個狀況是,如果主管只是丟給我們一組資料,並指示找出一些洞見以改善績效,那就更不能直接跳進去。為什麼?如果只是跳進去分析,出來的結果很容易就只是些膚淺的結論,對下一步的行動毫無幫助。

相反地,在思考之前要盡量以目前所知的方式,來思考推論的架構(推論的架構與方式會之後在其他文章細說)。當我們有了許多的假設,就要把這些假說以故事的方式串連起來,製作成類似簡報的說明頁,並根據要驗證假說列下所需的數據。

Photo by Austin Distel from Unsplash

當然也有可能對於該領域的理解不深,此時可以優先請教該領域專家以加速理解,以及單純參考數據給出的類別設立假說。

簡而言之,在開始分析之前,就應該要有一連串的分析假設與驗證步驟,以及根據這些驗證所得出的假說結論,甚至是下一步行動。而後根據數據驗證和反覆修正假說,利用事實與假說不符時內心冒出的疑惑,來深入挖掘問題。

最終,就能以極高的效率獲得深入的洞見與分析結果,並實際運用在下一步的行動上。

分析實例 — — Stanford Open Policing Project

一、檢視資料(Inspect Data)

A. 引入資料與察看表頭:
一開始,先引入 Pandas 套件與讀取資料,之後先簡單的檢視整體資料的狀況,因此使用 head() 來閱讀前五筆資料。

# 引入 pandas
import pandas as pd
# 讀取 data 並儲存至變數 ri
ri = pd.read_csv('police.csv')
# 檢視資料前五筆
print(ri.head())
# 檢查資料的表格數量,會顯示該欄位共有多少欄跟列
print(ri.shape)

B. 檢驗資料:
接下來則是確認資料的狀況,常用的方式有檢查缺失值資料欄位與型態的檢視。

# 察看缺失值狀況
print(ri.isnull().sum())
# 檢查資料欄位的數量與資料的型態
print(ri.info())
OUTPUT:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91741 entries, 0 to 91740
Data columns (total 15 columns):
state 91741 non-null object
stop_date 91741 non-null object
stop_time 91741 non-null object
county_name 0 non-null float64
driver_gender 86536 non-null object
driver_race 86539 non-null object
violation_raw 86539 non-null object
violation 86539 non-null object
search_conducted 91741 non-null bool
search_type 3307 non-null object
stop_outcome 86539 non-null object
is_arrested 86539 non-null object
stop_duration 86539 non-null object
drugs_related_stop 91741 non-null bool
district 91741 non-null object
dtypes: bool(2), float64(1), object(12)
memory usage: 9.3+ MB

C. 進行假說設立:

這個部分是整個分析最重要的過程,也是分析最具價值的所在。第一步,便是以結構的方式思考整個問題的架構。

Photo by Julius Jansson from Unsplash

通常警察在進行臨檢時,可能會參考的因素有:

  1. 性別
  2. 種族
  3. 攔停的時間
  4. 違法方式

另一方面,警察在察看駕駛後,可能會做出的行為則有:

  1. 是否攔停
  2. 攔停時間
  3. 攔停後的行為:資料裡共有警告、開罰單、逮捕駕駛…等等。
  4. 是否因用藥而攔停
  5. 執行搜查
  6. 搜查的形式
  7. 是否逮捕

接著,我們就先從警察可能會考慮的兩大因素,來看可能影響的結果:

  1. 認為性別上的差異,會影響是否被開罰單。
  2. 認為種族的差異,會影響是否被攔停、開罰單。

在此要注意的是,如果只是單純發現特定性別或種族有較高的比例,並沒有辦法直接肯定該因素便是決定性的因素,原因是因為:

當我們只針對單一變因分析,就容易落入「確認偏誤」,只去尋找支持自己結論的證據

亦即,我們可能會認為相較於白人,黑人與西班牙裔的司機更容易被攔停;相較於男性,女性更不容易被開罰單。但這可能未能考慮到:

  1. 如果黑人與西班牙裔的司機確實違法的比例較高(僅為推論,並非事實),那警察便只是在執行勤務。
  2. 如果女性確實比較不容易被開罰單,是否是因為男性做出違法行為的比例本身就比女性高(再一次聲明,此處僅為推論並非事實),那男性的被開罰單的比例較高就合乎情理。

換句話說,部分違法比例較高的司機,確實相較不違法的司機更容易被攔停。因此如果假設黑人與西班牙裔的違法比例真的較高,則使攔停比例出現差異,便是合理的現象。

簡單來說,如果我們想要檢驗警察在值勤時,是否因性別而影響攔停,必須在分析時考慮:

  1. 在比較性別本身被攔停的比例時,同時也要檢視在被攔停時,男性確實違法的比例是否較高。如果是,則可證明男性攔停比例較高是基於警察合理的判斷。
  2. 在比較種族本身被攔停的比例,則亦需檢視被攔停時,黑人或西班牙裔的司機是否擁有較低的違法比例。如果是,則證明黑人與西班牙裔的司機確實更容易被攔停。
Photo by Arthur White form Unsplash

其他的分析假設,皆可圍繞著性別和種族、違法方式來做一系列的比較分析。此處因礙於篇幅,僅列出兩項主要的假說形式;但後續的分析讀者亦能根據該假說方式,來進行其他的推論與分析。

再一次強調,分析前的思考與假說設立,永遠最重要的關鍵

這篇文章主要說明分析前的前置步驟,實例說明在分析前,能如何建立較完整的分析推論,再實際進行資料整理。

如果能夠在分析之前,先進行深度的推論與假設,相信我,你的分析會有更高的效率,且能更深入地挖掘洞見。

如果是你,又會怎麼分析呢?

謝謝你願意看完這麼長一篇文章,下一篇會來說明如何以 Pandas 來驗證前面的假說,以及如何根據數據,再挖掘出新的假說。

如果對於上述的討論有任何建議或是筆誤的部分,都歡迎你提出來一起討論xD

【希望用你的掌聲來投票與支持】
拍 5~10 下:簽個到,表示支持(感謝你的鼓勵啊啊啊)
拍 10~20 下:想要我未來多寫「數據技術相關」內容
拍 20~30 下:想要我未來多寫「數據分析實例」內容
拍 30~50 下:我有你這讀者,寫這篇也心滿意足了!

--

--

學.誌|Chris Kang
不止數據|Not Only Data

嗨!我是 Chris,一位擁有技術背景的獵頭,熱愛解決生活與職涯上的挑戰。專注於產品管理/資料科學/前端開發 / 人生成長,在這條路上,歡迎你找我一起聊聊。歡迎來信合作和交流: chriskang0917@gmail.com