Phoenix Crime Frequency Analysis (R Shiny App)

William Han
Posted on Jul 20, 2021

Shiny App | Github | LinkedIn

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 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:

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.

Data Analysis

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)

Figure 1

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.

Figure 2

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.

Figure 3

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

Figure 4

Figure 5

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.

Figure 6

Figure 7

Interesting 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.

Figure 8

Figure 9

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?

About Author

William Han

William Han

Will Han, ASA, MAAA has been working as a Medicaid consulting actuary for 4 years. Experience programming in Python & R and expert in Excel modeling. Passionate about any data driven business insights & strategy and looking forward...
View all posts by William Han >

Related Articles

Leave a Comment

No comments found.

View Posts by Categories

Our Recent Popular Posts

View Posts by Tags

#python #trainwithnycdsa 2019 airbnb Alex Baransky alumni Alumni Interview Alumni Reviews Alumni Spotlight alumni story Alumnus API Application artist aws beautiful soup Best Bootcamp Best Data Science 2019 Best Data Science Bootcamp Best Data Science Bootcamp 2020 Best Ranked Big Data Book Launch Book-Signing bootcamp Bootcamp Alumni Bootcamp Prep Bundles California Cancer Research capstone Career Career Day citibike clustering Coding Course Demo Course Report D3.js data Data Analyst data science Data Science Academy Data Science Bootcamp Data science jobs Data Science Reviews Data Scientist Data Scientist Jobs data visualization Deep Learning Demo Day Discount dplyr employer networking feature engineering Finance Financial Data Science Flask gbm Get Hired ggplot2 googleVis Hadoop higgs boson Hiring hiring partner events Hiring Partners Industry Experts Instructor Blog Instructor Interview Job Job Placement Jobs Jon Krohn JP Morgan Chase Kaggle Kickstarter lasso regression Lead Data Scienctist Lead Data Scientist leaflet linear regression Logistic Regression machine learning Maps matplotlib Medical Research Meet the team meetup Networking neural network Neural networks New Courses nlp NYC NYC Data Science nyc data science academy NYC Open Data NYCDSA NYCDSA Alumni Online Online Bootcamp Online Training Open Data painter pandas Part-time Portfolio Development prediction Prework Programming PwC python Python Data Analysis python machine learning python scrapy python web scraping python webscraping Python Workshop R R language R Programming R Shiny r studio R Visualization R Workshop R-bloggers random forest Ranking recommendation recommendation system regression Remote remote data science bootcamp Scrapy scrapy visualization seaborn Selenium sentiment analysis Shiny Shiny Dashboard Spark Special Special Summer Sports statistics streaming Student Interview Student Showcase SVM Switchup Tableau team TensorFlow Testimonial tf-idf Top Data Science Bootcamp twitter visualization web scraping Weekend Course What to expect word cloud word2vec XGBoost yelp