R의 주요 데이터포맷인 데이터프레임(data.frame)을 사용하다보면 필터링을 해야 되는 경우가 많다.

필터링하는게 어렵지는 않지만 데이터프레임의 데이터가 많을 수록 성능이슈가 발생한다.


데이터가 클수록 필터링 속도는 현저하기 느려진다.

물론 이러한 성능이슈를 도와주는 R의 여러 패키지가 존재하며 대표적으로 data.table 패키지가 있다.

해당 패키지는 RDBMS와 유사하게 데이터를 인덱싱하여 보다 빠른 필터링 및 그외 여러기능을 제공한다.

(더 자세히 알고 싶다면 여기를 참고)


여기서는 data.table과 같은 패키지를 사용하지 않고 보다 빠르게 필터링 하는 방법을 알아보고자 한다.

우선 기본적인 R에서 데이터프레임을 필터링하는 방법으로는 아래 2가지가 대표적(?)이다.


df1 <- data[data$col1=='filter조건',]
df2 <- subset(data, col1=='filter조건') 


위와 같은 방법 data 데이터 사이즈가 500만건 정도의 데이터를 필터링 했을 경우 하드웨어 사양에 따라 조금씩 차이는 있겠지만 대략 두 방법 모두 10초 가량 소요가 되었다.


꽤 오랜시간이 소요되어 고민하던 차에 R에서 grep을 지원하는게 생각나서 아래와 같이 테스트를 해보았다.


df3 <- data[grep('filter조건', data$col1, ignore.case=T),]


테스트 결과 위 두가지 필터보다 50%이상 성능이 빠르게 나왔다.


내부적으로 어떤 차이가 있는지 좀 더 알아보고 싶지만 머 grep이니까 빠르겠지... 하고 쓴다...@.@;


끝.

저작자 표시
신고

'R' 카테고리의 다른 글

R grep을 이용한 데이터프레임 필터링  (0) 2014.10.22
R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret


이상치(Outlier)라고 하면 특정 데이터 변수의 분포에서 비정상적으로 벗어난 값을 뜻한다.

예를 들면 어떤 학생이 신체검사를 했다고 치자 A학생은 몸무게와 키가 각각 100kg, 150cm나왔다.

이 A학생은 일반적으로 생각했을때 키에 비해 몸무게가 많은 것으로 보인다. 

(여기서는 몸무게와 키는 상관관계가 높은 것으로 간주한다.)

그럼 이 A학생은 속한 학년 반 또는 또래 아이들에 비해 비정상(여기서 이상치)이 맞을까?


위 질문에 대한 이상치 분석을 한번 해보자.

이상치 분석을 위한 모델 데이터는  A학생이 포함된 반의 학생들의 몸무게, 키 데이터이며 변수는 몸무게, 키로만 한정지어 분석해보고자 한다. 모델에 대한 종속변수는 몸무게이며 설명변수는 키가 된다.


우선 데이터를 한번 만들어보자.(실제 데이터가 없으니 ^^;)



name,weight,tall

A,100,150

B,55,156

C,50,153

D,54,165

E,70,164

F,56,155

....생략....

Y,49,153

Z,43,151


 


 std.data <- read.csv("outlier.csv", header=T)
summary(std.data)
boxplot(std.data$weight)

우선샘플 데이터를 R에서 가져와 데이터 분포와 몸무게에 대한 boxplot을 확인해보자.


boxplot을 통해보면 상단 whisker의 몸무게 70kg이상은 이상치라고 판단하고 있으며 해당 데이터에서는 위 boxplot에서 100kg은 이상치라고 판단했다. boxplot에서의 이상치는 몸무게 데이터간의 이상치라고 볼 수 있다.

몸무게와 키와의 상관관계가 있다고 가정하며 키가 클수록 몸무게도 커지기 때문에 몸무게 변수하나로 이상치를 판단하기는 좀 무리가 있을 수 있겠다. (저 몸무게 100kg의 학생이 키가 2m일 수도 있지 않나?? ㅡㅡ;)


그렇다면 설명변수 키와 종속변수 몸무게를 이용하여 회귀분석 모델을 생성하여 이상치를 팓단해보자.

회귀분석 lm함수를 이용하여 lm(종속변수 ~ 설명변수, 모델데이터)로 회귀분석 모델을 생성한다.

library(car)
std.lm <- lm( weight ~ tall , data = std.data)
summary(std.lm)
outlierTest(std.lm)
std.data[1,]

생성한 회귀분석 모델에 의한 이상치 판단을 하기 위해 outlierTest 함수를 사용한다.

해당함수는 모델에 대한 이상치 데이터를 각종 수치와 함께 쉽게 나타내 준다. 단 해당 함수는 car 패키지를 설치 후 사용가능하다. 실행 결과를 보면 아래와 같다.


> outlierTest(std.lm)
  rstudent unadjusted p-value Bonferonni p
1  7.62756         9.6225e-08   2.5018e-06
> std.data[1,]
  name weight tall
1    A    100  150

std.data에서 1번째 데이터가 이상치라고 판단했으며 해당 데이터를 확인해보니 A학생으로 나오는 것을 확인할 수 있다.


전체 실행코드



지금까지 정말 정말 간단한 말도 안되는 데이터를 가지고 이상치 분석을 해보았다... ^^;

그렇다면 이상치 분석은 어떻게 활용할 수 있을까? 

데이터만 가지고 있다면 어디든 활용할 수 있을 것이다. 예를 들면 상품에 대한 가격 이상치라던지 서버 모니터 정보를 이용한 이상치 등등...


물론 실제 많은 설명변수들이 존재하는 데이터를 가지고 이상치 분석을 하기는 쉽지 않다.

데이터 전처리도 쉽지 않고 위에서 설명하지 않은 회귀분석 모델, outlierTest함수를 통해 나온 수치해석 등 통계적 지식이 꽤 많이 필요한 건 사실이지만... 재미로 내가 몸담고 있는 회사의 데이터를 가지고 테스트 해보는 것도 나쁘지 않겠다.

