대기오염농도_에어코리아확정자료_대기오염농도

원천 데이터 변수 정의서

변수명 변수 종류 변수 설명 샘플데이터
지역 문자 시군구 서울 중구
문자 동일한 설치목적을 가진 측정소의 모임 (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. 원천 데이터 획득

1.1 원천 데이터 소개

[출처: 대기환경연보 [본문1장-개요: 3.2]]

전국 측정소의 측정 자료에 대하여 관할기관(수도권대기환경청, 한국환경공단, 지자체 보건환경연구원)에서 1차 확정한 후, 국가대기오염 정보관리시스템(NAMIS)으로 전송한다. 국가대기오염 정보관리시스템(NAMIS)에 수집된 자료들은 국립환경과학원의 전산시스템으로 다시 전송되어 최종확정 및 통계 처리한 후 데이터베이스의 형태로 저장한다.

  • 국가에서 관리하는 기준 대기오염물질 (primary criteria pollutant): PM10 (미세먼지), PM2.5 (초미세먼지), NO2 (이산화질소), SO2 (아황산가스), CO (일산화탄소), ozone (오존)

1.2 원천 데이터 획득 및 저장

  • 수동 다운로드: 에어코리아 사이트에서 연도별 확정자료 다운로드

에어코리아

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

1.3 원천 데이터 형태 및 특성

Untitled

  • 확정 자료 통계처리 방법

[출처: 대기환경연보 [부록 21.대기환경연보 통계처리 방법]]

국립환경과학원에서는 통계자료의 신뢰성 제고를 위하여, 통계처리 시 대상기간 중 75% 이상의 측정(통계)자료가 확보된 경우에만 통계자료를 산출한다(2001년 1월부터 적용).

가. 1시간 일ㆍ월ㆍ년 평균값 나. 8시간 평균값 다. 최고ㆍ최저값 라. 지역별(도시별) 평균값 마. 분위수(Percentile) 개념 도입 바. 대기오염 측정값의 유효자리수

2. 과거 원천 데이터와의 차이점

2.1 과거 메뉴얼 및 코드

[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)

코드

2.2 업데이트 항목 및 내용

  • 자료 구성 (연도별, 측정소 유형별 등), 파일 이름, 변수이름, 코딩값의 업데이트되는 연도별 차이

3. 전처리 방법

다운 받은 원천데이터 파일 형식 및 변수 형식을 동일하게 수정하여 정제데이터로 저장한다.

3.1 체크리스트

주의: 에어코리아의 확정자료는 담당자가 바뀔 때 마다 새롭게 거의 모든 데이터를 업데이트 하기도 한다. 이 때, 코딩의 차이나 에러로 연도별 파일명 및 형식, 각 변수명, 변수값 형식 등이 달라 질 수 있기에 다운받은 파일은 아래의 체크리스트 항목을 참고하여 수동으로 하나씩 직접 파일을 열어 확인해야한다.

번호 항목 확인 유/무 비고
0 과거 원천데이터와 파일명, 파일형식이 동일한가? 동일하다면 과거 코딩 활용 가능성이 높아질 수 있음
1 파일 형식이 csv인가? xlsx인가?
2 자료가 월별로 주어졌는가?
3 연도별 파일명이 띄어쓰기가 포함되어 있는가?
4 분기별 또는 월별 파일명에 “0”이 포함되어 있는가?
5 연도별 각 파일의 변수명이 동일한가?
6 연도별 파일의 변수명이 동일한가?
7 연도별 각 파일의 측정일시 변수값 포맷이 동일한가?
8 연도별 측정일시 변수값 포맷이 동일한가?
9 측정일시 변수값이 YYYYMMDDHH인가?
10 측정일시의 마지막 두 값의 범위가 01-24인가?

3.2 원천 데이터 전처리

  1. 자료 다운로드: 각 연도별 압축파일 클릭 다운로드
  • 다운 일시: 2022-05-26
  • 자료 기간: 2001년01분기~2021년 10월
  • 각 연도별 자료 압축 풀기 (연도별 폴더 생성 또는 전체 폴더에 파일명 압축 풀기)

Untitled

  1. 원천 데이터 특성
  1. 형식
  • 포맷, 파일명단위, 파일명 (띄어쓰기, 숫자 형식 등) 확인

제목 없는 데이터베이스

  1. 변수
  • 변수명 동일성과 유/무 확인
  • 수동으로 (또는 코딩을 통해서) 각 파일 확인 필요

제목 없는 데이터베이스

  1. 변수값
  • “지역”: 2001~2003, 2005, 2007~2016- only “서울”

제목 없는 데이터베이스

  1. 파일별 변수값 summary 등 확인하여 변수명, 변수값 포맷 등 변경
  1. 수동 정제
  • 2019년 1월 자료에 2월 자료가 포함되어 있음 => 2월 값을 지우고 정제데이터에 2019년 1월.xlsx로 저장
  • 2004년 파일 => 정제데이터에 2004년1분기.xlsx, 2004년2분기.xlsx , 2004년3분기.xlsx , 2004년4분기.xlsx 로 저장
  1. 2004년4분기 파일 - 변수명 변경: DATA_TINE -> 측정일시0

  2. 2004년1~3분기 파일 - 변수명 변경: 측정일시 -> 측정일시0

  3. 포맷을 동일하게 맞추기 위해서 “측정일시” 변수 생성: (측정일시0) YYYY-MM-DD HH -> (측정일시) YYYYMMDDHH

  1. 코딩 및 병합
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)
}

정제 데이터 저장

  • **위치: Dropbox\1. processed-data_pollutants**
  • 자료명: airkorea_hourly_year.csv (예: airkorea_hourly_2008.csv)

정제 데이터 변수 정의서

변수명 (영문) 변수명 (국문) 변수 종류 변수 설명 샘플데이터 비고
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

참고 자료 및 문헌

원천자료:

에어코리아

대기환경연보:

에어코리아