2014년 8월 27일 수요일

서울 시내 콜택시 이용현황 Visualization

SKT 빅데이터허브에 올라와 있는 "콜택시 이용자료"를 기반으로 서울시내 콜택시 이용 현황을 시각화 해봤다.

우선 데이터는 아래와 같이 발신지별 통화량 데이터를 나타내고 있다.


텍스트 데이터를 geocoding하고 google map을 이용하여 시각화.

library(ggmap)

# geocode를 이용하여 주소 텍스트를 WGS84 좌표계 (longitude, latitude)로 변환한다
# geocode Test 
geocode("도곡동 강남구")

f <- file('seoul_calltaxi.csv', open="r", encoding="UTF-8")
df <- read.table(f, sep=',', dec=',', header=FALSE)
head(df)
df<-df[,c(-1, -2)]
head(df)
colnames(df) = c("gu", "dong", "callcount")

# "XX동 XX구 형태로 geocode를 호출하여 해당 주소지의 longitude, latitude return
df <- cbind(df, geocode(paste(df$dong, " ", df$gu)))
head(df) 

# Map drawing
cent <- c(mean(df$lon), mean(df$lat))
map <- ggmap(get_googlemap(center=cent, zoom=11), extent="device", 
             maptype="roadmap",
             base_layer=ggplot(df, aes(x=lon, y=lat, size=callcount)))
map + geom_point(color="red", alpha=0.8)


결과물은 아래.
데이터량이 많지 않았지만.....
교통이 그다지 좋지 않은 노원구 일대와,
아마도 귀가를 위해 콜택시를 불렀을 것 같은 강남구 일대에 콜택시를 부르기 위한 통화가 많은 것을 알 수 있다.

(클릭하면 확대됨)


2014년 8월 16일 토요일

수도권 지하철 역별 시간대별 혼잡도 Visualization (2)

수도권 지하철 역별 시간대별 혼잡도 Visualization (1) 에 이어 데이터로 혼잡도 패턴에 따른 클러스터링을 해보기로 했다.
역별, 시간대별로 유사한 패턴이 일어나는 곳은 주거지역, 업무지역, 유흥가, 대학가 등등으로 분류가 될 것으로 예상했다.
우선 kmeans clustering시 클러스터간 거리의 합이 유의하게 줄어드는 지점을 찾기 위해 아래와 클러스터 개수별 거리의 합을 그래프로 그렸다.

# Data Import
d <- read.csv("subway_congestion.csv", header=FALSE, encoding="utf-8")
head(d)

# 3행을 header로 사용, 소문자로 변환
colnames(d) <- apply(d[2, ], 1, print)
colnames(d) <- tolower(colnames(d))

# 1,2행을 날리고 column명을 재지정하자
d <- d[c(-1,-2), ]

# 평일 데이터만 추리기
d <- d[d$day_of_wk == "평일", ]
head(d)

# 기준년도도 2013으로 동일하니 날리자.
d$year <- NULL

# 상/하행, 내/외선 이름 합치기
d$stn_nm <- paste(d$stn_nm, d$train_cs, sep=".")
d$train_cs <- NULL

head(d)

d3 <- d
# data frame의 column을 숫자 형태로 바꾸고, 데이터를 정규화
d3[, 1:20] <- sapply(d3, as.numeric)
d3 <- scale(d3) 
wss <- 0

