IT기술/BigData

R 기초 입문

dobbby 2014. 2. 13. 18:09
반응형

R  은  데이터  분석을  위한  통계  및  그래픽스를  지원하는  Freeware Software  입니다.

아주  훌륭한  성능을  가지고  있으면서도  Freeware  라는  것이  놀라울  정도인  멋진  Software  이지요.


이렇게  좋은  프로그램의  뿌리는  벨  연구소에서  만들어진  통계  분석  언어  S입니다.  

R  은  S언어를 근간으로  뉴질랜드의  University  of  Auckland에서  RossIhaka  와  Robert  Gentleman  로  부터  시작되었습니다.


R  은  현재  데이터  분석  을  위한  도구로  많은  인기를  누리고  있습니다.

한  가지  사례로  kdnugget  에서  실시한‘  지난  12개월  간  실제로  사용한  분석,  데이터  마이닝,  빅데이터  소프트웨어’에  대한  설문  조사가  있습니다.

그  조사  내용에  따르면  R  은  2012년  기준으로  Rapid  Miner,  Weka  ,  SAS,  MATLAB  등의  쟁쟁한  경쟁자를  물리치고

데이터  분석  소프트웨어  1위를  지키고  있습니다.  

더  놀라운  사실은  저  위의  경쟁  상대들은  대부분  어마어마한  고가의  상용  프로그램  이라는  것이지요.

R은  하나의  컴퓨터  언어이며  다양한  패키지(또는  라이브러리)들로  구성되어  있습니다..

따라서  자유롭게  데이터분석을  R  안에서  수행  할  수  있다는  장점이  있습니다.

또한  R  은  통계,  머신  러닝,  금융,  바이오  인포머틱스  ,  그래픽스에  이르는  다양한  통계  패키지를

갖고  있으며  놀랍게도  이  모든  것이  무료로  제공되고  있습니다.

게다가  최근  시류에  발  맞춰  R  은  멀티  프로세서에서  손쉽게  병렬화하여  실행  할  수  있고,  

RHive를  사용하면  최근  인기를  끌고  있는  Hive환경에서  R을  사용  할  수  있습니다.

R과  비슷한  프로그램도  몇  가지  있습니다.

예를  들어  WEKA는  자바로  작성된  데이터  마이닝  소프트웨어이며  자바  언어에서  연결해  사용하기에  편리한  언어입니다.

또한  매우  훌륭한  가이드  북이  나와  있어  쉽게  시작  할  수  있는  여건도  됩니다.

그러나  WEKA는  기본적으로  GUI를  사용한  도구이지  하나의  언어  쳬계는  아닙니다.


또  다른  예로  Python에는  pydata라  불리는  numpy,  scipy,  pandas,  matplotlib,  sciki-learn의  라이브러리  들이  있습니다. 

Python for Data Analysis처럼  numpy, pandas등을  잘  설명한  책도  있습니다.

좋은  책이  있다는  것은  어두운  밤에  찾아갈  등대가  있다는  것과  같을  것입니다.

그러나  pydata에는  R의  다양한  통계  기능에  대응되는  기능이  없습니다.

비록  statsmodel등의  라이브러리가  있으나  문서화의  수준이  빈약합니다.

그러나  R  은  관련  라이브러리와  각종  자료들이  아주  방대해서  뭘  원하든  아마도  거의  다  있을  거라  생각이  되네요  ^^

본격적인  R  의  세계로  들어가  보겠습니다. 



R  설치  하기

지면  관계상  설치하는  부분은  생략합니다.

직접  설치를  해  보세요.



R  기초

- R  은  1  줄씩  처리하는  인터프리터  언어입니다.

- >  는  명령  프롬프트  입니다.  원하는  명령을  치고  엔터를  치면  실행이  됩니다.

- R  은  대소문자를  구분하므로  명령을  실행할  때  주의해야  합니다.

테스트로  5+6  을  실행하면  아래와  같이  나옵니다.



사용  가능한  주요  산술  연산자들

