feat. 서울시설공단 공영주차장 잔여주차 가능 대수
서울 시내에 갈 일이 생겼습니다. 차를 가지고요.
교통 체증이야 각오하고, 차를 주차할 자리가 있는지부터 알아봅니다.
지도 앱으로 찾아보니 목적지 근방에 사설 주차장이 있긴 한데 시내 요지라 그런지 요금이 만만치가 않습니다.
주변부까지 조금 더 검색범위를 넓혀보니 걸어갈 만한 거리에 공영주차장이 있었습니다. 주차요금은 절반에서 1/4정도 되네요.
공영주차장은 웹사이트를 통해 주차 가능대수가 실시간으로 조회되기까지 하니 좋습니다. (2019년 8월 현재 32개소)
https://www.sisul.or.kr/open_content/parking/guidance/useable.jsp
참 좋은 기능인데 정작 며칠 뒤에 상황이 어찌 변할지 모르고, 당일에 출발하면서 확인하고 가더라도 막상 도착하는 시각에는 가능대수가 변할 게 분명합니다.
도착하는 그 시각에 제 자리 있나요?
그래서,
그날까지 데이터를 모아보기로 했습니다.
HTML페이지를 마우스로 드래그 해서 복사&엑셀에 붙여넣기 하고, 잠시 후 새로고침하면서 작업을 반복하면 어렵지 않습니다. 그런데 몇번이나 할 수 있을까요. 지금부터 웹사이트에서 눈을 떼지 않고 로봇처럼 Ctrl+C, Ctrl+V 계속 무한 반복? 아니면 생각날 때마다 한번씩? 방법은 여러 가지니까 아무튼 데이터를 모아봅시다.
웹사이트의 표 내용 그대로에 더해 수집 시점도 datetime이라는 이름으로 붙여줬네요. 시시각각 변하는 데이터니까요.
크롤링 혹은 스크래핑이라고 부르는 기법에 대해서는 'How to 문제해결'에 별도 글로 발행할 예정입니다.
여기서는 데이터에 관한 내용을 우선 정리해보겠습니다.
플롯(plot)을 그리는 방법은 다양하지만 이번에는 "googleVis" 라이브러리(googleVis examples)를 이용하여, charting이라는 이름으로 불러온 데이터 중 필요한 컬럼만 막대그래프로 만들어 보려고 합니다. 6만9천 줄까지는 필요치 않습니다. 하나의 시점에 모은 최근 데이터 32개만 가지고 작업을 시작합니다.
점선 이하는 코드와 설명을 섞어 쓰게 되어 박스(코드 스니펫), #(주석=설명), >(프롬프트=커맨드라인에 입력하는 코드)로 구분해뒀습니다.
그리고 dplyr을 로드해둬야 합니다.
library(googleVis)
Column <- gvisColumnChart(charting %>% select(주차장명, 주차면수, 잔여주차가능대수))
plot(Column)
Error in gvisCheckCoreChartData(data, xvar = xvar, yvar = yvar) :
Error: Your data has to have at least one numerical column.
# 데이터가 숫자 형태가 아니라며 에러가 나네요. str() 함수로 살펴보니 factor형입니다.
> str(charting)
'data.frame':32 obs. of 5 variables:
$ 번호 : Factor w/ 32 levels "1","10","11",..: 1 12 23 27 28 29 30 31 32 2 ...
$ 주차장명 : Factor w/ 32 levels "가양라이품","개화산역",..: 22 4 2 14 13 8 29 12 30 5 ...
$ 주차면수 : Factor w/ 31 levels "107","1092","1260",..: 18 31 14 26 12 19 8 7 17 22 ...
$ 잔여주차가능대수: Factor w/ 30 levels "1053","110","1137",..: 14 21 12 23 7 16 8 2 13 18 ...
$ datetime : chr "2019-08-09 01:10:19 KST" "2019-08-09 01:10:19 KST" "2019-08-09 01:10:19 KST" "2019-08-09 01:10:19 KST" ...
# as.numeric()으로 형변환을 해줍니다.
charting$주차면수 <- as.numeric(charting$주차면수)
charting$잔여주차가능대수 <- as.numeric(charting$잔여주차가능대수)
# charting$주차장명 <- as.character(charting$주차장명)
Column <- gvisColumnChart(charting %>% select(주차장명, 주차면수, 잔여주차가능대수))
plot(Column)
# 차트가 나타나긴 했는데, 한글로 된 '주차장명'이 제대로 표시가 안 됐네요. 옵션에서 인코딩을 UTF-8로 바꿔줍니다. {R 한글 깨짐, 인코딩, UTF-8}
> options(encoding = 'UTF-8')
# 그런 다음 위 코드 스니펫을 재실행하면
# 주차 면수 즉, capacity가 파란색이고 가능 대수(빈자리)가 빨간색인데 들쭉날쭉한 게 눈에 잘 안 들어옵니다. 차트 종류를 바꿔봅니다.
> Area <- gvisAreaChart(charting %>% select(주차장명, 주차면수, 잔여주차가능대수))
> plot(Area)
# 훨씬 낫습니다. 그런데 잔여 대수가 주차면수보다 많을 리가 없을 텐데요. y축 단위도 뭔가 이상하면서 익숙합니다. 주차장 개수와 동일하게 데이터 한 세트가 32줄로 이뤄져있는데 공교롭게도 그 언저리 숫자네요.
> str(charting)
'data.frame':32 obs. of 5 variables:
$ 번호 : Factor w/ 32 levels "1","10","11",..: 1 12 23 27 28 29 30 31 32 2 ...
$ 주차장명 : Factor w/ 32 levels "가양라이품","개화산역",..: 22 4 2 14 13 8 29 12 30 5 ...
$ 주차면수 : num 18 31 14 26 12 19 8 7 17 22 ...
$ 잔여주차가능대수: num 14 21 12 23 7 16 8 2 13 18 ...
# 데이터 자체가 문제였습니다. 저 위에 factor일 때와 값이 아예 달라졌네요. 숫자를 정확한 값으로 바꿔줍니다. {factor to integer r - Google Search} 가장 직관적인 솔루션은 문자형으로 먼저 변환 후 숫자로 한번 더 변환하는 것입니다.
# charting 데이터를 다시 불러온 뒤 실행(이미 데이터값에 오류가 생겼으므로)
charting$주차면수 <- as.numeric(as.character(charting$주차면수))
charting$잔여주차가능대수 <- as.numeric(as.character(charting$잔여주차가능대수))
# charting$주차장명 <- as.character(charting$주차장명)
Column <- gvisColumnChart(charting %>% select(주차장명, 주차면수, 잔여주차가능대수))
plot(Column)
# 32개 전부 주차면수가 가능대수보다 많고, y축도 1,000단위까지 늘었네요. 좀 더 적합한 영역차트로 변경하면
> Area <- gvisAreaChart(charting %>% select(주차장명, 주차면수, 잔여주차가능대수))
> plot(Area)
# 잘 된 것 같네요. 하지만 이는 현재 혹은 특정 시점의 상태를 시각화한 것이고, 이 작업을 시작했던 최초의 목적은 해결되지 않았습니다. 웹사이트로부터 데이터를 가져오는 것부터 해서 동일한 코드를 몇번 더 반복해보면 차트가 미세하게 변하긴 합니다.
# 오후 5시 무렵의 데이터를 확인 중이었고, 이전에 모아둔 데이터 중 새벽 5시의 한 세트(32행)를 가져와서 차트로 그려봤습니다. 새벽시간에는 상당수 주차장이 텅 비게 되는 걸 알 수 있습니다.
차트로 그려놓으니 뭔가 그럴싸해 보이기도 하고 원하는 시간대 주차현황을 알 수 없으니 별 소득이 없는 것도 같습니다. 여유가 된다면 위 차트를 시간단위로 모두 그려서 애니메이션처럼 만들어도 괜찮겠네요.
하지만 아직 소기의 목적을 달성하지 못했습니다.
며칠 뒤 제가 도착할 그 무렵
그 주차장에
제 자리 있나요?
다음 글 [생활 속 데이터분석] 주차장에 자리 있나요?(2/3)로 이어집니다.
※ 전체 코드 확인 및 복사가 필요한 분들을 위해 R Markdown 링크도 공유합니다.
-.NULL