How do noise levels change over time according to the Maryland Aviation Administration noise monitors around BWI. These data come from two reports online Supplemental Permanent Noise Monitoring Data for 2012-2014 and 2015-2016.

Setup

Load the packages and create a helper function to format the tables. Note the use of tabularize which will scrape tables from PDF documents.

library(tabulizer)
library(tidyverse)
formatTable <- function(data){
  x <- gsub("\\([0-9]+\\)", "", data[-c(1:2), ]) %>% gsub("\\*", "", .) %>% gsub("-", NA, .)
  colnames(x) <- c("id", "Loc", substr(data[2, 3:14], 1, 3))
  as.data.frame(x, stringsAsFactors = FALSE)
}

2012-2014

Organize the data from 2012-2014.

url24 <- "http://www.maacommunityrelations.com/_media/client/anznoiseupdate/2017/20170803_BWI_RMS_2012-2014.pdf"
raw24 <- extract_tables(url24, pages = c(3, 5, 7))
for(i in 1:3){
  if(i == 1) dat24 <- data.frame()
  dat24 <- rbind(dat24, data.frame(Year = c(2012:2014)[i], formatTable(raw24[[i]])))
}
out24 <- gather(dat24, month, dnl, Jan:Dec) %>%
  mutate(dnl = as.numeric(dnl))

2015-2016

Organize the data from 2015-2016.

url56 <- "http://www.maacommunityrelations.com/_media/client/anznoiseupdate/2015%20and%202016%20Q1-Q4%20Supplemental%20Noise%20Report.pdf"
raw56 <- extract_tables(url56, pages = c(3, 5))
for(i in 1:2){
  if(i == 1) dat56 <- data.frame()
  dat56 <- rbind(dat56, data.frame(Year = c(2015:2016)[i], formatTable(raw56[[i]])))
}
out56 <- gather(dat56, month, dnl, Jan:Dec) %>%
  mutate(dnl = as.numeric(dnl))

Combine data

Combine years 2012 - 2016

dnl <- rbind(out24, out56) %>%
  mutate(mon = match(month, month.abb)) %>%
  mutate(date = as.Date(paste(Year, mon, "01", sep = "-"))) %>%
  mutate(Location = as.factor(paste(sprintf("%02d", as.numeric(id)), Loc, sep = "-"))) %>%
  mutate(dnl = ifelse(dnl == 0, NA, dnl)) %>%
  select(-id, -Loc)

Visualize DNL

We can plot the the monthly DNL over time by location. Notice many locations have missing data, and some locations have no data collected at all. Also notice the large variation in noise measurements for several locations.

ggplot(dnl, aes(date, dnl, color = Location)) +
  geom_line() +
  facet_wrap(~Location, ncol = 1) +
  theme(legend.position="none")

