Notice
Recent Posts
Recent Comments
Today
Total
03-29 18:05
Archives
관리 메뉴

Jeongchul Kim

R 3.2.1 프로그래밍 - R의 개요와 데이터 구조 본문

R프로그래밍

R 3.2.1 프로그래밍 - R의 개요와 데이터 구조

김 정출 2016. 5. 7. 13:30


R 3.2.1 프로그래밍 - R의 개요와 데이터 구조




R프로그램에 대한 배경지식을 살펴 봅시다. 빅데이터의 ‘붐’ 속에서 R은 어떠한 역할을 담당하고 있을까요?

R의 가장 큰 장점은 통계 라이브러리가 많다는 점입니다. R은 전 세계 R 사용자 그룹으로부터 신뢰성을 검증 받으며 지속해서 개선될 수 있었습니다. 기획자들은 R을 활용함으로써 직접 알고리즘을 짤 필요 없이 검증된 알고리즘으로 분석 방법론을 구현할 수 있습니다. 그렇다고 R만으로 빅데이터 시스템을 개발할 수 있느냐 하면, 그런 건 아닙니다.

통계 연산과 수리 연산은 다른데, R은 통계에 최적화되어 있기 때문에 수리 연산에 약합니다.

그리고 R은 분석 정확도를 위해 속도를 희생한 언어이기도 합니다. 따라서 R은 시스템을 직접 개발하는 데 활용되기 보다는데이터마이닝을 하거나, 머신러닝(Machine Learning)으로 알고리즘을 구현하는 데 쓰입니다.



실제 빅데이터 시스템 개발 과정에서, 기획자들은 분석 방법론을 테스트하는 데는 R을 활용하고, 실제 시스템 개발에는 C나 자바 등 속도가 빠른 언어를 사용하는 경우가 많습니다. 물론 최근에는 R을 개발 자체에 활용하기 좋도록 개선하는 노력도 이루어지고 있지만, R 전문가들도 R 하나만으로 모든 것을 해내지는 않습니다. 즉 R은 성공적인 데이터 분석을 실현하기 위한 선택 대안 중 하나이며, 개발자보다는 데이터 사이언티스트가 선택하는 언어라고 볼 수 있습니다.



R 프로그램 소개 및 설치

1. R 프로그래밍 소개

R프로그램 소개 및 설치

R은 통계 데이터 수정과 분석에 사용되는 스크립트입니다. 이 언어는 AT&T에서 개발한 통계 언어인 S에서 영향을 받아 개발됐으며, S와의 호환성 또한 매우 높습니다. R은 가끔 gnu S 라는 이름으로 불리기도 하는데, 이는 R의 오픈소스라는 특성에서 기인합니다. 그럼 R의 구체적인 특징에는 어떤 것이 있을까요? 첫째, R은 전문 통계 표준 플랫폼으로서, 기능이 다양하고 그래픽이 우수합니다. 또한 다양한 운영체제에서 새로운 함수를 생성하여 사용이 가능하죠.

뿐만 아니라 객체지향 언어와 함수형 언어의 특징을 모두 포함하고, 오픈소스이므로 사용자 커뮤니티에 도움을 요청하기 쉽습니다.  

예를 들어 plot() 함수를 살펴볼까요? 이 함수를 숫자로 된 리스트에 대입하면 단순한 도표가 나옵니다.

하지만 이 함수를 회귀분석 결과에 적용한다면, 분석의 다양한 면을 보여주는 여러 도표들이 출력됩니다.

실제로 plot() 함수는 R에서 만들어지는 어떤 결과물에도 적용이 가능합니다. 객체지향 프로그래밍은 회귀분석 함수 사용으로각 통계 결과값인 객체를 반환하고 포괄적 가상 함수로 다형성(Polymorphism)을 구현하는 역할을 합니다.


함수형 프로그래밍은 더욱 깔끔하고 단출된 코드를 가지며, 매우 빠른 코드 수행 속도를 자랑합니다. 또한 단순한 코드로 디버깅 노력이 감소되는 효과가 있고, 병렬 프로그래밍의 전환이 더욱 용이합니다. 보통 함수형 프로그래밍 언어처럼, R프로그래밍의 일반적인 관심사 또한 명시적인 반복법을 피합니다. 루프코드 대신 내부에서 반복을 수행하는 R의 함수 기능을 이용할 수 있습니다. 이런 기능은 코드가 더 효율적으로 수행되게 하고 R이 큰 데이터 세트를 처리할 때 걸리는 시간을 크게 줄여줍니다.

2. R 프로그래밍 설치 및 실행하기

