변수명 | 변수 종류 | 변수 설명 | 샘플데이터 |
---|---|---|---|
지역 | 문자 | 시군구 | 서울 중구 |
망 | 문자 | 동일한 설치목적을 가진 측정소의 모임 (5종류) | 도시대기, 도로변대기, 교외대기, 국가배경농도, 항만 |
측정소코드 | 숫자 | 측정소코드 (6자리) | 111121 |
측정소명 | 문자 | 측정소명 | 중구 |
측정일시 | 숫자 | 년월일시간 | 2021100101 |
SO2 | 숫자 | 아황산가스 농도 (ppm) | 0.003 |
CO | 숫자 | 일산화탄소 농도 (ppm) | 0.5 |
O3 | 숫자 | 오존 농도 (ppm) | 0.002 |
NO2 | 숫자 | 이산화질소 농도 (ppm) | 0.038 |
PM10 | 숫자 | PM10 농도 (㎍/㎥) | 30 |
PM25 | 숫자 | PM2.5 농도 (㎍/㎥) | 17 |
주소 | 문자 | 주소 (구주소, 새도로명주소,…) | 서울 중구 덕수궁길 15 |
[출처: 대기환경연보 [본문1장-개요: 3.2]]
전국 측정소의 측정 자료에 대하여 관할기관(수도권대기환경청, 한국환경공단, 지자체 보건환경연구원)에서 1차 확정한 후, 국가대기오염 정보관리시스템(NAMIS)으로 전송한다. 국가대기오염 정보관리시스템(NAMIS)에 수집된 자료들은 국립환경과학원의 전산시스템으로 다시 전송되어 최종확정 및 통계 처리한 후 데이터베이스의 형태로 저장한다.
- 국가에서 관리하는 기준 대기오염물질 (primary criteria pollutant): PM10 (미세먼지), PM2.5 (초미세먼지), NO2 (이산화질소), SO2 (아황산가스), CO (일산화탄소), ozone (오존)
bash script를 이용해서 자동 다운로드를 할 수 있습니다.
request_endpoint = "https://www.airkorea.or.kr/jfile/readDownloadFile.do?fileId=1657eebba9237&fileSeq"
year=21
wget -P airkorea "$request_endpoint=$year" -O "$year.zip"
Untitled
Dropbox\0. source-data_pollutants
Untitled
Untitled
[출처: 대기환경연보 [부록 21.대기환경연보 통계처리 방법]]
국립환경과학원에서는 통계자료의 신뢰성 제고를 위하여, 통계처리 시 대상기간 중 75% 이상의 측정(통계)자료가 확보된 경우에만 통계자료를 산출한다(2001년 1월부터 적용).
가. 1시간 일ㆍ월ㆍ년 평균값 나. 8시간 평균값 다. 최고ㆍ최저값 라. 지역별(도시별) 평균값 마. 분위수(Percentile) 개념 도입 바. 대기오염 측정값의 유효자리수
[air pollution 대기오염자료 다운 및 가공_2021.08.docx](Home%206adb6f5afa8d491d9280b2d3509ef662/Group%20Projects%20df844ef409ed49dbb1356e3ab7c7e8bd/To-dos%20in%20exposure%20prediction%20(%E1%84%8C%E1%85%B5%E1%84%85%E1%85%B5%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%E1%84%80%E1%85%A8%E1%84%89%E1%85%A1%E1%86%AB-%E1%84%86%E1%85%A9%E1%84%92%E1%85%A7%200f9a7e7c00d1469480551a7c5d9611a2/air_pollution_%EB%8C%80%EA%B8%B0%EC%98%A4%EC%97%BC%EC%9E%90%EB%A3%8C_%EB%8B%A4%EC%9A%B4_%EB%B0%8F_%EA%B0%80%EA%B3%B5_2021.08.docx)
코드
다운 받은 원천데이터 파일 형식 및 변수 형식을 동일하게 수정하여 정제데이터로 저장한다.
주의: 에어코리아의 확정자료는 담당자가 바뀔 때 마다 새롭게 거의 모든 데이터를 업데이트 하기도 한다. 이 때, 코딩의 차이나 에러로 연도별 파일명 및 형식, 각 변수명, 변수값 형식 등이 달라 질 수 있기에 다운받은 파일은 아래의 체크리스트 항목을 참고하여 수동으로 하나씩 직접 파일을 열어 확인해야한다.
번호 | 항목 | 확인 유/무 | 비고 |
---|---|---|---|
0 | 과거 원천데이터와 파일명, 파일형식이 동일한가? | 동일하다면 과거 코딩 활용 가능성이 높아질 수 있음 | |
1 | 파일 형식이 csv인가? xlsx인가? | ||
2 | 자료가 월별로 주어졌는가? | ||
3 | 연도별 파일명이 띄어쓰기가 포함되어 있는가? | ||
4 | 분기별 또는 월별 파일명에 “0”이 포함되어 있는가? | ||
5 | 연도별 각 파일의 변수명이 동일한가? | ||
6 | 연도별 파일의 변수명이 동일한가? | ||
7 | 연도별 각 파일의 측정일시 변수값 포맷이 동일한가? | ||
8 | 연도별 측정일시 변수값 포맷이 동일한가? | ||
9 | 측정일시 변수값이 YYYYMMDDHH인가? | ||
10 | 측정일시의 마지막 두 값의 범위가 01-24인가? |
Untitled
2004년4분기 파일 - 변수명 변경: DATA_TINE -> 측정일시0
2004년1~3분기 파일 - 변수명 변경: 측정일시 -> 측정일시0
포맷을 동일하게 맞추기 위해서 “측정일시” 변수 생성: (측정일시0) YYYY-MM-DD HH -> (측정일시) YYYYMMDDHH
setwd("E:\\works\\SYK_공간지리정보데이터 파이프라인\\Preprocessing\\Air pollution")
library(readxl)
### 파일 특성에 따라서 분류
##2001~2013: xlsx, 분기, 띄어쓰기 없음, 01~04
##2004: xlsx, 분기, 띄어쓰기 없음, 01~04 & 변수명과 포맷 변경
year <- c(2001:2013)
for (i in 1:length(year)){
route1 <- paste0("source data\\",rep(year[i], each = 4),"년0", 1:4, "분기.xlsx")
df.list0 <- lapply(route1, read_excel)
df.list <- lapply(df.list0,data.frame)
if (year[i]==2004) {
# 2004년04분기 "DATA_TINE" -> "측정일시"
colnames(df.list[[4]])[4] <- "측정일시" }
raw.year <- do.call(rbind,df.list)
colnames(raw.year) <- c("area", "name","TMSID","date0","SO2","CO","O3","NO2","PM10","address")
if (year[i]==2004) {
colnames(raw.year) <- c("area","TMSID","name","date0","SO2","CO","O3","NO2","PM10","address")
# 변수 포맷 변경 "측정일시": YYYY-MM-DD HH -> YYYYMMDDHH
raw.year$date0 <- gsub("-","",raw.year$date0)
raw.year$date0 <- gsub(" ","",raw.year$date0) }
path0 <- paste0("processed data\\test\\airkorea_hourly_",year[i],".csv")
write.csv(raw.year,file=path0,row.names=F)
}
##2014~2016: csv, 분기, 띄어쓰기, 1~4
##2015: 수동으로 이름 변경 - 띄어쓰기 X -> 띄어쓰기 삽입
year <- c(2014:2016)
for (i in 1:length(year)){
route1 <- paste0("source data\\",rep(year[i], each = 4),"년 ", 1:4, "분기.csv")
# 2015: “fileEncoding = "euc-kr"” 인지 못함
if (year[i]==2015) {
df.list0 <- lapply(route1,read.csv,header=T) }
df.list0 <- lapply(route1,read.csv,header=T, fileEncoding = "euc-kr")
df.list <- lapply(df.list0,data.frame)
raw.year <- do.call(rbind,df.list)
#2001~2013과 행이름 순서 다름
colnames(raw.year) <- c("area","TMSID","name","date0","SO2","CO","O3","NO2","PM10","PM25","address")
path0 <- paste0("processed data\\airkorea_hourly_",year[i],".csv")
write.csv(raw.year,file=path0,row.names=F)
}
##2017: xlsx, 월, 띄어쓰기, 1~12
year <- c(2017)
route1 <- paste0("source data\\",rep(year, each = 12),"년 ", 1:12, "월.xlsx")
df.list0 <- lapply(route1, read_excel)
df.list <- lapply(df.list0,data.frame)
raw.year <- do.call(rbind,df.list)
colnames(raw.year) <- c("area","type","TMSID","name","date0","SO2","CO","O3","NO2","PM10","PM25","address")
path0 <- paste0("processed data\\airkorea_hourly_",year,".csv")
write.csv(raw.year,file=path0,row.names=F)
##2018년: xlsx, 분기, 띄어쓰기, 1~4
##2018년 1-2분기: "망" 변수 없음
year <- c(2018)
route1 <- paste0("source data\\",rep(year, each = 4),"년 ", 1:4, "분기.xlsx")
df.list0 <- lapply(route1, read_excel)
df.list <- lapply(df.list0,data.frame)
##2018년 1-2분기: "망" 변수 없음
# get all variable names
allNms <- unique(unlist(lapply(df.list, names)))
raw.year <- do.call(rbind,
lapply(df.list,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))))
colnames(raw.year) <- c("area","TMSID","name","date0","SO2","CO","O3","NO2","PM10","PM25","address","type")
path0 <- paste0("processed data\\airkorea_hourly_",year,".csv")
write.csv(raw.year,file=path0,row.names=F)
##2019~2020: xlsx, 월, 띄어쓰기, 1~12
year <- c(2019:2020)
for (i in 1:length(year)){
route1 <- paste0("source data\\",rep(year[i], each = 12),"년 ", 1:12, "월.xlsx")
df.list0 <- lapply(route1, read_excel)
df.list <- lapply(df.list0,data.frame)
raw.year <- do.call(rbind,df.list)
colnames(raw.year) <- c("area","type","TMSID","name","date0","SO2","CO","O3","NO2","PM10","PM25","address")
path0 <- paste0("processed data\\airkorea_hourly_",year[i],".csv")
write.csv(raw.year,file=path0,row.names=F)
}
변수명 (영문) | 변수명 (국문) | 변수 종류 | 변수 설명 | 샘플데이터 | 비고 |
---|---|---|---|---|---|
sigungu | 지역 | 문자 | 시군구 | 서울 중구 | |
type | 망 | 문자 | 동일한 설치목적을 가진 측정소의 모임 (5종류) | 도시대기, 도로변대기, 교외대기, 국가배경농도, 항만 | 2017~ |
TMSID | 측정소코드 | 숫자 | 측정소코드 (6자리) | 111121 | |
name | 측정소명 | 문자 | 측정소명 | 중구 | |
date0 | 측정일시 | 숫자 | 년월일시간 | 2021100101 | |
SO2 | SO2 | 숫자 | 아황산가스 농도 (ppm) | 0.003 | |
CO | CO | 숫자 | 일산화탄소 농도 (ppm) | 0.5 | |
O3 | O3 | 숫자 | 오존 농도 (ppm) | 0.002 | |
NO2 | NO2 | 숫자 | 이산화질소 농도 (ppm) | 0.038 | |
PM10 | PM10 | 숫자 | PM10 농도 (㎍/㎥) | 30 | |
PM25 | PM25 | 숫자 | PM2.5 농도 (㎍/㎥) | 17 | 2014~ |
address | 주소 | 문자 | 새도로명 주소 | 서울 중구 덕수궁길 15 |