미세먼지 시각화


목차

  1. 미세먼지 자료를 설치하기 위해 패키지 다운로드

  2. 미세먼지 사이트에서 미세먼지 자료 생성 및 지도 자료와 합치기

  3. 미세먼지 지도 그림 그리기

(4. 크롤링을 통해 실시간 지도 그림 그리기)


1. R 패키지 설치

패키지란?

누군가의 코드 보관함

#지도를 그릴 때 필요한 패키지
if(!require('leaflet.extras'))install.packages('leaflet.extras');library('leaflet.extras')
if(!require('leaflet'))install.packages('leaflet');library('leaflet')
if(!require('classInt'))install.packages('classInt');library('classInt')
if(!require('maps'))install.packages('maps');library('maps')
if(!require('rgdal'))install.packages('rgdal');library('rgdal')
if(!require('xml2'))install.packages('xml2');library('xml2')
if(!require('XML'))install.packages('XML');library('XML')
if(!require('maptools'))install.packages('maptools');library('maptools')

#미세먼지를 크롤링 할 때 필요한 패키지

if(!require('RSelenium'))install.packages('RSelenium');library('RSelenium')

2. 미세먼지 사이트에서 미세먼지 자료 생성 및 지도 자료와 합치기

에어코리아

에어코리아에서 아래와 같이 자료를 복사하자(ctrl+C).

복사한 자료를 엑셀에 붙여넣어보자(ctrl+V)

붙여 놓은 자료를 옆으로 이동시켜보자

파일형식을 CSV(쉼표로 분리) 로 바꾸어 보자.

\

\

\

setwd(choose.dir())
#C:/Users/OWNER/Desktop/
data=read.csv('통합 문서1.csv')
colnames(data)=c('',colnames(data)[-ncol(data)])

데이터를 원하는데로 형태 바꾸기

data=t(data)
data=data[-1,]
data=data.frame(area=rownames(data),HourMean=data[,1],stringsAsFactors = F)
rownames(data)=NULL
data$area=as.character(data$area)
data$HourMean=as.numeric(data$HourMean)


data
##    area HourMean
## 1  서울       15
## 2  부산       32
## 3  대구       27
## 4  인천       16
## 5  광주       13
## 6  대전       23
## 7  울산       25
## 8  경기       16
## 9  강원       18
## 10 충북       23
## 11 충남       19
## 12 전북       14
## 13 전남       10
## 14 세종       31
## 15 경북       29
## 16 경남       29
## 17 제주        7

위에서 생성한 자료가 지도자료와 합쳐지게 하자.

지도자료

setwd(choose.dir())
#C:/shp/CTPRVN_201703
map=readOGR('TL_SCCO_CTPRVN.shp',stringsAsFactors = F,verbose=FALSE)
map@data
##    CTPRVN_CD        CTP_ENG_NM     CTP_KOR_NM
## 0         11             Seoul     서울특별시
## 1         26             Busan     부산광역시
## 2         27             Daegu     대구광역시
## 3         28           Incheon     인천광역시
## 4         29           Gwangju     광주광역시
## 5         30           Daejeon     대전광역시
## 6         31             Ulsan     울산광역시
## 7         36         Sejong-si 세종특별자치시
## 8         41       Gyeonggi-do         경기도
## 9         42        Gangwon-do         강원도
## 10        43 Chungcheongbuk-do       충청북도
## 11        44 Chungcheongnam-do       충청남도
## 12        45      Jeollabuk-do       전라북도
## 13        46       Jellanam-do       전라남도
## 14        47  Gyeongsangbuk-do       경상북도
## 15        48  Gyeongsangnam-do       경상남도
## 16        50           Jeju-do 제주특별자치도

위에서 생성한 자료와 지도자료의 이름이 다르니 같게 수정해주자.

map@data$CTP_KOR_NM<-c('서울','부산','대구','인천','광주','대전','울산','세종','경기','강원','충북','충남','전북','전남','경북','경남','제주')
map=spTransform(map,"+init=epsg:4326")
map=spTransform(map,CRS("+proj=longlat +ellps=GRS80"))

미세먼지 자료(에어코리아)와 지도자료(지적도) 합치기

자료를 합치기 전과 후를 차이 비교해보자

