본문 바로가기

R programming

ggmap을 활용해 지도 위에 장소표시하기

반응형

이번에 활용한 데이터는 앞에서 사용했던 공유자전거 데이터입니다.

 

해당 데이터에는 각 바이크 운행기록에 대여 장소와 반납 장소에 대한 위도,경도 정보를 포함하고 있습니다.

 

앞서 각 station별 대여횟수와 반납횟수를 막대그래프로 시각화 했다면,

이번 포스팅에서는 지도 위에 빈도에 따라 크기를 달리하여 시각화하고 싶었습니다.

 

먼저 데이터를 불러옵니다.

bike<-read.csv("sharebike.csv")
str(bike)

library(ggmap)
library(devtools)
library(ggplot2)

이후 필요한 라이브러리를 불러오고 앞서 google API키를 등록합니다.

 

register_google(key = "각자의 구글 API 키를 넣어주세요")  

 

이제 많은 데이터 중에서 필요한 컬럼만을 가져옵니다.

library(dplyr)
head(bike)

bike_start<-bike %>%
  select(Trip.ID,
         Trip.Route.Category,
         Passholder.Type,
         Starting.Station.ID,
         Starting.Station.Latitude,
         Starting.Station.Longitude)

bike_end<-bike %>%
  select(Trip.ID,
         Trip.Route.Category,
         Passholder.Type,
         Ending.Station.ID,
         Ending.Station.Latitude,
         Ending.Station.Longitude)

저는 데이터를 2개로 분할하여 저장했습니다.

Starting station ID와 위도 경도.

Ending station ID와 위도 경도를 따로 분할했습니다.

bike_start$lat<-bike_start$Starting.Station.Latitude
bike_start$lon<-bike_start$Starting.Station.Longitude

bike_end$lat<-bike_end$Ending.Station.Latitude
bike_end$lon<-bike_end$Ending.Station.Longitude

bike_start_sample<-head(bike_start,100)

bike_end_sample<-head(bike_end, 100)

컬럼의 이름이 너무 길다보니, 간단하게 줄여 새로운 컬럼을 생성했습니다.

이부분에서는 기존이름을 바꿔도 상관없습니다.

이 방식대로 하면 컬럼이 증가하다보니 데이터가 커지게 됩니다.

 

이후에 head를 사용해  데이터 1행부터 100행까지

총 100개에 대한 운행기록을 불러와 샘플로 저장했습니다.

 

str(bike)라는 명령어를 입력해보면 대략 12만 개의 행을 확인할 수 있습니다.

12만 개를 모두 쓰려고 했더니 제 랩탑에서는 감당이 안되어,

부득이하게 100개만 저장합니다.

또 이렇게 랜덤하지 않게 데이터를 추출하면

향후 이 데이터를 활용해 데이터분석을 진행할 경우

통계적인 오류가 발생할 가능성이 많지만, 이러한 형태로 진행된다고만 이해해주세요.

 

head(bike_start_sample)

la<-get_googlemap('Losangeles',zoom=14,maptype="roadmap")

la2<-ggmap(la)+geom_point(data=bike_start_sample,
                     aes(x=lon,
                         y=lat,
                         size=Starting.Station.ID),
                     alpha=0.3,
                     color="red")
la2

 

LA시내의 지도를 la라는 변수로 저장하고

거기에 geom_point라는 함수를 사용해 위도와 경도를 지정하고,

크기는 스테이션 ID로 지정합니다. 이러면 빈도에 따라 사이즈가 적용됩니다.

 

la2를 입력하게 되면 다음과 같은 지도를 확인할 수 있습니다.

같은 방식으로 반납이 이루어진 데이터를 진행해봅니다.

 

la3<-ggmap(la)+geom_point(data=bike_end_sample,
             aes(x=Ending.Station.Longitude,
                 y=Ending.Station.Latitude,
             size=Ending.Station.ID), alpha=0.3, color="blue")

la3

 

동일한 방식으로 입력을 하게 된다면 반납이 행해진 장소와 빈도에 따른 크기를 지도 위에서 확인할 수 있습니다.

 

 

다음 목표는 이런 시각화 지도를 인터렉티브 지도로 만들어 줌인, 줌아웃 등의 기능과 함께

마우스 포인트 이동에 따라 각 포인트의 디테일한 수치를 확인할 수 있게 만들어보려고합니다...

무한구글링할 예정

 

아 그리고 shiny 라이브러리를 활용해 웹에서도 시각화 정보를 확인할 수 있게 하려고 합니다.

shiny 어렵더라구요...

 

해당 포스팅에 질문 있으시면 댓글 남겨주세요 ^^

 

 

반응형