'Cloud&BigData/R'에 해당되는 글 23건

  1. 2015.09.14 R 학습도구 Swirl~
  2. 2015.09.07 R 데이터셋의 일부 데이터 가져오기
  3. 2015.08.27 R 데이터셋 정렬하기~
  4. 2015.08.06 R 데이터셋 처리 함수들에 대한 간단한 정리~
  5. 2015.02.26 R 패키지 설치하기
  6. 2015.02.25 R 예제: 데이터 세트에서 관계 확인하기
  7. 2013.11.07 우분투에서 R 패키지 설치
  8. 2013.11.04 R 예제: 연관성 측정
  9. 2013.08.28 R 예제: 이산적 시계열값 예측하기
  10. 2013.08.14 R 예제: 1이 연속으로 나오는 부분 찾기

R 학습도구 Swirl~

|



R에 대한 기본적인 설명과 한줄 한줄 직접 실행하면서 배울 수 있는 패키지가 R에 있다. 

바로 Swirl 이다. 

사이트를 둘러보니, 학습자 모드와 교수자 모드를 모두 제공하는 듯 하다. 


Swirl로 R Programming 학습하기 

Swirl은 R 버전 3.0.2 이상만 지원하기 때문에 먼저 R을 최신버전으로 업그레이드 해야 한다.

그리고 일반 패키지를 설치하듯이 swirl 패지를 설치한다. 


> install.packages("swirl")


그리고 swirl 라이브러리를 로드하고 swirl()을 실행해 강의 모드로 들어가면 된다. 

이어서 이름을 물어보면, 본인 이름을 쓴다. (여기서는 mini를 적었다.)


swirl 모드의 선택이 나오면, 0을 누르면 swirl을 종료하고 빠져나온다. 

swirl에서 제공하는 존스홉킨스 대학의 Roger D. Peng 교수의 "R Programming"을 학습하기 위해 다음과 같이 R 콘솔에서 입력한다. 


> install_from_swirl("R Programming")


다시 swirl()을 입력하고 들어가면, 다음과 같이 R Programming 강의를 선택할 수 있다. 

총 15개의 R 강의를 제공하고 있다.

 

> swirl()


3번 강의를 선택하고 들어가면, 다음과 같이 설명과 함께 실행하도록 요구하는 내용이 나온다. 

R 프로프트(>) 에서 해당 내용대로 실행하면 결과가 나오고 설명이 이어진다. 

만약 틀리면, 가이드를 해주거나 Help를 찾아보라고 나오게 된다. 


그리고 오른쪽에는 해당 강의에 대한 진도율이 퍼센트로 표시된다. 

 설명이 영어로 나와서 아쉽기는 하지만, 한번 사용해보면 R 학습하는데 큰 도움이 될 것이다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 데이터셋의 일부 데이터 가져오기

|



먼저 지난번에 설명한 R 데이터셋 처리 함수들의 일부를 살펴보자. 

table()로 일부 데이터 가져오기 

mtcars 데이터셋의 실린더 수를 가지고 str(), summary(), stem()을 적용하면 다음과 같다. 


str()을 사용하면 R 객체의 구조를 확인할 수 있고, 

summary()는 데이터에 대한 요약 정보를 보여준다고 했다. 

그리고 stem()은 줄기와 잎 형태로 데이터를 재구성해서 출력한다. 


하지만 자동차의 실린더 수에 따라 일반적으로 4기통, 6기통, 8기통으로 나눠지기 때문에

이런 이산적인 데이터에 대해서는 위와 같은 형태의 출력보다는 테이블 구조가 더 적합하다.

그래서 table()을 한번 적용해 보면 다음과 같이 출력된다. 


전체 자동차에 대해 좀더 확실하게 4, 6, 8기통으로 분류해서 확인해 볼 수 있다. 

만약 이 중에서 4기통과 6기통의 자동차에 대한 정보만 보고 싶으면 어떻게 할까? 

mtcars의 다음과 같이 조건을 주고 4, 6기통 자동차의 정보만 별도로 저장하면 된다. 