끝.

저작자 표시
신고

'R' 카테고리의 다른 글

R grep을 이용한 데이터프레임 필터링  (0) 2014.10.22
R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R on Hadoop and Amazon EMR

R 2014.08.19 15:44

Amazon EMR은 R을 지원한다. 

AMI Versions 3.0.0 이상부터는 Hadoop과 함께 R 3.0.2버전이 함께 Includes되어 설치된다.

현재 R최신버전은 3.1.1이지만 R 3.0.2버전이면 거의 최신버전이라고 할 수 있다.


Amazon 서비스에서 R을 지원하기 때문에 EMR을 이용하여 R Script를 실행하는 방법을 알아보고자 한다.


우선 고려해야 될 사항을 나열해보면 아래와 같다.

첫째 AMI를 통해 설치되는 R버전이 내가 사용하고자 하는 R package에서 지원하는 버전대인지?

둘째 EMR Hadoop Cluster 세팅 시 R은 설치 되지만 R Package는 설치되지 않기 때문에 설치가 가는한지?


우선 첫번째 문제부터 살펴보면 R 3.0.2버전이면 거의 왠만한 R package는 사용가능하다. 

rdocumentation.org 에서 제공하는 R package rank내의 ggplot2, plyr등 모두 사용가능하며 이슈는 없다.

둘째로는 사용하고자 하는 R package가 설치가 가능한지인데 이 부분도 EMR에서는 Bootstrap Actions라는 기능이 있다. 해당 기능을 통해서 R package뿐만 아니라 기타 여러 패키지가 설치 가능하다.


그럼 이제 EMR에서 R Script를 실행하는 방법을 알아보자.


AMI version

위에서 언급한 바와 같이 3.0.0이상 가장 최신버전을 선택하도록 하자.


Bootstrap Actions

Bootstrap Custom Actions을 통해 R Script에서 사용할 package와 기타 필요한 패키지들을 설치할 수 있도록 해야 한다.

여기서는 R package 하나와 mysql을 설치하도록 지정했다.

아래와 같이 shell script파일을 생성한다.

 
#!/bin/bash
sudo yum -y install mysql mysql-server mysql-connector-odbc mysql-devel
wget http://cran.r-project.org/src/contrib/DBI_0.2-7.tar.gz
sudo R CMD INSTALL DBI_0.2-7.tar.gz

만약 설치되어야 하는 R package가 많다면  아래와 같이 RScript Install.package구문으로도 가능하다.

 
 sudo Rscript -e "install.packages(c('DBI', 'rJava', 'etc'),repos='http://ftp.heanet.ie/mirrors/cran.r-project.org/')"

mysql설치는 apt-get 명령어가 아닌 yum을 사용했다. AMI 3.x대 버전 이후 부터는 apt-get이 아닌 yum을 이용하여

필요한 패키지들을 설치할 수 있다. 해당 shell script를 S3내의 내 버킷공간에 저장해 둔다.


S3에 저장한 shell script를 S3 location에 Path를 지정한 후 Add해주면 Bootstrap Action설정은 모두 끝난다.


Steps

R Script 작성 시 맨 상단에 "#! /usr/bin/env Rscript" 해당 구문을 추가해주어야 한다.

추가하지 않으면 EMR에서 R Script를 해석하지 못한다.

#! /usr/bin/env Rscript
library(DBI, quietly=TRUE)
.....

실행할 R Script를 Bootstrap의 Shell script와 마찬가지로 S3내의 내 버컷공간에 저장해 둔다.

그리고 Streaming program을 선택 후 Step을 추가해주면 된다.



Mapper, Reduce에서 싫행될 R Script를 각각 지정 후 Input, Output 장소도 지정한다.

Output의 경우 Reduce에서 실행되는 R Script의 실행 결과물이 파일로 저장된다.



위와 같이 최종 설정 후 Create cluster를 생성하면 EMR내에서 R Script가 실행가능하다.



참고
http://www.joyofdata.de/blog/mapreduce-r-hadoop-amazon-emr/
https://forums.cascading.io/index.php?/topic/9-unable-to-run-emr-bootstrapscript/
http://mrjob.readthedocs.org/en/latest/guides/emr-bootstrap-cookbook.html#ami-2-x-and-ami-3-x-version-differences


저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R Oracle Connection

R 2014.02.24 13:13

지난번 R DB Connection 글에서 R에서 RDBMS에 Connection하는 방법을 알아보았다.

지난 글에서는 MySQL를 접속했었는데 Oracle접속하는 방법도 간단하다.


ojdbc.jar파일을 다운로드 받은 후 특정폴더에 복사한다.

여기서는 지난 MySQL과 마찬가지로 /usr/share/java 폴더로 복사였다.


Oracle connection 소스는 아래와 같다. 자세한 사항은 지난 R DB Connection을 참고하기 바란다.

library(DBI)
library(RJDBC)
library(rJava)
drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")
conn<-dbConnect(drv, "jdbc:oracle:thin:@//<db_ip>:<port>/<sid>","<id>","<pw>")
query = "SELECT * FROM TABLES"
dbGetQuery(conn, query)

실제 소스 실행화면


저작자 표시
신고

'R' 카테고리의 다른 글

