Data Analysis on Phoenix Crime Frequency (R Shiny App)
The skills I demoed here can be learned through taking Data Science with Machine Learning bootcamp with NYC Data Science Academy.
Background & Inspiration
Phoenix - the fifth-largest U.S. city behind New York, Los Angeles, Chicago, and Houston - has been one of the fastest growing cities in the U.S. with a population of over 1.7 million as of April 2021. According to U.S. Census Bureau data and multiple articles, Phoenix also leads the country in 10-year population growth. One of the main reasons of the growth is due to more and more people moving from the west coast to escape a very high cost of living.
I was also in the heart of the movement as I moved out to Phoenix for work in 2017. As I saw the city grow exponentially over the years, I came to wonder how the crime rate in the area is changing with such a fast growth in population. This especially became very relevant to me as I was looking to buy a house earlier in 2020 because I wanted a property in a safer neighborhood.
In order to analyze the crime frequency in Phoenix, I obtained the dataset from City of Phoenix Open Data website. The incident-level data comes from police reports from November 2015 through March 2021. It contains over 350,000 observations and attributes such as incident number, occurred on time, occurred to time, crime category, zip code, and premise type. I performed some initial preprocessing steps before starting the exploratory data analysis (EDA):
- Remove unnecessary features
- Remove null values (~2,500 observations)
- Create month, hour, and day of week
Some additional data were also used to join onto the main dataset for extra analysis:
- Phoenix zip code: Phoenix areaConnect
- Moon phase calendar: Vertex42
- Population by zip code: Zipatlas
- Weather: National Weather Service Forecast Office
Once I performed enough EDA on the data, I developed a stand-alone Shiny app, which demonstrates the analysis and lets the user toggle through different views and options. The target audience for this app would be the Phoenix police department so that it can be used to determine where and when to best place officers on duty and to schedule vacation around high crime frequency time periods. But this app can also be useful for people who are planning to move into the Phoenix area to check out the neighborhood crime rate just like me.
First, I wanted to see the frequency of crime in Phoenix over the years. So I plotted the number of crimes by year-month breakout as shown in Figure 1. Overall, the number of crimes steadily grew over time until March 2020 when it drops about 20%, most likely due to COVID-19 lockdown. After toggling through different options (zip codes, crime categories, and premise types) shown on the app, the following observations stood out:
- Drug offense and aggravated assault cases almost doubled over 4 years
- Larceny-theft is the biggest driver of the drop in March 2020
- Motor vehicle theft shows a seasonality where it is most frequent during the summer (except in 2020)
I then analyzed how crime frequency varies by zip code. As shown in Figure 2, I created an interactive leaflet map that shows the crime frequency by size of blue circles along with red dots showing police station locations. The user can easily hover the cursor over each circle or dot to see what zip code or police station it represents. Zip code 85015 showed a very consistent high number of crimes over the years, so it may be a good idea for the Phoenix police department to build a next police station around the area.
Population density was also compared against crime frequency. Figure 3 plots crime frequency vs. population density which is calculated by taking the number of crimes in the selected year-month by zip code and dividing by the population per square mile. As seen in the graph, there were more crimes per capita for zip codes with fewer populatino per square mile. So this implied that just because it's a less populated neighborhood, it doesn't necessarily mean that there will be fewer crimes.
Then I looked at what category of crime was the most frequent. Figure 4 shows the number of crimes by hour of day (from 0 to 24) & category and Figure 5 shows the number of crimes by day of week. By toggling through different time periods for both figures, the following were observed:
- Larceny-theft is the leading category across all years
- Safest time is midnight to 8AM, but this could be due to everyone being at home, not being able to be "crimed"
- Over the years, burglary category decreased most likely due to better security systems
- There are less crimes during the weekend than weekdays
I then looked at how crime duration varies by category and premise. As seen from Figure 6 & 7, I plotted log transformed histograms showing counts by crime duration in hours, each for crime category and premise, respectively. The way to interpret the scaling on the graph: 0 ~ 1e0 covers hours 0 to 1, 1e0 ~ 1e1 covers hours 1 to 10, 1e1 ~ 1e2 covers hours 10 to 100, so on so forth. For example, Figure 6 (which is currently showing larceny-theft) shows that the majority of the crimes last for around 10 hours to resolve. From these graphs, I noticed that aggravated assault, drug offense, and robbery cases get resolved faster than the other categories. Also, store & restaurant, parks, and airport cases get resolved faster than the other premises.
Interesting Data Facts
A couple of external features - moon phase, average temperature, and unemployment rate - were also analyzed against crime frequency to see if there were any noticeable relationships. Nothing stood out for moon phase, but there were some interesting observations for temperature and unemployment rate. As seen in Figure 8, the number of crimes trends downwards as temperature increases most likely due to excruciating Phoenix summer of over 100°F weather. Unemployment rate, however, showed something very unexpected. As seen in Figure 9, the crime frequency increased as unemployment rate decreased which was counter-intuitive.
More details on the observations discussed above in the data analysis and interesting facts sections can be found in the Shiny app.
After a thorough analysis of the data, I got to the following conclusions for Phoenix police department (some of these are more detailed than what is discussed above - the information can be found on the Shiny app):
- The police department should focus the officers on duty to zip codes 85051, 85015, 85008, 85009, and 85041
- If the police department is considering building another station, 85015 would be a good location
- When scheduling the officers' vacations, it should be over the weekends and during the summer when crime is less frequent
- Police department should track unemployment rate since a decreasing trend in unemployment rate may mean an increase of number of crimes
To conclude, some additional research I would like to continue doing regarding this project are as follows:
- How do major U.S. holidays relate to crime rates?
- How should broken windows policing be considered with this analysis?
- Are there any noticeable observations for unresolved incidents?