PART Ⅰ R 기초및활용 1 장 R 기초 1.1 R 소개및프로그램설치 1.1.1 R 소개 R(http://www.r-project.org/) 은뉴질랜드오클랜드대학의 Ross Ihaka와 Robert Gentleman (1996) 에의해개발된통계계산 (statistical computing) 과그래픽 (graphics) 을위한무료소프트웨어이다. R은 CRAN(http://cran.r-project.org/) 에서제공되는 7,000여개 (2015년 12월기준 ) 의패키지를통해쉽게확장될수있다. CRAN에서제공되는패키지에대한정보는 https://cran.r-project.org/web/packages/index.html에자세히 ( 날짜별, 이름별로정렬 ) 나와있다. 또한 Omegahat(http://www.omegahat.org/), Bioconductor (http://www.bioconductor.org/), R-Forge(http://r-forge.r-project.org/), GitHub (http://github.com/) 등에서도많은패키지를제공받을수있다. R은학술분야와산업분야모두에서널리사용되고있다. R은 2012년이후현재 (2015년 9 월 ) 까지 3년연속 KDnuggets 투표 (http://www.kdnuggets.com/polls/) 에서분석 (analytics) 과데이터마이닝 (data mining), 빅데이터 (big data) 소프트웨어중실무에가장많이사용한언어 1위에올라있으며, Excel, RapidMiner, KNIME, Weka, SAS 등이그뒤를잇고있다. [ 그림 1.1] KDnuggets 소프트웨어투표결과 (2015 년 9 월 15 일기준 ) R 은 IEEE Spectrum's 프로그래밍언어랭킹에서도 JAVA, C 등에이어톱 10 안에들어있 다 (http://spectrum.ieee.org/computing/software/). 특히빅데이터의분석과시각화에뛰어 난 R 의약진이눈에띈다.
2015 년 2014 년 [ 그림 1.2] IEEE Spectrum's 프로그래밍언어랭킹 CRAN 에서는 R 기초, 자료입출력, 그래픽등의다양한매뉴얼을제공하며, CRAN Task Views(http://cran.r-project.org/web/views/) 에서는다양한분야별 ( 기계학습, 군집분석, 다 변량, 시계열, 그래픽,...) 로관련된 R 패키지에대한정보를제공하므로매우유용하다. R 의특징을간략히소개하면다음과같다. R은오픈소스기반의객체지향언어이다. R은메모리기반으로동작하므로데이터처리속도가빠르며하드웨어메모리크기가처리시간에영향을미친다. R은모든플랫폼 (Windows, MacOS, UNIX, Linux) 에서운영이가능하다. SAS나 SPSS 등다른통계분석소프트웨어에서플러그-인형태등으로 R의스크립트를이용할수있다. R은다른언어로작성된프로그램을통합하는강력한인터페이스를제공한다. 이들언어에는 C, C++, C#, Fortran, Perl, Python, JAVA 등이있다. R 은위의기능이외에도다음의부가적인장점을가진다. R 의뉴스레터와 R- 뉴스및많은웹기반의튜토리얼과매뉴얼을제공한다. 새로운방법을동시에개발하는사람이증가하고있다. 베이지안분석을위한 WinBUGS 와인터페이스가가능하다. R 은프로그래밍언어이자강력한데이터분석소프트웨어이며동시에훌륭한그래픽기능을 갖춘강력한도구로써그수요가폭발적으로늘어나고있다.
1.1.2 R과 RStudio 프로그램 설치 (a) R 프로그램 다운로드 절차 (1-1) 홈페이지(http://www.r-project.org)에서 download R을 클릭한다. (1-2) Korea의 미러사이트 가운데 하나(http://cran.nexr.com)를 클릭한다. (1-3) 운영체제에 맞는 프로그램을 클릭한다. (1-4) base를 클릭한다. (1-5) Download R을 클릭한다. (1-6) 설치 언어를 선택한다.
(1-7) 64-bit 사용자는 32-bit Files 를선택해제하고 64-bit Files 를선택한다.
(1-8) 설치된 R 프로그램을실행하면다음과같은초기화면이나타난다. (b) RStudio 프로그램다운로드절차 R 프로그램 (http://www.r-project.org/) 이설치되었다면, R 사용자의편의를위해제공되는무료소프트웨어 ( 에디터 ) 인 RStudio(http://www.rstudio.com/) 프로그램을추가로설치한다 ( 반드시 R 프로그램이먼저설치되어야함 ). RStudio는 R 사용자의편의를위한통합개발환경 (IDE, Integrated Development Environment) 을제공한다. (2-1) 홈페이지 (http://www.rstudio.com/) 에서 Download RStudio 를클릭한다. (2-2) Download rstudio desktop 을클릭한다.
(2-3) 운영체제에맞는프로그램을다운받는다.
(2-4) 설치된 RStudio 프로그램을실행하면다음과같은초기화면이나타난다. 체크사항 : R과 Studio 프로그램이정상적으로설치되었으나, RStudio가정상적으로동작하지않을경우에는다음과같이조치해보기바란다 : 제어판 -> 사용자계정 -> 새계정만들기 -> 관리자 를선택하고 ( 표준사용자 가아님 ), 새계정의이름을 ( 반드시 ) 영어로부여함 -> 사용자전환 설치된 R 프로그램의버전을확인할때는콘솔창 ( 좌측하단 ) 에서다음을수행한다. > R.version
1.1.3 R 들어가기 R 또는 R Studio 환경에서아래의내용을따라하며 R 의기초와작동원리를배우기로한 다. > ## 단순계산기기능 > (20+3*2)/3 [1] 8.666667 # 디폴트로소수점 7 자리에서반올림 # 자릿수변환 > options(digits=4) > (20+3*2)/3 [1] 8.667 > ## 수열 (sequence) 의생성 > 1:10 [1] 1 2 3 4 5 6 7 8 9 10 > seq(1, 5, 0.5) [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 > rep(10, 5) # 반복되는원소 (repeated elements) 의수열 [1] 10 10 10 10 10 > rep(1:5, 2) [1] 1 2 3 4 5 1 2 3 4 5 > ## 연속되는알파벳생성 > LETTERS[1:10] [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" > letters[-(3:5)] [1] "a" "b" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" [20] "w" "x" "y" "z" > ## LETTERS, letters와함께 R에내장된상수 : month.name, month.abb, state.name, state.abb, pi 등이있음 > month.name # 시계열자료등을다룰때유용 [1] "January" "February" "March" "April" "May" "June" "July" "August" [9] "September" "October" "November" "December" > month.abb [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> ## abbreviate(month.name) 의결과와비교해볼것 > pi [1] 3.141593 > ## 값 (value) 을변수에할당 > x <- 3*4 > x [1] 12
1.2 R 의도움말이용하기 1.2.1 help() 함수이용하기 R 의도움말기능은매우우수하다. R 의고급사용자가되기위해서는도움말을잘활용할 필요가있다. > ## 함수에대한도움말 > help(summary) #?summary 와동일 > ## 키워드에대한도움말 > help("for") #?"for" 와동일 > ## help.search() 함수 : 키워드를통해관련자료를내컴퓨터에설치된 (installed) 패키 지에서찾음. 키워드와관련된패키지와함수정보제공 >??ANOVA # help.search("anova") 와동일 > ## apropos() 함수 : 로딩된 (loaded) 패키지에서키워드를포함하는객체를찾음 > apropos("anova") [1] ". C anova" ". C anova.glm" ". C anova.glm.null" [4] "anova" "manova" "power.anova.test" [7] "stat.anova" "summary.manova" > ## help.start() 함수 : HTML 웹브라우저를통한도움말을제공 > help.start() [ 그림 1.3] help.start() 함수의실행화면
1.2.2 R 의자료검색 R 사용자는필요한정보를인터넷또는 R 환경내에서찾을수있다. 주요내용은다음과 같다. > ## R 환경내에서키워드를이용한사이트또는함수찾기 > RSiteSearch("keywords") 이함수는 http://search.r-project.org 사이트에서검색하는것과동일하며, R 환경내에서 내컴퓨터에인스톨되지않은패키지의내용도인터넷검색을통해정보를제공해줌으로 매우편리하다. 그외 R 사용시유용한사이트를소개하면다음과같다. http://crantastic.org # 키워드를통해패키지를찾아보기 http://rseek.org # R 질의에대해특별히맞추어진구글에기초한검색엔진 http://stackoverflow.com # R 관련 Q&A 사이트, 오류등해결책제시 http://stats.stackexchange.com # 통계분석에대한 Q&A 사이트 1.2.3 R 의주요명령어 / 함수요약 R에서사용되는기본명령어 ( 또는함수 ) 에대한요약은 R 홈페이지 (http:/ www.r-project.org/) -> Documentation -> Other -> Contributed Documentation -> Short Documentation and Reference Cards -> R reference card v2 (by Matt Baggott) 를추천한다 (http://cran.r-project.org/doc/contrib/short-refcard.pdf). 이요약표를출력하여활용하면좋을것이다.
1.3 주요연산자및 R 객체 1.3.1 주요연산자및기호 R 에서사용되는주요연산자는다음의 [ 표 1.1] 과같다. [ 표 1.1] R의주요연산자 R 연산자 설명 <- ( 또는 ->) 할당연산자 = 할당연산자 ( 비추천 ) $ 리스트부집합 +, -, *, / 합, 차, 곱, 나누기 ^ 제곱 ~ 모형표현에사용 : 수열 ( 모형에서는교호작용 ) :: 패키지에서함수참조! NOT & AND OR && AND ( 주로 if 문내에서사용됨 ) OR ( 주로 if 문내에서사용됨 ) xor(x,y ) 원소별배타적 OR == equal to <, >, <=, >= 대소관계 %*% 행렬곱 %% 모듈러연산자 %/% 정수나누기 %o% 외적 %x% 크로네커곱 %in% 매칭연산자 ( 모형에서는내포 (nesting)) R 은다음의사항을따른다. R 객체명은대, 소문자를구분한다 (case-sensitive). R 프로그램의각행에서 # 기호이후의모든내용은주석문 (comments) 으로취급되며, 따라서프로그램의수행에는영향을주지않는다.
1.3.2 주요객체와생성 R은여러형태 (types) 의객체를가진다. R의객체형태에는스칼라 (scalar), 벡터 (vector), 행렬 (matrix), 데이터프레임 (data frame), 리스트 (list), 시계열 (time series), 함수 (function), 그래픽 (graphics) 등이있다. R을잘다루기위해서는이들객체에대한이해가선행되어야한다. R 객체는모드 (mode) 를통해특징지워진다. 모드의종류는다음과같다. 빈객체 (null or empty object) 논리형 (logical): TRUE 또는 FALSE 수치형 (numeric): 5, 3.1415, 10+sqrt(3) 복소수형 (complex): 5-3i, complex(2,4,-2) 문자형 (character): "Red", "John", "y=a+bx" 객체의모드를확인하고자할때는 class() 함수를사용한다. 또한, R 의 str() 함수는 R 객 체의구조 (structure) 를보여준다. 이함수들은어떠한 R 객체에도적용된다. (a) 벡터객체생성 > ## 벡터 (vector) 객체생성 : c() 함수사용 (c: combine) > v <- c(2, 4, 6) > v # 숫자형벡터 [1] 2 4 6 > class(v) [1] "numeric" > str(v) num [1:3] 2 4 6 > ## 이름이부여된벡터 (named vector) 생성 > names(v) <- c("site1", "site2", "site3") > v # ( 이름이부여된 ) 숫자형벡터 site1 site2 site3 2 4 6 > v[1] site1 2
> v["site1"] site1 2 > v[2] <- "Kim" > v # ( 이름이부여된 ) 문자형벡터 site1 site2 site3 "2" "Kim" "6" > (v1 <- c(v[1], v[3])) site1 site3 "2" "6" (b) 요인객체생성 요인 (factor) 은범주형자료를다룰때사용되며, 취할수있는가능한값을수준 (levels) 으 로가진다. > ## factor() 함수 : 요인객체생성 > f <- factor(c("low", "high")) > f [1] low high Levels: high low 주의마지막줄에 "Levels:..." 는요인객체를벡터객체와외형적으로구분지어준다. > ## gl() 함수 : 요인수열 (factor sequence) 의생성 > f.1 <- gl(2, 3, labels=c("male", "female")) > f.1 [1] male male male female female female Levels: male female > ## table() 함수 : 요인객체에대해빈도표 (frequence table) 작성 > table(f.1) f.1 male female 3 3 > f.2 <- factor(c("white", "black", "white", "white", "black", "white")) > (t <- table(f.1, f.2))
f.2 f.1 black white male 1 2 female 1 2 > ## margin.table() 함수 : 주변표작성 > margin.table(t, 1) f.1 male female 3 3 > margin.table(t, 2) f.2 black white 2 4 > ## prop.table() 함수 : 비율표작성 > prop.table(t, 1) f.2 f.1 black white male 0.3333333 0.6666667 female 0.3333333 0.6666667 > prop.table(t, 2) f.2 f.1 black white male 0.5 0.5 female 0.5 0.5 > prop.table(t) f.2 f.1 black white male 0.1666667 0.3333333 female 0.1666667 0.3333333 (c) 행렬과배열객체생성 > ## matrix() 함수 : 행렬 (matrix) 객체생성 > m <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8), 2, 4) > m
[,1] [,2] [,3] [,4] [1,] 1 3 5 7 [2,] 2 4 6 8 > m[2,2] [1] 4 > m[1,] [1] 1 3 5 7 > m[1, -3] [1] 1 3 7 > ## array() 함수 : 배열 (array) 객체생성 > a <- array(1:30, dim=c(2, 5, 3)) > a,, 1 [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10,, 2 [,1] [,2] [,3] [,4] [,5] [1,] 11 13 15 17 19 [2,] 12 14 16 18 20,, 3 [,1] [,2] [,3] [,4] [,5] [1,] 21 23 25 27 29 [2,] 22 24 26 28 30 (d) 리스트객체생성 리스트 (list) 는서로다른유형의객체 (objects) 들의순서화된모임 (ordered collection) 이다. > ## list() 함수 : 리스트객체생성
> l <- list(id=c(1, 2, 3), name=c("kim", "Lee", "Park"), score=c(70, 80, 90)) > l $id [1] 1 2 3 $name [1] "Kim" "Lee" "Park" $score [1] 70 80 90 > l[3] # ( 주의 ) 원소가하나인리스트임 $score [1] 70 80 90 > l[[3]] # ( 주의 ) 리스트가아닌벡터객체임에유의 [1] 70 80 90 > l$score # l[[3]] 과동일 [1] 70 80 90 > unlist(l) # 이름을가지는문자형벡터객체 id1 id2 id3 name1 name2 name3 score1 score2 score3 "1" "2" "3" "Kim" "Lee" "Park" "70" "80" "90" (e) 데이터프레임객체생성 데이터프레임 (data frame) 은행렬과유사하나컬럼별로이름이부여되어있으며, 행렬과는 달리각컬럼별서로다른형태의자료를가질수있다는면에서리스트와도유사하다. > ## data.frame() 함수 : 데이터프레임객체생성 > d <- data.frame(id=c(1, 2, 3), name=c("kim", "Lee", "Park"), score=c(70, 80, 90)) > d id name score 1 1 Kim 70 2 2 Lee 80 3 3 Park 90 > d$name
[1] Kim Lee Park Levels: Kim Lee Park > d$score [1] 70 80 90 > d[2,3] [1] 80 > d[1, ] id name score 1 1 Kim 70 > d[, 1] [1] 1 2 3 > d[d$score >= 80, ] id name score 2 2 Lee 80 3 3 Park 90 > d[d$name=="kim", ] id name score 1 1 Kim 70 > d[d$name=="kim", "score" ] [1] 70 > d[d$name=="kim", c("id", "score")] id score 1 1 70 > names(d) [1] "id" "name" "score" > names(d)[3] <- "total" > d id name total 1 1 Kim 70 2 2 Lee 80 3 3 Park 90
(f) 테이블객체생성 앞서요인객체를 table() 함수로요약한바있다. table() 함수가적용된결과는테이블객 체로취급되어다루어진다. 특히, 테이블객체는범주형자료의분석에유용하다. > ## 테이블 (table) 객체생성 : table() 함수를이용 > table(rpois(100,5)) 1 2 3 4 5 6 7 8 9 10 12 3 7 10 21 13 20 14 6 4 1 1 > ## 2차원테이블객체생성 > table(rbinom(100, 10, 0.5), rbinom(100, 10,.2)) # 길이가같아야함 0 1 2 3 4 5 6 1 0 0 0 0 1 0 0 2 1 1 2 0 0 1 0 3 4 4 1 1 0 0 0 4 2 6 4 5 2 0 1 5 2 6 12 6 0 0 1 6 0 10 5 5 1 0 0 7 0 2 3 2 1 1 0 8 0 2 1 2 2 0 0 # ftable() 함수 : 다양한객체 ( 요인, 리스트, 데이터프레임, 분할표등 ) 를평면분할 표 (flat contingency table) 객체로만들어줌 (ftable 객체생성 ). > ftable(titanic, row.vars=1:3) # 테이블객체 (Titanic) 에 ftable() 함수적용 Survived No Yes Class Sex Age 1st Male Child 0 5 Adult 118 57 Female Child 0 1 Adult 4 140 2nd Male Child 0 11 Adult 154 14 Female Child 0 13 Adult 13 80 3rd Male Child 35 13 Adult 387 75 Female Child 17 14 Adult 89 76
Crew Male Child 0 0 Adult 670 192 Female Child 0 0 Adult 3 20 > ftable(titanic, row.vars=1:2, col.vars="survived") Survived No Yes Class Sex 1st Male 118 62 Female 4 141 2nd Male 154 25 Female 13 93 3rd Male 422 88 Female 106 90 Crew Male 670 192 Female 3 20 > ftable(titanic, row.vars=2:1, col.vars="survived") Survived No Yes Sex Class Male 1st 118 62 2nd 154 25 3rd 422 88 Crew 670 192 Female 1st 4 141 2nd 13 93 3rd 106 90 Crew 3 20 > ## 데이터프레임객체를 ftable 객체로 > x <- ftable(mtcars[c("cyl", "vs", "am", "gear")]) > ## 데이터프레임객체에 ftable() 함수적용 > x gear 3 4 5 cyl vs am 4 0 0 0 0 0 1 0 0 1 1 0 1 2 0 1 0 6 1 6 0 0 0 0 0 1 0 2 1
1 0 2 2 0 1 0 0 0 8 0 0 12 0 0 1 0 0 2 1 0 0 0 0 1 0 0 0 > ftable(x, row.vars=c(2, 4)) cyl 4 6 8 am 0 1 0 1 0 1 vs gear 0 3 0 0 0 0 12 0 4 0 0 0 2 0 0 5 0 1 0 1 0 2 1 3 1 0 2 0 0 0 4 2 6 2 0 0 0 5 0 1 0 0 0 0 > ## dnn= 옵션을통해출력시변수명 (dimension name: 라벨 ) 을변경함 > ftable(mtcars$cyl, mtcars$vs, mtcars$am, mtcars$gear, row.vars=c(2, 4), dnn=c("cylinders", "V/S", "Transmission", "Gears")) Cylinders 4 6 8 Transmission 0 1 0 1 0 1 V/S Gears 0 3 0 0 0 0 12 0 4 0 0 0 2 0 0 5 0 1 0 1 0 2 1 3 1 0 2 0 0 0 4 2 6 2 0 0 0 5 0 1 0 0 0 0 # ftable() 함수는 ftable(xtabs()) 형식으로 xtabs() 함수와함께사용하면분할표 작성에매우유용하다 (21 장참고 ). (g) 시계열객체생성 시계열객체는시간의흐름에따라변하는자료객체를의미한다. > ## 시계열 (time series) 객체생성 : ts() 함수를이용
> (t <- ts(1:10, frequency=4, start=c(2001, 2))) Qtr1 Qtr2 Qtr3 Qtr4 2001 1 2 3 2002 4 5 6 7 2003 8 9 10 > str(t) Time-Series [1:10] from 2001 to 2004: 1 2 3 4 5 6 7 8 9 10 > ## 다변량시계열생성 > set.seed(100) > z <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), frequency=12) > class(z) # 여러가지객체로인식됨 [1] "mts" "ts" "matrix" > head(z) # 행렬구조로출력됨에유의 Series 1 Series 2 Series 3 [1,] -0.50219235-0.3329234 0.02817177 [2,] 0.13153117 1.3631137-0.35670341 [3,] -0.07891709-0.4691473 0.85262638... [99,] -1.1786831-1.0854529 0.8140322 [100,] -1.1740348 0.5769373-1.3200244 > plot(z) > plot(z, plot.type="single", lty=1:3)
1.4 R 객체다루기 1.4.1 객체확인및전환하기 R 의객체는매우다양하며, 객체의종류에따라적용되는함수가다르다. R 에서객체를 확인하거나전환하는함수는다음과같다. 객체확인하기 is.vector(), is.matrix(), is.data.frame(), is.factor(), is.table(), is.ts(),... 객체전환하기 as.vector(), as.matrix(), as.data.frame, as.factor(), as.table(), as.ts(),... > ## 활용예제 > a <- matrix(c(1:10), 2, 5) > is.data.frame(a) [1] FALSE > is.matrix(a) [1] TRUE > a %*% t(a) # %*% 는행렬객체에적용되는연산자임 [,1] [,2] [1,] 165 190 [2,] 190 220 > b <-as.data.frame(a) > str(b) 'data.frame': 2 obs. of 5 variables: $ V1: int 1 2 $ V2: int 3 4 $ V3: int 5 6 $ V4: int 7 8 $ V5: int 9 10 > b %*% t(b) # 객체 b 는행렬객체가아니므로행렬연산 (%*%) 수행불가 Error in b %*% t(b) : requires numeric/complex matrix/vector arguments > as.matrix(b) %*% t(as.matrix(b)) [,1] [,2] [1,] 165 190
[2,] 190 220
1.4.2 분석결과객체다루기 R 에서통계분석함수 ( 예를들어, lm() 함수 ) 를수행한결과객체는여러가지중요한정보 를포함하고있다. 이가운데분석에필수적인중요한정보는다음과같이 summary( 객체 명 ) 함수를사용하면편리하다. 결과객체에저장된정보의종류 ( 이름 ) 는 names() 함수를통해확인할수있다. 물론이가 운데일부를새로운객체로저장할수도있다. 이와유사한함수로는 ls() 와 objects() 가있 다. > ## names() 함수의적용예 > lm.iris <- lm(sepal.length ~ Sepal.Width, data=iris) # lm.iris는 lm 객체임 > names(lm.iris) # lm 객체에포함된내용확인 [1] "coefficients" "residuals" "effects" "rank" "fitted.values" "assign" [7] "qr" "df.residual" "xlevels" "call" "terms" "model" > ls(lm.iris) # 제공되는내용은유사하나순서가다름 [1] "assign" "call" "coefficients" "df.residual" "effects" "fitted.values" [7] "model" "qr" "rank" "residuals" "terms" "xlevels" > summary(lm.iris) # lm 객체의주요결과요약 Call: lm(formula=sepal.length ~ Sepal.Width, data=iris) Residuals: Min 1Q Median 3Q Max -1.5561-0.6333-0.1120 0.5579 2.2226 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 6.5262 0.4789 13.63 <2e-16 *** Sepal.Width -0.2234 0.1551-1.44 0.152 일반적으로 names() 함수는이름이부여된객체의이름 (name) 을출력하거나바꿀때사용 하는함수이다.
1.5 인덱싱과벡터화연산 1.5.1 인덱싱 인덱싱 (indexing) 을통해벡터로부터특정한자료를추출한다. [] 속의인덱스벡터는논리 형, 정수, 음의정수, 문자열 (:) 이가능하다. > x <- c(-3, 5, 0, 50, 100, -10) > (y <- x > 0) [1] FALSE TRUE FALSE TRUE TRUE FALSE > x[x > 0] # x[y] 와동일 [1] 5 50 100 > x[x < -5 x >= 50] # 은 or 연산자 [1] 50 100-10 > x[x > 0 & x < 100] # & 은 and 연산자 [1] 5 50 > x[-c(1, 3)] [1] 5 50 100-10 > x[c(3:5)] [1] 0 50 100 인덱싱은벡터객체뿐아니라행렬, 데이터프레임, 리스트등의객체에대해서도유사하게 적용된다.
1.5.2 벡터화연산 R 의강력한기능가운데하나는벡터화연산 (vectorizing computation) 이다. R 의고급사용 자가되기위해서는반복문의사용을가급적피하고벡터화연산을잘활용하는것이바람 직하다 ( 연산속도에서많은차이가있음 ). > v1 <- c(1, 2, 3, 4, 5) > 2*v1 # 원소별로연산이적용됨 [1] 2 4 6 8 10 > sqrt(v1) # 원소별로함수가적용됨 [1] 1.000000 1.414214 1.732051 2.000000 2.236068 > 1:10 * 10:1 # 대응되는원소끼리연산이수행됨 [1] 10 18 24 28 30 30 28 24 18 10 > v2 <- c(10, 20, 30) > v1+v2 # 벡터의길이가달라도재순환규칙 (recycling rule) 이적용됨 [1] 11 22 33 14 25
1.6 R 함수만들기와프로그램실행 1.6.1 R 함수만들기 R 은사용자가분석에필요한함수를만들어사용할수있다. 다음은사용자정의함수의간 단한예로가중평균을구하는함수이다 ( 함수명 : weighted.mean()). > ## 함수작성예 : 가중평균을구하는함수 > weighted.mean <- function(x, weight=rep(1, length(x))) { sum(x * weight) / sum(weight) } > weighted.mean(1:3) # 함수이용하기 [1] 2 > weighted.mean(1:3, 3:1) [1] 1.667 함수는한개또는여러개의결과를다양한방식으로제공할수있다. (a) 한개의결과내보내기 > ## 예 : 표준오차구하는함수 > std.error <- function(x) { v <- var(x) n <- length(x) se <- sqrt(v/n) return(se) # return() 함수 : 한개의결과만내보냄 } > ## 위함수는다음과동일함 > std.error <- function(x) { v <- var(x) n <- length(x) sqrt(v/n) # 마지막문장이결과로제공됨 } > std.error(c(1:10)) [1] 0.9574
(b) 여러가지결과를리스트로내보내기 > basic.stats <- function(x) { n <- length(x) m <- mean(x) med <- median(x) s <- sd(x) list(n=n, mean=m, median=med, std=s) # list() 함수 : 여러개의결과를내보냄 } > basic.stats(c(1:10)) $n [1] 10 $mean [1] 5.5 $median [1] 5.5 $std [1] 3.028 > ## 위의 basic.stats() 함수는다음과같이작성될수도있음 > basic.stats <- function(x) { stats <- list() # 빈리스트객체를만듬 stats$n <- length(x) stats$mean <- mean(x) stats$med <- median(x) stats$std <- sd(x) stats # 마지막문장을결과로보냄 } (c) 벡터형태로결과를내보내기 > basic.stats <- function(x) { n <- length(x) m <- mean(x)
med <- median(x) s <- sd(x) out <-c(n, m, med, s) # 벡터로저장 names(out) <- c("n", "mean", "median", "std") # 이름부여 round(out, 4) # out을출력하되소수점 4자리까지만출력 } > basic.stats(c(1:10)) n mean median std 10.0000 5.5000 5.5000 3.0277 [ 예제 1] 자료에대한탐색적분석을수행하는사용자정의함수를하나만들어보자 ( 함수 명 : eda.shape()). > eda.shape <- function(x) { par(mfrow=c(2, 2)) # 그래픽을 행렬의형태로배치함 # par() 함수는전역적으로그래픽옵션을지정하는함수임 (3장참고 ) hist(x) boxplot(x) qqnorm(x) qqline(x) plot(density(x), type="l") } > eda.shape(iris$sepal.length) # 사용자정의함수실행 (d) R 의내장함수수정하여사용하기
R 은매우풍부한함수를제공한다. R 에서제공되는대부분의함수는그소스가제공되므로, 필요시에는목적에맞게수정하여새로운이름으로저장하여사용할수있다. 이경우 fix() 함수를이용한다. > fix(factorial) # factorial() 함수를수정
1.6.2 R 프로그램실행하기 R 콘솔창 (console) 에서외부에서작성된 R 프로그램실행하기위해서는다음의 source() 함수를이용한다. > source(" 화일명.txt") 예를들어, 메모장등에서작성된텍스트파일 ( 화일명 : program.txt) 의내용이다음과 같다고하자. -------------- c:/program.txt 의내용 ------------- x <- c(1,2,3,4,5) y <- c(10,20,30,40,50) mean.x <- mean(x) mean.y <- mean(y) std.error <- function(x) { v <- var(x) n <- length(x) se <- sqrt(v/n) return(se) } SE <- std.error(c(1:10)) ---------------------------------------------- 위프로그램은 source() 함수를이용하여다음과같이실행된다. > source("c:/program.txt") > mean.x; mean.y [1] 3 [1] 30 > SE [1] 0.9574271 R 프로그램이한번실행되고나면프로그램내의함수 (std.error) 와변수 (x, y, mean.x, mean.y, SE) 들은작업창 (workspace) 에서객체로저장되므로언제든호출하여사용할수 있다. > ## 웹에서제공되는텍스트파일도동일한방법으로실행할수있음 > source("http:// /a.txt")
1.7 R 패키지활용과객체관리 1.7.1 패키지활용및참조 (a) 패키지활용 R 환경내에서다음의절차를통해 CRAN 사이트 ( 디폴트임 ) 에서제공하는 R 패키지의기 능을 ( 함수를 ) 이용할수있다. 예를들어, 패키지 {ggplot2} 의기능을사용하고싶다면다 음을수행하면된다. > ## 패키지를내컴퓨터에설치 (install) 함 > install.packages("ggplot2") > ## CRAN 이외의사이트로부터패키지를 install 하는예는다음과같다. > install.packages("packagename", repos="http://www.omegahat.org/r") > ## 패키지를현재의작업환경으로로딩 (loading) 함 > library("ggplot2") # require("ggplot2") 와동일 패키지 {ggplot2} 에서제공하는함수는다음과같이확인할수있다. 아래에서따옴표는생 략가능하다. > library(help="ggplot2") # help(package="ggplot2") 와동일 (b) 패키지참조 R 에서는동일한이름을가진함수가여러패키지에서제공될수있다. 이때참조기호 (::) 를이용하여프로그램내에서분명하게명시할필요가있다. 예를들어, 패키지 {e1071} 에서제공하는 skewness() 함수를이용하는방법은다음과같 다. 이명령어가실행되기위해서는해당패키지가내컴퓨터에설치되어있어야한다 (loading 될필요는없다 ). > ## 참조기호 (::) 활용예제 > x<-c(1:100) > e1071::skewness(x) # ( 패키지 :: 함수 ) 형태 : 패키지내의함수를호출 [1] 0
(c) 패키지갱신 update.packages() 함수는설치된패키지의버전을최신버전으로갱신한다. 관련함수로는 old.packages() 와 new.packages() 가있다 ( 두함수는모두인스톨된패키지와 CRAN 등의 패키지저장소의버전을비교해준다 ). > update.packages()
1.7.2 R 의객체관리 R 이설치되면기본적으로 {base} 패키지가설치되면서 6 개의패키지 ({methods}, {datasets}, {utils}, {grdevices}, {graphics}, {stat}) 가자동으로추가설치된다. 현재작 업창에서 R 이참조하는디렉토리는 search() 함수를통해확인할수있다. (a) search() 와 searchpaths() 함수 > ## search() 함수 : R이참조하는디렉토리확인 > search() > search() [1] ".GlobalEnv" "tools:rstudio" "package:stats" [4] "package:graphics" "package:grdevices" "package:utils" [7] "package:datasets" "package:methods" "Autoloads" [10] "package:base" > ## searchpaths() 함수는좀더자세한정보를제공해줌 > searchpaths() [1] ".GlobalEnv" # 위치불변 [2] "tools:rstudio" [3] "C:/Program Files/R/R-3.1.1/library/stats" [4] "C:/Program Files/R/R-3.1.1/library/graphics" [5] "C:/Program Files/R/R-3.1.1/library/grDevices" [6] "C:/Program Files/R/R-3.1.1/library/utils" [7] "C:/Program Files/R/R-3.1.1/library/datasets" [8] "C:/Program Files/R/R-3.1.1/library/methods" [9] "Autoloads" [10] "C:/PROGRA~1/R/R-31~1.1/library/base" 위결과는 R 이설치된후 RStudio 프로그램이설치된결과를보여준다. R 에서사용되는함 수는위의패키지에부여된번호순으로검색되어실행된다. 가령동일한함수명이서로다 는패키지에존재할때, 상위번호에부여된패키지내의함수가실행되는것이다. 분석을위해새로운패키지를설치후로딩하게되면, 해당패키지가최상위에배치된다. > install.packages("mass") # {MASS} 패키지를설치 > library("mass") # {MASS} 패키지를로딩 > searchpaths() [1] ".GlobalEnv" [2] "C:/Program Files/R/R-3.1.1/library/MASS" # {MASS} 가최상위에위치
[3] "tools:rstudio" [4] "C:/Program Files/R/R-3.1.1/library/stats" [5] "C:/Program Files/R/R-3.1.1/library/graphics" [6] "C:/Program Files/R/R-3.1.1/library/grDevices" [7] "C:/Program Files/R/R-3.1.1/library/utils" [8] "C:/Program Files/R/R-3.1.1/library/datasets" [9] "C:/Program Files/R/R-3.1.1/library/methods" [10] "Autoloads" [11] "C:/PROGRA~1/R/R-31~1.1/library/base" (b) attach() 와 detach() 함수 데이터또는패키지에대해 attach() 함수를적용하여맨상위 ( 또는특정순위 ) 의디렉토리 에위치시킬수있다. R 은 search() 또는 searchpaths() 함수에나타나는순서대로자료나 함수를찾아내어이를실행하게된다. > ## 데이터셋 (iris) 을 attach 시킨예 > attach(iris); searchpaths() 이와같이데이터셋을 attach 한경우에는다음과같이 ( 데이터셋명없이 ) 데이터셋의변수 명을바로사용할수있게된다. > Sepal.Length # iris$sepal.length 와동일함 detach() 함수를통해검색디렉토리목록에서제거할수있다. > detach(package:mass) # detach(2) (c) ls() 와 rm() 함수 각디렉토리내의객체들을관리하는데유용한함수로 ls(), rm() 등이있다. > ## ls() 함수 > ls() # 현재작업창에사용되고있는객체를보여주며 objects() 와동일 [1] "alpha" "cars.lm" "m" "n" "p" "phat" "se" [8] "test.df" "testxtab" "x" "zstar" > ## rm() 함수 > rm(alpha, m, n) # 몇개의객체를지울때 > rm(list=ls()) # 모든객체를지울때
> dir() # 작업디렉토리의모든파일을보여줌
1.8 데이터불러오기 1.8.1 내부데이터불러오기 R 의패키지는함수와함께분석에필요한데이터를제공하기도한다. 기본패키지중 {datasets} 는데이터만모아놓은패키지로 data() 함수를통해그내용을확인할수있다. 패키지내의하나의데이터셋을로딩할때는데이터명을인자로사용한다. data() # data(package="datasets") 와동일 data( 데이터명 ) # 데이터셋로딩 > ## 설치된특정패키지내의데이터셋을확인할때는 package= 옵션을사용함 > data(package=" 패키지명 ) > ## data() 함수사용예 > data(iris) # 데이터셋을로딩함 > str(iris) # 데이터의구조 (structure) 를보여줌 'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1... > head(iris) # 데이터의앞부분 (head) 만보여줌 Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa > tail(iris) # 데이터의뒷부분 (tail) 만보여줌 Sepal.Length Sepal.Width Petal.Length Petal.Width Species 145 6.7 3.3 5.7 2.5 virginica 146 6.7 3.0 5.2 2.3 virginica 147 6.3 2.5 5.0 1.9 virginica 148 6.5 3.0 5.2 2.0 virginica 149 6.2 3.4 5.4 2.3 virginica 150 5.9 3.0 5.1 1.8 virginica
이때, 특정변수를지칭할때는다음과같이데이터셋의이름을반드시사용하여야한다. > iris$sepal.length [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3 [58] 4.9 6.6 5.2 ( 생략 ) 데이터셋의이름을매번사용하는것이번거로울수있다. 이때는 attach() 을이용하여특 정데이터를맨상위의디렉토리에위치시키면된다. > attach(iris) # 인용부호 (" ") 사용안함 > search() # iris가맨상위에위치함을알수있음 [1] ".GlobalEnv" "iris" "package:mass" "tools:rstudio" [5] "package:stats" "package:graphics" "package:grdevices" "package:utils" [9] "package:datasets" "package:methods" "Autoloads" "package:base" 맨상위디렉토리에위치한데이터셋의경우에는변수명만사용해도된다 ( 데이터셋의이름 을생략할수있음 ). > Sepal.Length # iris$sepal.length 대신변수명 (Sepal.Length) 만사용해도됨 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3 [58] 4.9 6.6 5.2 ( 이하생략 )
1.8.2 엑셀등외부데이터불러오기 R 에서외부프로그램에서작성된데이터를불러오는함수는매우다양하다. 이가운데활용 도가높은텍스트와엑셀자료를불러오는함수를소개하면다음과같다. read.table() # 텍스트자료 read.csv() # csv 확장자의엑셀자료 read.xlsx{openxlsx} # 엑셀자료 ( 시트번호지정가능 ) (a) read.table() 함수 : 텍스트형태의데이터를데이터프레임의형태로읽어들임 > read.table("c:/ex1.txt", header=t, sep="") > ## 웹상에서제공되는텍스트자료도동일한방법으로불러올수있다. > read.table("http:/.../a.dat") (b) read.csv() 함수 : csv 확장자를가지는엑셀자료를불러옴. 확장자가.xls 인엑셀자료 는확장자명을.csv 로저장후사용 > read.csv("c:/project/ex1.csv") # R 에서는디렉토리지정에 / 가사용됨에유의 > ## 위명령어는다음과같이두단계로수행될수있다. > setwd("c:/project") # setwd(): set working directory를의미함 # 현재의작업디렉토리는 getwd() 를통해확인가능 > read.csv("ex1.csv") (c) read.xlsx{openxlsx} 함수 : 확장자가.xlsx 인엑셀자료를불러옴. 시트번호를비롯한 다양한옵션을제공하여매우편리함 > library(openxlsx) > read.xlsx("c:/project/ex1.xlsx", 1) # 두번째인자는 sheet=1 과동일 통계패키지로부터데이터불러오기 (/ 보내기 ): R 의 {foreign} 패키지를통해다양한통계시스템 ( 예를들어, SAS, SPSS, Minitab, Stata, Systat, S-PLUS, Weka, EpiInfo, dbase) 에서생성된자료를불러올수있음 DBMS 로부터데이터불러오기 (/ 보내기 ):
R 의 {ODBC} 패키지는 SQL- 기반의 DBMS( 예를들어, MySQL, PostgreSQL, Microsoft Access 와 SQL server, DB2, Oracle, SQLite 등 ) 에접근하는공통의 API 를제공함 download.file() 함수는 FTP 또는 HTTP 를통한웹자원으로부터파일을읽어들임 그외자료의 Import/Export 에대한자세한내용은 R 에서 help.start() 를수행후 R Data Import/Export 메뉴얼을참고하기바람 R 패키지 {Hmisc}(:Harrell miscellaneous) 는데이터분석, 고해상도그래픽, 유용한연산, 표본크기와검정력계산을위한함수, 데이터셋가져오기, 결측치대체 (imputing), 고급테이블작성, 변수군집화, 문자열처리 (manipulation), R 객체의 LaTEX 코드로의변환, 변수리코딩등에관련된많은유용한함수를제공한다. (d) R 객체저장하기 : write.table(object, file) 함수는객체를데이터프레임으로바꾸고 ( 객 체가데이터프레임이아닌경우에해당 ) 파일로저장한다. 유사함수로 write.csv() 함수가 있다. > ## write.table() 함수사용예 > x <- matrix(c(1:10), 2,5) > write.table(x, file="c:/test1.csv", sep=",", col.names=na) > write.csv(x, file="c:/test2.csv") # 위의결과와동일 > ## 확장자를.txt 로하면텍스트화일로저장됨 > write.table(x, file="c:/test1.txt")
1 장연습문제 1. rep() 와 seq() 함수를사용하여다음값들로구성된벡터를생성하여라. (a) 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4 (b) 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4 (c) 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6 (d) 9,7,5,3,1,7,5,3,1,5,3,1,3,1,1 2. R 에서엑셀자료를읽어들이고, 변수명을수정한후데이터프레임으로저장하여라. 3. iris 자료를이용하여다음물음에답하여라. (a) 수치형변수만으로데이터프레임으로저장하여라. (b) Species가 setosa인자료만추출하여새로운데이터프레임으로저장하여라. (c) Sepal.Length의값이평균보다큰자료만추출하여새로운데이터프레임으로저장하여라. 4. 월이자율이 인조건으로, 대출 (loan) 받은금액이 이라하자. 대출받은지한달뒤 부터 개월동안갚아나간다고할때, 매달지불해야하는금액 P 는다음과같이계산된 다. 만약이자율 1%( ) 로 1000 만원을대출받아 10 달동안갚아나간다고할때, 매달 지불해야하는금액을계산하여라.