R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21
R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  4개가 달렸습니다.
  1. 안녕하세요 컴퓨터공학과 4학년입니다. 현재 R과 하둡을 이용하여 빅데이터를 분석후 워드클라우드 같은 것을 웹에 JSP를 이용하여 뿌려 주려하는데요
    혹시 확장자 .R 소스(라이브러리 등등)을 .java에서 가져오게 하려면 어떻게 해야하나요? JRI 이용한 지금까지의 소스를 볼수 있을지 해서 올려봅니다. 즐거운 하루 되세요!
    • R과 Java간의 인터페이스는 Java Runtime Interface를 이용하여 가능합니다.
      http://using.tistory.com/55 여기를 참고해주세요
  2. 안녕하세요 질문이 있어서 연락드립니다.
    drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")

    여기서 classPath 잡는 부분이 잘 안되서요.
    ojdbc14.jar를 기존 client 설치되어 있는 곳으로 연결하려고 하거든요.
    classpath를 정확히 어떻게 잡아줘야 class가 로드될지 알고 싶습니다.

    windows7 이고요.. 로컬 환경변수 설정해서 연결해도 잘 안되네요..

    그럼, 수고하세요
    • 우선 작성해주신 내용만으로는 파악이 어렵네요 ^^;

      단순 클래스패스 설정 문제라면 검색하면 많이 나옵니다.
secret

이번에는 사내에서 진행중인 한 프로젝트의 svn commit history를 이용한 간단한 시각화 방법이다.


svn commit history 가져오기

Eclipse에서 해당 프로젝트의 Show History를 가져와 정보를 파일(txt)로 저장한다.


Eclipse Generate ChangeLog


저장된 파일은 아래와 같이 commint순번, 아이디, 날짜, 수정된 파일 리스트로 되어있다.

r799 | y2kpooh | 2014-02-21 10:54:35 KST| Changed paths: D /trunk/~~~.xml r798 | y2kpooh | 2014-02-21 10:53:21 KST| Changed paths: D /trunk/~~~.jsp D /trunk/~~~.xml

R data 핸들링

우선 작업에 사용하기 위한 패키지를 로드한다.

library(data.table)
library(stringr)
library(ggplot2)

ggplot2은 Plot, data.table을 데이터를 핸들링, stringr은 문자열을 핸들링 하기 위해 사용하였다.


이제 위에서 만들어진 데이터를 R에서 작업해보자. 

svn.log.dtl <- read.table(file="~/svn_log_dtl.txt", header= F, sep="|")
svn.log.dtl.dt <- data.table(svn.log.dtl)
head(svn.log.dtl.dt)

V1 V2 V3 V4 1: r799 y2kpooh 2014-02-21 10:54:35 KST Changed paths:\tD /trunk/~~xxx.xml /trunk/~~~.jsp

2: r798 y2kpooh 2014-02-21 10:54:35 KST Changed paths:\tD /trunk/~~xxx.xml

3: r797 y2kpooh 2014-02-21 10:54:35 KST Changed paths:\tD /trunk/~~xxx.img

4: r796 y2kpooh 2014-02-21 10:54:35 KST Changed paths:\tD /trunk/~~xxx.xml /trunk/~~~.png

5: r795 y2kpooh2 2014-02-21 10:54:35 KST Changed paths:\tD /trunk/~~xxx.jsp

6: r794 y2kpooh2 2014-02-20 10:54:35 KST Changed paths:\tD /trunk/~~xxx.jsp

텍스트 파일을 | 기호로 구분하여 데이터를 로드 후 data.table로 변경하였다.


위 데이터를 가지고 날짜별,아이디별 commit한 파일 갯수를 만들고자 한다.

그러기 위해서는 V3에서는 날짜에서 시간을 제거하고 V4에서는 문자열에서 파일 갯수를 알아내야 한다.

이제 그 작업을 진행해보자.

#날짜에서 시간제거
svn.log.dtl.dt$V3 <- substr(svn.log.dtl.dt$V3, 1, 11)
#commit 파일정보에서 한 커밋 트랜젝션당 파일갯수 구하기
svn.log.dtl.dt.n <- svn.log.dtl.dt[, str_count(V4, 'trunk'), by="V3,V2"]
head(svn.log.dtl.dt.n)

            V3             V2         V1
1:  2014-02-21  y2kpooh   1
2:  2014-02-21  y2kpooh   1
3: 2014-02-21 y2kpooh 2
4: 2014-02-21 y2kpooh 4
5: 2014-02-21 y2kpooh2 2
6: 2014-02-20 y2kpooh2 21

날짜를 제거하고 날짜별,아이디별(쉬운 이해 : group by date, user) V4 파일경로의 /trunk 문자열의 일치하는 갯수를

stringr패키지의 str_count()함수를 이용해 구했다. 그정보는 V1 컬럼에 추가되었다.


여기서 다시 한번 V3, V2(날짜,아이디) group by 를 해보자.

svn.log.dtl.dt.daily <- svn.log.dtl.dt.n[, sum(V1), by="V3,V2"]
head(svn.log.dtl.dt.daily)

V3 V2 V1 1: 2014-02-21 y2kpooh 8 2: 2014-02-21 y2kpooh2 2 3: 2014-02-20 y2kpooh 21 4: 2014-02-20 y2kpooh2 2 5: 2014-02-19 y2kpooh 40 6: 2014-02-19 y2kpooh2 24

이제 데이터 핸들링 작업은 다 되었다. 이제 Plot을 하기위해 데이터를 data.table에서 data.frame으로 변경하자.

ggplot2로 Plot을 하기 위해서는 데이터는 data.frame class이어야 한다.

svn.log.dtl.dt.daily.df <- data.frame(svn.log.dtl.dt.daily)

R ggplot

이제 bar, line차트를 각각 생성해보자

#bar
ggplot(svn.log.dtl.dt.daily.df, aes(x=V3, y=V1, fill=V2)) + geom_bar(stat='identity', position='dodge') 
#line
ggplot(svn.log.dtl.dt.daily.df, aes(x=V3, y=V1, color=V2, linetype=V2)) + geom_line(aes(group=V2))


bar chart


line chart


참 쉽죠? ^^; 작업하다 svn commit 로그가 눈에 보이기에 심심해서 한번 해봤다. :)

저작자 표시
신고

'R' 카테고리의 다른 글

R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21
R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19
R data.table  (1) 2014.02.07

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

사내 근태관리 시스템에서 출퇴근 데이터를 이용하여 사내직원의 출퇴근 성향을 파악해보려 한다.

이를 위하여 boxplot을 사용해보고자 한다.