그럼 R프로그램의 설치 방법에 대해 알아볼까요? R을 처음 사용하는 경우라면, GUI를 통해 마우스로 클릭하는 것보다 터미널 윈도우에서 R 명령어를 직접 입력하는 편을 추천합니다. 실제로 대다수 R 사용자는 GUI를 사용하지 않습니다.

만약 GUI를 쓰지 않고서 도저히 R을 사용할 수 없다면 오픈 소스나 R용 무료 GUI를 사용할 수 있습니다.


R의 설치가 완료되어 실행시키면 다음과 같은 초기 화면이 나오고 R 명령어를 실행시킬 준비가 완료된 것입니다.


R 프로그램 다운로드 사이트

http://www.r-project.org


GUI 패키지 다운로드 사이트

http://www.rstudio.org

StatET http://www.wlware.de/goto/statet

ESS http://ess.r-project.org



그럼 본격적으로 R을 실행해 봅시다. R은 인터렉티브 모드와 배치 모드 두 가지로 실행할 수 있습니다.

보통 인터렉티브 모드를 많이 사용합니다.

이 모드는 명령어를 입력하면 결과를 보여주고 다음 명령어를 입력하면 또 보여주는 형태로 작동합니다.

다음은 정규분포하의 random sample 100개의 값에 대한 평균을 인터렉티브 모드로 실행하는 예입니다.


반면 배치 모드에서는 사용자와 상호작용이 필요하지 않습니다. 이 모드는 프로그램을 하루에 한 번씩 주기적으로 돌려야 할 때 프로세스를 자동화할 수 있으므로 실행 작업 같은 데 유용합니다. 어떤 경우에는 R 세션이 자동으로 실행되는 게 편할 수 있습니다. 예를 들어 일일이 R을 실행해 스크립트를 직접 실행할 필요없이 그래프를 그리는 R 스크립트를 실행하게 하고 싶을 수 있습니다. 이 경우 배치 모드에서 R을 실행할 수 있습니다. 다음의 예제는 z.R 파일에 그래프를 그리는 코드를 입력한 것입니다. # 표시가 된 부분은 주석입니다. R 인터프리터에서는 이 부분을 무시합니다.

이 코드를 리눅스의 $ 프롬프트 같은 운영체제의 쉘 입력 창에서 R을 호출함으로써 R의 인터렉티브 모드에 들어가지 않고서도 코드를 자동으로 실행할 수 있습니다.







R 프로그래밍 함수와 데이터 구조

1. R 프로그래밍 함수

R프로그래밍 함수와 데이터 구조

이번에는 R프로그래밍 함수와 데이터구조에 대해 알아보겠습니다. 대부분의 프로그래밍 언어처럼 R프로그래밍의 중심에도 ‘함수 작성’이 있습니다. ‘함수’란 입력값을 넣고 이를 기반으로 계산해 결과값을 출력하는 명령들의 묶음입니다.

간단한 예제로서 정수형으로 이뤄진 벡터에서 홀수의 개수를 세는 oddcount()라는 함수를 정의해 봅시다.

함수 정의 후에 oddcount() 함수를 호출한 두 개의 결과를 볼 수 있습니다. 벡터 {1,3,5}에는 3개의 홀수가 들어가 있고 oddcount(c(1,3,5))를 호출하면 3이 출력됩니다. 다른 경우도 홀수의 개수를 산출하여 출력하는 것을 볼 수 있습니다.


R에서는 기본 인수가 자주 사용됩니다. 다음과 같은 함수 정의를 생각해 봅시다. 여기서 프로그래머가 함수 호출시 y를 따로 지정해 주지 않으면 y는 2로 초기화됩니다. 비슷하게 z는 기본 값을 TRUE로 가집니다. 다음 함수 호출 내용을 봅시다.

여기서 x는 실제 인수로 12값을 갖고 y는 기본 인수로 2값을 갖게 되지만 z의 경우는 FALSE값이 들어감으로써 기본 값은 무시됩니다. 또한 이 예제에서는 많은 프로그래밍 언어에서처럼 R 또한 TRUE와 FALSE는 논리값을 갖는 불리언 데이터 형임을 보여줍니다.


2. R 데이터의 구조

R은 또한 다양한 데이터 구조를 가집니다. 우선 R에 대해서 자세히 알아보기 전, R을 소개하기 위해 R에서 자주 사용되는 몇 가지 구조를 훑어 보고 넘어가 봅시다. 중요한 R 데이터 구조로는 벡터, 문자열, 행렬, 리스트, 데이터프레임 그리고 클래스가 있습니다.