기호          의미                      사용  예  ->  결과

+              더하기                         5+6   ->   11

-              빼기                            5-4   ->   1

*              곱하기                         5*6   -> 30

/              나누기(실수  가능)         4/2   -> 2

%/%        정수  나누기                  위와  동일

%%         나머지  구하기                5%%4   ->   1

^   , **     거듭제곱                        3^2   -> 9 , 3^3   -> 27



> 3+4*5


괄호를 사용하여 우선순위 조정

>(3+4)*5


# 기호로 주석달기

> 3+4+5     # 주석


-  함수  사용하기

1.  수학  관련  함수  사용하기

주요  수학  함수  정리

함수명          의미

sin(x)          sin x

cos(x)          cos x

tan(x)          tan x

sinh(x)          sinh x

cosh(x)          cosh x

tanh(x)          tanh x

asin(x)          asin x

acos(x)          acos x

atan(x)          atan x

asinh(x)          asinh x

acosh(x)          acosh x

atanh(x)          atanh x

log(x)              로그  계산

log10(x)          상용로그  계산

log2(x)          밑이  2인  로그

log1p(x)          log(1+x)

exp(x)          e  의  x  승

sqrt(x)          루트계산하기

round(x)          반올림

floor(x)          내림

ceiling(x)      올림

trunk(x)          소수점  이하는  버림

sign(x)          x  의  부호(음수인지  양수인지)

이  외에도  다양한  수학적  함수를  지원합니다.



- 숫자함수 사용예

> sqrt(2)

[1] 1.414214

> (cos(1) -sqrt(2)) / exp(3)

[1] -0.04350948



변수의 사용

> a <- sqrt(2)

> a

[1] 1.414214



변수  설정시  주의  사항

1.  대소문자를  구분합니다.

2.  영어와  숫자  모두  쓸수  있으나  시작은  반드시  문자여야  합니다.

3.  예약어는  사용할  수  없습니다.

-  참고  :  예약어들

break   else FALSE for   function if   in Inf   NA   NaN next NULL   repeat TRUE while


> x <- 1

> y <- 2

> x + y

[1] 3


괄호를 쓰면 자동 실행됨

> (x <- 1:5)

[1] 1 2 3 4 5

> x <- 1:5


벡터  살펴보기

R  에서  벡터란  여러  데이터를  모은 것을  의미하며  c( )  함수를  사용합니다.

> c(1,2,3,4,5)

[1] 1 2 3 4 5

> a <- c(1,2,3,4,5)

> a+1

[1] 2 3 4 5 6


벡터  연산  주요  함수들

함수                      의미

cor( )                  상관함수

cumsum( )          누적합

diff( )                  전진차분

length( )            요소갯수

max( )                최대값

min( )                최소값

mean( )              평균값

median( )          가운데값

order( )            각  요소의  원래  위치

prod( )              누적곱

range( )              범위

rank( )              각  요소의  순위

rev( )              요소의  역순

sd( )                표준편차

sort( )                정렬

sum( )                  총합

summary( )          요약통계량

var( )                  분산


> x <- c(1,2,3,4,5)

> max (x)

[1] 5

> mean(x)

[1] 3

> min(x)

[1] 1



위에서  살펴본  백터  안에  들어가는  값들을  요소  라고  부릅니다.

일종의  1차원  배열과  비슷한  개념이므로  특정  항목의  요소를  보고  싶을  경우가  종종  발생합니다.

이럴때는  백터명[번호]  를  하면  되며  순서는  첫번째  부터  1  씩  증가  합니다.

아래의  예를  보세요.


> x <- c(1,2,3,4,5)

> x[2]

[1] 2

> x[3]

[1] 3

> x[3] <- 6

> x

[1] 1 2 6 4 5



벡터  연산  하기

벡터에  다양한  값을  넣은  후  연산을  할  수  있습니다.

아래의  예를  보세요


> c(1,2,3) + c(4,5,6)

[1] 5 7 9

> c(1,2,3) * c(4,5,6)

