R 시작하기
What is R?
R은 통계적인 계산과 데이터 분석에 특화되어 있는 프로그래밍 언어이자 소프트웨어 환경이다.
Quick Start
-R Download
R의 공식 사이트라고 볼 수 있는 CRAN에서 R의 설치 파일을 다운로드하자.
The Comprehensive R Archive Network
cran.r-project.org
설치된 R을 실행해보면 Console 화면을 가진 RGui 화면이 표시되는 것을 볼 수 있다. 커서가 깜빡이는 Console 화면에서 이제 본격적인 R 코딩을 시작할 수 있다. Console화면에서 구문을 입력한 후 Enter 키로 줄 바꿈을 하면 그 구문이 실행될 것이다.
구문의 끝에는 세미콜론(;)을 붙여주어야 하나, 줄바꿈을 할 경우에는 자동으로 그 줄의 가장 끝에 세미콜론이 붙게 된다. ( 자바스크립트와 동일)
-R Studio Download
R 스튜디오는 무료로 사용할 수 있는 Open Source Edition과 매년 일정 비용을 지불해야 하는 RStudio Desktop Pro가 있다. 두 버전의 가장 큰 차이는 문제가 발생했을 때 유지보수 지원을 받을 수 있느냐 없느냐 정도이며, R은 커뮤니티가 활성화되어 있어서 지원을 받지 않고도 사용할 수 있으므로 무료 버전을 사용해도 충분하다.
https://www.rstudio.com/products/rstudio/download/
Posit
The best data science is open source. Posit is committed to creating incredible open-source tools for individuals, teams, and enterprises.
posit.co
DOWNLOAD RSTUDIO FOR WONDOWS 버튼을 찾아 설치 파일을 다운로드한 후 실행해주자.
RStudio를 설치 후 실행하면 아래와 같은 화면이 우리를 반긴다.
R Studio를 처음 실행했을 때는 Source 창이 닫혀 있지만 항상 사용하기 때문에 열어두도록 하자.
왼쪽 아래에 위치하는 Console창은 R GUI의 Console 창과 같은 역할을 한다.
Propmt에 명령어를 입력하고 실행하면 결과가 출력된다.
왼쪽 위에 위치하고 있는 Source 창은 메모장 같은 일종의 문서 편집기로 명령어나 메모를 자유롭게 기록할 수 있다.
Source 창에 입력한 명령어로 만들어진 문서를 Script라고 한다.
Source 창에 입력한 명령어를 실행하려면 실행하려는 행을 클릭해 Ctrl + Enter 키를 눌러야 한다.
환경 창은 분석 과정에서 생성한 데이터를 보여주는 기능을 한다.
오른쪽 아래에 있는 파일 창은 윈도우의 파일 탐색기와 비슷한 기능을 한다.
파일 창은 R Studio에서 파일을 불러오거나 저장할 때 참조할 위치인 워킹 디렉터리의 내용물을 보여준다.
R 문법
1) 객체(변수)의 할당과 삭제
대부분의 언어에서는 이름을 붙여 어떤 값을 보관하는 가상의 공간을 변수라고 부른다. R에서는 이를 객체(Object)라고 부른다. 이름이 객체지향 언어에서의 객체와 비슷하기 때문에 혼동하기 쉽다.
객체는 미리 선언할 필요 없이 할당만 하면 바로 생성된다. 객체의 이름에는 문자와 숫자를 사용할 수 있으며 첫 글자는 반드시 문자여야 한다. 영문자가 아닌 다른 언어의 문자라도 객체의 이름에 사용하는 데에는 문제가 없지만, 영문자인 경우에는 대소문자를 구분해야 한다.
x = 13
y <- sqrt(9)
4 * x -> z
어떤 객체에 값을 할당하고자 할 때, R에서도 물론 타 언어에서 지원하는 할당 연산자 '='를 사용할 수 있으나, '<-'과 '->'를 더 널리 사용한다. '<-'는 우변의 결과를 좌변의 객체에, '->'는 좌변의 결과를 우변의 객체에 대입한다.
ls()
objects()
rm(x)
현재까지 할당된 모든 객체의 이름을 확인하려면 ls() 혹은 objects() 함수를 사용한다.
이미 할당된 객체를 삭제하기 위해서는 rm() 함수에 인자로 객체 이름을 입력한다.
2) 자료 구조
객체에는 7가지의 자료구조를 할당할 수 있다.
x <- 2.7 # 실수
y <- "string" # 문자열
z <- FALSE # 논리값
첫 번째 자료구조는 스칼라(Scalar)이다. 단순히 객체에 하나의 값을 할당했을 때, 바로 그 할당되는 값을 R에서 스칼라라고 지칭한다.
스칼라 값에는 실수, 문자열, 논리 값(TRUE, FALSE)의 3가지 자료형이 있다.
v <- c(1.2, 2.7, 3.1, 4.9, 5.4)
w <- c(TRUE, FALSE, FALSE)
x <- c("a", "b", "c", "d")
y <- 1.5:4.9 # 1.5 2.5 3.5 4.5
두 번째 자료구조는 벡터(Vector)이다. 벡터는 같은 자료형을 가진 스칼라 값들을 순서를 가지고 일렬로 나열한 자료구조이다. 벡터는 함수 c()에 넣을 값들을 나열하여 생성하는 것이 일반적이나, 실수 값을 가진 벡터의 경우 시작 값:종료 값의 형태로도 생성할 수 있다. 이 경우 벡터는 시작 값에서부터 종료 값에 이르기 전까지 1씩 증가한 실수들로 채워질 것이다.( 만약 시작 값이 종료 값보다 크다면 1씩 감소한다)
matrix(
c(1, 2, 4, 8, 16, 32),
nrow=2,
ncol=3
)
세 번째 자료구조는 행렬(matrix)이다. 행렬은 서로 다른 자료형을 가진 스칼라 값들을 2차원으로 나열한 자료구조이다. 행렬은 함수 matrix(벡터, nrow=행 개수, ncol=열개수)로 생성한다.
Vt <- c("A","B","C")
Ft <- factor(Vt)
Ft
네 번째 자료구조는 요인(factor)이다. 요인은 범주형(명목형, 순서형)의 데이터이다. (1,2,3은 숫자이지만 첫 번째, 두 번째, 세 번째는 범주형이다.)
범주형으로 만들기 위해선 먼저, 범주 카테고리를 문자로 입력한다. 위에서는 A, B, C로 구성된 벡터를 만들었다.
그 후 factor() 함수를 통해 범주형으로 바꿔준다. Ft 출력 결과를 보면 Levels: A B C를 확인할 수 있는데 이는 범주가 A,B,C 총 3개로 이루어져 있다는 뜻이다.
요인이 가질 수 있는 값들을 수준(level)이라고 하며 순서형의 경우 순서(order)를 부여할 수 있다.
(수준에 순서를 부여하려면 'order=TRUE' 옵션 설정 후, level=c("")에 순서대로 입력하면 된다)
ar=array(1:12,dim=c(3,4))
다섯 번째 자료구조는 배열(Array)이다. 숫자, 문자 등의 원소를 n차원 구조로 나열한 것이며, 문자를 포함할 경우 모든 원소를 문자로 인식한다.
li=list(vec,ar,fac)
여섯 번째 자료구조는 리스트(list)이다. 원소로 모든 데이터 구조를 가질 수 있다.
name=c('kys','ojh','psk')
gender=c('M','F','M')
height=c(182,165,177)
df=data.frame(name,gender,height)
일곱 번째 자료구조는 데이터 프레임(data frame)이다. 엑셀 시트와 비슷하며 한 열에는 같은 종류 자료형만 올 수 있다.
3) 산술 연산자
3 + 2
7 - 4
11 * 5
16 / 5
16 %/% 5 # 정수나눗셈
16 %% 5 # 나머지
3^2 # 거듭제곱
R에는 타 언어에서 찾아볼 수 있는 대부분의 산술 연산자가 있다. 다만 나눗셈의 몫을 구하는 정수 나눗셈 연산자 %/%가 존재하며, 나머지를 구하는 mod 연산자가 %%라는 점이 타 언어에 비해 생소한 부분이다.
거듭제곱의 경우 pow() 함수를 사용하지 않고도 연산자만으로 간단하게 연산할 수 있다.
v <- c(1.2, 2.7, 3.1)
v <- v + 1 # 2.2 3.7 4.1
벡터나 행렬도 위처럼 산술 연산자를 사용할 수 있다. 이 경우에는 벡터 혹은 행렬 안에 있는 모든 값에 연산을 하게 된다. 2개의 벡터나 행렬의 크기가 같다면 둘 사이에도 산술 연산자를 사용할 수 있다.
4) 조건문과 비교 · 논리 연산자
if(x == 3 || x >= 7 || x <= 1) {
x <- x+1
}
else(x != 1 && x < 3) {
x <- x-1
}
타 언어에서 대부분 지원하는 비교 연산자 >, >=, <, <=, ==,!=는 R에서도 모두 사용할 수 있다.
비교 연산자를 사용하면 TRUE와 FALSE 중 하나를 결과로 얻을 수 있고, 이 결과는 논리 연산자 ||과 &&을 통하여 OR과 AND 연산을 할 수도 있다.
R의 조건문은 다른 대부분의 언어들과 마찬가지로 if문과 else문으로 구성되어 있다.
5) 반복문
i <- 0
while(i < 10) {
i <- i + 1
}
R의 while문은 다른 언어들과 같이 while(구문) {}의 구조를 가지며, 소괄호 안의 결과가 TRUE가 되는 한, 중괄호 안의 로직은 계속하여 반복된다.
sum <- 0
for(i in c(1, 4, 7)) {
sum <- sum + i
}
for문은 for(변수명 in 벡터) {}의 구조를 가지며, for문이 실행되면 객체 i에 벡터 안에 있는 값들이 순서대로 할당되어 들어온다.
반복문을 중간에 중지할 때는 break 문을, 반복문 내 남은 구문을 모두 통과할 때는 next문을 사용한다.
6) 사용자 정의 함수
f <- function(n){
sum <- 0;
for(i in 1:n){
sum <- sum + i
}
return (sum)
}
f(12)
R에서도 물론 사용자가 직접 함수를 만들고 이것을 객체에 담아 사용할 수 있다. 함수 선언 또한 타 언어와 마찬가지로 function(인자, 인자...) {} 구문을 따른다.
함수 실행을 마치고 값을 반환할 때는 return() 구문을 사용하며 반드시 return 문에서 반환할 값을 소괄호로 감싸야한다.
f <- function(n){ return (n+1) }
f(12) # 13
g <- f
g(12) # f(12)와 동일하게 작동
sum <- f
sum(12) # f(12)와 동일하게 작동
함수는 한 객체에서 다른 객체로 복제하여 동일하게 사용할 수 있으며 이 규칙은 사용자 정의 함수만이 아니라 내장 함수에도 적용된다.
특별히 주의해야 하는 점은 내장함수에도 다른 함수를 할당하는 것이 가능하다는 것이다.
7) 수학적 계산
sin(pi) # 1.224606e-16
log(3) # 1.098612 (자연로그)
log10(100) # 2 (상용로그)
floor(3.14) # 3 (버림)
ceiling(5.87) # 6 (올림)
round(4.65) # 5 (반올림)
sqrt(9) # 3 (제곱근)
min(c(1,5,7)) # 1 (최소값)
max(c(2,6,9)) # 9 (최대값)
mean(c(3,6,9)) # 6 (평균)
sum(c(1,2,4,7)) # 14 (합계)
sd(c(1,2,3,4)) # 1.290994 (표준편차)
runif(2, 1, 10) # 난수 2개를 벡터로 생성(1 초과 10 미만)
통계분석에 사용되는 R 특성상, 수학 관련 함수들을 풍부하게 내장하고 있다.
# (편)미분
f <- expression(2*x^3 - y*x^2 + 2*y^2 + 1)
D(f, “x”)
D(f, “y”)
# 정적분
f <- function(x) 2*x^3 - 3*x^2 + 1
integrate(f, 0, 3)
R의 수학 관련 기능 지원은 폭넓어서 미분과 정적분도 몇 줄의 코드로 가능하다.
데이터 마이닝에서 사용하는 회귀분석이나 군집화 알고리즘도 내장 함수로 제공해 편리하게 이용할 수 있다.
8) 패키지의 설치와 사용
install.packages("ggplot2")
library(ggplot2)
Node.js의 npm, Python의 pip처럼 R에서는 install.packages()로 패키지를 설치한다.
설치한 패키지는 library()로 사용할 수 있다.
9) 기초적인 시각화 도구
R의 시각화 도구는 커스터마이징이 까다로운 편이지만, 단일 함수의 그래프나 단일 데이터의 분포도처럼 복잡하지 않은 시각화의 경우에는 함수 호출만으로도 간편하게 끝난다.
hist(c(5, 1, 5, 2, 4, 1, 5, 4, 5, 1, 1, 3))
hist() 함수는 주어진 벡터나 행렬이 가진 값들의 출현 빈도를 히스토그램으로 표시해준다.
plot(function(x){ 2*x^3 - 5*x }, xlim=range(-10,10))
plot() 함수는 벡터나 행렬의 분포도나 함수의 그래프를 좌표평면 위에 표시한다.