There are two directions to further the analysis of alcohol consumption: the relationship between alcohol licensing and econoimc growth, and the impact of alcohol consumption in the context of public health. Because of the lack of data on off-premise liquor licenses, it is impossible to estimate how much alcohol people consume at home, thus the door is closed for the public health direction. I would like to move my focus to the economic factors surrounding alcohol consumptions. After all, liquor licenses were used by municipalities repeatedly as a tool to spur economic development.

To be precise, I will be looking at the “fondness for alcohol” of a neighborhood and the social economic implications of such fondness.

Regulation Background

Massachusetts General Laws has defined 6 types of on-premise alcohol retail venues: restaurant, hotel, club, veterans club, general-on-premises and tavern. Each category has its own restriction on who may be the patrons, where the alcohol may be consumed, hours of sale, and whether food can be served with, etc. There is also a distinction between a license for wines and malt beverages (beers for example) and one for all alcoholic beverages.

Local licensing boards are authorized to manage quotas on number of licenses based on the population of the city/town and license types. All alcoholic beverages and wines & malt beverages licenses have separate quotas. Generally speaking, the law allows one liquor license for each population unit of one thousand, although the actual regulations are much more complicated. The quota seldom changes every year, but licenses are open to transfers if a business closes its door. Businesses are reported to spend hundreds of thousands competing on a full liquor license.

Apparently, this is not fair to small businesses in under-served areas. They will never have enough money to bid on a liquor license that cosst so much. In 2014, the city of Boston introduced the concept of “neighborhood-restricted liquor licenses”, which would be allowed only in a few selected neighborhoods. In a period of 3 years, 40 new restricted licenses have been issued to the neighborhoods of Dorchester, Hyde Park, Jamaica Plain, Mattapan, Mission Hill, Roxbury, and Main Streets Districts (as designated by BRA), along with 35 new unrestricted licenses.

Besides common alcoholic beverage licenses with strict quotas, there are also “Farmer Distillery” licenses, which are issued to farms that produce craft distillers. The purpose of this special license is to stimulate culinary tourism for local farms. The city of Boston has issued two of these licenses, one in South Boston, one in Dorchester.

Research Methods

The data we have readily at hand are the on-premise liquor licenses, categorized by type of premises, type of alcohol that is allowed to sell, and whether it is neighborhood-restricted; food service licenses and entertainment venue licenses that may be linked to the liquor licenses by business addresses and names of the owners; demographics data from census indicators, including sex, age, rage, education level, family type, income, transportation preference, etc.

I will first link liquor licenses to business types, then discuss how certain demographics may have influenced the thriving of each business type, and how alcohol consumption may be related to it.

Analysis

Liquor licenses by business and liquor types

The dataset contains in total 1169 unique liquor licenses, distributed among 25 different sub-categories1.

Business Type All Alcohol Malt & Wine Total
Common Vectualler 635 374 1009
Hotel 63 2 65
Club 54 7 61
General On-Premises 20 6 26
Tavern 6 0 6
Farmer Distillery 2 0 2
Table 1: Number of Liquor Licenses by Types

It is no surprise that common vectuallers (restuarants and bars that serve both food and beverages) have taken most (86%) of the liquor licenses. The percentage is so high that other premises almost look peripheral. However, among the 86% of licenses for common vectuallers, 37% of them are Wines and Malt Beverages only, which is much higher a ratio than other venue types. This is certainly not because that restaurants tend to voluntarily opt out hard liquor, but more because of limited number of full liquor licenses in the market.

Some of the venue types can indicate the type of customers. For examples, hotels mostly serve travellers, clubs are most visited by young people. But for the majority of the licenses issued to common vectuallers, we cannot infer who the customers are based on the information we now have. A possible followup would be to scrape data from Yelp or Foursquare, or even Twitter and Facebook, so to understand the dynamics of each venue. For example, popular bars/restaurants with a lot of ratings may have attracted a lot of travellers or people from all over the city, while less rated venues tend to have a more local customer base.

Liquor licenses and demographics

Using census indicators derieved from American Community Survey and decennial census, in five-year estimates between 2010 to 2014 (file ACS_1014_BLKGRP.tab in dataset “American Community Survey Census Indicators for Massachusetts Block Groups”), and the density of liquor licenses as an proxy to alcohol consumption, following analysis aims at finding out which areas of the city attract most alcoholic beverage consumers, and who the typical patrons are2.

Tract ID Per Capita Neighborhood
25025030400 0.02512 Central
25025981202 0.02041 South Boston
25025060600 0.01970 South Boston
25025070101 0.01673 Central
25025010701 0.01422 Back Bay/Beacon Hill
25025010600 0.01346 Back Bay/Beacon Hill
25025030300 0.01303 Central
25025070200 0.00952 Central
25025010702 0.00781 Back Bay/Beacon Hill
25025070300 0.00777 Central
Table 2: Top 10 tracts with the most liquor licenses per capita

At the census tract level, number of licenses per capita varies from 0.02512 (25 per 1000 residents) to 0.00011 (0.1 per 1000 residents). We can plot this data against different demographic attributes to see whether there are any potential correlations between the number of licenses and certain charasteristic of the population3.