[1]  4 10 18

> c(1,2,3) + 1

[1] 2 3 4


위  결과를  보면  두  벡터에서  첫  번째  값들과  두  번째  값들과  세  번째  값들이  연산이  되는  것을 알  수  있습니다. 

조금  특이한  것은  세  번째  예제인데  각  요소들에  공통적으로  1을  더한  것을  확인  할  수  있습니다.   




-  함수  만들어서  사용하기

함수의  기본  형태

함수명  <- function(  인수  또는  입력  값)   {

계산식  1

계산식  2

.............

Return (계산  결과  반환  값)

}


예) 함수에 입력되는 값이 없는 경우

> func1 <- function() {

+  return(1)

+ }

> func1()

[1] 1



이번에는  함수에  입력되는  값(인자)  가  있는  경우의  예를  테스트  해  보겠습니다.


제곱구하기

> func2 <- function(x) {

+  y <- x^2

+  return(y)

+ }

> func2(3);

[1] 9


두개의 수를 받아 곱하기

> func3 <- function(x,y) {

+  z <- x*y

+  return(z)

+ }

> func3(2,3)

[1] 6


위  예에서  보는  바와  같이  함수에  여러  가지  인수를  사용하여  연산을  할  수도  있습니다.



-  조건문과  반복문  사용하기

모든  프로그래밍  언어는  조건문과  반복문이  있습니다.

R  역시  프로그래밍  언어이므로  동일하게  조건문과  반복문이  존재합니다.

아래  내용으로  살펴보겠습니다.

- if  조건문

