ggmap을 사용하여 서울 지하철 역 위치 및 사용자 수 표시

2019.05.07 01:23R/Advanced

서울 지하철역의 위치에 따른 역 사용자 수를 시각적으로 파악하려면 어떻게 해야 할까?

역의 위치 정보와 사용자 수 정보를 각각 획득한 후 ggmap을 통하여 분류하면 될 것 같다

우선 지하철 역의 주소를 찾아 보자 

http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12035&srvType=A&serviceKind=1

불러오는 중입니다...

위 데이터를 불러온 후 역명, 호선, 주소를 가져온다

 

library(tidyverse)
library(ggmap)
library(readxl)

#########################################
# import subway address

setwd('e:/R_study')
raw.subway = read_excel('seoul_subway_address.xlsx')
View(raw.subway)
head(raw.subway)

subway.add = raw.subway %>% 
  select(c(3,2,6)) %>% 
  rename(line = 호선, station = 역명, address = 상세주소) %>% 
  separate(address, c('address', 'etc'), sep = '[(]') %>% 
  select(-etc)

한글 주소에서 geocode를 사용하여 경도와 위도를 얻은 후 col bind를 진행 해보자

 

 
#########################################
# generate coordinate with geocode 

register_google(key='구글맵 API를 여기에 입력') 
coordinate = subway.add$address %>% enc2utf8() %>% geocode()

## merging 

subway.lon.lat = bind_cols(subway.add, coordinate)
subway.lon.lat

위경도 정보를 얻었으니, 서울 지도를 불러 온 후 위치를 표시해 보자

#########################################
# display subway position on map 

map.seoul = get_googlemap('seoul',
                          maptype = 'roadmap',
                          zoom = 11)
ggmap(map.seoul) + geom_point(data = subway.lon.lat, 
                              aes(x = lon, y = lat), color = 'blue')

지하철 별 사용자 수 데이터를 가져와 보자

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

이 데이터를 R로 불러온 후 날짜, 호선, 역명, 구분, 합계 데이터로 새로운 Tibble을 생성한다

 

#########################################
# import subway transforting capability 

raw.pop = read.csv('subway_pop.csv') %>% as.tibble
subway.pop = raw.pop %>% 
  select(-c(6:25), -3) %>% 
  rename(date = 날짜, line = 호선, station = 역명, type = 구분, pop = 합.계) %>% 
  separate(line, c('line', 'etc'), sep = 1) %>% 
  select(-etc)
subway.pop
subway.lon.lat[1,2] <- '서울역'
subway.lon.lat

위경도 데이터와 사용자수 데이터를 left_join으로 병합한다

상하차 수 중 하차 데이터만 filter로 가져온다

#########################################
# left join coordinate and popuation

subway.merged = left_join(subway.pop, subway.lon.lat, by = c('station')) %>% na.omit()
subway.merged

subway.final = subway.merged %>% 
  filter(line.x == line.y) %>%
  filter(type == '하차') %>% 
  select(-line.y) %>% 
  rename(line = line.x)

subway.final$date = as.Date(subway.final$date)
subway.final$line = as.factor(subway.final$line)

사용자수와 경위도 정보를 ggmap을 사용하여 표시해보자

#########################################
# display subway position on map 

subway.final

map.seoul = get_googlemap('seoul',
                          maptype = 'roadmap',
                          zoom = 11)
ggmap(map.seoul) + geom_point(data = subway.final, 
                              aes(x = lon, y = lat, size = pop, color = 'blue'))

역의 위치를 표시하는 점의 크기로 내리는 사용자의 수를 알 수 있다