boxplot이란?

최대값, 최소값, 중앙값, 사분편차를 사용하여 자료의 측정값들이 어떤 모양으로 분포되어 있으며, 극단값들은 어떠한지 등을 쉽게 알 수 있도록 하는 그림이다. 자료들이 비대칭으로 분포되어 있을 경우에는 상자그림을 그려 극단값의 개수, 비대칭 여부 등을 파악할 수 있으므로 측정값들의 중심위치와 산포도의 척도로 사용할 수 있다.

[네이버 지식백과] 상자그림 [box plot, box and whisker plot] 


boxplot 해석을 돕기 위한 그림(출처)



boxplot분석

우선 데이터 전처리 작업을 진행하였다. DB에 저장된 직원별 근태정보에서 출퇴근시간에서 년월일을 제외한 시간만 가져와 R에서 분석하기 위한 CSV 데이터로 생성하였다.

attitude <- read.table(file="~/attitude.csv", header= T, sep=",")
summary(attitude)

USER_ID USER_NM START_TIME END_TIME xxxx1 :28 아무개1 :28 Min. : 82027 Min. : 53416 xxxx2 :27 아무개2 :27 1st Qu.: 85814 1st Qu.: 61226

xxxx3 :24 아무개3 :24 Median : 90724 Median : 62600 xxxx4 :24 아무개4 :24 Mean : 90763 Mean : 68178

xxxx5 :22 아무개5 :22 3rd Qu.: 91619 3rd Qu.: 71935

 xxxx6 :21 아무개6 :21 Max. :123546 Max. :112241

(Other) :95 (Other):95

데이터 컬럼은 아이디, 이름, 출근시간, 퇴근시간으로 구성되어있다.

여기서 아무개1출근시간에 대하여 boxplot으로 표현해보자.

pooh <- attitude[attitude$USER_NM=='아무개1',]
boxplot(pooh[3])

아무개1의 경우 주 출근시간대는 8:40~8:50 사이로 나타난다. box 크기가 크지 않으므로 해당시간에 주로 출근했음을 알 수 있다. upper outlier표시로 9:00 이후로 지각한 것을 알 수 있다.

만약 아무개1이 9:00시 넘어 지각을 할 경우 매일 일정한 시간대에 오던 아무개1이 늦자 회사동료들은 이상하게 여길 수 있겠다. :)

그렇다면 아무개1과는 정반대의 결과를 가진 직원 아무개3의 출근시간을 확인해보자.

아무개3은 위 boxplot에서도 나타나듯이 9:00시 이전에 오는게 low outlier에 나타난다.

이 아무개3은 일찍오는게 이상하다는거다 ㅡ,.ㅡ; 평균 출근시간은 10:00시 쯤으로 늦을때는 점심시간대에도 출근을 하는 직원이다. 출근시간도 일정 치 않고 들쭉날쭉이고 ... 해튼 boxplot만 보면 이런 직원은 짤라야 한다...


이제 직원 개개인에 대한 boxplot이 아닌 ggplot2를 이용하여 전체직원의 출근시간을 표현해보자.

library(ggplot2)
ggplot(attitude, aes(x=USER_NM, y=START_TIME)) + geom_boxplot()

개인정보 보호차원에서 x축의 이름정보는 모자이크 처리했다. ;)

위 boxplot만 보더라도 어느 직원이 성실한지 한 눈에 파악할 수 있을 것이다. 

(물론 출근시간으로 성실함을 판단하는게 문제가 있겠지만 ^^;)



저작자 표시
신고

'R' 카테고리의 다른 글

R svn commit history 시각화  (0) 2014.02.21
R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19
R data.table  (1) 2014.02.07
R 상위버전 설치  (0) 2014.01.28

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R data.table

R 2014.02.07 13:18

1. data.table?


R에는 data handling을 위한 여러가지 패키지들이 있다. 그중 data.table패키지는 가장 많이 사용하는 패키지라 할 수 있다. data.table큰 데이터를 탐색, 연산, 병합 하는데 아주 유용하다.

data.table의 빠른 속도의 원리는 특정 column을 key값으로 색인을 지정한 후 데이터를 처리한다.

따라서 기존의 방식(data.frame)보다 월등히 빠른 속도를 보여준다.

현재 data.table 패키지 버전은 1.8.10까지 나와 있으며 R버전 (≥ 2.12.0) 이상부터 지원한다.

(이 자료는 황명식군이 작성한 초안을 토대로 재작성되었음)


2. data.table vs data.frame


여기서 사용하는 데이터 샘플은 titanic data로 여기서 다운로드 받을 수 있다.


가. Data load

library(data.table)
titanic <- read.csv("titanic.csv")

# class 변환
titanic.dt <- data.table(titanic)

class(titanic)
## [1] "data.frame"
class(titanic.dt)
## [1] "data.table" "data.frame"

나. 속도의 차이

data.table을 사용하는 가장 큰 이유는 기존 data.frame에서 하는 작업보다 최소 20배가량 빠르다.

data.frame과의 속도를 비교해보았다.


DF <- data.frame(x = runif(2.6e+07), y = rep(LETTERS, each = 10000))
df <- data.frame(x = runif(2.6e+07), y = rep(letters, each = 10000))
system.time(x <- DF[DF$y == "C", ])
##    user  system elapsed 
##    3.59    0.18    3.76
DT <- as.data.table(DF)
setkey(DT, y)
system.time(x <- DT[J("C"), ])
##    user  system elapsed 
##    0.04    0.00    0.03

결과를 보면 100배 이상 빠른걸 볼 수 있다. 데이터가 많을 수록 속도는 더 차이가 나타난다.


다. 데이터 선택

data.table의 형식은 [행, 표현식, 옵션]으로 되어 있으며 data.frame과는 조금 다르다.

그 차이점을 아래에서 볼 수 있다.


