devlog_zz

버스 노선별 이용 승객 현황분석 barplot() in r 본문

빅데이터/R을 이용한 빅데이터분석

버스 노선별 이용 승객 현황분석 barplot() in r

YJ_SW 2018. 10. 2. 13:29
728x90


광명시 버스 노선별 이용승객 현황 분석

1) 자료 다운로드

버스통계자료 - 경기도 교통 정보 센터

http://gits.gg.go.kr/web/main/index.do


Microsoft Excel 97-2003 워크시트(.xls) 자료를 Microsoft Excel 쉼표로 구분된 값 파일(.csv) 로 변환해서 사용

.xls -> .csv

( 처음에 엑셀파일에서 다른이름으로 저장을 CSV로 했는데 CSV UTF-8(쉼표로분리)(*.cvs) 로 변환하면 안됨

저장을 그냥 CSV (쉼표로 분리) (*.csv)로 저장해야 인코더 변환 필요없이 그냥 read.csv()로 읽을 수 있음 )


2) data 추출

자료가 이런구조여서 평일 주말을 구분하여 전체통행의 전체자료를 사용하고자 하였다.

평일 자료 , 주말 자료 dataframe을 만들고자 하였다.

홀수행 짝수행 을 구분하여 평일 주말 데이터를 따로 저장하였다.

이 때 처음엔 

if( 행 %% 2 ==0)

평일에 저장

이런식으로 하려고 했는데 저장하는 과정에서 어려움이 있었다. ( 순차적으로 데이터를 넣는 방법?) 

생각하다가 더 간단한 방법을 발견하였다.

http://issactoast.com/66

이 블로그를 참조하였다.

벡터 x의 짝수번째 원소들만을 가지는 새로운 벡터 y로 저장하는 방법

weekday <- total[1:(length(total)/2)*2-1]  #평일(홀수)

weekend <- total[1:(length(total)/2)*2]  #주말 (짝수)

이렇게 데이터를 뽑아와 저장하였다.


3) numeric형으로 변환

나중에 그래프를 출력하다가 자료가 numeric형이 아님을 발견하였다

기존 데이터의 형을 알기위해 class()함수를 사용

> class(weekday)

[1] "factor"

factor 형을 numeric 형으로 바꾸는 방법

as.numeric ( as.character( factor형 data ) )

이방법을 적용하였는데 계속 NA가 뜨는오류가 발생하였다.

> as.numeric(as.character(weekday))

 [1]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 556  NA  NA

Warning message:

NAs introduced by coercion


자료들이 다 NA로 뜨고 556만 제대로 변환되길래 원래 자료를 보니 1000이 넘어가면 1,000이런 형태로 표기되어 있어

콤마 때문에 생기는 문제인 점을 발견하고 ,를 제거하기위해 gsub()함수를 사용하여 변환하였다.

> weekday <- gsub(',','',weekday)  #,(콤마) 다 없애기!


> weekday <- as.numeric(as.character(weekday)) # factor -> numeric


> class(weekday)

[1] "numeric"



4) weekday와 weekend 합쳐 datafrme 형태로 만들기


> bus<-data.frame(weekday,weekend)


> t(bus)

         [,1]  [,2]  [,3]  [,4]  [,5] [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]

weekday 46303 46819 10425 26407 24704 3567 68392 27746 38190 10557 24399 38005  7285  6514 19583   556

weekend 38287 34606  8589 21099 16524 2300 54344 23171 29119  6228 19570 28800  3384  3196 12933   190

        [,17] [,18]

weekday  1367  9133

weekend  1563  7941


이와 같이 bus 라는 dataframe을 만들었다.


5) barplot 그래프 그리기


평일과 주말을 barplot으로 나란히 나타내어 색으로 구분하여 표현함

bplot<-barplot(bus2,main=paste("광명시 버스노선별 이용객수"),ylim=c(0,70000)

        ,col=c('green','yellow'),ylab="전체이용승객",las=2,beside=T,names.arg=data$X[4:21*2-3])


text(x=bplot,y=bus2*0.95,labels=bus2,col="red",cex=0.7)

abline(h=seq(5000,70000,5000),col="white",lty=2,lwd=2)

#5000부터 70000까지 50000단위로 가로줄 긋기


legend(42,60000,c("평일","주말"),cex=1,col=c("green","yellow"),lty=1,lwd=5,bg="white")



6) 결과 


728x90
Comments