if (조건식)   {

<조건에  맞을  때  실행될  식>

else { 

<  조건이  아닐  때  실행될  식>

}


입력된 숫자가 양수든 음수든 양수로 출력하기

> absfunc1 <- function(a) {

+  if ( a < 0 ) {

+   return(-a)

+  } else {

+   return(a)

+  }

+ }

> absfunc1(1)

[1] 1

> absfunc1(-1)

[1] 1


입력된 숫자가 양수면 0, 음수면 2배로 출력

> absfunc2 <- function(a) {

+  if ( a > 0 ) {

+   x <- a-a

+   return(x)

+  } else {

+   x <- a+a

+   return(x)

+  }

+ }

> absfunc2(1)

[1] 0

> absfunc2(-1)

[1] -2


비교  조건에  사용되는  연산자

조건               의미

==                같다

!=                같지않다

>=              크거나  같다

>                크다

<=              작거나  같다

<                작다


-if ~ else if  문  사용하기  (  조건이  3개  이상일  경우

if (  조건식  1) {

조건식  1일때  실행될  문장

}

else if (  조건식  2) {

조건식  1이  아니고  조건식  2일  경우  실행될  문장

}

else {

조건식  1도  아니고  조건식  2도  아닐  경우  실행될  문장


연습문제  1.  입력되는  인수가  5보다  클  때는  1을  출력하고  5  보다  작으면  무조건  0을  출력하는

functest1( )  을  생성하세요.


연습문제  2.  입력되는  인수가  양수일  때는  1을  출력하고  음수일  때는  늘  0  을  출력하는

functest2( )  를  생성하세요.


연습문제  3.  두  인수를  입력해서  두  인수를  뺀  차이값을  출력하는  함수  functest3(  )  를  생성하세

요.  단  결과값은  늘  양수가  나와야  합니다  (즉  |a-b| (절대값)  이  나와야  합니다)


연습문제  4.  입력값이  0보다  작을  경우  0으로  출력하고  1-5  사이의  값일  경우  1  을  출력하고  5 

이상의  값이  입력될  경우  10을  출력하는  함수  funcif( )  를  생성하세요.




- for  반복문

횟수가  정해진  반복을  수행할  때  사용하는  문장입니다.

for (  변수  in  횟수  ) {

<  반복할  식

}


> fortest1 <- function(a) {

+  for (i in 1:5) {

+   a <- a+i

+  }

+  return(a)

+ }

> fortest1(1)

[1] 16


위의  예는  인자  a  의  값을  입력  받아서  1,2,3,4,5  를  반복적으로  더해서  출력하기  입니다

즉  처음  a가  1  일  경우  a=1  ,  i=1  이므로  2를  a  에  저장한  후  다시  a=2  ,  1=2  이므로  

4를  다시a  에  저장하고  a=4,  i=3  이므로  7을  a  에  저장하고  a=7,i=4  이므로  11을  a  에  저장한  후  

마지막으로  a=11,i=5  이므로  결과가  두  값을  더한  16이  출력되는  것입니다.


아래의  예는  정수  n  을  입력하면  1  부터  n  까지의  더한  값을  입력하는  함수입니다.


> fortest2 <- function(n) {

+  i <- 0

+  for (j in 1:n) {

+   i <- i+j

+  }

+  return(i)

+ }

> fortest2(10)

[1] 55


for  연습문제 

1.  사용자로부터  하나의  숫자를  입력받아서  1  부터  해당  숫자까지의  짝수만  다  더하여  결과를  

력하는  fortest3( )  함수를  생성하세요




여러  가지  조건  지정하기


기호                  의미

!                      ~~가  아니다  (NOT)

&&                  AND

||                   OR


사용  예

 > funcand <- function(x,y) {

+  if (( x > 1 ) && ( y > 1 )) {

+   z <- x * y

+   return(z)

+  } else {

+   z <- x + y

+   return(z)

+  }

+ }

> funcand(1,2)

[1] 3

> funcand(2,3)

[1] 6



그래프  작성  입문하기

R  의  강점  중  대표적인  한  가지가  그래프  작성  기능입니다.

그래프를  그려주는  방법은  그래프만  그리는  고수준  작도함수가  있고  

만들어진  그래프에  글자나 설명등을  추가  할  수  있는  저  수준  작도  함수가  있습니다. 

다양한  함수를  사용하여  멋진  그래픽을  생성하는  연습을  해  보겠습니다.


1. plot( )  함수

R  에서  그래픽  관련해서  가장  많이  사용되는  함수입니다.

이  함수를  사용해서  분포도나  꺾은선  그래프  등을  그릴  수  있습니다.

plot( y  축  데이터  ,  옵션)

plot( x  축  데이터  , y  축  데이터  ,  옵션  ) 


예1)

> y <- c(1,2,3,4,5)

> plot(y)




위  결과와  같이  x  축  값을  지정하지  않을  경우  자동으로  1,2,3,4,5  로  설정이  됩니다.



> y <- c(1,1,2,2,3,3)

> plot(x,y)




예  3) x , y  축의  값을  다  지정해서  출력하기


> x <- c(1:5)

> y <- c(6:10)

> plot(x,y)





- plot( )  함수의  x,y  축  한계값  조정하기

위  경우  x,y  축의  한계는  함수가  자동으로  결정했습니다.  그러나  함수를  수행할  때  xlim  ,  ylim  인

자를  사용해서  사람이  수동으로  지정해  줄  수도  있습니다.


예  4)

> x <- 1:10

> y <- 1:10

> plot(x,y,xlim=c(1,15))





> x <- 1:10

> y <- 1:10

> plot(x,y,xlim=c(15,0))




그래프에  제목을  붙일  때는  아래처럼  main  인수를  사용합니다.


예  6)

> x <- 1:10

> y <- 1:10

> plot(x,y,xlim=c(0,20),main="Sample")


결과  6)





위와  같이  그래프를  제어하는  옵션은  아래와  같습니다.


인수                                    설명

main="메인  제목"                 제목  설정

sub="서브  제목"                  서브  제목

xlab="문자", ylab="문자"        x , y  축에  사용할  문자열을  지정합니다

ann=F                                 x , y  축  제목을  지정하지  않습니다.

tmag=2                                제목  등에  사용되는  문자의  확대율  지정



그래프              타입선택

type="p"              점  모양  그래프  (기본값)