titanic.dt[1]
##    X pclass survived                          name    sex age sibsp parch
## 1: 1    1st        1 Allen, Miss. Elisabeth Walton female  29     0     0
##    ticket  fare cabin    embarked boat body    home.dest
## 1:  24160 211.3    B5 Southampton    2   NA St Louis, MO

1열를 data.frame에서 가져온다면 [,1]을 사용하지만 data.table에서는 다르다.

head(titanic[, 1])  #(data.frame)
## [1] 1 2 3 4 5 6

data.table에서는 다른 결과를 보인다.

titanic.dt[, 1]  #(data.table)
## [1] 1

옵션 with=F 를 써주면 data.frame에서 사용하던 방식을 사용할 수 있다.

titanic.dt[, 1, with = F]
##          X
##    1:    1
##    2:    2
##    3:    3
##    4:    4
##    5:    5
##   ---     
## 1305: 1305
## 1306: 1306
## 1307: 1307
## 1308: 1308
## 1309: 1309

열 번호대신 변수명을 쓰면 data.frame과 같은 결과를 얻을 수 있다.

head(titanic.dt[, X])  #열 변호대신 변수명 사용
## [1] 1 2 3 4 5 6


3. use a data.table


가. 조건으로(제약) 데이터 선택

data.table에서느 J 표현식이 있다. dt[J('제약조건')]으로 작성할 수 있으며 J 를 사용할 경우 setkey가 꼭 지정되어

있어야한다. 사용방법을 확인해보자.


데이터에서 1등급 승객 리스트를 뽑아보면 아래와 같으며 두 코드 모두 동일한 결과를 보인다.

titanic.dt[pclass == "1st"]
titanic.dt[pclass == "1st", ]
##        X pclass survived                            name    sex     age
##   1:   1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000
##   2:   2    1st        1  Allison, Master. Hudson Trevor   male  0.9167
##   3:   3    1st        0    Allison, Miss. Helen Loraine female  2.0000
##   4:   4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000
##   5:   5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000
##  ---                                                                   
## 319: 319    1st        0  Williams-Lambert, Mr. Fletcher   male      NA
## 320: 320    1st        1       Wilson, Miss. Helen Alice female 31.0000
## 321: 321    1st        1               Woolner, Mr. Hugh   male      NA
## 322: 322    1st        0              Wright, Mr. George   male 62.0000
## 323: 323    1st        1        Young, Miss. Marie Grice female 36.0000
##     ... 생략 ...

key를 이용하여 데이터를 가져올 수 도 있다.

setkey(titanic.dt, pclass)
# data.table 정보 확인
tables()
##      NAME             NROW  MB
## [1,] DT         26,000,000 298
## [2,] titanic.dt      1,309   1
## [3,] x           1,000,000  12
##      COLS                                                                            
## [1,] x,y                                                                             
## [2,] X,pclass,survived,name,sex,age,sibsp,parch,ticket,fare,cabin,embarked,boat,body,
## [3,] y,x                                                                             
##      KEY   
## [1,] y     
## [2,] pclass
## [3,] y     
## Total: 311MB
titanic.dt[J("1st")]
##      pclass   X survived                            name    sex     age
##   1:    1st   1        1   Allen, Miss. Elisabeth Walton female 29.0000
##   2:    1st   2        1  Allison, Master. Hudson Trevor   male  0.9167
##   3:    1st   3        0    Allison, Miss. Helen Loraine female  2.0000
##   4:    1st   4        0 Allison, Mr. Hudson Joshua Crei   male 30.0000
##   5:    1st   5        0 Allison, Mrs. Hudson J C (Bessi female 25.0000
##  ---                                                                   
## 319:    1st 319        0  Williams-Lambert, Mr. Fletcher   male      NA
## 320:    1st 320        1       Wilson, Miss. Helen Alice female 31.0000
## 321:    1st 321        1               Woolner, Mr. Hugh   male      NA
## 322:    1st 322        0              Wright, Mr. George   male 62.0000
## 323:    1st 323        1        Young, Miss. Marie Grice female 36.0000
##      ... 생략 ...

계산도 동시에 할 수 있다. :)

titanic.dt[pclass == "1st", mean(survived)]
## [1] 0.6192
titanic.dt[J("1st"), mean(survived)]
##    pclass     V1
## 1:    1st 0.6192


나. data group 연산

dt[,조건, by='variable'] 표현식으로 사용가능하다.


등급별 생존률

titanic.dt[, mean(survived), by = "pclass"]
##    pclass     V1
## 1:    1st 0.6192
## 2:    2nd 0.4296
## 3:    3rd 0.2553

1등급 승객의 성별 생존률

titanic.dt[J("1st"), mean(survived), by = "sex"]
##       sex     V1
## 1: female 0.9653
## 2:   male 0.3408

group key는 여러개 지정가능하다.

titanic.dt[J("1st"), mean(survived), by = "sex,boat"]
##        sex boat     V1
##  1: female    2 1.0000
##  2:   male   11 1.0000
##  3: female      0.1667
##  4:   male      0.0000
##  5:   male    3 1.0000
##  6: female   10 1.0000
##  ... 생략 ...
##        sex boat     V1

1등급 승객의 성비율을 알고 있다면

titanic.dt[pclass == "1st", length(which(age > 20))/.N, by = "sex"]
##       sex     V1
## 1: female 0.8125
## 2:   male 0.7877

counting(1등급 승객의 카운팅)

titanic.dt[, length(which(pclass == "1st"))]
## [1] 323
titanic.dt[pclass == "1st", .N]
## [1] 323

group counting(1등급 승객의 성별 카운팅)

titanic.dt[pclass == "1st", .N, by = "sex"]
##       sex   N
## 1: female 144
## 2:   male 179
titanic.dt[, .N, by = "pclass"]
##    pclass   N
## 1:    1st 323
## 2:    2nd 277
## 3:    3rd 709

1등급 승객 성인의 비율을 성별로 나누어 계산