The graphs suggest no significant correlations in population density and percentage of renters, but median house income and sex ratio do seem have correlations with number of liquor licenses. It seems that liquor licenses tend are more often issued to where rich males live.

Of course, this is only a preliminiary study on 4 of 45 census indicators. I will run though more indicators offline and share the results during coming weeks.


  1. Liquor lisences by business type

    source("posts/src/preparation.R")
    library(sqldf)
    
    length(unique(bizz[bizz$LICENSECAT_C == 'Liquor', ]$LICENSECATDESC))
    
    alc.cat <- read.table(textConnection('
      Abbr       Type
      GOP        "General On-Premises"
      Gen        "General On-Premises"
      CV7        "Common Vectualler"
      Club       Club
      Clb        Club
      Inn        Hotel
      Tavern     Tavern
      "Farmer Distillery" "Farmer Distillery"
    '), header = TRUE)
    
    bizz.alc <- bizz.clean[bizz.clean$LICENSECAT_C == "Liquor",
                            c("LICENSENO", "BIZID", "LICENSECAT",
                              "LICENSECATDESC", "ISSDTTM",
                              "LATITUDE", "LONGITUDE", "ZIP",
                              "BRA_NSA", "BRA_PD",
                              "BG_ID_10", "CT_ID_10", "TLID")]
    
    bizz.alc$ALC_BIZ_TYPE <- "Other"
    
    l <- apply(alc.cat, 1, function(row) {
      idx <- which(str_detect(bizz.alc$LICENSECATDESC, as.character(row[1])))
      bizz.alc[idx, "ALC_BIZ_TYPE"] <<- as.character(row[2])
    })
    
    bizz.alc$ALC_TYPE <- ifelse(
      str_detect(bizz.alc$LICENSECATDESC, "Malt"),
      "Malt Wine", "All Alcohol")
    bizz.alc$ALC_IS_RESTRICTED <- ifelse(
      str_detect(bizz.alc$LICENSECATDESC, "Rest"),
      1, 0)
    
    alc.count <- sqldf("select
          ALC_BIZ_TYPE as `Business Type`,
          count(case when ALC_TYPE='All Alcohol' THEN 1 END) as `All Alcohol`,
          count(case when ALC_TYPE='Malt Wine' THEN 1 END) as `Malt & Wine`,
          count(1) as `Total`
          from `bizz.alc`
          group by `Business Type`
          order by `Total` desc")
    
    write.csv(alc.count, "tmp.txt", row.names = FALSE)
  2. Number of liquor licenses by tract

    # ACS Census Tract
    acs.ct <- read.csv("../data/acs-census-tract/ACS_1014_TRACT.tab",
                    header = TRUE, sep = "\t")
    # ACS Block Group
    acs.bg <- read.csv("../data/acs-census-block/ACS_1014_BLKGRP.tab",
                        header = TRUE, sep = "\t")
    
    count.census.liq <- function(df, key) {
      liqcount <- as.data.frame(table(bizz.alc[, key]))
      names(liqcount) <- c(key, "LiqCount")
      df <- merge(df, liqcount)
      df <- mutate(df, LiqPerCapita = round(LiqCount / TotalPop, 5))
      df[df$LiqPerCapita == Inf, "LiqPerCapita"] <- NaN
      df
    }
    
    # will add new columns `LiqCount` and `LiqPerCapita`
    acs.ct <- count.census.liq(acs.ct, "CT_ID_10")
    acs.bg <- count.census.liq(acs.bg, "BG_ID_10")
    
    # output as a readable html table
    format.top10 <- function(df) {
      df <- sqldf("select CT_ID_10 as `Tract ID`, LiqPerCapita as `Per Capita`
                      from df
                      order by `Per Capita` desc limit 10")
      df$Neighborhood <- bizz.alc[match(df$`Tract ID`, bizz.alc$CT_ID_10), "BRA_PD"]
      df$`Per Capita` <- str_pad(df$`Per Capita`, 7, "right", "0")
      df
    }
    htmlTable(format.top10(acs.ct),
              rnames=FALSE,
              css.cell = "padding: 0.25em",
              css.class = "table",
              pos.caption = "bottom",
              caption="Table 2: Top 10 tracts with the most liquor licenses per capita")
  3. Plots for correlations

    suppressPackageStartupMessages(library(gridExtra))
    
    p1 <- ggplot(acs.ct, aes(x = PopDen, y = LiqPerCapita)) +
      geom_point() +
      theme_light() +
      xlab("Population Density") +
      ylab("Liquor license per capita")
    
    p2 <- ggplot(acs.ct, aes(x = MedHouseIncome, y = LiqPerCapita)) +
      geom_point() +
      theme_light() +
      xlab("Median House Income") +
      ylab("Liquor license per capita")
    
    p3 <- ggplot(acs.ct, aes(x = RentersPer, y = LiqPerCapita)) +
      geom_point() +
      theme_light() +
      xlab("Percentage of renters") +
      ylab("Liquor license per capita")
    
    p4 <- ggplot(acs.ct, aes(x = SexRatio, y = LiqPerCapita)) +
      geom_point() +
      theme_light() +
      xlab("Sex Ratio") +
      ylab("Liquor license per capita")
    grid.arrange(p1, p2, p3, p4, ncol = 2)