우선 벡터에 대해 알아봅시다. 벡터 형식은 R의 핵심입니다. 벡터를 거론하지 않고서는 R 코드나 인터랙티브 R 세션을 상상하기 어렵습니다. 벡터의 원소는 모두 같은 ‘형식’이나 데이터 형을 가져야 합니다. 3개의 문자열로 이뤄진 문자 형식의 벡터나 세 개의 정수 원소로 이뤄진 정수 형식의 벡터를 만들 수는 있습니다. 하지만 한 개의 정수와 두 개의 문자열을 원소로 갖는 벡터는 만들 수 없습니다.

R에서 스칼라 혹은 단일 수치값은 실제로 존재하지는 않습니다. 단일 숫자처럼 보이는 것은 사실 한 개의 원소를 갖는 벡터입니다. 이 예제를 보면 [1]의 의미는 ‘이 줄에서 벡터의 첫 번째 원소부터 보여주기 시작한다.’임을 기억해두시기 바랍니다. 이 경우에는 x[1]을 가리킵니다. 그러므로 x를 하나의 원소를 가진 벡터로 취급한다는 것을 알 수 있습니다.



문자열은 실제로는 숫자 형식이 아닌 문자 형식의 단일 원소를 갖는 벡터입니다. 첫 번째 예제에서 숫자 형식이라고 할 수 있는 x라는 벡터를 생성했습니다. 그리고 문자 형식의 벡터 두 개를 생성했습니다. y는 1개의 원소를 갖는 한 개의 문자열인 벡터고, z는 두 개의 문자열로 이뤄졌습니다.


R의 행렬은 수학에서의 행렬과 같은 개념을 가집니다. 기술적으로 행렬은 벡터지만 행의 개수와 열의 개수라는 두 가지 속성을 추가로 가집니다. 다음 행렬 예제 코드를 봅시다. 일단 두 벡터를 가져와 그것들을 행으로 하는 행렬을 만들기 위해 행 결합을 위한 rbind() 함수를 사용해 결과를 m에 저장합니다. 이에 대응하는 함수로서 여러 열을 결합해 행렬을 만드는 cbind()가 있습니다. 그 후 변수 이름만 입력하여 변수값을 출력해 의도한 대로 행렬이 만들어 졌는지 확인합니다. 마지막으로 행렬 m과 벡터 (1,1)의 행렬 곱을 계산합니다.


다음으로 리스트에 대해 알아보겠습니다. R의 벡터처럼 R 리스트 또한 어떤 값들을 담고 있지만, 그 내용은 여러 데이터형으로이뤄져 있습니다. C나 C++ 프로그래머들은 C 구조체와 유사성을 기억해 내면 좋을 것입니다. 리스트의 원소들은 두 부분으로 나뉜 이름을 통해 접근 가능합니다. 이들은 R에서 $ 기호로 구분되어 있습니다. 간단한 예제를 살펴볼까요?

x$u라는 표현은 리스트 x의 u라는 요소라는 것을 뜻합니다. 후자의 v는 x의 다른 요소를 뜻합니다.

다음으로 데이터 프레임입니다. 일반적인 데이터 세트는 여러 형식의 데이터를 포함합니다.

예를 들어 employee 데이터 세트에서는 직원 이름 등의 문자열 데이터도 있지만 월급 같은 숫자 데이터도 있습니다.

그러므로 50명의 직원이 각각 4개의 변수를 갖는 데이터 세트라면 50*4 행렬로 보일 것입니다.

이 경우 데이터 형이 섞여 있기 때문에 R 같은 프로그램에서는 쓰일 수가 없습니다.

이때는 행렬 대신 ‘데이터 프레임’을 사용할 수 있습니다. R에서 데이터 프레임은 일종의 리스트로서 각 리스트의 구성 요소는 데이터의 ‘행렬‘ 열에 해당하는 벡터가 됩니다.


데이터 프레임은 다음과 같이 간단하게 만들 수 있습니다.



마지막으로 클래스에 대해 알아볼까요? R은 객체지향 언어입니다. ‘객체’는 ‘클래스’의 인스턴스입니다. 클래스는 지금까지 봐 왔던 데이터 형들보다 좀 더 추상적입니다. 여기서는 R의 S3 클래스를 활용한 개념에 대해 간단히 알아보겠습니다.

예를 들어 히스토그램을 그리는 hist() 함수의 그래프를 제외한 결과물은 break나 count같은 여러 요소를 갖는 리스트인데 여기에는 이 리스트의 클래스를 histogram이라고 명명하는 ‘속성‘(attr(, “class”)이  있습니다.








Comments