다른 정보도 잘 저장되어 있는지 확인하기 위해 str()메소드를 적용해 봤다. 


다음과 같이 조건을 테스트해보면 실린더 수가 4, 6인 것은 TRUE로 나오고 8인 것은 FALSE로 나오는 것을 알 수 있다. 

그러므로 mtcars에 해당 조건을 부여하면 TRUE인 값만 별도로 추출하게 된다. 


subset()으로 일부 데이터 가져오기

이와 유사하게 subset()을 활용할 수도 있다. 

subset()으로 조건을 지정할 수도 있고, 특정 열만 가져오도록 처리할 수도 있다. 

다음 예제를 살펴보면 쉽게 이애할 수 있을 것이다. 


mtcars1은 subset()에 조건만 부여해서 4, 6기통 자동차 정보를 가져온 것이다. 

mtcars2는 위에서 만들어진 mtcars1에 select를 통해 mpg와 cyl 열만 가져온 것이다. 

마지막으로 mtcars3는 원래 데이터인 mtcars에서 subset 조건과 select 열을 한꺼번에 지정해서 가져온 것이다. 


R 더 알아보기

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~


R 예제: 데이터 세트에서 관계 확인하기

R 예제: 연관성 측정

R 예제: 이산적 시계열값 예측하기

R 예제: 1이 연속으로 나오는 부분 찾기





Trackback 0 And Comment 0

R 데이터셋 정렬하기~

|



지난번 글에서 R 데이터셋의 명령어들.. head, str, summary, stem, fivenum, hist, boxplot 을 살펴봤다. 

이번에는 데이터셋을 정렬하는 명령어를 알아본다. 


실전에서도 데이터셋 정렬은 많이 사용하기 때문에 잘 알아두면 많은 도움이 될 것이다. 

샘플 데이터 셋은 역시 R에 내장되어 있는 mtcars (1974년 Motor Trend US Magazine에서 추출한 73, 74년식 자동차 32개 데이터)이다. 


R 데이터 정렬

R에서 데이터 정렬하는 명령어는 order이다. 

먼저 mtcars를 읽어온 후, 

> dtat(mtcars)


mtcars 데이터의 mpg(mile per gallon)을 기준으로 order를 실행해 보자. 


order의 결과값을 실제 mtcars$mpg의 값과 비교해 보면 그 의미를 명확하게 알 수 있다. 


order 함수는 말 그대로 해당 열의 순서, 즉 인덱스만을 제공하는 명령어이다. 

그래서 order의 결과값은 각 열의 데이터의 순서를 나타낸다. 

즉, 첫번째 값인 21.0이 mpg 전체서 15번째이고, 두번째 값인 21.0이 그 다음인 16번째 라는 것을 나타낸다. 


그럼. 순서를 나타내는 order를 가지고 어떻게 데이터를 정렬할 수 있을까? 

order를 필터로 mtcars를 재정렬해서 다음과 같이 저장하면 된다. 


head 함수로 결과를 살펴보면 mpg를 기반으로 오름차순으로 잘 정리된 것을 확인할 수 있다. 

