시각화/R

▶R로만드는 데이터시각화 :: ggmap응용 - 항공노선시각화

비주얼라이즈 2014. 3. 28. 14:24













R로 만드는 데이터시각화 :: ggmap -  항공노선 시각화




인상깊었던 TED 강의 중하나가 바로

[Aaron Koblin: Visualizing ourselves ... with crowd-sourced data]였습니다.


[사진: 아론코블린 홈페이지]


아론코블린이 TED강연에서 보여준 시각화입니다.

이 시각화 직관적으로 미 항공노선의 패턴을 이해할 수 있는데요~



일일이 공항의 이름, 비행기 출도착 시간, 횟수 등을 들여다보지 않아도

'미국 항공의 비행패턴'에 대해 살펴볼 수 있도록 해줍니다.^^



그런데 최근 R공부를 하던 중, 한 블로그에서 

이와 관련한 예제를 보게 되었습니다.




[wsyang.com 블로그]


이 블로그에서는 openflights.org 라는 사이트도 함께 소개해주었는데요~

전 세계 공항, 항공노선 등에 대한 정보를 담고 있는 사이트였습니다.^^





[wsyang.com 블로그]


결과물의 모습인데요~

 친절하게도 포스팅에 사용된 코드를 함께 공개해주었습니다!


정말 감사함을 느끼며 복사 + 불어넣기 + 실행이아닌

한줄 한줄 코드를 직접 타이핑을 해가며 공부를 했습니다.




*****

이번 포스팅은 앞서 말한대로

wsyang.com에서 소개하는 예제를 바탕으로 진행된다는 것을

분명히해봅니다!

*****





1. 데이터 다운로드


블로그에서 소개해준 사이트에서 직접 다운로드 받았습니다.

aiport의 정보와 route의 정보파일입니다.



airports.dat


routes.dat


[데이터 출처 : openflights.org]



데이터를 다운로드 받았다면

R-Studio를 실행해줍니다.



2. 패키지 로드


이번 예제에서 활용할 패키지는

'ggmap'입니다.


library(ggmap)

[설치가 안되었다면 install.packages("ggmap")]



3. 코드 작성



airport <- read.csv("airports.dat", sep=",", header=F, stringsAsFactor = F)

route <- read.csv("routes.dat", sep=",", header=F, stringsAsFactor = F)


데이터를 불러온다음 확인해보면,

열의 이름이 아래와같이 V1,V2…이런 식으로 부여되어있습니다.




이중에서 불필요한 정보를 제거하고, 시각화에 필요한 열만 가져와야겠습니다.


airport <- airport[airport$V5!='', c('V3', 'V4', 'V5', 'V7', 'V8')]



좀전과 다르게 지정한 열들만으로 airport가 구성되었습니다.







이번에는 V3, V4등으로 되어있는 열 제목을

변경해줍니다.


names(airport) <- c("City", "Country", "IATA", "lantitude", "longitude")


변경 결과는 아래와 같습니다.




시각화를 위한 적절한 형식으로 변경이 되었습니다^^

마찬가지로 route도 동일한 방법으로 다듬어줍니다.





route <- route[c('V1', 'V3', 'V5')]

names(route) <- c("Airline", "Departure", "Arrival")



마찬가지로 잘 정리가 되었습니다.



airport.krjp <- subset(airport, Country %in% c("South Korea", "Japan"))

route.krjp <- subset(route, (Departure %in% airport.krjp$IATA & Arrival %in% airport.krjp$IATA))


첫 번째 줄은, 한국공항과 일본공항만 선택합니다.

두 번째 줄은, 두 공항을 오가는 노선만을 선택합니다.



findposition <- function(IATA) {

find <- airport.krjp$IATA==IATA

x <- airport.krjp['find','longitude']

y <- airport.krjp['find', 'lantitude']

return(data.frame(x,y)) }


각 노선의 출발/도착 지점의 위도와 경도를 구합니다.



from <- lapply(route.krjp$Departure, findposition)

from <- do.call('rbind', from)

from$group <- c(1:nrow(from))

names(from) <- c("longitude",'lantitude','group')


출발공항의 위도와 경도를 구하는 부분입니다.


to <- lapply(route.krjp$Arrival, findposition)

to <- do.call('rbind', to)

to$group <- c(1:nrow(to))

names(to) <- c('longitude','lantitude','group')

data.line <- rbind(from,to)



착륙공항의 위도와 경도를 구하는 부분입니다.


Arriving.freq <- data.frame(table(route.krjp$Arrival))

names(Arriving.freq) <- c('IATA', 'Freq')

airport.krjp <- merge(airport.krjp, Arriving.freq, by = c("IATA"), all=T)

airport.lkrjp <- airport.krjp[order(airport.krjp$Freq, decreasing=T),]



항공노선의 착륙도수를 구하는 부분입니다.





4. 지도 그리기



 map <- ggmap(get_googlemap(center = c(lon=134, lat=36),

zoom=5, maptype='roadmap', color='bw', scale='2'), extent='device')


map + geom_point(data=airport.krjp, aes(x=longitude, y=lantitude, size=Freq),

colour = 'gray10', alpha=0.3) +

geom_line(data=data.line, aes(x=longitude, y=lantitude, group=group),

size=0.2, alpha=.1, color = '#816960') +

scale_size(range=c(0,15)) + theme(legend.position="none")



이렇게 입력하면 아래와같은 결과 창을 보실 수 있습니다.







마지막으로 일러스트레이터로 보정을 해보겠습니다^^