titanic.dt[pclass == "1st", length(which(age > 20))/nrow(.SD), by = "sex"]
##       sex     V1
## 1: female 0.8125
## 2:   male 0.7877
titanic.dt[pclass == "1st", length(which(age > 20))/.N, by = "sex"]
##       sex     V1
## 1: female 0.8125
## 2:   male 0.7877


다. data merge 연산

data.frame의 merge보다 약 400배 이상 빠른 속도를 보인다.


data.frame merge

# data.frame 생성
DF <- data.frame(x = runif(2.6e+07), y = rep(LETTERS, each = 10000))
df <- data.frame(y = c("A", "B", "C"), z = c("a", "b", "c"))
# data.table 생성
DT <- as.data.table(DF)
dt <- as.data.table(df)
# 데이터확인
head(DF)
##        x y
## 1 0.5853 A
## 2 0.6798 A
## 3 0.5041 A
## 4 0.9614 A
## 5 0.4453 A
## 6 0.8605 A
head(df)
##   y z
## 1 A a
## 2 B b
## 3 C c
# data.frame 시간측정
system.time(tmp.merge <- merge(DF, df, by = "y"))
##    user  system elapsed 
##   29.13    0.95   30.09

data.table merge 

# 먼저 setkey를 이용하여 key값을 지정
setkey(DT, y)
system.time(tmp.merge.dt <- DT[dt, ])
##    user  system elapsed 
##    0.07    0.00    0.06

월등한 속도차이를 보인다.


라. data 수정 및 삭제

DT[i, 새로운 변수명 ` =` 값] 표현식으로 data에서 계산을하거나 사용자가 원하는 새로운 변수를 만들수 있다.


titanic data에 isminor란 변수에 'adult'라는 값을 추가

titanic.dt[, `:=`(isminor, "adult")]
##    X pclass survived                            name    sex     age sibsp
## 1: 1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000     0
## 2: 2    1st        1  Allison, Master. Hudson Trevor   male  0.9167     1
## 3: 3    1st        0    Allison, Miss. Helen Loraine female  2.0000     1
## 4: 4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000     1
## 5: 5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000     1
## 6: 6    1st        1             Anderson, Mr. Harry   male 48.0000     0
##    parch ticket   fare   cabin    embarked boat body
## 1:     0  24160 211.34      B5 Southampton    2   NA
## 2:     2 113781 151.55 C22 C26 Southampton   11   NA
## 3:     2 113781 151.55 C22 C26 Southampton        NA
## 4:     2 113781 151.55 C22 C26 Southampton       135
## 5:     2 113781 151.55 C22 C26 Southampton        NA
## 6:     0  19952  26.55     E12 Southampton    3   NA
##                          home.dest isminor
## 1:                    St Louis, MO   adult
## 2: Montreal, PQ / Chesterville, ON   adult
## 3: Montreal, PQ / Chesterville, ON   adult
## 4: Montreal, PQ / Chesterville, ON   adult
## 5: Montreal, PQ / Chesterville, ON   adult
## 6:                    New York, NY   adult

추가된 data 확인

titanic.dt[isminor == "adult", .N]
## [1] 1309

age가 15이하일때는 'child'로 값은 수정

titanic.dt[age < 15, `:=`(isminor, "child")]
##          X pclass survived                            name    sex     age
##    1:    1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000
##    2:    2    1st        1  Allison, Master. Hudson Trevor   male  0.9167
##    3:    3    1st        0    Allison, Miss. Helen Loraine female  2.0000
##    4:    4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000
##    5:    5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000
##   ---                                                                    
## 1305: 1305    3rd        0            Zabour, Miss. Hileni female 14.5000
## 1306: 1306    3rd        0           Zabour, Miss. Thamine female      NA
## 1307: 1307    3rd        0       Zakarian, Mr. Mapriededer   male 26.5000
## 1308: 1308    3rd        0             Zakarian, Mr. Ortin   male 27.0000
## 1309: 1309    3rd        0              Zimmerman, Mr. Leo   male 29.0000
##       sibsp parch ticket    fare   cabin    embarked boat body
##    1:     0     0  24160 211.337      B5 Southampton    2   NA
##    2:     1     2 113781 151.550 C22 C26 Southampton   11   NA
##    3:     1     2 113781 151.550 C22 C26 Southampton        NA
##    4:     1     2 113781 151.550 C22 C26 Southampton       135
##    5:     1     2 113781 151.550 C22 C26 Southampton        NA
##   ---                                                         
## 1305:     1     0   2665  14.454           Cherbourg       328
## 1306:     1     0   2665  14.454           Cherbourg        NA
## 1307:     0     0   2656   7.225           Cherbourg       304
## 1308:     0     0   2670   7.225           Cherbourg        NA
## 1309:     0     0 315082   7.875         Southampton        NA
##                             home.dest isminor
##    1:                    St Louis, MO   adult
##    2: Montreal, PQ / Chesterville, ON   child
##    3: Montreal, PQ / Chesterville, ON   child
##    4: Montreal, PQ / Chesterville, ON   adult
##    5: Montreal, PQ / Chesterville, ON   adult
##   ---                                        
## 1305:                                   child
## 1306:                                   adult
## 1307:                                   adult
## 1308:                                   adult
## 1309:                                   adult

수정된 data 확인

titanic.dt[isminor == "adult", .N]
## [1] 1200
titanic.dt[isminor == "child", .N]
## [1] 109

계산결과 값으로도 가능, 요금을 원화로 계산

