Files
DATA201_projects/python_project_2.ipynb
T
2022-07-25 22:20:35 -04:00

43 KiB

In [1]:
import pandas as pd
pd.set_option('display.max_columns', None)
In [2]:
df = pd.read_csv('~/Downloads/NYPD_Complaint_Data_Historic.csv')
/tmp/ipykernel_18634/2268714868.py:1: DtypeWarning: Columns (18,20) have mixed types. Specify dtype option on import or set low_memory=False.
  df = pd.read_csv('~/Downloads/NYPD_Complaint_Data_Historic.csv')
In [3]:
df.columns
# df.dtypes
# df.shape
Out [3]:
Index(['CMPLNT_NUM', 'CMPLNT_FR_DT', 'CMPLNT_FR_TM', 'CMPLNT_TO_DT',
       'CMPLNT_TO_TM', 'ADDR_PCT_CD', 'RPT_DT', 'KY_CD', 'OFNS_DESC', 'PD_CD',
       'PD_DESC', 'CRM_ATPT_CPTD_CD', 'LAW_CAT_CD', 'BORO_NM',
       'LOC_OF_OCCUR_DESC', 'PREM_TYP_DESC', 'JURIS_DESC', 'JURISDICTION_CODE',
       'PARKS_NM', 'HADEVELOPT', 'HOUSING_PSA', 'X_COORD_CD', 'Y_COORD_CD',
       'SUSP_AGE_GROUP', 'SUSP_RACE', 'SUSP_SEX', 'TRANSIT_DISTRICT',
       'Latitude', 'Longitude', 'Lat_Lon', 'PATROL_BORO', 'STATION_NAME',
       'VIC_AGE_GROUP', 'VIC_RACE', 'VIC_SEX'],
      dtype='object')
In [4]:
# According to the data dictionary, CMPLNT_NUM (Complaint Number) is randomly generated and persistent.
# Is it unique?

df['CMPLNT_NUM'].is_unique
Out [4]:
False
In [5]:
# It's not unique. That's unexpected.

df.duplicated(subset = 'CMPLNT_NUM').value_counts()
Out [5]:
False    7821537
True        3962
dtype: int64
In [6]:
# Since CMPLNT_NUM is not unique, we can't use it as an index.
# Let's drop it.

df.drop('CMPLNT_NUM', axis = 1, inplace = True)
In [7]:
df.head(3)
# df.columns
# df.dtypes
Out [7]:
CMPLNT_FR_DT CMPLNT_FR_TM CMPLNT_TO_DT CMPLNT_TO_TM ADDR_PCT_CD RPT_DT KY_CD OFNS_DESC PD_CD PD_DESC CRM_ATPT_CPTD_CD LAW_CAT_CD BORO_NM LOC_OF_OCCUR_DESC PREM_TYP_DESC JURIS_DESC JURISDICTION_CODE PARKS_NM HADEVELOPT HOUSING_PSA X_COORD_CD Y_COORD_CD SUSP_AGE_GROUP SUSP_RACE SUSP_SEX TRANSIT_DISTRICT Latitude Longitude Lat_Lon PATROL_BORO STATION_NAME VIC_AGE_GROUP VIC_RACE VIC_SEX
0 12/31/2019 17:30:00 NaN NaN 32.0 12/31/2019 118 DANGEROUS WEAPONS 793.0 WEAPONS POSSESSION 3 COMPLETED FELONY MANHATTAN NaN STREET N.Y. POLICE DEPT 0.0 NaN NaN NaN 999937.0 238365.0 NaN NaN NaN NaN 40.820927 -73.943324 (40.82092679700002, -73.94332421899996) PATROL BORO MAN NORTH NaN UNKNOWN UNKNOWN E
1 12/29/2019 16:31:00 12/29/2019 16:54:00 47.0 12/29/2019 113 FORGERY 729.0 FORGERY,ETC.,UNCLASSIFIED-FELO COMPLETED FELONY BRONX NaN STREET N.Y. POLICE DEPT 0.0 NaN NaN NaN 1022508.0 261990.0 NaN NaN NaN NaN 40.885701 -73.861640 (40.885701406000074, -73.86164032499995) PATROL BORO BRONX NaN UNKNOWN UNKNOWN E
2 12/15/2019 18:45:00 NaN NaN 109.0 12/29/2019 578 HARRASSMENT 2 638.0 HARASSMENT,SUBD 3,4,5 COMPLETED VIOLATION QUEENS FRONT OF STREET N.Y. POLICE DEPT 0.0 NaN NaN NaN 1034178.0 209758.0 25-44 UNKNOWN M NaN 40.742281 -73.819824 (40.74228115600005, -73.81982408) PATROL BORO QUEENS NORTH NaN 25-44 WHITE HISPANIC F
In [8]:
# Question 1

# How does each borough compare according to the class of crime committed?
# But first, rename some columns to make the table more readable.

df.rename(columns = {'LAW_CAT_CD': 'CRIME_CLASS', 'BORO_NM': 'BORO'}, inplace = True)
df.groupby(['BORO'])['CRIME_CLASS'].value_counts()
Out [8]:
BORO           CRIME_CLASS
BRONX          MISDEMEANOR    1000078
               FELONY          466248
               VIOLATION       227655
BROOKLYN       MISDEMEANOR    1249836
               FELONY          754414
               VIOLATION       308893
MANHATTAN      MISDEMEANOR    1075687
               FELONY          597184
               VIOLATION       209421
QUEENS         MISDEMEANOR     826883
               FELONY          516528
               VIOLATION       218301
STATEN ISLAND  MISDEMEANOR     210270
               FELONY           81032
               VIOLATION        70589
Name: CRIME_CLASS, dtype: int64
In [9]:
# A quick visualization of the above

df.groupby(['BORO'])['CRIME_CLASS'].value_counts().plot(kind = 'bar')
Out [9]:
<AxesSubplot:xlabel='BORO,CRIME_CLASS'>
In [10]:
# Question 2

# Some incidents occurred in NYC parks, playgrounds or greenspaces.
# What crimes were reported most often and where?

# Again, let's begin by renaming columns.

# df.rename(columns = {'PARKS_NM': 'PUBLIC_SPACE', '', inplace = True}