map@data
##    CTPRVN_CD        CTP_ENG_NM CTP_KOR_NM
## 0         11             Seoul       서울
## 1         26             Busan       부산
## 2         27             Daegu       대구
## 3         28           Incheon       인천
## 4         29           Gwangju       광주
## 5         30           Daejeon       대전
## 6         31             Ulsan       울산
## 7         36         Sejong-si       세종
## 8         41       Gyeonggi-do       경기
## 9         42        Gangwon-do       강원
## 10        43 Chungcheongbuk-do       충북
## 11        44 Chungcheongnam-do       충남
## 12        45      Jeollabuk-do       전북
## 13        46       Jellanam-do       전남
## 14        47  Gyeongsangbuk-do       경북
## 15        48  Gyeongsangnam-do       경남
## 16        50           Jeju-do       제주
map@data=merge(map@data,data,by.x='CTP_KOR_NM',by.y='area',all=T)
map@data=map@data[order(map@data$CTPRVN_CD),]
map@data
##    CTP_KOR_NM CTPRVN_CD        CTP_ENG_NM HourMean
## 9        서울        11             Seoul       15
## 8        부산        26             Busan       32
## 6        대구        27             Daegu       27
## 12       인천        28           Incheon       16
## 5        광주        29           Gwangju       13
## 7        대전        30           Daejeon       23
## 11       울산        31             Ulsan       25
## 10       세종        36         Sejong-si       31
## 2        경기        41       Gyeonggi-do       16
## 1        강원        42        Gangwon-do       18
## 17       충북        43 Chungcheongbuk-do       23
## 16       충남        44 Chungcheongnam-do       19
## 14       전북        45      Jeollabuk-do       14
## 13       전남        46       Jellanam-do       10
## 4        경북        47  Gyeongsangbuk-do       29
## 3        경남        48  Gyeongsangnam-do       29
## 15       제주        50           Jeju-do        7

3. 불러온 자료를 통해 미세먼지 지도 그림 그리기

leaflet()%>%addTiles()

툴바 추가

map2=leaflet()%>%addTiles()%>%addDrawToolbar(editOptions=editToolbarOptions(selectedPathOptions=selectedPathOptions()))
 map2

지도 데이터를 시각화

p <- colorBin("YlOrRd", domain = map@data$HourMean, bins = 7)
map3=map2%>%addPolygons(data=map,color = ~p(HourMean),stroke=F, smoothFactor = 0.1,fillOpacity = .5)%>%
addLegend(data=map,pal=p,values=~HourMean,position = 'bottomright',title = date())
# map3

4. 크롤링(Web scraping)이란?

웹에서 데이터를 가져오는 코드

참고

크롤링을 하기전에

설치 자료

  1. 설치자료를 다운받는다.

  2. 관리자권한으로 명령프롬프트(cmd)를 실행한다.(반드시 관리자 권한으로 할 것)

  1. 위 이미지처럼 실행

명령프롬프트의 붙여넣기 : shift+insert (안될 수도 있음..안되면 .. 적으세요)

cd c:\selenium

java -Dwebdriver.gecko.driver=“geckodriver.exe” -jar selenium-server-standalone-3.9.1.jar -port 4445

위 그림과 같이 되었다면 크롤링을 해보자.

*만약 실행시 인터넷 창이 떴다 닫힌다면 크롬드라이버의 버전이 맞지 않으므로

https://sites.google.com/a/chromium.org/chromedriver/ 에서 자신에게 맞는 크롬 버전을 다운받자.

chrome://settings/help 을 클릭하면 크롬 버전을 확인 할 수 있다.

다운로드 클릭

인터넷을 실행하는 코드

# remDr<-remoteDriver(port=4446L,browser='chrome')
# remDr$open(silent = T)

위 방법이 불편하다면 R 내에서도 할 수 있다.

if(!require(rstudioapi))install.packages('rstudioapi');library(rstudioapi)
## Loading required package: rstudioapi
# myTerm <- rstudioapi::terminalCreate()
#   if (!rstudioapi::terminalRunning(myTerm)) {
#     rstudioapi::terminalActivate(myTerm, show = FALSE)
#     while (!rstudioapi::terminalRunning(myTerm)) {
#       Sys.sleep(0.1)
#     }
#   }
# rstudioapi::terminalSend(myTerm, "cd c:/selenium \n")
# rstudioapi::terminalSend(myTerm, 'java -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-3.9.1.jar -port 4446\n ')
# 
# remDr<-remoteDriver(port=4446L,browser='chrome')
# remDr$open(silent = T)
# 
# ### 인터넷 주소로 이동 한 후 표를 data에다가 가져오는 코드
# 
# url='https://www.airkorea.or.kr/web/sidoQualityCompare?itemCode=10007&pMENU_NO=101'
# remDr$navigate(url)
# source=remDr$getPageSource()[[1]]
# data=XML::readHTMLTable(source,stringsAsFactors = FALSE)[[1]]
# data
# map3
# terminalKill(myTerm)
# remDr$close()