titanic.dt[, `:=`(fare.won, fare * 1000)]
##    X pclass survived                            name    sex     age sibsp
## 1: 1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000     0
## 2: 2    1st        1  Allison, Master. Hudson Trevor   male  0.9167     1
## 3: 3    1st        0    Allison, Miss. Helen Loraine female  2.0000     1
## 4: 4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000     1
## 5: 5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000     1
## 6: 6    1st        1             Anderson, Mr. Harry   male 48.0000     0
##    parch ticket   fare   cabin    embarked boat body
## 1:     0  24160 211.34      B5 Southampton    2   NA
## 2:     2 113781 151.55 C22 C26 Southampton   11   NA
## 3:     2 113781 151.55 C22 C26 Southampton        NA
## 4:     2 113781 151.55 C22 C26 Southampton       135
## 5:     2 113781 151.55 C22 C26 Southampton        NA
## 6:     0  19952  26.55     E12 Southampton    3   NA
##                          home.dest isminor fare.won
## 1:                    St Louis, MO   adult   211337
## 2: Montreal, PQ / Chesterville, ON   child   151550
## 3: Montreal, PQ / Chesterville, ON   child   151550
## 4: Montreal, PQ / Chesterville, ON   adult   151550
## 5: Montreal, PQ / Chesterville, ON   adult   151550
## 6:                    New York, NY   adult    26550


4. 결론 :)

이것으로 data.table에 대하여 간략하게 사용방법을 알아보았다.

data.frame에 비해 월등한 속도를 보이므로 R에서 데이터 탐색,추가,수정 등의 작업에 유용하게 사용할 수 있겠다.

data.table에 대하여 더 자세하게 알고 싶다면 아래 링크를 참조하기 바란다. :)


저작자 표시
신고

'R' 카테고리의 다른 글

R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19
R data.table  (1) 2014.02.07
R 상위버전 설치  (0) 2014.01.28
R DB Connection  (0) 2014.01.28

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 안녕하세요 테이블을 만들고 싶은데, 이해가 잘안되서요
secret

R 상위버전 설치

R 2014.01.28 11:19

Ubuntu를 사용하는 유저라면 R을 아래와 같이 설치할 수 있다.

 $ sudo apt-get install r-base


설치후 아래와 같은 명령어로 R version을 확인해보면 아마도? 메이비? 2.14 version이 설치되어 있을 것이오!!

R.Version()

물론 해당 버전으로 R을 사용하는데 크게 문제는 없다. 하지만... 말이오... 일부 Package의 경우 하위 R버전을 지원하지 않는단 말이오!!! 말이오~~~ ^^ 2.15 이상이거나 3.0 이상부터 지원하는 Package도 꽤 많다오...


그래서 우린 뛰어난 똑똑이들이 만들어놓은 Package를 R version의 문제로 사용 못하게 되는 일이 없도록 R 상위버전을 설치할 필요가 있다... 그래서 방법을 알려주겠소...


sources.list파일을 열어서 아래 두줄을 추가해주시오.

 $ sudo vi /etc/apt/sources.list


여기서 precise는 Ubuntu 버전이라오.

 deb http://cran.cnr.berkeley.edu/bin/linux/ubuntu/ precise/

 deb http://cran.cnr.berkeley.edu/bin/linux/ubuntu/ precise-update/


sources.list에 추가 후 apt key 인증을 실행해주시오.

 $ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9

 $ gpg -a --export E084DAB9 | sudo apt-key add -


이미 설치가 되어있다면 update & upgrade

 $ sudo apt-get update

 $ sudo apt-get upgrade


이제 설치를 해보면 R 최신버전이 3.0이 설치될것이오..

 $ sudo apt-get install r-base


짠~

 $ R

R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"

Copyright (C) 2013 The R Foundation for Statistical Computing

Platform: x86_64-pc-linux-gnu (64-bit)


R is free software and comes with ABSOLUTELY NO WARRANTY.

You are welcome to redistribute it under certain conditions.

Type 'license()' or 'licence()' for distribution details.


  Natural language support but running in an English locale


R is a collaborative project with many contributors.

Type 'contributors()' for more information and

'citation()' on how to cite R or R packages in publications.


Type 'demo()' for some demos, 'help()' for on-line help, or

'help.start()' for an HTML browser interface to help.

Type 'q()' to quit R.


저작자 표시
신고

'R' 카테고리의 다른 글

R data.table  (1) 2014.02.07
R 상위버전 설치  (0) 2014.01.28
R DB Connection  (0) 2014.01.28
R 상관분석(Correlation) 시각화  (2) 2014.01.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R DB Connection

R 2014.01.28 11:02

R에서 일반적인 분석 방법은 아래와 같다.

1. DB에서 분석할 데이터를 가져와 csv, txt와 같은 파일 형태로 생성한다.

2. R에서는 각종 read 함수를 이용하여 생성한 파일을 메모리에 올려 분석 작업을 진행한다.


이 방법의 단점은 R에서 분석하기 위해서는 DB에서 데이터를 가공해서 파일로 전달할때 까지 기다려야 한다는 것이다.

분석가와 DBA간의 커뮤니케이션에 문제가 있을 경우 위 1,2번의 작업을 몇 차례나 더 해야 할 수도 있다.


그래서 이번에는 R에서 직접 RDBMS를 Conncetion하는 방법을 알아보고자 한다.

이 방법의 장점은 SQL을 조금만 알면 분석가는 DBA에게 데이터를 요청할 필요도 없으며 SQL로 쉽게 데이터를 선 정제 후 R에서 분석가능하다.


여기서 부터 아래 작업은 Ubuntu 64bit 기준으로 작성되었으며 R이 이미 설치되어 있다고 가정한다.

R Version은 >= 2.15 이상이어야 한다.


RJDBC 패키지를 사용하기 위해서는 우선 java를 설치해야 한다.

 $ sudo apt-get install openjdk-7-jdk


그리고 아래와 같이 실행하기 바란다.(Root 계정으로 실행)

 $ R CMD javareconf


이제 R에서 DB Connection하기 위한 Package를 설치해야 한다.

install.packages(rJava)
install.packages(DBI)
install.packages(RJDBC)

환경변수 세팅

 LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server/:/home/user/R/x86_64-pc-linux-gnu-library/3.0/rJava/jri:$LD_LIBRARY_PATH


설치 후 해당 Package가 제대로 load되는지 확인이 필요하다.

library(DBI)
library(rJava)
library(RJDBC)