type="l"               선  모양  그래프  (꺾은선  그래프)

type="b"              점과  선  모양  그래프

type="c"              "b"  에서  점을  생략한  모양

type="o"              점과  선을  중첩해서  그린  그래프

type="h"              각  점에서  x축  까지의  수직선  그래프

type="s"              왼쪽값을  기초로  계단모양으로  연결한  그래프

type="S"              오른쪽  값을  기초로  계단모양으로  연결한  그래프

type="n"              축  만  그리고  그래프는  그리지  않습니다

선의  모양  선택

lty=0,lty="blank"          투명선

lty=1,lty="solid"          실선

lty=2,lty="dashed"      대쉬선

lty=3,lty="dotted"        점선

lty=4,lty="dotdash"     점선과  대쉬선

lty=5,lty="longdash"   긴  대쉬선

lty=6,lty="twodash"    2개의  대쉬선

색,  기호  등

col=1 ,col="blue"       기호의  색지정  ,1-검정  , 2-빨강  , 3-초록  , 4-파랑  , 5-연파랑 6-보라  , 7-노랑  , 8-회색

pch=0,pch="문자"      점의  모양을  지정합니다  (아래  별도  표  참조)

bg="blue"                 그래프의  배경색을  지정합니다

lwd="숫자"               선을  그릴  때  선의  굵기를  지정합니다

cex="숫자"               문자를  그릴  때  문자의  굵기를  지정합니다


실습  :  위  옵션들을  변경하면서  테스트  꼭  해보세요.


> y <- c(1,3,2,4,8,5,7,6,9)

> plot(y,ylim=c(0,10),type="l")





아래의  예제는  x  에  50  개,  y  에  50  개를  할당한  후  y  의  값이  0.5  보다  클  경우  점의  모양을 

번  모양으로  출력하고  아닐  경우  점의  모양을  2  번으로  출력하라는  의미입니다.


> x <- runif(50)

> y <- runif(50)

> plot(x,y,pch=ifelse(y>0.5,1,2))



위  그림에서  둥근  모양이  1  번이고  삼각형  모양이  2번  모양입니다.  이  번호는  0  번  부터  25번까

지  있으므로  테스트  해  보시기  바랍니다.



-  저  수준  작도  함수  사용하기  (  그래프에  추가적인  선이나  설명을  넣는  것을  말합니다  )


> plot(1:10)

> abline(h=5)

> rect(1,6,4,9)

> arrows(1,1,4,4)

> text(8,9,"ABCD")

> title("main","sub")

> legend(8,3,lty=1:3,c("P","Q","R"))





위  저수준  작도  함수에  사용된  주요  항목은  아래  표와  같습니다.


도  형                      함  수

점                       points( )

직선                    lines( ) , segments( ) , abline( )

격자                    grid( )

화살표                 arrows( )

직사각형              rect( )

문자                    text( ) , mtext( ) , title( )

테두리와  축         box( ) , axis( )

범례                    legend( )

다각형                 polygon( )


실습:   위  옵션들을  꼭  변경해서  테스트  해  보세요~~~



-  그래프  중첩으로  그리기

그래프를  중첩으로  그리려면  par(new=T)  를  사용하거나  고수준  작도함수의  인수로  add=T  를  지정하는  방법이  있는  데  

일반적으로  전자를  많이  사용합니다.


다음  예를  보세요.

> plot(sin,-pi,pi,xlab="",lty=2)

> par(new=T)

> plot(cos,-pi,pi,xlab="x",ylab="y")

> plot(sin,-pi,pi,xlab="x",ylab="y",lty=2)

> plot(cos,-pi,pi,add=T)




> y <- c(1,3,2,4,8,5,7,6,9)

> plot(y,xlab="", ylab="빈도", type="h", lwd=5)

> lines(c(0,10), c(5,5), col="red")

> arrows(8,9,9,9)

> text(7.5,9,"롭")

> title("막대그래프")





2. sunflowerplot( )  함수  :  해바라기  함수