# 그래프에서 거리의 제곱합이 최소가 되는 지점 (클러스터의 개수) 을 찾아야 한다. 
for(i in 1:15) wss[i] <- sum(kmeans(d3, centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Number of Clusters", ylab="Within group sum of squares")

약 4~5개 정도부터 유의하게 줄어드는 것으로 보고, 클러스터링 수행. 

#### Clustering
d3 <- d
d3$day_of_wk <- NULL
d3$line_no <- NULL
d3$stn_nm <- NULL

# k=5로 kmeans clustering 수행
kc <- kmeans(d3, 5)
d3 <- cbind(d3, kc$cluster)
d3 <- cbind(d3, d$stn_nm)
head(d3)
colnames(d3) <- c("cluster", "stn_nm")
d3[d3$cluster==1, 2]  # 클러스터 1
d3[d3$cluster==2, 2]  # 클러스터 2

아래는 각 클러스터별 해당 역 리스트.
내선, 외선의 구분도 필요하고 하지만, 모여있는 역들을 보면 왠지 클러스터4가 주요 업무 지역인 것으로 예측된다.
강남, 종로, 삼성, 을지로3가, ...

클러스터별 무슨 의미인지는 클러스터 개수도 변화를 주고, 시간대별로 잘라보기도 하고 등등을 더 해야할 것 같지만 귀찮으니 패스.

> d3[d3$cluster==1, 2]
 [1] 동대문.하선             동묘앞.하선             신설동.하선          
 [4] 제기동.하선             청량리(지하).하선       교대.외선            
 [7] 낙성대.외선             당산.내선               도림천.외선          
[10] 문래.내선               방배.외선               봉천.외선            
[13] 사당.외선               서울대입구.외선         서초.외선            
[16] 신도림.내선             신림.외선               신정네거리.외선      
[19] 신천.내선               신촌.내선               아현.내선            
[22] 양천구청.외선           영등포구청.내선         이대입구.내선        
[25] 잠실.내선               종합운동장.내선         충정로.내선          
[28] 합정.내선               홍대입구.내선           경복궁.하선          
[31] 녹번.하선               독립문.하선             무악재.하선          
[34] 불광.하선               안국.하선               종로3가.하선        
[37] 홍제.하선               길음.하선               동대문.하선          
[40] 동대문역사문화공원.하선 미아.하선               미아사거리.하선      
[43] 성신여대.하선           수유.하선               한성대입구.하선      
[46] 혜화.하선  

> d3[d3$cluster==2, 2]
 [1] 서울역.상선             서울역.하선             시청.상선            
 [4] 시청.하선               종각.상선               청량리(지하).상선    
 [7] 강변.내선               강변.외선               건대입구.내선        
[10] 건대입구.외선           구의.내선               구의.외선            
[13] 동대문역사문화공원.내선 뚝섬.내선               뚝섬.외선            
[16] 상왕십리.내선           상왕십리.외선           성내.내선            
[19] 성내.외선               성수.내선               성수.외선            
[22] 시청.내선               신당.내선               신당.외선            
[25] 신정네거리.내선         왕십리.내선             왕십리.외선          
[28] 을지3가.외선            을지입구.내선           을지입구.외선        
[31] 잠실.외선               한양대.내선             한양대.외선          
[34] 남부터미널.하선         녹번.상선               도곡.상선            
[37] 매봉.상선               매봉.하선               불광.상선            
[40] 양재.상선               양재.하선               연신내.하선          
[43] 지축.상선               지축.하선               동작.상선            
[46] 동작.하선               명동.하선               미아.상선            
[49] 사당.상선               사당.하선               삼각지.상선          
[52] 삼각지.하선             서울역.상선             서울역.하선          
[55] 수유.상선               숙대입구.상선           숙대입구.하선        
[58] 신용산.상선             신용산.하선             쌍문.하선            
[61] 이촌.상선               이촌.하선               총신대입구.상선      
[64] 총신대입구.하선         충무로.하선             회현.상선            
[67] 회현.하선      

> d3[d3$cluster==3, 2]
 [1] 동대문.상선             동묘앞.상선             신설동.상선          
 [4] 제기동.상선             종로3가.상선            종로5가.상선        
 [7] 강남.내선               교대.내선               낙성대.내선          
[10] 당산.외선               도림천.내선             방배.내선            
[13] 봉천.내선               사당.내선               삼성.외선            
[16] 서울대입구.내선         서초.내선               선릉.외선            
[19] 시청.외선               신도림(지선).내선       신천.외선            
[22] 신촌.외선               아현.외선               양천구청.내선        
[25] 이대입구.외선           종합운동장.외선         충정로.외선          
[28] 합정.외선               홍대입구.외선           경복궁.상선          
[31] 금호.상선               독립문.상선             동대입구.상선        
[34] 무악재.상선             신사.상선               안국.상선            
[37] 압구정.상선             약수.상선               옥수.상선            
[40] 을지3가.상선            종로3가.상선            충무로.상선          
[43] 홍제.상선               길음.상선               남태령.하선          
[46] 동대문.상선             동대문역사문화공원.상선 명동.상선            
[49] 미아사거리.상선         성신여대.상선           충무로.상선          
[52] 한성대입구.상선         혜화.상선  

> d3[d3$cluster==4, 2]
 [1] 종각.하선           종로3가.하선        종로5가.하선        강남.외선        
 [5] 구로디지털단지.내선 구로디지털단지.외선 대림.내선           대림.외선        
 [9] 문래.외선           삼성.내선           선릉.내선           신대방.내선      
[13] 신대방.외선         신도림.외선         신림.내선           역삼.내선        
[17] 역삼.외선           영등포구청.외선     고속터미널.상선     고속터미널.하선  
[21] 교대.상선           교대.하선           금호.하선           남부터미널.상선  
[25] 동대입구.하선       신사.하선           압구정.하선         약수.하선        
[29] 옥수.하선           을지3가.하선        잠원.상선           잠원.하선        
[33] 충무로.하선         남태령.상선

> d3[d3$cluster==5, 2]
 [1] 까치산.내선             까치산.외선             동대문역사문화공원.외선
 [4] 성수(지선).내선         성수(지선).외선         신답.내선            
 [7] 신답.외선               신도림(지선).외선       신설동.내선          
[10] 신설동.외선             용답.내선               용답.외선            
[13] 용두.내선               용두.외선               을지3가.내선        
[16] 을지4가.내선            을지4가.외선            가락시장.상선        
[19] 가락시장.하선           경찰병원.상선           경찰병원.하선        
[22] 구파발.상선             구파발.하선             대청.상선            
[25] 대청.하선               대치.상선               대치.하선            
[28] 도곡.하선               수서.상선               수서.하선            
[31] 연신내.상선             오금.상선               오금.하선            
[34] 일원.상선               일원.하선               학여울.상선          
[37] 학여울.하선             노원.상선               노원.하선            
[40] 당고개.상선             당고개.하선             상계.상선            
[43] 상계.하선               쌍문.상선               창동.상선            
[46] 창동.하선      

2014년 8월 12일 화요일

수도권 지하철 역별 시간대별 혼잡도 Visualization (1)

R의 Data Visualization 관련 기능들 공부도 할겸, 매일 매일 지겹게 이용하는 지하철과 관련하여 무언가 해보기로 했다.

이용한 데이터는 서울 열린 데이터 광장 (http://data.seoul.go.kr/openinf/sheetview.jsp?infId=OA-2731)에서 얻을 수 있다.

y축의 수치가 의미하는 바는 아래와 같이 %이며, 이는 열차 1량의 정원 160명을 100으로 두고 상대적으로 얼마나 많이 탔는지를 나타낸다.
(80% 정도만 되어도 복잡하고 쾌적하지 못한 느낌이 된다.)

지하철의 혼잡도에 대한 부가적인 설명은
http://urban.seoul.go.kr/4DUPIS/wordsearch/content_word.do?iword_no=1143 참조.

중앙에 3열로 빽빽하게 서있고, 출입문에 10명 정도가 서있는 경우가 200% 즉 320명이 되는, 힘빼고 서있어도 안넘어질 상태가 된다. -_-;;
8시~9시 사이의 사당 -> 강남 방향 평균이 185% 이니 이와 비교해서 상상하시면 될것 같다. 1시간 동안의 평균 수치라는데서 좀 조심해야 할 수도 있지만, 다녀본 사람은 알듯이 사당~강남 8~9시는 거의 균일하게 hell이다.

결과물은 아래. (그래프는 클릭하면 커짐)
그래프에 종점과 베드타운, 밤문화가 발달한 번화가 등에 따른 혼잡도 패턴이 확연히 나타난다. 평일 데이터만 분석했는데 주말 데이터도 분석하면 재미있는 결과가 나올것 같다.

googleVis 라이브러리를 사용해서 시간대에 따라서 움직이는 형태를 만들어보려 했지만,
역이 너무 많아서 gg치고 그냥 ggplot으로 적당히 마무리했다.
분석을 위해선 데이터를 원하는 형태로 cleansing하는 시간이 제일 많이 걸린다는 것을 느낀 작업.

14.08.16 역별 특성 클러스터링 결과는 여기에.
수도권 지하철 역별 시간대별 혼잡도 Visualization (2)