RJDBC는 rJava에 의존적으로 rJava를 먼저 load 후 loading해야 한다.

혹 rJava load 시 아래와 같은 에러가 발생할 경우 이 링크를 참조하기 바란다.

(만약 이도저도 다 해봤는데 안되면 재부팅 해보길 바란다... ^^;)

 Error in dyn.load(x, as.logical(local), as.logical(now)) : 
      unable to load shared library '/usr/local/lib/R/site-library/rJava/libs/rJava.so':
  libjvm.so: cannot open shared object file: No such file or directory

여기서는 mysql를 접속하기 위해서 mysql connector를 설치해야 한다.(oracle이라면 이글 참고)

 $ sudo apt-get install libmysql-java

설치를 하게 되면 /usr/share/java/ 폴더에 jar파일이 있을 것이다.


이제 다 끝났다. 이제 직접 R에서 DB Connection을 해보자.

library(DBI)
library(rJava)
library(RJDBC)
drv <- JDBC("com.mysql.jdbc.Driver", "/usr/share/java/mysql-connector-java.jar", identifier.quote="`")
conn <- dbConnect(drv, "jdbc:mysql://<db_ip>:<db_port>/<dbname>", "<id>", "<passwd>")
df.table <- dbGetQuery(conn, "select * from DBTABLE")
class(df.table)

실제 소스 실행화면


위 실행화면을 보면 dbGetQuery로 SQL문을 작성하여 해당 테이블을 가져와 df.table R 객체에 할당하였고 테이블 데이터를 확인할 수 있다. 또한 class 함수로 df.table형을 확인해보면 data.frame을 알 수 있다. ^^

저작자 표시
신고

'R' 카테고리의 다른 글

R 상위버전 설치  (0) 2014.01.28
R DB Connection  (0) 2014.01.28
R 상관분석(Correlation) 시각화  (2) 2014.01.24
R 데이터프레임(DF) grep & gsub  (0) 2014.01.17

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

상관분석이란?


상관분석(Correlation Analysis)은 확률론과 통계학에서 두 변수간에 어떤 선형적 관계를 갖고 있는 지를 분석하는 방법이다. 두변수는 서로 독립적인 관계로부터 서로 상관된 관계일 수 있으며 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 한다. 상관분석에서는 상관관계의 정도를 나타내는 단위로 모상관계수 ρ를 사용한다.


상관관계의 정도를 파악하는 상관계수(Correlation coefficient)는 두 변수간의 연관된 정도를 나타낼 뿐 인과관계를 설명하는 것은 아니다. 두 변수간에 원인과 결과의 인과관계가 있는지에 대한 것은 회귀분석을 통해 인과관계의 방향, 정도와 수학적 모델을 확인해 볼 수 있다.

위키백과 참조


R에서 상관분석


R에서는 상관분석하는 방법은 몇가지 함수만 알면 간단하게 할 수 있다.

이 글에서는 R에서 기본으로 제공하는 mtcars 데이터 셋을 이용하고자 한다.

mtcars 데이터 셋은 미국의 1973~74년 자동차 모델에 대한 디자인 성능 연비등의 정보를 나타내고 있다.


우선 mtcars 데이터 셋을 확인해보자

 R-fiddle 버그로 종종 소스코드가 안 보이는 증상이 있음.

str(mtcars)
head(mtcars)

데이터 컬럼 수는 11개이며 32개의 로우 데이터로 구성되어 있다.


그럼 해당 변수들 간의 상관분석을 해보자

cor 함수를 이용하면 간단하게 상관분석을 할 수 있다.


 R-fiddle 버그로 종종 소스코드가 안 보이는 증상이 있음.

mcor <- cor(mtcars)
round(mcor, 2)



상관분석 결과를 간략하게 확인해보면 아래와 같다.

1 또는 -1에 가까울 수록 두 변수간의 상관관계가 있음을 알 수 있다.

> round(mcor, 2)
       mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.66  0.60  0.48 -0.55
cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.81 -0.52 -0.49  0.53
disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.71 -0.59 -0.56  0.39
hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.72 -0.24 -0.13  0.75
drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.44  0.71  0.70 -0.09
wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.55 -0.69 -0.58  0.43
qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00  0.74 -0.23 -0.21 -0.66
vs    0.66 -0.81 -0.71 -0.72  0.44 -0.55  0.74  1.00  0.17  0.21 -0.57
am    0.60 -0.52 -0.59 -0.24  0.71 -0.69 -0.23  0.17  1.00  0.79  0.06
gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  0.21  0.79  1.00  0.27
carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66 -0.57  0.06  0.27  1.00


위 데이터만으로 충분히 분석할 수 있지만 이왕이면 차트로 표현해보자

R에서는 기본적으로 plot을 지원하며 ggplot2와 같은 차트 패키지를 많이 지원하고 있다.

여기서는 상관분석 차트 표현을 위하여 corrplot 패키지를 사용하려 한다.


R-fiddle 버그로 종종 소스코드가 안 보이는 증상이 있음.

library(corrplot)
mcor <- cor(mtcars)
round(mcor, 2) 
corrplot(mcor, method='shade', shade.col=NA, tl.col='black', tl.srt=45)



차트를 확인해보면 아래와 같다. 양수 1에 가까울 수록 파란색 계열로 음수 1에 가까울 수록 붉은색 계열의 색상으로 표현됨을 알 수 있으며 위 데이터 결과보다 차트로 보는것으로 변수간의 상관관계를 쉽게 확인할 수 있다.




저작자 표시
신고

'R' 카테고리의 다른 글

R DB Connection  (0) 2014.01.28
R 상관분석(Correlation) 시각화  (2) 2014.01.24
R 데이터프레임(DF) grep & gsub  (0) 2014.01.17
R evel함수활용 : String Source Code Execute  (0) 2014.01.17

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  2개가 달렸습니다.
  1. 비밀댓글입니다
  2. R 독학중인데 도움 많이 되었습니다. 감사합니다.
secret