2014년 12월 6일 토요일

조직내 밥그릇 싸움과 정보 공유

최근에 주변의 어떤 논쟁을 보며.정말 오랜만에 블로그에 끄적질.



예외적인 얘기들은 빼고 일단 대세상에서 -
조직이건 개인이건 지식은 나눌수록 커진다.

그런데 대기업, 중소기업 가릴 것없이 회사에서 흔히 볼 수 있는 풍경은
 - 별것도 아닌 지식을 자신의 경쟁력과 비밀무기로 삼아 감추고 안 알려주고,
 - 우리 조직과 나의 사업기획, 전략은 극비 중에 극비이며 대내외 보안을 강조한다.

산업사회 등 요새처럼 변화가 빠르지 않던 사회에서는 특정 노하우가 곧 본인의 가치가 되어
그 사람이 없으면 일이 되게 하는 데에 애로사항이 넘치는 경우들이 있어왔겠지만,
진부한 표현으로 know-where가 중요하다고 하는 지식 정보화 사회에서는 더 이상 이런 패러다임이 지속되기는 어렵다고 본다.

어차피 본인이 알고 있는 것으로 누군가는 세계 어딘가에서 이미 실행을 하고 있고, 그나마 조금만 시일이 지나면 구닥다리가 되기 때문에.
정보의 개방과 공유로 (이는 WWW의 핵심적 철학이기도 하다), 그리고 적극적 collaboration으로 나를 포함한 전체가 함께 발전하는 것에 익숙하지 않다면 결국 도태될 수 밖에 없을 것이다.

경험과 관심에 따라 서로 서로 아는 분야와 깊이는 다를 수 밖에 없으니 서로의 지식을 적극적으로 공유하여 함께 성장하여,
서로를 볼때마다 긍정적인 자극으로 염통이 쫄깃하여 더 즐겁게 새로운 것을 배우고 만들어 가는 형태가 바람직하지 않나?
(가장 강력한 자극은 위로부터 내려오는 갈굼이 아니라 옆으로부터의 자극이라고도 한다.)
그렇지 않으면 '대기업을 오래 다니면 바보가 된다' 라는 흔한 말처럼 특정 갈라파고스에서 서로 하향평준화를 향해 내리 달리기 십상이다.

조직도 알량하게 보유한 지식에서 경쟁력을 찾을게 아니라 구성원의 배움, 변화의 속도와, 창조적 문화에서 찾아야 한다.
General Intelligence와 Fast-Learning Skill을 갖춘 Self-Motivator들로 A팀을 구성하고, 학습과 공유를 일상화하는 문화의 형성이 최우선적이며 가장 중요한 조직의 과업일 것이다.

2014년 9월 9일 화요일

Getting and Cleaning Data Quiz1

Coursera의 "Getting and Cleaning Data" Quiz 1.
단순한 퀴즈와 짧은 코드지만 기록을 위해 남겨둔다.

Question 1
The American Community Survey distributes downloadable data about United States communities. Download the 2006 microdata survey about housing for the state of Idaho using download.file() from here:
https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06hid.csv
and load the data into R. The code book, describing the variable names is here:
https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2FPUMSDataDict06.pdf 
How many properties are worth $1,000,000 or more?
A1. 
fileUrl <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06hid.csv"
download.file(fileUrl, destfile="./quiz1.csv")
list.files("./")
d <- read.table("./quiz1.csv", sep=",", header=TRUE, na.string=0)
head(d)
d[d$VAL > 23 & !is.na(d$VAL), "VAL"]

Question 3

Download the Excel spreadsheet on Natural Gas Aquisition Program here:

https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2FDATA.gov_NGAP.xlsx 

Read rows 18-23 and columns 7-15 into R and assign the result to a variable called:
 dat 
What is the value of:
 sum(dat$Zip*dat$Ext,na.rm=T) 
(original data source: http://catalog.data.gov/dataset/natural-gas-acquisition-program)

A3.
install.packages("xlsx")
library(xlsx)
fileUrl <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2FDATA.gov_NGAP.xlsx"
download.file(fileUrl, destfile="./quiz2.xlsx")

colIndex <- 7:15
rowIndex <- 18:23
dat <- read.xlsx("./quiz2.xlsx", sheetIndex=1, colIndex=colIndex, rowIndex=rowIndex)
sum(dat$Zip*dat$Ext,na.rm=T) 

Question 4

Read the XML data on Baltimore restaurants from here:

https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml 

How many restaurants have zipcode 21231?

A4.
install.packages("XML")
library(XML)
fileUrl <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml"
download.file(fileUrl, destfile="./quiz4.xml")
doc <- xmlTreeParse("./quiz4.xml", useInternal=TRUE)
rootNode <- xmlRoot(doc)
xmlName(rootNode)
zipcode <- xpathSApply(rootNode, "//zipcode", xmlValue)
zipcode[zipcode=="21231"]

Question 5

The American Community Survey distributes downloadable data about United States communities. Download the 2006 microdata survey about housing for the state of Idaho using download.file() from here:

https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06pid.csv

using the fread() command load the data into an R object
 DT 
Which of the following is the fastest way to calculate the average value of the variable
pwgtp15 
broken down by sex using the data.table package?

A5. 
fileUrl <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06pid.csv "
download.file(fileUrl, destfile="./quiz5.csv")
DT <- read.table("./quiz5.csv", sep=",", header=TRUE)
head(DT)
sapply(split(DT$pwgtp15,DT$SEX),mean)

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)











2014년 1월 26일 일요일

Android Emulator 속도 높이기

Android Emulator는 극악한 속도를 자랑한다. 좋은 PC는 아니지만 또 그렇게 끔찍한 PC는 아니건만 도저히 개발할 환경이 안되어 찾아보다보니 Intel님의 은혜를 입을 수 있었다.
좋은 PC가 아니라 만족할만한 결과까지는 아니지만 체감 속도가 엄청나게 올라갔다.

1. Android SDK Manager에서 [Intel x86 emulator accelerator (HAXM)] 인스톨


2. Intel® Hardware Accelerated Execution Manager 설치
참고: http://software.intel.com/en-us/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-windows

3. Android Virtual Device Manager에서 Intel Atom (x86) processor를 이용하도록 emulating
 - 이미지 생성시 CPU/ABI 에서 x86 선택
 - Emulation option에서 Use Host GPU 선택
  • Enable the GPU acceleration in the AVD Manager for your image. The HAXM driver executes most CPU instructions natively through Intel Virtualization Technology in the processor and the GPU acceleration offloads the OpenGL* calls to the host GPU.