그래프에서  한  점  주위에  여러  데이터가  있을  때  점의  주변에  겹친  만큼  꽃잎으로  표현한다고  해

서  붙여진  이름입니다


> x <- rnorm(50)

> z <- data.frame(round(x,d=1), round(x,d=1))

> sunflowerplot(z)





3. barplot( ) :  막대  그래프  그리기


> x <- matrix(c(0.3,0.7,0.8,0.2),2,2)

> barplot(x,beside=T, names=1:2)





> x <- matrix(c(0.3,0.7,0.8,0.2),2,2)

> barplot(x,horiz=T, names=1:2)




barplot( )  에서  주로  사용되는  인수  정리

인수                              기능

angle,density,col          막대를  칠하는  선분의  각도,  선분의  수,  선분의  색을  지정합니다

legend                        오른쪽  상단에  범례를  그립니다

names                        각  막대의  라벨을  정하는  문자열  벡터를  지정합니다

width                          각  막대의  상대적인  폭을  벡터로  지정합니다

space                         각  막대  사이의  간격을  지정합니다

beside                        TRUE  를  지정하면  각각의  값마다  막대를  그립니다

horiz                          TRUE  를  지정하면  막대를  옆으로  눕혀서  그립니다



4. persp( )  함수  : 3차원  데이터  그리기

함수  persp( x  축  데이터, y축  데이터  , z  축  데이터)  로  3차원  입체  도를  그려주는  함수입니다.


> x <- seq(-10,10,length=50) # x축의 폭

> y <- x                     # y축의 폭

> f <- function(x,y) {

+  r <- sqrt(x^2 + y^2) ; 10 * sin(r) / r}

> z <- outer(x,y,f)

> persp(x,y,z,theta=30,phi=30,expand=0.5,col=rainbow(50),border=NA)




위에서  살펴본  persp( )  함수의  인수는  아래와  같습니다.


인수                          기능

col                          그래프의  색을  지정합니다

xlim, ylim , zlim         각  각  x,y,z  축의  범위를  지정합니다

xlib , ylab , zlab       각  각  x,y,z  축의  제목을  지정합니다

theta                       시점의  가로  각도를  지정합니다

phi                         시점의  세로  각도를  지정합니다

expand                    z  축의  폭의  비율을[0,1]  범위로  지정합니다

border                     경계선의  색을  지정합니다

scale                      FALSE  로  하면  x,y,z  축의  데이터  그대로의  크기로  그래프가  그려지고  자동조정  안됩니다.

shade                     수치를  조정해서  그림자의  농도를  지정합니다

itheta                      shade  를  지정했을  때,  빛이  닿는  가로  각도를  지정합니다

lphi                        shade  를  지정했을  때  ,  빛이  닿는  세로  각도를  지정합니다

box                        TRUE  로  지정하면  그래프를  상자로  둘러싸고  FALSE  면  둘러싸지  않습니다

axes                      FALSE  로  하면  선의  축이  그려지지  않습니다.



5. scatterplog3d( )  

3  차원으로  표시하는  기능입니다.

아래  그림을  보세요


> install.packages("scatterplot3d")

Warning in install.packages("scatterplot3d") :

  'lib = "C:/Program Files/R/R-3.0.2/library"' is not writable

--- Please select a CRAN mirror for use in this session ---

trying URL 'http://cran.nexr.com/bin/windows/contrib/3.0/scatterplot3d_0.3-35.zip'

Content type 'application/zip' length 289696 bytes (282 Kb)

opened URL

downloaded 282 Kb


package ‘scatterplot3d’ successfully unpacked and MD5 sums checked


The downloaded binary packages are in

        C:\Users\stu\AppData\Local\Temp\RtmpAF31An\downloaded_packages

> library(scatterplot3d)

> z <- seq(-10,10,0.01)

> x <- cos(z)

> y <- sin(z)

> scatterplot3d(x,y,z,highlight.3d=TRUE, col.axis="blue", col.grid="lightblue", main="Title", pch=20)





반응형