가. R과 R Studio의 구성
1) R의 구성
2) R Studiio의 구성
나. R 패키지 설치하기
R은 오픈 소스 프로그램이므로 다양한 개인들이 자신들만의 함수로 여러 기능을 제작하여 누구나 설치할 수 있는 패키지의 형태로 배포하고 있다. 이를 통해 최신 통계 이론을 적용한 패키지를 설치하여 분석을 실시할 수도 있고 각종 복잡한 그래프 설정에 대해 미리 정의해둔 패키지를 설치하면 복잡한 그림들을 손쉽게 그릴 수도 있다. 또한 기본 프로그램인 R(base)에서 지원하지 않는 명령어나 함수를 사용할 수 있으며 유용한 데이터셋이 내장되어 있는 패키지를 이용할 수도 있다.
R 패키지를 설치하기 위해 상단 메뉴바의 패키지툴을 클릭하고 패키지(를 ) 철치하기... 를 클릭한다. CRAN 미러사이트가 설정되어있지 않다면 CRAN 미러사이트를 지정하는 창이 뜬다. 미러사이트 설정되면 현재 설치할 수 있는 모든 패키지들의 목록이 알파벳순서로 나열된다. 설치하고자 하는 패키지를 찾아 선택하고 OK 버튼을 클릭하면 자동적으로 패키지 설치가 진행된다.
R Studio를 이용하면 패키지 설치도 간편하게 진행할 수 있다. 우측 하단 인터페이스의 Packages 탭을 클릭한 후 Install을 클릭하면 창이 새로 나타난다. 이 창에 패키지 이름을 입력하면 설치가 진행된다. 패키지 이름은 대소문자를 구별한다는 점에 유의하자.
또한 아래와 같은 명령어를 사용해서 패키지를 설치할 수도 있다. 이 경우 명령어를 실행하면 위와 마찬가지로 CRAN 미러사이트를 지정해주는 창이 나오고 선택된 미러사이트에서 패키지를 다운로드 받아 설치한다.
패키지의 이름을 정확하게 알고 있는 경우 이 코드를 직접 실행시키는 방법이 가장 빠르고 간편하게 패키지를 설치할 수 있는 방법이다.
>install.packages("패키지 이름"
패키지를 설치한 후에는 패키지를 R 콘솔에 불러와야 패키지에 포함된 함수나 데이터셋을 사용할 수 있다. 설치된 패키지는 다음 명령어를 이용하여 R 콘솔로 불러온다.
>library(패키지 이름)
패키지를 설치하는 명령어와 패키지를 불러오는 명령어에 따옴표 사용 유무가 다르므로 잘 확인하여야 한다. R Studio의 경우 패키지를 설치한 이후 우측 하단의 Package 탭의 목록 중에 불러오고자 하는 패키지의 이름 앞에 있는 체크박스를 클릭하면 자동적으로 위 코드를 실행시키며 패키지를 불러온다.
다. R 도움말(help)
라. R 언어와 문법
R 언어는 S 언어와 유사하며 C 언어와도 유사하기 때문에 다른 언어를 통한 프로그래밍에 익숙한 사람이라면 여러 가지 명령어를 직관적으로 적용할 수 있어 쉽게 사용이 가능하다. 그러나 프로그래밍을 처음 접해 보는 사람이라면 익숙해지기까지 시간이 필요할 것이다.
1) R의 데이터 구조
R은 다양한 형태의 데이터 구조를 다룰 수 있다. Transaction, Rules, Logical 등 다양항 형태의 데이터 구조가 존재하지만 그 중에서도 R에서 가장 주로 사용되는 데이터 구조인 벡터, 행렬, 데이터 프레임에 대해 살펴보자.
(1) 벡터
벡터 데이터 구조는 하나의 스칼라값, 혹은 하나 이상의 스칼라 원소들을 갖는 단순한 형태의 집합을 의미한다. 이 때 벡터 데이터 내에 들어갈 수 있는 원소는 숫자, 문자, 논리 연사자 등이 될 수 있다. 숫자로 이루어진 벡터는 숫자 벡터가 되고 문자로 이루어진 벡터는 문자 벡터가 된다. R에서 다루는 데이터 구조 중 가장 단순한 형태이며 명령어 c를 이용해 선언할 수 있다. 이때, 'c'는 concentration(연결)을 의미한다.
>x = c(1, 10, 24, 40)
>y = c("사과", "바나나", "오렌지")
>z = c(TRUE, FALSE, TRUE)
이 경우 x는 숫자형 벡터, y 는 문자형 벡터, z는 논리 연산자 벡터가 된다. 논리 연산자 벡터를 숫자형 벡터처럼 사용하는 경우 자동적으로 "TRUE"는 1의 값을 할당 받으며 "FALSE"는 0의 값을 할당받는다. R은 대문자와 소문자를 구분하여 인식하기 때문에 논리 연산자를 입력할 때는 반드시 모든 글자를 대문자로 기입하여야 논리연산자로 인식한다는 점에 유의하자. 등호 '='의 경우 우측의 값을 죄측의 변수에 할당한다는 의미로서 조금 더 직관적인 형태로 '<- p="">>x <- 10="" 24="" 40="" c="" p="">>y <- c="" p="">>z <- c="" false="" p="" true="">
또한 다음과 같이 c 명령어를 이요하여 벡터와 벡터를 결합하여 새로운 벡터를 형성할 수도 있다. 벡터를 결합하여 행렬을 이루도록 하는 방법도 존재하는데, 이에 대해서는 다른 절에서 다루도록 한다. 형식이 같은 벡터를 합치면 합쳐진 벡터의 형식도 이전과 동일한 형식을 따르지만, 합치는 벡터에 문자형 벡터가 포함되면 합쳐지는 벡터는 문자형 벡터가 된다. 아래 코드의 예에서 숫자형 벡터인 x와 문자형 벡터인 y를 xy라고 벡터로 전환되었기 때문에 이 값들을 숫자가 아닌 문자 데이터로 인식하게 된다.
> x <- 10="" 24="" 40="" c="" p="">> y <- c="" p="">> xy <- c="" p="" x="" y="">> xy
[1] "1" "10" "24" "40" "사과" "바나나" "오렌지"
(2)행렬
행렬은 행과 열을 갖는 m x n 형태의 직사각형에 데이터를 나열한 데이터 구조이다. 행렬의 선언을 위해 명령어 matrix 를 사용한다. matrix 명령어의 첫 번째 인수는 행렬에 들어가는 데이터들을 묶어놓은 벡터가 할당되며 ncol 옵션으로 열(column)의 수르 정하거나 nrow 옵션으로 행(row)의 수를 정해 행렬의 크기를 사용자가 원하는 대로 지정할 수 있다. 기본적으로 값들은 열을 우선 채우는 방향으로 입력된다 (즉, 1행 1열, 2행 1열, 3행 1열....1행2열, 2행2열...의 순서). 아래 코드를 살펴보면 행렬형 변수 'mx'는 1,2,3,4,5,6이라는 여섯 개의 원소를 갖는 행렬이 되며 ncol=2 옵션을 통해 2열짜리 (원소가 총 6개이므로 열의 개수가 2개인 것이 정해지면 행의 수도 3개로 자동적으로 정해진다) 행렬이 만들어 진다. 결과를 살펴보면 다음과 같다. 3행 2열이 만들어 졌으며 1, 2, 3, 4, 5, 6의 값이 열을 우선 채우는 방향으로 채워 넣어졌다. 만약 행을 우선 채우는 방향을 원하면, byrow=T 옵션을 추가하면 된다.
> mx = matrix(c(1, 2, 3, 4, 5, 6), ncol=2)
> mx
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
명령어 rbind와 cbind를 사용해 이미 만들어져있는 벡터를 서로 합쳐 행렬을 만들 수도 있다. rbind의 'r'은 'row'를 의미하는데 기존의 행렬에 행을 추가하는 형태로 데이터를 결합시킨다. cbind의 'c'는 'column'을 의미하는데 기존의 행렬에 열을 추가하는 형태로 데이터를 결합시킨다. 다음 예제 코드를 살펴보자. 우선 rbind 명령어를이용하여 이미 생성된 3행 2열의 행렬 'mx'에 1행 2열의 r1벡터를 추가하여 4행 2열의 행렬을 생성한다. 또한 cbind 명령어을 이용하여 기존의 행렬 'mx'에 3행 1열의 c1벡터를 추가하여 3행 3열의 행열을 생성한다.
> mx
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> r1 = c(10, 10)
> c1 = c(20, 20, 20)
> rbind(mx, r1)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
r1 10 10
> cbind(mx, c1)
[,1] [,2] c1
[1,] 1 4 20
[2,] 2 5 20
[3,] 3 6 20
행렬과 벡터 뿐 아니라 벡터와 벡터 역시 동일한 방법으로 합쳐 새로운 행렬을 형성할 수 있다. 이 때 합쳐지는 벡터들의 행의 수와 열의 수를 잘 파악하여 명령어를 적절하게 사용해야 한다. 또한 rbind 와 cbind 명령어는 기본적으로 같은 데이터 타입의 벡터들은 행렬의 형태로 합쳐주지만, 이 명령어들을 이용해 다음에 소개한 데이터 프레임을 서로 합치는 경우에는 그대로 데이터 프레임의 형태로 데이터를 합쳐준다.
(3) 데이터 프레임
데이터 프레임은 행렬과 유사한 2차원 목록 데이터 구조이다. 다루기가 쉽고 한번에 많은 정보를 담을 수 있어 R에서 가장 널리 사용된다. 행렬과는 다르게 각 열이 서로 다른 데이터 타입을 가질 수 있기 때문에 데이터의 크기가 커져도 사용자가 다루기 수월하다. 명령어 data.frame을 이용하면 여러 개의 벡터를 하나의 데이터 프레임으로 합쳐 입력할 수 있다.->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">
->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> income = c(100, 200, 150, 300, 900)->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> car = c("kia", "hyudai", "kia", "toyota", "lexus")->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> marriage = c(FALSE, FALSE, FALSE, TRUE, TRUE)->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">>mydat = data.frame(income, car, marriage)->->->->->->->
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">
->->->->->->->
위 코드에서 선언되는 income 벡터는 숫자형 벡터이다. car 벡터는 "kia", "hyundai", "toyota", "lexus"의 값을 원소르 갖는 문자형 벡터이며 marriage는 논리 연산자 벡터이다. data.frame 명령어를 이용해 세 벡터를 합쳐 하나의 데이터 프레임인 mydat을 생성했다. 생성된 데이터 프레임인 mydat의 출력 형태는 다음과 같다. 각 행이 하나의 곽측치를 의미하고 각 열이 하나의 변수라고 가정하면 데이터 프레임은 분석자에게 상당히 친숙한 형태를 띠고 있음을 알 수 있다.
> mydat
income car marriage
1 100 kia FALSE
2 200 hyundai FALSE
3 150 kia FALSE
4 300 toyota TRUE
5 900 lexus TRUE
2) 외부 데이터 불러오기
데이터를 저장하는 파일 형식은 다양하다. R은 다양한 형태의 외부 데이터를 불러올 수 있다. 데이터 저장을 위해 주로 많이 사용되는 csv파일, txt파일, 엑셀의 xls/xlsx파일을 R로 불러오는 방법에 대해서 알아보자.
(1) csv파일 불러오기
명령어 read.table을 이용하면 csv파일을 R에 데이터 프레임 형태로 불러올 수 있다. csv파일의 구성에 따라 다양한 옵션을 이용하면 데이터가 작성된 형태 그래로 불러올 수 있다. header=T 옵션을 이용하면 csv파일의 첫 줄을 변수명으로 지정할 수 있다. 또한 sep=','옵션을 통해 데이터가 쉼표로 구분된 데이터 파일 (즉, csv파일)임을 지정해준다. read.table 명령어를 이용할 때는 파일 경로에 \ 대신 \\를 사용함에 유의한다. 혹은 \\ 대신 /을 사용해도 무관하다. 아래 코드를 통해 data1이라는 데이터 프레임이 생성되며 해당 경로의 csv파일을 그대로 불러오게 된다.
data1 <- example.csv="" header="T," p="" read.table="" sep=",">
혹은 유사한 명령어인 read.csv를 이용할 수도 있다. 사용법은 read.table과 비슷하지만 sep=","를 통해 구분자를 명시할 필요가 없다.
(2) txt파일 불러오기
명령어 read.table을 이용하여 txt파일 역시 데이터 프레임의 형태로 불러올 수 있다. 이 경우 sep=','옵션을 사용하지 않으면 csv파일이 아닌 일반 txt파일을 불러올 수 있다. txt파일을 데이터셋의 형태로 불러올 때는 txt파일이 구분자나 형식 등을 잘 지켜서 작성되어 있어야 한다. 아래 코드에서 선언되는 data2라는 데이터 프레임은 해당 경로의 텍스트 파일을 불러온다.
data2 <- example.txt="" p="" read.table="">
(3) 엑셀 파일 (xls/xlsx) 불러오기
엑셀 파일을 불러오는 방법은 크게 두 가지이다. 첫번째 방법은 엑셀 파일을 엑셀로 실행시킨 뒤 csv파일 형식으로 저장하여 앞의 csv파일 불러오기 방법으로 불러오는 방법이다. 엑셀을 사용할 수 없거나 이 방법이 번거롭다면 두 번째 방법으로 R에서 지원하는 패키지를 설치하여 엑셀 파일을 직접 불러올 수도 있다. 아래의 방법은 RODBC라는 패키지를 이용해 불러오는 방법이지만 이 외에도 엑셀 파일을 불어올 수 있도록 만들어 주는 패키지는 다양하다. 경로에 저장되어 있는 mydata.xls 파일을 불러오는 코드는 다음과 같다.
> library(RODBC) #패키지 열기
> new <- c:="" data="" mydata="" odbcconnectexcel="" p="">> yourdata <- heet1="" new="" p="" sheet="" sqlfetch="">> close(new)
library 명령어를 통해 RODBC 패키지를 연다. 이후 odbcConnectExcel 명령어와 sqlFetch 명령어를 이용하여 엑셀 파일의 워크시트를 설정하여 불러올 수 있다. 엑셀 파일의 경로를 입력하는 경우 확장자를 생략하고 작성해야 하는 점에 유의한다. 또한 엑셀 파일의 워크시트 이름은 대소문자를 구분하므로 정확하게 작성해야 한다. R의 패키지와 라이브러리를 설치하는 방법에 대해서는 뒤의 "라. R 패키지 설치하기" 에서 설명할 것이다.
3) R의 기초 함수
R에는 다양한 함수들이 존재하며 이 함수들을 적절하게 이용해 자신이 구현하고자 하는 통계적 기법이나 데이터 처리를 진행 할 수 있다. 여러 가지 함수들 중 가장 기본이 되는 몇 가지 함수들을 살펴보자. 이러한 기초 함수들은 복잡한 함수나 프로그램을 젝작하는데 있어 볼트와 너트처럼 어디에나 사용되므로 잘 익혀둘 필요가 있다.
(1) 수열 생성하기->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">복잡한 계산이나 알고리즘의 구현을 위해서는 다양한 형태의 숫자들을 반복적으로 생성해주는 수영 생성 함수들을 알아두어야 한다. rep 함수는 기본적으로 두 개의 인수를 갖는데, 첫 번째 인수를 두 번째 인수만큼 반복하는 숫자 벡터를 생성한다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> rep (1, 3)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1 1 1->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq 함수 역시 기본적으로 두 개의 인수를 갖는데, 첫 인수부터 두 번째 인수까지 1씩 증가하는 수열의 숫자 벡터를 생성한다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> seq (1, 3)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1 2 3->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq (1, 3)은 간단하게 1:3과 같은 형태로 사용할 수도 있다. a:b 라는 함수는 seq 함수의 첫 번째 인수가 a이고 두 번째 인수가 b인 경우와 가은 결과를 생성한다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> 1: 3->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1 2 3->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
seq 함수에 by=n 옵션을 추가하여 1씩 증가하는 수열이 아닌 n씩 증가하는 수열을 생성할 수 있다.
> seq ( 1, 11, by=2)
[1] 1 3 5 7 9 11
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq 함수에 length=m 옵션을 추가하면 전체 수열의 개수가 m개가 되도록 자동적으로 증가하는 수열을 생성할 수 있다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">>seq (1, 11, length=6)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1 3 5 7 9 11->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">>seq (1, 11, length=8)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1.000000 2.428571 3,857143 5.285714 6.714286 8.142857 9.571429 11.000000->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">req 함수에 연속 증가하는 seq 함수의 형태를 인수로 사용하여 다음과 같은 수열을 생성할 수 있다. 이경우 수열 2:5, 즉 2, 3, 4, 5가 3번 반복된다는 것을 알 수 있다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> rep(2:5, 3)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 2 3 4 5 2 3 4 5 2 3 4 5->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">(2) 기초적인 수치 계산->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">R에는 행렬 계산을 비롯해 다양한 형태의 수치 계산을 위한 함수와 명령어가 준비되어있다. 간단한 형태의 벡터와 행렬을 생성하여 여러 수치 계산 기능들에 대해 살펴보도록 하자. 아래 코드를 통해 기본적인 사칙연산이 수행되는 원리를 알 수 있을 것이다. 기본적으로 벡터와 벡터의 사칙연산을 수행하는 경우 연산되는 벡터들의 길이가 같아야 한다.->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a = 1: 10->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a ->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch=""> [1] 1 2 3 4 5 6 7 8 9 10->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a + a->->->->
[1] 2 4 6 8 10 12 14 16 18 20
> a - a
[1] 0 0 0 0 0 0 0 0 0 0
> a * a
[1] 1 4 3 16 25 36 49 64 81 100
> a / a
[1] 1 1 1 1 1 1 1 1 1 1
R에서 벡터를 생성할 때는 기본적으로 열벡터가 만들어진다.. 아래 코드에서는 3행 1열의 열벡터 행렬을 생성하고, 이 행렬의 전치행렬 t(a), 즉 1행 3열의 행벡터 행렬을 생성한 후 두 행렬에 대해 서로 행렬곱을 실히해 3행 3열의 행렬을 만들어 보도록 한다. t 명령어를 통해 주어진 행렬의 전치행렬(transpose matrix)을 구할 수 있고 %*%를 통해 두 행렬 사이의 행렬곱을 실시할 수 있다.
> a = c(2, 7, 3)
> a
[1] 2 7 3
>t(a)
[, 1] [, 2] [,3]
[1,] 2 7 3
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> A = a%*t(a)->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> A->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch=""> [, 1] [, 2] [, 3]->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1 ,] 4 14 6->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[2 ,] 14 49 21->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[3 ,] 6 21 9->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
->->->->
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">행렬 A에 대해서 *를 통해 연산을 실시하면 단순한 스칼라 곱의 결과를 얻을 수 있다. 또한 solve 명령어를 통해 주어진 행렬의 역행렬(inverse matrix)을 계산할 수 있다.->->->->
> mx = matrix(c(23, 41, 12, 35, 67, 1, 24, 7, 53), nrow = 3)
>mx
[, 1] [, 2] [, 3]
[1 ,] 23 35 24
[2 ,] 41 67 7
[3 ,] 12 1 53
> 5 * mx
[, 1] [, 2] [, 3]
[1 ,] 115 175 120
[2 ,] 205 335 35
[3 ,] 60 5 265
>solve(mx)
[, 1] [, 2] [, 3]
[1 ,] -0.35743822 0.18466969 0.13746848
[2 ,] 0.21069087 -0.09389813 -0.08300555
[3 ,] 0.07695411 -0.04004034 -0.01069087
R에서는 짧은 명령어를 이용해 기초적인 기술통계량들을 간편하게 계산할 수 있다. a라는 벡터를 다음과 같이 생성하고 이 벡터에 대하 기초 통계량들과 통계 계산에서 주로 사용되는 연산들에 대한 계산법을 살펴보자.
> a = 1: 10
> a
[1] 1 2 3 4 5 6 7 8 9 10
mean, var, sd 함수는 각각 입력한 벡터의 평균, 분산, 표준편차를 계산해 준다.
> mean(a)
[1] 5.5
> var(a)
[1] 9.166667
> sd(a)
[1] 3.02765
sum, median, log 함수를 이용해서 각각 입력한 벡터들의 합, 중앙값, 자연로그값을 계산 할 수 있다.
> sum(a)
[1] 55
> median(a)
[1] 5.5
>log(a)
[1] 0.000000 0.6931472 1.0986123 1.3862944 1.7917595 1.9459101
[8] 2.0794415 2.1972246 2.3025851
서로 다른 두 벡터에 대해서는 cov, cor 함수를 사용해 공분산과 상관계수를 구할 수 있다.
> b=log(a)
> cov(a,b)
[1] 2.112062
> cor(a,b)
[1] 0.9516624
또한 summary 함수를 이용하면 주어진 벡터에 대해 각 사분위수와 최소값, 최대값, 중앙값, 평균을 계산 할 수 있다. summary 함수는 숫자 벡터에 사용하면 단순히 사분위수를 계산하는 기능을 하지만 다른 형태의 데이터 타입에도 사용할 수 있다. 이 때 summary 함수는 해당 대상에 대한 정보를 요약해주는 기능을 한다.
>summary(a)
Min. 1st Qu, Median Mean 3rd Qu. Max.
1.00 3.25 5.50 5.50 7.75 10.00
4) R 데이터 핸들링
R은 객체지향의 언어이기 때문에 변수(객체)를 불러오거나 변수 내의 요소들을 참조하는 것이 직관적이고 간단하다. 이를 이용하면 분석 기법을 적용하기 위한 빅데이터도 직관적으로 핸들링 하는 것이 가능하다.
여러 종류의 변수에 대해 기본적인 핸들링 방법을 살펴보자.
(1)벡터형 변수
예제로 'b'라는 문자형 벡터를 다음과 같이 생성하여 이 벡터에 대해 각 요소들을 핸들링 하는 방법을 살펴본다. 문자형 벡터 b에는 "a", "b", "c", "d", "e" 다섯 개의 문자 값이 포함되어 있다.
>b = c ("a", "b", "c", "d", "e")
>b
[1] "a" "b" "c" "d" "e"
b[n]과 같이 벡터 뒤에 대괄호 []를 붙여 숫자를 지정해 주면 b벡터 내에서 n번째 원소에 해당하는 값을 불러온다. b[-n]과 같이 대괄호 안에 -를 붙이고숫자를 지정해주면 n번째 원소에 해당하는 값만을 제외하고 b벡터를 불러온다. 대괄호 안에는 하나의 숫자뿐 아니라 여러 개의 원소를 불러오고자 할 때는 c 명령어를 사용하여 해당 원소값이 있는 위치를 나열해 주면 된다.
>b [ 2 ]
[1] "b"
>b [ -4 ]
[1] "a" "b" "c " "e"
>b [ c(2,3) ] #벡터의 2, 3번째 위치 값을 선택한다.
[1] "b" "c"
(2) 행렬/데이터 프레임 형태의 변수
형렬형 변수나 데이터 프레임 형태의 변수에 대해서도 대괄호를 통한 특정 원소/요소의 참조가 가능하다. 먼저 다음과 같이 mydat이라는 데이터 프레임을 생성한다.
> income = c(100, 200, 150, 300, 900)
> car = c("kia", "hyundai", "kia", "toyota", "lexus")
> marriage = c(FALSE, FALSE, FALSE, TRUE, TRUE)
> mydat = data.frame(income, car, marriage)
> mydat
income car marriage
1 100 kia FALSE
2 200 hyundai FALSE
3 150 kia FALSE
4 300 toyota TRUE
5 900 lexus TRUE
기본적인 방식은 벡터형 변수를 다룰 때와 동일하다. 그러나 행렬형/데이터 프레임형 변수의 경우 대괄호 안에 [m,n]의 형식으로 두 개의 숫자를 사용하여 불러오고자 아는 자료의 행과 열을 지정해주어야 한다.
아래 예제를 참고하자. 이 경우에도 마찬가지로 [-m, ] 또는 [ , -n]의 형태로 대괄호 안의 숫자에 - 를 붙여 해당 행이나 열만을 제외하고 데이터를 불러올 수도 있지만, [-m, -n]처럼 행과 열을 모두 지정하여 하나의 원소만을 제외할 수는 없다. 또한 대괄호 안에 하나의 숫자뿐 아니라 여러 개의 숫자(숫자형 벡터)도 적용시킬 수 있다.
5) 반복 구문과 조건문
R의 함수 작성에 있어서 특정 조건 하에서 비슷한 작업을 반복하게 하는 구문, 또는 일정한 조건이 만족되면 다른 작업을 수행하도록 만들어주는 구문들을 활용하면 복잡한 계산이나 작업을 용이하게 처리할 수 있는 함수를 만들 수 있다. 다양한 반복 구문과 조건문이 존재하며 상황에 맞게 적절한 구문을 사용하면 프로그램이 작동되는 시간을 줄여 효율적인 프로그래밍이 가능해진다.
(1)for 반복 구문
> a = c( ) #아무런 값도 포함되지 않는 a 벡터 선언
>for (i in 1:9){
+ a[i] = i * i
+ }
>a
[1] 1 4 9 16 25 36 49 64 81
> isum=0
> for ( i in 1:100) {
+ isum = isum + i
+ }
>cat("1부터 100까지의 합=", isum, "입니다.", "\n")
1부터 100까지의 합= 5050입니다.
(2)while 반복 구문
> x=1
> whilie (x <5 p="">+ x = x +1
+ print( x )
+ }
[1] 2
[1] 3
[1] 4
[1] 5
(3)if ~ else 조건문
> StatScore = c(88, 90, 78, 84, 76, 68, 50, 48, 66, 88, 96, 79, 65, 27, 88, 96,
33, 64, 48, 77, 64, 88, 95, 79, 88, 49, 30, 29, 10, 49, 88)
>over70 = rep(0,40) #1
>for(i in 1:40){
+ if ( StatScore[ i ] >= 70) over70[ i ] = i #2
+ else over70[ i ] = 0 }
> over70
[1] 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0
[29] 1 0 1 1 1 1 0 0 0 0 1
>sum(over70)
[1] 18
6) 사용자 정의 함수
function 명령어를 이용하면 기존에 존재하는 함수 외에도 사용자가 직접 복잡한 함수를 구성하여 사용할 수 있다. '함수 이름 = function(x, y, z)'의 형식으로 선언하며 이 때 괄호 안의 x, y, z는 함수 구문에서 인수(argument)로 사용된다. 간단한 사용자 정의 함수 코드를 살펴보자. 이 코드는 입력한 인수a 까지의 합을 계산해 주는 함수 addto를 선언한다.
> addto = function(a){
+ isum =0
+ for ( i in 1:a) {
+ isum = isum + i
+ }
+ print (isum)
}
>addto(10)
[1] 5050
>addto(50)
[1] 1275
7) 기타 유용한 기능들
R에는 이 외에도 많은 기능들이 존재하기 때문에 도움말이나 관련 교재를 참고한다면 분석자가 생각하는 알고리즘을 R로 구현하는 데는 큰 어려움이 없을 것으로 보인다. 마지막 절에는 아직 소개하지 않은 다양한 기능들 중에서도 특히, 프로그래밍 코드 중간에 사용되어 아주 복잡할 것 같은 프로그래밍을 간단하고 가능하게 해주는 유용한 기능들에 대해 소개하고자 한다. 이러한 기능들을 적재적소에 유용하게 사용하면 고급 프로그래머로서 더빠르고 효율적으로 작동하는 프로그램을 설계할 수 있을 것이다.
(1)paste
paste 명령어는 입력받은 문자열들을 하나로 붙여준다. 'sep=' 옵션을 통해 붙이고자 하는 문자열들 사이에 구분자(separator)를 삽입시킬 수 있다. 이 명령어를 이용하면 복잡한 알고리즘을 통해 생산되는 결과물들을 더 알기 쉽고 보기 좋게 출력하도록 할 수 있다.
>number=1:10
>alphabet=c("a", "b", "c")
>paste(number, alphabet)
[1] "1 a" "2 b" "3 c" " 4 a" "5 b" "6 c" "7 a" "8 b" "9 c" "10 a"
>paste(number, alphabet, seq=" to the ")
[1] "1 to the a" "2 to the b" "3 to the c" "4 to the a" "5 to the b" ......
(2)substr
주어진 문자열에서 특정 문자열을 추출
>substr("BigDataAnalysis", 1, 4)
[1] "BigD"
>country=c("Korea", "Japan", "China", "Singapore", "Russia")
>substr(country, 1,3)
[1] "Kor" "Jap" "Chi" "Sin" "Rus"
(3) 자료형 데이터 구조 변환
R에서의 객체는 다양한 형태를 가질 수 있다. 예를 들어 문자형 변수, 실수형 변수, 논리 연산자, Factor, 데이터 프레임 등이 있다. 주어진 객체의 데이터 구조를 다른 구조로 바꾸자 할 때 다음과 같은 함수들을 사용해 변환할 수 있다.
- as.data.frame(x): 데이터 프레임 형식으로 변환한다.
- as.list(x): 리스트 형시으로 변환한다.
- as.matrix(x): 행렬 형식으로 변환한다.
- as.vector(x):벡터 형식으로 변환한다.
- as.factor(x):팩터(factor) 형식으로 변환한다.
> as.integer(3.14)
[1] 3
> as.numeric("foo")
[1] NA
경고메시지:
강제형벼환에 의해 생성된 NA입니다.
> as.character(101)
[1] "101"
> as.numberic(FALSE)
[1] 0
> as.logical(0.45)
[1] TRUE
다음과 같이 as.matrix함수를 이용해 데이터 프레임을 행렬로 변환할 수도 있다. 문자형 데이터만이 저장되는 행렬로 변환되었으므로 데이터 프레임에서 숫자형 값으로 인식되던 변수들도 문자형으로 강제 전환된다. 다음 예제에서 데이터 프레임을 구성하고 있는 세 개의 백터에서 income열은 숫자형 벡터, car열은 문자형 벡트, marrage 열은 논리형 벡터의 형태로 구성되어 있지만, as.matrix 함수를 이용해 행렬로 변환된 이후에는 income열과 marriage 열의 데이터들도 모두 문자형 데이터로 변환되었다.
>mydat
income car marriage
1 100 kia FALSE
2 200 hyundai FALSE
3 150 kia FALSE
4 300 toyota TRUE
5 900 lexus TRUE
>as.matrix(mydat)
income car marriage
[1, ] "100" "kia" "FALSE"
[2, ] "200" "hyundai" "FALSE"
[3, ] "150" "kia" "FALSE"
[4, ] "300" "toyota" "TRUE"
[5, ] "900" "lexus" "TRUE"
(4)문자열을 날짜로 변환
"2015-01-13"처럼 문자열 표현으로된 날짜 데이터를 실제 날짜의의미를 지니는 Date 객체로 변환해보자.
Date 객체를 통해 입력된 날짜 데이터는 시계열 부석이나 시간 요소를 포함하고 있는 그림을 그릴 때 유용하게 사용될 수 있다. 앞서 본 다른 변환들과 유사하게 as.Date 라는 함수를 통해 이 기능을 할 수 있지만, 그 전에 입력되는 문자열의 형식에 대해 알아야 한다. as.Date는 기본 문자열이 yyyy-mm-dd일 거라고 가정한다. 그 외의 다른 형식을 처리하려면 'format=' 옵션을 통해 입력되는 날짜의 형식을 지정해 주어야한다. 예를 들어 날짜가 미국에서 주로 사용하는 mm/dd/yy 형태로 구성되어 있다면 다음과 같이 옵션 'format="%m/%d/%Y"를 사용해야 한다.
- Sys.Date(): 현재 날짜를 반환한다.
- as.Date(): 날짜 객체로 변환한다.
> as.Date("2014-01-13")
[1] "2015-01-13"
> as.Date("01/13/2015")
다음에 오류가 있습니다charToDate(x) : 문자열이 표준서식을 따르지 않습니다.
> as.Date("01/13/2015", format="%m/5d/%Y)
[1] "2015-01-13"
(5) 날짜를 문자열로 변환
문자열을 날짜로 변환하여 사용할 수 있는 것처럼 날짜를 나타내는 Date객체 또한 문자열로 변환하여 사용할 수 있다. 분석의 결과물을 출력할 때 분석이 실시된 날짜를 기입하거나 날짜별로 데이터셋을 관리하는 등 다양한 응용법이 있을 수 있다. format 명령어를 통해 날짜 외에도 다양한 데이터의 포맷을 변경할 수 있다. format이 가진 기능은 아주 다양하지만 이해하기에 그다지 어렵지 않으며 자주 사용되는 기능은 아니기 때문에 이와 관련된 설명은 R 도움말을 통해 각자 살펴보도록 하자.
- format(데이터, 포맷)
- as.character()
> as.Date("08/13/2013", format="%m/%d/%y")
[1] "2015-01-13"
> format(Sys.Date())
[1] "2015-01-13"
> as.character(Sys.Date())
[1] "2015-01-13"
> format(Sys.Date(), format="%m/%d/%Y")
[1] "01/13/2015"
> format(Sys.Date(), '%a') #'%a'는 요일을 출력한다.
[1] "화"
> format(Sys.Date(), '%b') #'%b'는 월을 출력한다.
[1] "1"
> format(Sys.Date(), '%m') #'%m'은 두자리 숫자로 월을 출력한다.
[1] "01"
> format(Sys.Date(), '%d') #'%d'는 두 자리 숫자로 일을 출력한다.
[1] "13"
> format(Sys.Date(), '%y') #'%y'는 두자리 숫자로 연도를 출력한다.
[1] "15"
> format(Sys.Date(), '%Y') # '%Y'는 네자리 숫자로 연도를 출력한다.
[1] "2015"
마. R 그래픽 기능
R은 다른 통계 분석 프로그램들에 비해 그래픽 기능이 다양하고 자유자재로 그림을 그릴 수 있다는 장점이 있다. 다양한 종류의 그래프들을 그릴 수 있으며 이렇게 다양한 그래프에 대해 아주 세세한 부분까지 설정할 수 있다. 또한 전문적으로 그래프 그리기에 특화된 패키지를 설치하여 사용하면 상용 프로그램 수준의 그래프를 그릴 수도 있다. 축을 설정하고 기본적인 선을 긋거나 색을 변경하는 등의 낮은 단계(Low Level) 그래픽 함수들과 이를 이용하여 하나의 완성된 그래프를 구현할 수 있는 높은 단계 (High Level) 그래픽 함수가 있다. 높은 단계의 그래픽 함수들은 그 사용법이 매우 복잡하여 해당 함수를 지원하는 각각의 패키지에 이에 따른 전문적인 설명이 포함되어 있으므로 이 장에서는 다루지 않고, 간단한 몇 개의 그래픽 함수들을 살펴본다. 일반적으로 명령어를 이용해 그림을 새로 그려내는 경우 R에서는 별도의 창이 생성되어 그림이 나타나고 R Studio에서는 생성되는 모든 그림들을 우측 하단 Plot탭에서 볼 수 있다.
1) 산점도 그래프
plot(x, y) 함수는 x에 대한 y의 그래프를 그려준다. plot(y~x)라는 형태로도 마찬가지의그래프를 그릴수 있다.
> height = c(170,168,174,175,188,165,165 ,190,173,168,159,170,184,155,165)
> weight = c(68, 65, 74, 77, 92, 63, 67, 95, 72, 69, 60, 69, 73, 56, 55)
> plot(height, weight)
2) 산점도 행렬
여러 가지 변수들에 대해서 각각의 산점도를 한눈에 살펴볼 수 있도록 확장된 산점도 행렬이다. 여러 변수들을 한 공간에 표현하기 위해서는 4차원, 5차원의 공간이 도입되어야 하므로이를 극복하기 위해 도입된 그래프이다. 산점도 행렬은 pairs명령어를 이용해 바로 그릴 수 있으며 아래 코드에서는 좀 더 보기 좋은 그림을 위해 다양한 옵션이 사용되었다. "main=' 옵션은 그래프의 최상단에 제목을 표기해 준다. 'pch='옵션은 그래프 상에 찍히는 점의 모양을 변경해준다. 'bg=' 옵션을 이용해 iris 데이터의 Species에 따라 서로 다른 색상을 부여했다.5>
<5 p="">> pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",5>
<5 p="">+ pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])5>
<5 p="">
5>
<5 p="">이러한 그래프의 형태는 옵션에 따라 원하는 모양을 다양하게 만들어낼 수 있다. 또한 특정한 패키지를 설치해 이미 준비된 형태의 완성도 높은 그림을 손쉽게 그려낼 수도 있다.5>
<5 p="">
5>
<5 p="">3) 히스토그램과 상자그림5>
<5 p="">탐색적 자료 분석에서 자료의 분포를 손쉽게 확인하는 방법으로히스토그램을 그려보거나 상자 그림을 그려보는 방법이 있다. 히스토그램과 상자 그림은 간편한 코드를 이용하여 손쉽게 그려볼 수 있다. 그림을 그리는 것 자체는 아주 단순하지만 사용자의 입맛에 맞게 축을 조절하거나 간격을 조절하고 색을 입히는 것은 해당 함수의 옵션을 통해 가능하다. 히스토그램과 상자 그림을 위한 기본적인 코드는 다음과 같다.5>
<5 p="">> StatScore = c(88, 90, 78, 84, 76, 68, 50, 48, 33, 70, 48, 66, 88, 96, 79, 65, 27, 88, 96,5>
<5 p=""> 33, 64, 48, 77, 18, 26, 44, 48, 68, 77, 64, 88, 95, 79, 88, 49, 30, 29, 10, 49, 88)5>
<5 p="">> hist( StatScore, prob=T)5>
<5 p="">> boxplot( StatScore )5>
<5 p="">
5>
<5 p="">hist 함수는 히스토그램을 그려주는 함수이며 기본적으로 세로축(Y축)에 도수를 표기한다. prob=T 옵션을 통해 상대도수를 표시하도록 변경할 수 있다. boxplot 함수는 상자 그림을 그려준다. 5>
<5 p="">
5>
<5 p="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">
->->->->->->->->->->->5>
댓글 없음:
댓글 쓰기