본문 바로가기

코드이야기/R

[R프로그래밍] R을 계산기로 사용하는 방법


읽기 전 클릭↑ 한 번!

블로거에겐 큰 힘입니다


R은 뉴질랜 오클랜드 대학의 로스이하카(Ross Ihaka)와 로버트 젠틀맨(Robert Gentleman)에 의해 시작된 통계계산과 그래픽을 위한 프로그래밍 언어입니다. GNU GPL을 따르고 있어 누구나 자유롭게 사용할 수 있고, 윈도우, 리눅스, OS X등 멀티 플랫폼에서 소스코드의 변형없이 재사용이 가능해 통계연구에 널리 쓰입니다.


R은 프로그래밍 언어로써의 통계계산과 패키지 개발 용도 외에도 다양한 계산이 용이하고 탁월한 성능을 발휘합니다. 여기서는 R을 계산기로 사용하는 방법에 대해 이야기 합니다.

연산자, 연산의 우선순위와 데이터 할당

계산기는 다양합니다. 사칙연산, 간단한 무리수의 계산, 메모리기능을 가지고 있는 일명 쌀집계산기에서 부터 화폐의 시간가치, 현금흐름의 평가 등에 사용하는 재무용 계산기, 행렬이나 벡터의 계산, 방정식의 해찾기, 미적분, 삼각함수 등의 계산에 사용하는 공학용 계산기 등이 대표적입니다. R은 이 모든 계산에서 그것들을 대체할 막강한 성능을 자랑합니다.


R에서 사용하는 연산자는 +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), %/%(정수나눗셈), %%(나머지), ^(제곱) 등이 있습니다. 우선순위는 표준적인 연산의 우선순위를 그대로 따릅니다. 괄호 안쪽의 수식, 지수 및 근호, 곱하기와 나누기, 더하기와 빼기 순입니다.

> 3/(2-1)		              # 괄호안의 숫자는 항상 우선순위가 높음
[1] 3
-3^2		 	               # 거듭제곱이 먼저 계산
[1] -9
> sqrt(3+1)*2 	              # 루트의 계산은 sqrt()함수를 사용하며 우선순위가 높음
[1] 4
> 12 + 34 - 56 * 78 / 90       # 곱하기, 나누기의 우선순위는 더하기 빼기보다 높음
[1] -2.533333

대부분의 쌀집계산기를 보면 메모리 기능이 포함되어 있습니다. 계산 결과를 저장하는 역할을 하는데요, R에서도 계산의 결과를 변수에 할당 할 수 있습니다. '<-' 기호를 사용합니다. R에서 변수를 사용하기 위해서는 몇 가지 규칙을 지켜야 합니다. 첫째, R은 대문자와 소문자를 구분합니다. 즉, abc, ABC, abC는 모두 다른 변수로 취급됩니다. 둘째, 변수명에는 알파벳과 숫자를 사용할 수 있지만 숫자로 시작할 수 없습니다. 셋째, 예약어를 변수명으로 사용할 수 없습니다. R에서 사용하는 예약어는 다음과 같습니다.

break else FALSE for function if in Inf

NA NaN next NULL repeat TRUE while

코드를 통해 살펴 보겠습니다.

> x <- sqrt(2)		# 변수 x에 루트 2의 결과값을 할당
> y <- 2^3        	# 변수 y에 2의 세제곱을 할당
> x
[1] 1.414214
> y
[1] 8
> x + y      	 	 # x와 y의 합을 계산
[1] 9.414214
> abc <- 1    		# 변수 abc에 1을 할당 
> Abc <- 2 			# 변수 Abc에 2를 할당
> abc == Abc 	     # abc와 Abc를 비교
[1] FALSE
> 1a <- 1      		# 변수 1a에 1을 할당. 오류
Error: unexpected symbol in "1a"
> if <- 1  			# 변수 if에 1을 할당. 오류
Error: unexpected assignment in "if <-"

화폐의 시간가치와 현재/미래 가치의 계산

화폐는 시간에 따라 가치가 달라집니다. 누군가가 당신에게 지금 '1억원을 받을래? 1년 뒤에 1억원을 받을래?'라고 묻는다면 전부 지금 1억원을 받는다고 할 것입니다. 똑같은 금액이지만 누구나 '지금의 1억원'을 받는 것이 합리적이라고 생각합니다. 재무관리에서는 이를 '화폐의 시간가치(time value of money)'라고 부릅니다. 인플레이션(inflation), 생산기회(production oppotunity), 화폐의 시차선호(time preference), 위험(risk)과 같은 개념으로 '지금의 1억원'이 합리적인 이유를 설명합니다.


