xwMOOC 데이터 저널리즘
측정소 위치 - 대한민국
1. 공기 불평등 민주화
공기질이 삶의 질에 영향을 지대하게 미친다. 깨끗한 공기는 건강과 직결된다. 공기 불평등과 투쟁을 선언한 OpenAQ(Open Air Quality) “2018-01-29” 기준 64개국에 설치된 8,254개 측정솔ㄹ 통해 155,673,930 공기품질 측정값을 수집하여 제공하고 있다.
2. 대한민국 측정소 현황
공기질 측정소 현황은 한국환경공단 Air Korea 홈페이지 통계정보 → 대기환경 연월보에서 대기환경 연보 최신 2016년 다운로드 받으면 구할 수 있다. 데이터가 깔끔(tidy)하지 않은 더러운(messy) 형태라 tidyverse
다양한 기능을 활용하여 정제작업을 거친다.
# 0. 환경설정 ------
library(tidyverse)
library(readxl)
library(purrr)
library(xts)
library(leaflet)
library(crosstalk)
library(DT)
# 1. 데이터 가져오기 -----
read_excel("data/air_korea_2016/부록14.대기오염측정망 제원_170927.xls", sheet="2016년", skip=4)
loc_dat <-
names(loc_dat) <- c("시도", "도시", "측정소코드", "측정소명", "주소", "longitude_DMS", "latitude_DMS", "비고")
# 2. 데이터 변환 -----
loc_dat %>%
대기_df <- filter(row_number() <= 281) %>%
mutate(측정기능 = "도시대기")
loc_dat %>%
도로_df <- filter(row_number() >= 287,
row_number() <= 326) %>%
mutate(측정기능 = "도로변대기")
loc_dat %>%
배경농도_df <- filter(row_number() >= 330,
row_number() <= 334) %>%
mutate(측정기능 = "국가배경농도")
loc_dat %>%
교외대기_df <- filter(row_number() >= 340,
row_number() <= 358) %>%
mutate(측정기능 = "교외대기")
loc_dat %>%
중금속_df <- filter(row_number() >= 364,
row_number() <= 421) %>%
mutate(측정기능 = "대기중금속")
loc_dat %>%
광화학_df <- filter(row_number() >= 427,
row_number() <= 446) %>%
mutate(측정기능 = "광화학오염")
loc_dat %>%
유해물질_df <- filter(row_number() >= 451,
row_number() <= 483) %>%
mutate(측정기능 = "유해대기물질")
loc_dat %>%
산성강하_df <- filter(row_number() >= 489,
row_number() <= 528) %>%
mutate(측정기능 = "산성강하물")
loc_dat %>%
대기오염집중_df <- filter(row_number() >= 534,
row_number() <= 539) %>%
mutate(측정기능 = "대기오염집중")
loc_dat %>%
PM25_df <- filter(row_number() >= 545,
row_number() <= 579) %>%
mutate(측정기능 = "PM25")
loc_dat %>%
종합대기_df <- filter(row_number() >= 585,
row_number() <= 599) %>%
mutate(측정기능 = "종합대기")
# 3. 데이터 취합 -----
mget(ls(pattern="_df"))
tmp <-
map_df(tmp, bind_rows)
air_df <-
# 4. 데이터 정제 -----
air_df %>%
air_df <- filter(측정소명 != "측정소명",
!is.na(측정소명)) %>%
mutate(시도 = na.locf(시도),
na.locf(도시),
도시 = na.locf(측정소코드),
측정소코드 = na.locf(측정소명)) 측정소명 =
3. 측정 기능별 측정소 위치 시각화
총 12 개 기능을 갖는 다양한 공기품질 측정소가 전국에 산재하여 있다. 하지만, 측정소 위치가 도분초로 되어 있어 이를 도로 변환하는 과정을 거친다.
그리고 나서, crosstalk
기능을 추가하여 leaflet
에서 공기품질 측정기능별로 측정소 위치를 파악할 수 있도록 작업한다.
# 1. 데이터 정제: 도분초 --> 도 변환 -----
air_df %>%
air_df <- tidyr::separate(longitude_DMS, into=c("경도_도", "경도_분", "경도_초"), sep=" ") %>%
tidyr::separate(latitude_DMS, into=c("위도_도", "위도_분", "위도_초"), sep=" ") %>%
mutate(longitude = as.numeric(경도_도) + as.numeric(경도_분)/60 + as.numeric(경도_초)/3600) %>%
mutate(latitude = as.numeric(위도_도) + as.numeric(위도_분)/60 + as.numeric(위도_초)/3600)
# 2. 공간정보 시각화 -----
## 2.1. 공유 데이터
SharedData$new(air_df)
air_sd <-
## 2.2. 제어
filter_checkbox("측정기능", "대기오염측정망 제원", air_sd, ~측정기능, inline = TRUE)
## 2.3. 공간 정보 시각화
leaflet(data = air_sd) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addMarkers(popup = ~ as.character(paste0("<strong>", paste0("측정소명: ", 측정소명), "</strong><br><br>",
"-----------------------------------------------------------<br>",
"· 측정기능: ", 측정기능, "<br>",
"· 시도: ", 시도, "<br>",
"· 도시: ", 도시, "<br>",
"· 주소: ", 주소, "<br>"
)))
3. 측정 기능별 측정소 위치 상세
층정 기능별 측정소 상세정보를 표로 살펴보자.
%>%
air_df select(측정기능, 시도, 도시, 측정소코드, 측정소명, 주소, 비고,
%>%
경도=longitude, 위도=latitude) DT::datatable(filter = "top") %>%
formatCurrency(c("경도", "위도"), currency="", digits=6)