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=