자, 이제 질문을 바꿔보겠습니다. '지금 1억원을 받을래? 1년 뒤에 1억 천만원을 받을래?' 이제 선택이 쉽지 않습니다. 선택을 위해서는 1년간의 이자율을 알아야 합니다. 1년간의 이자율이 5%라고 가정해보겠습니다. 지금 1억원을 받아 1년간 예금하면 1억 5백만원이 됩니다. 1년 뒤에 1억 천만원을 받는 것이 유리합니다. 만약 이자율이 15%라면 어떨까요? 지금 1억원을 받아 예금해 두면 1년뒤에 1억 1,500만원이 될 것이기 때문에 지금 1억원을 받는 것이 합리적입니다.


미래가치를 FV(future value), 현재가치를 PV(present value), 이자율을 r, 기간을 n이라고 하면, 아래와 같이 일반화 할 수 있습니다.

FV = PV * (1 + r) ^ n

PV = FV / (1+ r) ^ n

보통 이런 계산은 재무용 계산기를 사용하게 되는데, R이 훌륭한 대체수단이 됩니다. R을 통해 현재가치와 미래가치를 계산해 보겠습니다. 이자율이 10%일 때, 1억원을 10년간 예치 한 후 찾게 되는 금액은? 10년 후 1억원을 받기 위해서 현재 투자해야 할 금액은?

> r <- 0.1               # 이자율 변수 r에 0.1을 할당
> n <- 10                # 기간 변수 n에 10을 할당 
> PV <- 100000000        # 현재가치 변수 PV에 1억원을 할당
> FV <- PV * (1+r)^n     # 미래가치 FV를 계산 
> FV
[1] 259374246		     # 이자율 10%로 10년간 1억원 예치시 2억 6천만원 수령
> FV <- 100000000        # 미래가치 FV에 1억원을 할당 
> PV <- FV/(1+r)^n       # 현재가치 PV를 계산 
> PV
[1] 38554329             # 10년뒤 1억원을 만들기 위해서는 약 39백만원을 투자

행렬에서 미적분까지의 복잡한 공학계산

변수 x의 함수 f(x)에 대해서 f(x)=0을 만족하는 해를 구해야 하는 상황을 가정해 보겠습니다. 또 함수 f(x)=ax^5 + bx^2 + c를 미분하거나, f(x)=x^2을 적분해야 하는 상황은 어떨까요? 행렬의 계산이 필요할 때도 있습니다. 이런 문제는 공학용 계산기의 힘을 빌려야 합니다. 이런 상황 역시 R이 문제를 쉽게 풀 수 있도록 도와줍니다.


먼저, 방정식 x^3 - 2x^2 + 3x - 2 = 0의 해를 구해보도록 하겠습니다. 다항식의 해를 구할 때 R은 polyroot() 함수를 사용합니다. 다항식에서 계수를 인수로 주면 되는데, 계수는 차수가 낮은 것 부터 높은 것 순입니다. 여기서는 -2, 3, -2, 1이 인수가 되고 c(-2, 3, -2, 1)의 형태로 입력합니다. R에서는 방정식의 해를 계산할 때 뉴턴법을 통해서 근사해를 구합니다.

> polyroot(c(-2, 3, -2, 1))
[1] 1.0+0.000000i 0.5+1.322876i 0.5-1.322876i

이제 위에서 예로 든 두 함수에 대해 미분과 적분을 해보도록 하겠습니다. R에서 함수의 미분은 D()라고 하는 함수를 사용하고, 적분은 integrate()라는 함수를 사용합니다. R을 이용해 미분과 적분을 해보겠습니다.

> f <- expression(a*x^5+b*x^2+c)    # 미분할 함수 f를 정의
> D(f, "x")                         # 함수 f를 X로 미분
a * (5 * x^4) + b * (2 * x)
> f <- function(x) x^2              # 적분할 함수 f를 정의
> integrate(f, 0, 1)                # 0과 1의 범위에서 적분 실행
0.3333333 with absolute error < 3.7e-15

미분함수 D()의 인수는 각각 정의한 함수와 미분할 변수를 나타내고, 적분함수 integrate()의 인수는 각각 정의한 함수, 적분범위의 하한과 상한을 나타냅니다.


이 외에도 R은 다양한 수치계산을 간단하게 해결할 수 있습니다. 컴퓨터 앞에 앉아 있다면, R을 설치하고 책상 앞에 놓여있는 계산기를 치워 보는 건 어떨까요?