Data Analysis on Phoenix Crime Frequency (R Shiny App)

Posted on Jul 20, 2021
The skills I demoed here can be learned through taking Data Science with Machine Learning bootcamp with NYC Data Science Academy.

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

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

Data Analysis on Phoenix Crime Frequency (R Shiny App)

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

Data Analysis on Phoenix Crime Frequency (R Shiny App)

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

Data Analysis on Phoenix Crime Frequency (R Shiny App)

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

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

Will Han is a dynamic cross-functional leader with 5+ years of experience in timely project successes in healthcare and real estate industry. Proven track record in client management with effective communication, understanding and thoroughly meeting the stakeholder expectations.
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 2020 Revenue 3-points agriculture air quality airbnb airline alcohol Alex Baransky algorithm alumni Alumni Interview Alumni Reviews Alumni Spotlight alumni story Alumnus ames dataset ames housing dataset apartment rent API Application artist aws bank loans 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 boston safety Bundles cake recipe California Cancer Research capstone car price Career Career Day citibike classic cars classpass clustering Coding Course Demo Course Report covid 19 credit credit card crime frequency crops D3.js data data analysis Data Analyst data analytics data for tripadvisor reviews data science Data Science Academy Data Science Bootcamp Data science jobs Data Science Reviews Data Scientist Data Scientist Jobs data visualization database Deep Learning Demo Day Discount disney dplyr drug data e-commerce economy employee employee burnout employer networking environment feature engineering Finance Financial Data Science fitness studio Flask flight delay gbm Get Hired ggplot2 googleVis H20 Hadoop hallmark holiday movie happiness healthcare frauds higgs boson Hiring hiring partner events Hiring Partners hotels housing housing data housing predictions housing price hy-vee Income Industry Experts Injuries Instructor Blog Instructor Interview insurance italki Job Job Placement Jobs Jon Krohn JP Morgan Chase Kaggle Kickstarter las vegas airport lasso regression Lead Data Scienctist Lead Data Scientist leaflet league linear regression Logistic Regression machine learning Maps market matplotlib Medical Research Meet the team meetup methal health miami beach movie music Napoli NBA netflix Networking neural network Neural networks New Courses NHL nlp NYC NYC Data Science nyc data science academy NYC Open Data nyc property NYCDSA NYCDSA Alumni Online Online Bootcamp Online Training Open Data painter pandas Part-time performance phoenix pollutants Portfolio Development precision measurement prediction Prework Programming public safety PwC python Python Data Analysis python machine learning python scrapy python web scraping python webscraping Python Workshop R R Data Analysis 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 seafood type Selenium sentiment analysis sentiment classification Shiny Shiny Dashboard Spark Special Special Summer Sports statistics streaming Student Interview Student Showcase SVM Switchup Tableau teachers team team performance TensorFlow Testimonial tf-idf Top Data Science Bootcamp Top manufacturing companies Transfers tweets twitter videos visualization wallstreet wallstreetbets web scraping Weekend Course What to expect whiskey whiskeyadvocate wildfire word cloud word2vec XGBoost yelp youtube trending ZORI