LS0tCnRpdGxlOiAiTUFBIFF1YXJ0ZXJseSBOb2lzZSBNZWFzdXJlbWVudHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkhvdyBkbyBub2lzZSBsZXZlbHMgY2hhbmdlIG92ZXIgdGltZSBhY2NvcmRpbmcgdG8gdGhlIE1hcnlsYW5kIEF2aWF0aW9uIEFkbWluaXN0cmF0aW9uIG5vaXNlIG1vbml0b3JzIGFyb3VuZCBCV0kuIFRoZXNlIGRhdGEgY29tZSBmcm9tIHR3byByZXBvcnRzIG9ubGluZSBTdXBwbGVtZW50YWwgUGVybWFuZW50IE5vaXNlIE1vbml0b3JpbmcgRGF0YSBmb3IgWzIwMTItMjAxNF0oaHR0cDovL3d3dy5tYWFjb21tdW5pdHlyZWxhdGlvbnMuY29tL19tZWRpYS9jbGllbnQvYW56bm9pc2V1cGRhdGUvMjAxNy8yMDE3MDgwM19CV0lfUk1TXzIwMTItMjAxNC5wZGYpIGFuZCBbMjAxNS0yMDE2XShodHRwOi8vd3d3Lm1hYWNvbW11bml0eXJlbGF0aW9ucy5jb20vX21lZGlhL2NsaWVudC9hbnpub2lzZXVwZGF0ZS8yMDE1JTIwYW5kJTIwMjAxNiUyMFExLVE0JTIwU3VwcGxlbWVudGFsJTIwTm9pc2UlMjBSZXBvcnQucGRmKS4KCiFbXShid2lub2lzZS5wbmcpCgojIyMgU2V0dXAKCkxvYWQgdGhlIHBhY2thZ2VzIGFuZCBjcmVhdGUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB0YWJsZXMuIE5vdGUgdGhlIHVzZSBvZiBgdGFidWxhcml6ZWAgd2hpY2ggd2lsbCBzY3JhcGUgdGFibGVzIGZyb20gUERGIGRvY3VtZW50cy4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRhYnVsaXplcikKbGlicmFyeSh0aWR5dmVyc2UpCgpmb3JtYXRUYWJsZSA8LSBmdW5jdGlvbihkYXRhKXsKICB4IDwtIGdzdWIoIlxcKFswLTldK1xcKSIsICIiLCBkYXRhWy1jKDE6MiksIF0pICU+JSBnc3ViKCJcXCoiLCAiIiwgLikgJT4lIGdzdWIoIi0iLCBOQSwgLikKICBjb2xuYW1lcyh4KSA8LSBjKCJpZCIsICJMb2MiLCBzdWJzdHIoZGF0YVsyLCAzOjE0XSwgMSwgMykpCiAgYXMuZGF0YS5mcmFtZSh4LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCn0KYGBgCgojIyMgMjAxMi0yMDE0CgpPcmdhbml6ZSB0aGUgZGF0YSBmcm9tIDIwMTItMjAxNC4KCmBgYHtyfQp1cmwyNCA8LSAiaHR0cDovL3d3dy5tYWFjb21tdW5pdHlyZWxhdGlvbnMuY29tL19tZWRpYS9jbGllbnQvYW56bm9pc2V1cGRhdGUvMjAxNy8yMDE3MDgwM19CV0lfUk1TXzIwMTItMjAxNC5wZGYiCnJhdzI0IDwtIGV4dHJhY3RfdGFibGVzKHVybDI0LCBwYWdlcyA9IGMoMywgNSwgNykpCgpmb3IoaSBpbiAxOjMpewogIGlmKGkgPT0gMSkgZGF0MjQgPC0gZGF0YS5mcmFtZSgpCiAgZGF0MjQgPC0gcmJpbmQoZGF0MjQsIGRhdGEuZnJhbWUoWWVhciA9IGMoMjAxMjoyMDE0KVtpXSwgZm9ybWF0VGFibGUocmF3MjRbW2ldXSkpKQp9CgpvdXQyNCA8LSBnYXRoZXIoZGF0MjQsIG1vbnRoLCBkbmwsIEphbjpEZWMpICU+JQogIG11dGF0ZShkbmwgPSBhcy5udW1lcmljKGRubCkpCmBgYAoKIyMjIDIwMTUtMjAxNgoKT3JnYW5pemUgdGhlIGRhdGEgZnJvbSAyMDE1LTIwMTYuCgpgYGB7cn0KdXJsNTYgPC0gImh0dHA6Ly93d3cubWFhY29tbXVuaXR5cmVsYXRpb25zLmNvbS9fbWVkaWEvY2xpZW50L2Fuem5vaXNldXBkYXRlLzIwMTUlMjBhbmQlMjAyMDE2JTIwUTEtUTQlMjBTdXBwbGVtZW50YWwlMjBOb2lzZSUyMFJlcG9ydC5wZGYiCnJhdzU2IDwtIGV4dHJhY3RfdGFibGVzKHVybDU2LCBwYWdlcyA9IGMoMywgNSkpCgpmb3IoaSBpbiAxOjIpewogIGlmKGkgPT0gMSkgZGF0NTYgPC0gZGF0YS5mcmFtZSgpCiAgZGF0NTYgPC0gcmJpbmQoZGF0NTYsIGRhdGEuZnJhbWUoWWVhciA9IGMoMjAxNToyMDE2KVtpXSwgZm9ybWF0VGFibGUocmF3NTZbW2ldXSkpKQp9CgpvdXQ1NiA8LSBnYXRoZXIoZGF0NTYsIG1vbnRoLCBkbmwsIEphbjpEZWMpICU+JQogIG11dGF0ZShkbmwgPSBhcy5udW1lcmljKGRubCkpCmBgYAoKIyMjIENvbWJpbmUgZGF0YQoKQ29tYmluZSB5ZWFycyAyMDEyIC0gMjAxNgoKYGBge3J9CmRubCA8LSByYmluZChvdXQyNCwgb3V0NTYpICU+JQogIG11dGF0ZShtb24gPSBtYXRjaChtb250aCwgbW9udGguYWJiKSkgJT4lCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKHBhc3RlKFllYXIsIG1vbiwgIjAxIiwgc2VwID0gIi0iKSkpICU+JQogIG11dGF0ZShMb2NhdGlvbiA9IGFzLmZhY3RvcihwYXN0ZShzcHJpbnRmKCIlMDJkIiwgYXMubnVtZXJpYyhpZCkpLCBMb2MsIHNlcCA9ICItIikpKSAlPiUKICBtdXRhdGUoZG5sID0gaWZlbHNlKGRubCA9PSAwLCBOQSwgZG5sKSkgJT4lCiAgc2VsZWN0KC1pZCwgLUxvYykKYGBgCgojIyMgVmlzdWFsaXplIEROTAoKV2UgY2FuIHBsb3QgdGhlIHRoZSBtb250aGx5IEROTCBvdmVyIHRpbWUgYnkgbG9jYXRpb24uIE5vdGljZSBtYW55IGxvY2F0aW9ucyBoYXZlIG1pc3NpbmcgZGF0YSwgYW5kIHNvbWUgbG9jYXRpb25zIGhhdmUgbm8gZGF0YSBjb2xsZWN0ZWQgYXQgYWxsLiBBbHNvIG5vdGljZSB0aGUgbGFyZ2UgdmFyaWF0aW9uIGluIG5vaXNlIG1lYXN1cmVtZW50cyBmb3Igc2V2ZXJhbCBsb2NhdGlvbnMuCgpgYGB7ciBmaWcuaGVpZ2h0PTM1LCBmaWcud2lkdGg9OH0KZ2dwbG90KGRubCwgYWVzKGRhdGUsIGRubCwgY29sb3IgPSBMb2NhdGlvbikpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+TG9jYXRpb24sIG5jb2wgPSAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgo=