Previously we discovered that the Central district has much higher number of liquor licenses per capita. This is no surprise since normally the city center has much more thriving businesses but less residential properties (hence a smaller population density).
Using the tax accessor’s data, we can see directly from the map how much this difference is and whether the percentage of residential occupancy really matters for an easy access to liquor venues.
Above graph uses a smaller geographical unit–census block groups–instead of census tracts that I played with last week. This is because the land areas of each census unit are drastically different, using a smaller unit helps constructing a more accurate and informative presentation of per unit variables. Block groups with less that 20 parcels are also excluded in map #3 and #4, so to reduce noise from extreme cases.
The graph strongly suggests that the distribution of on-premise liquor licenses generally follows the density of commercial parcels at large (map #1 and #4). Residents in lively business areas undoubtly have an easier access to food and entertainment venues that sell drinks.
Map #3 shows the percentage of all non-residential parcels within each census block group. This includes commercial parcels, industrial parcels, government building and any propery types that are exempt from property tax. It is interesting to see how the city center is surrounded by a circle of high non-residential parcel regions, then the suburbs are occupied by residents again.
Population density also plays a role in how businesses are thriving. It seems that the denser the population, the higher percentage of commercial parcels a neighborhood has, and the number of liquor licenses per capita also goes up. Except in the city center, commercial parcels take so much of land that the residential population density is even driven down by it.
When breaking down liquor licenses by venue types, and comparing it with the distribution of other business licenses, we can notice that common vectuallers without a liquor license are more likely to serve take-outs (see the green dots on map #2) than those who have obtained one, and they are more often located in the suburbs. It seems that take-out restaurants tend to not apply a liquor license. This makes sense because if your customers are only going to order and leave, why bother spending money to apply for a liquor license that only allows customers to consume alcohol on-premise?
I have used the number of liquor licenses per capita as an indicator for the accessibility to on-premise alcoholic beverages. By looking at population density and ratios of commercial parcels, I was able to identify that easy access to alcoholic beverages is often available at populous commercial areas. Less populous outskirts normally have a higher percentage of restaurants that accept take-out orders, and they are less inclined to apply for a liquor license.
This explains the initial doubt we had for Allston/Brighton, in which we found that although this neighorhood has the second highest number of business licenses in total, it seems to have a relatively low number of liquor licenses. The reason is that population and businesses in this region are both less condensed, and small businesses tend to apply for the expensive liquor license only when the customer base is big enough to support the demand.
Mapping population and business density
source("src/preparation.R")
source("src/tax.R")
source("src/alcohol.R")
source("src/map.R")
if (!exists("tracts.geo")) {
tracts.geo <- readOGR("../data/geo-tracts-2015/Tracts_Boston_2015_BARI",
layer = "Tracts_Boston BARI")
blkgrps.geo <- readOGR("../data/geo-blockgroups-2015/Block Groups 2015 BARI",
layer = "Census Block Groups")
ecometrics.ct <- read.csv("../data/ecometrics/CT_All_Ecometrics_2014.tab",
sep = "\t")
ecometrics.bg <- read.csv("../data/ecometrics/CBG_All_Ecometrics_2014.tab",
sep = "\t")
}
# Tracts Geo Data + ecometrics + demographics
tracts <- fortify(tracts.geo, region = "CT_ID_10")
tracts <- merge(tracts, ecometrics.ct, all.x = TRUE,
by.x = "id", by.y = "CT_ID_10")
tracts <- merge(tracts, acs.ct, all.x = TRUE,
by.x = "id", by.y = "CT_ID_10")
tracts <- merge(tracts, tad2015.res.count.ct, all.x = TRUE,
by.x = "id", by.y = "CT_ID_10")
tracts <- arrange(tracts, order)
blkgrps <- fortify(blkgrps.geo, region = "BG_ID_10")
blkgrps <- merge(blkgrps, ecometrics.bg, all.x = TRUE,
by.x = "id", by.y = "BG_ID_10")
blkgrps <- merge(blkgrps, acs.bg, all.x = TRUE,
by.x = "id", by.y = "BG_ID_10")
blkgrps <- merge(blkgrps, tad2015.res.count.bg, all.x = TRUE,
by.x = "id", by.y = "BG_ID_10")
blkgrps <- arrange(blkgrps, order)
# boston.bw and theme.no.axis are from `map.R`
bmap <- boston.bw + theme.no.axis + theme(
plot.title = element_text(size = rel(1)),
plot.margin = margin(8, 0, 8, 0)
)
p1 <- bmap +
geom_polygon(data = blkgrps, alpha = 0.9,
aes(x = long, y = lat, group = group, fill = LiqPerCapita)) +
geom_path(data = blkgrps, aes(x = long, y = lat, group = group),
size = .1, alpha = .2, color = 'black') +
scale_fill_gradient(low = "#ffeeee", high = "red", na.value = "white") +
labs(fill = "") +
ggtitle("1. Liquor Licenses Per Capita")
p2 <- bmap +
geom_polygon(data = blkgrps, alpha = 0.9,
aes(x = long, y = lat, group = group, fill = PopDen / 1000)) +
geom_path(data = blkgrps, aes(x = long, y = lat, group = group),
size = .1, alpha = .2, color = 'black') +
scale_fill_gradient(low = "white", high = "red", na.value = "white") +
labs(fill = "") +
ggtitle("2. Pupulation Per Square Mile (k)")
p3 <- bmap +
geom_polygon(data = blkgrps, alpha = 0.9,
aes(x = long, y = lat, group = group, fill = p.nores * 100)) +
geom_path( data = blkgrps, aes(x = long, y = lat, group = group),
size = .1, alpha = .2, color = 'black') +
scale_fill_gradient(low = "white", high = "red", na.value = "white") +
labs(fill = "") +
ggtitle("3. None-Residential Parcels (%)")
p4 <- bmap +
geom_polygon(data = blkgrps, alpha = 0.9,
aes(x = long, y = lat, group = group, fill = p.comm * 100)) +
geom_path( data = blkgrps, aes(x = long, y = lat, group = group),
size = .1, alpha = .2, color = 'black') +
scale_fill_gradient(low = "white", high = "red", na.value = "white") +
labs(fill = "") +
ggtitle("4. Commercial Parcels (%)")
grid.arrange(p1, p2, p3, p4, ncol = 2)
↩Mapping business types
bmap2 <- bmap + theme(
plot.margin = margin(8, 60, 8, 8),
legend.margin = unit(6, "points"),
legend.position = c(1, 0),
legend.justification = c(0.6, 0),
# legend.title = element_blank(),
legend.title = element_text(size = rel(.8)),
legend.text = element_text(size = rel(.7)),
legend.key.size = unit(13, "points"),
legend.key = element_rect(fill = "grey90"))
p1 <- bmap2 +
geom_polygon(
data = tracts,
fill = "#999999",
color = "#939393",
size = 0.1,
alpha = 0.3,
aes(x = long, y = lat, group = group)) +
geom_point(
data = bizz.alc,
size = 0.5,
alpha = 0.6,
aes(x = LONGITUDE, y = LATITUDE, color = ALC_BIZ_TYPE)) +
labs(color = "Venue Type") +
scale_color_hue(l = 90, c = 360, h.start = 9) +
ggtitle("1. On-Premise Liquor Licenses By Venue Types")
# food and clubs
fnc.cats <- c("FS", "FT", "LiveEnt", "NightClub", "NonLiveEnt")
fnc.cat.names <- c("Eating & Drinking", "Eating & Drinking w/ Take Out",
"Live Entertainment", "Night Club", "Non-Live Entertainment")
p2 <- bmap2 +
geom_polygon(
data = tracts,
fill = "#999999",
color = "#939393",
size = 0.1,
alpha = 0.3,
aes(x = long, y = lat, group = group)) +
geom_point(
data = bizz.clean[bizz.clean$LICENSECAT %in% fnc.cats, ],
size = 0.25,
alpha = 0.6,
aes(x = LONGITUDE, y = LATITUDE, color = LICENSECAT)) +
scale_color_hue(l = 100, c = 360, h.start = 60,
labels = fnc.cat.names) +
labs(color = "Business Type") +
ggtitle("2. Food Establishments and Entertainment Venues")
grid.arrange(p1, p2, ncol = 2)
↩