Overserved @ Overtime

Does extra time cut down on DUI arrests?

Over 10,000 people die every year in alcohol related accidents. 1.5 million people are caught driving over 0.08 BAC every year. Millions more admit to driving after several drinks in self-reported surveys. Drunk drivers cross-cut gender, race, income, and other traditional segments in demographic research. But few studies have asked where folks drink prior to their arrest or accident. So where do all these people come from? Safe-driving advocacy groups cite several various venues: neighborhood bars, college parties, and anywhere someone might be suffering from alcoholism. Also present on that list? Sporting events.

Researchers in 2011 found that 1 in 12 people leaving sampled MLB and NFL games measured above the legal limit of 0.08 BAC. In 2015, the state of California partnered with an insurance company to explore the same question. They found a 77% increase with alcohol-related crashes on Super Bowl Sunday.

How can we curb the social cost of drunk spectators returning home? For starters, venues could just stop selling booze, but that isn’t likely. Owners bank millions of dollars each season on alcohol sales. Football stadiums generate small economies. The Indianapolis Colts made $4 million on brews in 2014 alone.

League End of Serving Overtime Length (Minutes)
MLB 7th Inning ~25mins
NFL 3rd Quarter ~25mins
NBA 3rd Period ~20mins
NHL 2nd Period ~20mins

Venues could stop serving alcohol earlier in the game. Everyone understands that once the concessions close, it’s time to enjoy the remaining minutes of the game and focus on the fanfare. Baseball stadiums stop serving around the seventh-inning-stretch. NFL and NBA venues shut off the tap in the 3rd quarter. Hockey rinks cut the cold ones after 2nd period.

We can simulate earlier booze cut-offs with a natural experiment. Overtime extends the length of play and keeps fans in the stadium without drinking. Concession stands are not re-opened if games go into extra-time. The theory: if folks have more time to get sober, DUI arrests should decrease on days where the local team goes into overtime. I used the city of Denver as a pilot test for reasons shared below.

DUI arrests drop when games go into overtime. The sampling captured various professional sports teams over three years of football, baseball, basketball, and hockey games. The City of Denver’s police department has jurisdiction over each stadium and the respective ingress/egress routes. The difference is about one arrest per game that goes into OT.

The differences between regular and overtime games appear minimal on Thursday, Friday, and Saturday. The largest drop in DUI arrests is on Sunday: football games. Denver police average 4 DUI arrests when games finish in regulation, but that figure drops in half when spectators have more time to sober-up during overtime. The result is intuitive, football overtimes tend to be longer than other professional sports, so we would expect the difference to be more pronounced.

Drunk driving is a negative externality. The ripple effects and consequences on bystanders lives are all too real. In fact, safe motorists are often the victims of drunk driving and bear the costs of other’s actions. Mothers Against Drunk Driving estimate the societal cost at $130 billion/year. They factored the cost of insurance premiums, payouts, disability, damaged lives, damaged cars, lawsuits, and additional police forces. Sporting events surely contribute the towards that figure.

If curbing alcohol related accidents is as simple as sobering up earlier in the game, it’s worth a shot!

Methods:

To run the experiment, I needed to find a special city. One with open data polices, lots of professional sports teams, and a population that’s likely to drive to events. Denver, Colorado was the only city that checked all those boxes. They have four professional sports teams (NBA, NHL, NFL, and MLB), major a police force whose precincts cover every stadium and the surrounding roads for ingress and egress.

The study would have been way more interesting if I could pull from a series of cities. Unfortunately, granular data on specific arrests doesn’t exist at the national level. The FBI collects data on a regular basis from local precincts but only ask for aggregate figures on specific felonies. Denver was a great case study though and their police department solved the first half of data I needed: DUI arrests.

The second half was a more manual. I had to pull game records for each team over the last several years and tag games with OT flags. With the overtime data it was just a matter of merging the data in R and doing some visualization. If you’re an R programmer check out how I used plotly to make the charts locally. I also show how to render without their gross logos and formatting bar/menu/thingymajig. Code below!

R code:

### Libraries
library("sqldf")
library("ggplot2")
library("jsonlite")
library("plyr")
library("dplyr")
library("scales")
library("tidyr")
library("magrittr")
library(htmlwidgets)
library(plotly)

### Loading your data - details on finding the Denver crime data can be found in the README
denv <- read.csv("dengamescrime.csv", header = TRUE, stringsAsFactors = FALSE)

### Data cleaning and formatting
denv$dayofweek <- factor(denv$dayofweek, 
                             levels = c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))

denv$calend <- as.Date(denv$calend, "%m/%d/%Y")

denv$gamecount <- denv$gamewin - denv$gameloss

denvplay <- sqldf("select * from denv where gameplayed > 0")

denv$overtimeflag <- ifelse(denv$overtime >= 1, "Overtime", "Normal Day")
denvplay$overtimeflag <- ifelse(denvplay$overtime >= 1, "Overtime", "Regular Game")

### Visualizations

## ggplot statement for the first graph
subsetofjustgameswldui <- ggplot(data = subset(denvplay, gamecount %in% c("-1","1") & dayofweek %in% c("Thursday","Friday","Saturday","Sunday")), aes(x = factor(overtimeflag), y = duicount, group = factor(overtimeflag), color = factor(overtimeflag))) + geom_boxplot(outlier.colour = "gray", alpha = .01) + ylab("Number of DUI Arrests") + xlab("") + theme(legend.position="none") + scale_x_discrete(limits=c("Regular Game","Overtime"))

## ggplot statement for the second graph, just gotta declare the name of this chart in the plotly argument to generate
subsetofjustgameswlduif <- ggplot(data = subset(denvplay, gamecount %in% c("-1","1") & dayofweek %in% c("Thursday","Friday","Saturday","Sunday")), aes(x = factor(overtimeflag), y = duicount, group = factor(overtimeflag), color = factor(overtimeflag))) + geom_boxplot(outlier.colour = "gray", alpha = .01) + ylab("Number of DUI Arrests") + xlab("") + theme(legend.position="none") + scale_x_discrete(limits=c("Regular Game","Overtime")) + facet_grid(~dayofweek)

## plotly statement 1st graph - the text after the magrittr pipe is what pulls off plotly's logo and menu bar
ggplotly(subsetofjustgameswldui) %>% config(showLink = F, displayModeBar = F)

## plotly statement 2nd graph - the text after the magrittr pipe is what pulls off plotly's logo and menu bar
ggplotly(subsetofjustgameswlduif) %>% config(showLink = F, displayModeBar = F)