mtcars[order(mtcars$mpg,] 형태를 잘 기억해 두기 바란다. 


이제 원하는 다른 열의 데이터를 가지고 정렬하는데 어려움이 없을 것이다. 

만약 마력(hp)를 기준으로 정렬한다면 다음과 같이 처리한다. 


그렇다면 오름차순이 아닌 내림차순으로 정렬하는 것은 어떻게 할까? 

order 함수 내에 -를 붙이면 해결된다. 


마지막으로 두개의 열을 기준으로 mpg는 오름차순, hp는 내림차순으로 하려면 다음과 같이 한다. 


마지막으로 각 행의 이름, 여기에서는 자동차 모델명으로 정렬하는 것을 알아보자. 

행의 이름을 가져오는 함수는 rownames()이며, 이걸 기준으로 order 함수를 적용하면 된다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 데이터셋 처리 함수들에 대한 간단한 정리~

|



R을 활용하면 다양한 데이터셋을 data.frame으로 읽어서 많은 작업을 할 수 있다. 

어떤 작업들이 가능한지 R에서 데이터셋을 처리하는 함수를 중심으로 살펴보기로 하자. 


Motor Trend Car Load Test

예제로 사용할 데이터셋은 R에 내장되어 있는 mtcars이다. 

이 데이터는 1974년 Motor Trend US magazine에서 추출한 것으로 1973년, 1974년 모델의 32개 자동차들의 디자인과 성능을 비교한 것이다. 

help 명령어로 데이터 포맷 등을 먼저 살펴보기 바란다. 

> help(mtcars)


데이터셋의 정보 확인 

먼저 mtcars 데이터를 가져와 보자. 

데이터셋을 가져오기 위해서 간략하게 data() 함수를 호출하면 된다. 

> data(mtcars)


32개의 자동차의 성능비교 데이터를 제대로 불러왔는지 다음과 같이 확인한다. 

> mtcars


head()

경우에 따라서는 대량의 데이터셋을 읽어오는 경우가 있다. 

이때는 다음과 같이 head 함수를 사용해서 앞부분의 일부만 읽어올 수 있다.  


str()

str은 자바에서 주로 사용하는 String 관련 함수가 아니라 R 객체의 구조(Structure)를 보여주는 함수이다. 

mtcars는 data.frame이고 11개의 변수에 32개의 데이터가 있다는 것을 보여주고, 

각각의 변수들의 타입과 일부 데이터를 다음과 같이 출력한다. 


summary()

summary는 데이터에 대한 요약 정보를 나타내는데, 

숫자인 경우 최소값, 최대값, 산술평균, 중앙값, 하한 사분위수, 상한 사분위수를 다음과 같이 보여준다. 


중앙값에 대해서는 "평균에 대한 정리(mean, median, mode)"를 참고하고, 사분위수에 대해서는 "변이와 분포" 글을 참고하기 바란다. 


데이터셋의 특정 열 기준으로 작업하기 

데이터셋에서 특정 열을 가져오기 위해서는 $를 사용한다. 

mtcars 데이터에서 첫번째 열인 mpg(mile per gallon)를 가져오려면 다음과 같이 사용한다. 

> mtcars$mpg


 참고로 mpg는 1 갤론당 몇 마일을 갈 수 있는지를 나타내는 지표인데, US Gallon으로 표시되어 있으므로 약 3.8리터당 몇 마일을 가는지를 나타낸다. 

(1 갤론의 경우, 미국에서는 3.8리터에 해당하고, 영국, 캐나다 등 다른 나라에서는 4.5리터에 해당한다고 한다.)



stem()

stem은 "stem-and-Leaf Plots"라고 이야기하는데, 글자 그대로 줄기와 잎으로 재구성하는 방식이라고 할 수 있다. 

실제 분석할 때 유용하게 활용할 수 있는 함수인데 실제 예제를 통해서 이해해 보도록 하자. 


먼저 출력 데이터를 보면 | 가 있는데, 설명에 따르면 소수점(decimal point)을 기준으로 나눈 것을 알 수 있다. 

stem을 해석하려면 | 왼쪽의 데이터를 줄기로 보고, | 오른쪽 데이터를 잎으로 보면 된다. 

그래서 데이터 구성이 10.4, 10,4, 12.3, 14.3, 14.7, 14.0 .... 이런 형태로 되어 있다는 것이다. 


실제 동일한지 확인하기 위해서 mpg 열기준으로 정렬한 데이터를 보자. (정렬은 다음에 다룰 예정이다.)


10.4, 10.4는 일치하지만 13.3이 12.3으로 잘못 표시되어 있다. 15.0도 마찬가지로 14.0으로 해석된다. 

| 왼쪽의 stem 값을 보면 홀수값이 없이 짝수만 나와 있는 것을 알 수 있다. 

그래서 13은 12로 간주하고, 15는 14로 간주해서 보여주고 있다. 


hist()와 boxplot()

도수분포표를 그래프로 나타내는 히스토그램에 대해서 학창시절에 배운 기억이 있을 것이다. 

이 히스토그램을 그리는 함수가 hist이다. 


> hist(mtcars$mpg)


그리고 변이와 분포에서 설명한 "box and whisker diagram"을 boxplot으로 그릴 수 있다. 

> boxplot(mtcars$mpg)


fivenum()과 quantile()

fivenum은 5개의 숫자를 구하는데 사용한다. 최소값, 하한 사분위수, 중앙값, 상한 사분위수, 그리고 최대값을 나타내느데 사용한다. 

보통 Tukey Five-Number Summary라고 한다. 


qunatile도 유사하게 0%, 25%, 50%, 75%, 100%의 값을 나타낸다 


그러나 위 결과를 잘 살펴보면 25%에서 fivenum과 quantile의 값이 다른 것을 알 수 있다. 

fivenum은 우리가 알고 있는 사분위수를 구한 값이고, quantile은 확률적으로 균등하게 자른 개념이기 때문에 이런 차이가 발생할 수 있다. 


"본 글은 카톨릭의대 문건웅 교수님의 R 예제를 기반으로 작성했습니다."


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 패키지 설치하기

|



R 패키지 

R 사이트에 접속해보면 다양한 R 패키지들이 있는 것을 확인할 수 있다. 

http://cran.r-project.org/web/packages/available_packages_by_name.html


이러한 R 패키지를 이용하면, R을 활용해 보다 다양한 작업들을 할 수 있다. 

그럼 R 패키지를 설치하는 방법을 알아보기로 하자. 


R 패키지 설치

먼저 현재 사용하고 있는 R 패키지를 확인할 필요가 있다. 


새로운 패키지 설치는 install.packages()를 활용해서 처리한다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 예제: 데이터 세트에서 관계 확인하기

|



R을 사용하면서 특정 파일에서 데이터를 읽어 분류하고 관계를 확인해야 하는 경우가 많이 있다. 

이런 경우, 활용할 수 있는 간단한 예제를 살펴보도록 한다. (노만 매트로프의 빅데이터 분석 도구 R 프로그래밍 참조)


먼저 샘플로 사용할 아래 전복(abalone)의 데이터 파일을 다운로드 하자. 

Abalone.data


파일을 열어보면 다음과 같이 컴마(,)로 구분된 CSV 파일임을 알 수 있다. 


여기에서 성별(Gender)에 따라 전복의 직경(Diameter)과 길이(Length)가 변화가 있는지 살펴보려고 한다. 

전체 소스는 다음과 같다. 


read.csv 함수를 통해서 abalone.data 파일을 읽어들인다. 

옵션을 살펴보면 헤더를 인식하도록 True값으로 설정했다. 


grps라는 빈 리스트 변수를 만들고 여기에 수컷과 암컷으로 분류해서 데이터를 넣는다. 

그리고 나서 수컷은 abam 변수에, 암컷은 abaf 변수에 할당한다. 


그리고 plot 함수를 활용해서 직경과 길이의 관계를 그래프로 나타낸다. 

두번째 plot 함수는 pch 값을 x로 설정해서 그래프에 x로 표시하도록 하고 있다. (기본 값은 o 이다.)

이어서 new=FALSE로 선언함으로써 새로 그래프를 그리지 않고, 앞에 그린 그래프 위에 덮어 쓰도록 구성했다. 


결과를 보면 수컷이나 암컷에 따라 직경과 길이가 차이가 있지 않고 비슷하다는 것을 알 수 있다. 

추가로 암컷의 경우, 수컷보다 더 넓게 분포되어 있는 것도 파악할 수 있다. 


이와 같은 형태로 파일에서 데이터를 읽어서 각 칼럼간의 관계를 파악해 볼 수 있다. 


 

미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

우분투에서 R 패키지 설치

|



우분투에 R을 설치하기 위해 간단하게 apt-get을 사용하면 됩니다. 


$ sudo apt-get update

$ sudo apt-get install r-base

$ R


쉘에서 R을 입력하면 R 콘솔이 나타나게 됩니다. 

기본적으로 R은 수많은 패키지를 사용할 수 있다는 장점이 있습니다. 


R 콘솔에서 다음과 같은 명령어로 필요한 패키지를 추가로 설치할 수 있습니다. 


> install.pakages("RMySQL")



그런데 패키지에 따라서 다음과 같은 오류 메시지가 나올 수 있는데요. 


Warning in install.packages :

  package ‘gplots’ is not available (for R version 2.14.1)


이때는 R 콘솔에서 쉘로 나가서 apt-get으로 찾아서 설치하면 됩니다. 


$ sudo apt-cache search gplots

r-cran-gplots - GNU R package with tools for plotting data by Greg Warnes et al

$ sudo apt-get install r-cran-gplots


실제로 RMySQL과 같은 패키지를 설치할 때, 이런 이슈가 있어서 다음과 같이 처리했네요. 


$ sudo apt-get install r-cran-dbi

$ sudo apt-get install r-cran-rmysql


혹시 mysql을 연동할 때 잘 안되는 분들은 참고하기 바랍니다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 예제: 연관성 측정

|



두 변수 간의 통계적인 관계 측정 방식으로 사용하는 상관관계 측정으로 피어슨 상관계수, 스피어만 상관계수 등이 있다고 합니다. 

피어슨 상관계수는 두 변수 X와 Y가 함께 변하는지와 따로 변하는지의 비율로 계산하는 것으로 가장 많이 사용된다고 합니다. 

X와 Y가 완전히 동일하면 +1, 완전히 다르면 0, 반대방향으로 동일하면 -1 값을 가진다고 하네요. 


스피어만 상관계수는 자료의 값 대신 순위(랭킹)을 기준으로 상관관계를 계산하는 방식이라고 합니다. 

이 값은 -1과 1 사이의 값을 가지는데, 두 변수의 순위가 완전히 일치하면 +1, 완전히 반대면 -1이 된다고 합니다. 

스피어만 상관계수와 같이 순위를 기준으로 값을 측정하는 캔달의 타우도 있다고 하네요. 


이번에 살펴볼 R 예제는 기온과 기압과 같은 시계열 벡터 x, y에 대해 각 값이 증가하고 감소하는 것에 대한 상관관계를 살펴보는 것입니다. 

먼저 코드를 살펴보도록 하죠. 



findud는 시계열 벡터 v에 대해 뒤에 값에서 바로 앞의 값을 뺀 값을 계산하고, 

그 값이 증가하고 있으면 1, 감소하고 있으면 0을 리턴하는 함수입니다. 


연속된 값의 차이를 계산하기 위해 v[-1]으로 맨 앞의 값을 제거한 벡터를 먼저 구하고, 

v[-length(v)]으로 맨 뒤의 값을 제거한 벡터를 구한 다음, 두 값을 빼서 계산한 것을 확인할 수 있습니다. 


udcorr 함수에서는 상관관계 계수를 정하기 위해서 x 벡터와 y 벡터의 증감이 동일한지 먼저 비교합니다. 

증감이 동일하다면 1이 나올 것이고, 다르면 0이 나올 것이므로

그 평균을 구하면 증감이 동일한 상관관계의 비율이 나오게 되는 것이죠. 


실제 값을 넣고 테스트를 해 봤습니다. 



그런데 책에서는 udcorr 함수를 다음과 같이 계산했습니다. 



lapply()함수를 사용한 것이고 결과는 동일하게 나옵니다. 

findud를 두번 호출하지 않는 장점이 있어, 코드를 짧고 명확하게 작성하는데 도움이 된다고 하는데요. 

저는 첫번째 방식이 보다 직관적이고 읽기 쉬울 것 같다는 생각이 들었습니다. 

어쨌든 lapply()를 통해 리스트에 있는 벡터에 대해 동일한 함수를 호출할 수 있다는 점은 기억해 둬야 겠네요. 


마지막으로 R은 다양한 고급 함수를 제공하고 있습니다. 

연속된 값의 차이를 구해주는 diff() 함수와 

현재 값이 양수인지, 0인지, 음수인지에 따라 1, 0, -1을 리턴하는 sign() 함수를 사용할 수도 있다고 합니다. 



정말 소스가 간단해 지는군요.. ^^ 

하지만 코드가 더 읽기 힘들어질 수도 있으므로 개인적으로는 첫번째 방식을 가장 추천합니다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 예제: 이산적 시계열값 예측하기

|



다음과 같은 날씨가 있다고 가정해봅시다. 



비가 조금이라도 온 날을 1로 보구요.. 맑은 날을 0이라고 해보죠..

그리고 나서 일정 기간의 데이터를 보고 앞으로 비가 올지 안올지를 예측해 보는 겁니다. 

먼저 위의 날씨를  R의 벡터로 표시하면 다음과 같이 할 수 있을 것입니다. 



앞으로의 날씨를 예측하는 부분의 알고리즘은 여기에서는 쉽게 다수결로 한다고 생각해 보겠습니다. 

k라는 수를 정하고, k값이 3이면 이전 3일 데이터를 가지고 1과 0중 더 많이 나온 것을 보고, 그날의 날씨를 예측해 보는 것이죠. 

위 예에서는 1일에서 3일까지의 (0, 1, 1) 세개를 보고 1이 많으므로, 4일째도 1이 나온다고 예측한다는 것이죠. (즉, 비가 온다는 것입니다.)


한번 더 생각해볼까요? 

k값이 5이고, 위 그림의 9일의 날씨를 예측하려고 한다면, 

4일 ~ 8일의 데이터 (1, 1, 1, 0, 0)으로 9일의 데이터를 예측하면 1이 나와서 비가 온다고 했으니 틀린 예측이 되겠죠.. 


이처럼 훈련을 통해 패턴을 인식하기 위한 과거의 데이터를 기계학습에서는 training set 이라고 합니다. 

이런 경우, k값에 따른 예측에 대한 오차율(Error Rate)를 R을 통해서 쉽게 계산할 수 있는데요. 

그 예제를 한번 해보도록 하겠습니다. 



성능 향상을 위해서 vector()를 이용해 미리 영역을 할당하는 것에 대해서는 이전에 설명했었네요. 

여기에서는 sum(x[i:(i+(k-1))]을 먼저 살펴보죠..

0과 1로 이루어진 이산 데이터이기 때문에, 

i번째 부터 k개의 데이터를 합한 것이 k값의 반절보다 크면 1이 많은 것이고, 작으면 0이 많은 것이라는 점을 활용한 겁니다. 

위에서 설명한 k=3일때, (0,1,1)의 합은 2이고, k/2값은 1.5이므로, 4일째는 1이 나온다고 예측이 되는 것이죠. 


예측된 값이 맞는지를 확인하기 위해서 예측값에서 실제값을 뺀 것이 pred-x[(k+1):n]입니다. 

예측값과 실제값이 맞다면 0이 나올 것이고, 그렇지 않을 경우 1 또는 -1이 나오겠죠.. 

여기에 abs()로 절대값을 취하면, 0은 정확한 예측이 1은 틀린 예측이라고 할 수 있습니다. 

이것의 평균을 mean()으로 구하면 예측의 오차율(Error Rate)를 구할 수 있게 되는 것이죠. 


소스는 복잡해 보이지만 설명을 잘 읽어보시면 이해가 될 것입니다. 

실행해 보면, k=3인 경우가 5일때 보다는 오차율이 더 적은 것을 알 수 있습니다. 



여기에서도 최적화를 조금 해보면, 먼저 반복문 내에서 sum()을 여러번 호출하는 것을 알 수 있습니다. 

계속해서 sum을 계산하지 않고, 새로운 것을 더하고 이전 것을 빼는 형태로도 구성할 수 있겠죠. 



좀더 효율성을 높이기 위해서 누적합을 구해주는 R 함수인 cumsum()을 사용할 수도 있습니다. 



cumsum()은 이전의 숫자들의 합을 한번에 구해주는 함수입니다. 

이를 활용해서 위와 동일한 R 프로그래밍을 하면 다음과 같습니다. 



미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0

R 예제: 1이 연속으로 나오는 부분 찾기

|



R을 어떻게 하면 쉽게 이해할 수 있을까? 생각해봤습니다. 

모든 프로그래밍 언어가 마찬가지겠지만 실제 적용하는 사례로 보는 것이 가장 좋은 방법이 아닐까 합니다. 

그래서 지금부터 R에 대해서 "빅데이터 분석 도구 R 프로그래밍(노만 매트로프 지음)"의 예제로 정리해 보려고 합니다. 



첫번째는 매우 쉬운 예제이기는 하지만 기본적인 R을 이해하는데 도움이 될 것 같아서 진행해 봅니다. 

0과 1로만 이루어진 벡터가 있을 때, 1이 연속으로 나오는 부분을 찾는 함수입니다. 

즉, (1,0,0,1,1,1,0,1,1)과 같은 벡터가 있을 때, 1이 연속으로 세번 나오는 곳을 찾으면 4가 되겠죠..


중요한 부분이 R에서의 벡터는 1부터 시작한다는 점입니다. 

C/C++에 익숙했던 분들은 0부터 시작한다고 생각할 수도 있지만, R은 1부터 시작하는 점을 꼭 기억해 두세요. 


위 숫자에서 1이 연속으로 두번 나오는 곳을 찾으면, 4, 5, 8이 되겠죠.. 

자 그럼.. 이런 계산을 R로 어떻게 구성할까요? 



소스를 보면 정말 간단해 보입니다. 

하나씩 살펴보도록 하죠.. 


첫번째 줄은 findruns라는 함수를 정의한 것입니다. 

매개변수로 벡터 x와 1이 연속으로 나오는 개수를 지정한 k를 받고 있지요. 


이어서 벡터 x의 길이를 구해서 n에 할당하게 됩니다. 

for 문에서 runs라는 결과값을 생성할 때 기존의 runs에 새로운 것을 추가하는 형태이기 때문에, 

runs라는 벡터를 선언을 해야 합니다. 

R에서는 별도의 선언문이 없으므로 NULL을 할당해서 for 문에서 runs를 재할당 할 수 있도록 했습니다. 


for 문을 살펴보면 i in 1:(n-k+1) 이 나오는데요. 

i가 1부터 시작해서 (n-k+1)까지 반복문을 실행하라는 것입니다. 

n이 9이고 k가 3이라고 가정하면, 마지막 8,9번째 숫자는 계산할 필요가 없습니다. 

왜냐하면 이후에 남은 개수가 3개가 안되므로 당연히 1이 연속으로 3개 나올 수 없기 때문이죠.. 

그래서 (n-k+1)까지만 계산하도록 하는 것입니다. 


if 문을 살펴보도록 하지요. 

all(x[i:(i+k-1)]==1)) 을 먼저 보면, i부터 k개만큼 1이 나오는지 확인하는 것입니다. 

그런데, all()이라는 함수를 사용했습니다. 

R은 벡터 기반이므로 all(...)은 내용이 모두 TRUE일때, TRUE를 리턴합니다. 

즉, K가 3이라고 하고, all(x[1:3]==1)을 확인하면 TRUE, FALSE, FALSE 이렇게 나오므로 결과는 FALSE가 되는 것이죠. 


마지막으로 k개가 모두 1일 경우에, runs에 이전 runs와 현재 i를 추가해서 재할당 해줍니다. 

결과는 다음과 같이 나타납니다. 



하지만 위 예제에서 성능을 향상시킬 수 있는 부분이 있습니다. 

runs <- c(runs, i)로 계속 재할당을 하고 있는데요. 

이 부분을 미리 runs에 메모리 공간을 할당하고 값을 넣은 다음, 나머지 필요 없는 부분을 잘라내는 형태로 구성하면 성능 향상이 됩니다. 



소스는 좀 더 복잡해지지만 runs의 할당이 두번만 일어나므로 보다 효율적이겠지요. 

앞서 설명한 내용을 기반으로 살펴보면 이해가 될 것입니다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~





Trackback 0 And Comment 0
prev | 1 | 2 | 3 | next