인공지능관련/S, R 그래프 그리기

정규분포 그림 그리기

학위논문통계 2016. 11. 10. 02:08

 

 

최근에 big data와 인공지능이 나오면서 R이 인기를 끌고 있는데요. 원래 R은 S에서 나온 것입니다.

 

 

 

S하고 R을 간단히 설명하면요. S는 옛날 AT&T에서 데이터 변형하는 프로그램으로 개발되었습니다. 공짜죠. 이게 나중에 S-plus라고 상업용으로 발전해서 통계 처리하는 기능이 강화되고 윈도우 메뉴식이 첨가되었습니다. 미국에서는 통계를 전문적으로 사용하거나, 이공계에서는 제법 많이 사용되었고요. 통계학과에서는 매우 많이 사용되었습니다. 그러나 메뉴 기능이 별로 안좋습니다.

 

하여간 이 S-plus가 망하고, 그런 다음에 여러 사람들이 모여 R이라는 S를 닮은 공짜 프로그램을 개발하였습니다.

 

 

S과 R은 이공계에서 많이 사용되는 Matlab과 거의 비슷합니다. 단지 통계학이 많이 들어 있습니다. 이런 프로그램은 수학 문제 처리하는 mathematica나 Malpe 프로그램과 다릅니다. 예를 들어 방정식 근을 구하거나 미분, 적분 하는 것을 구하려면 Mathematica나 Maple 같은 프로그램을 사용해야 합니다. S나 R, Matlab은 기본적으로 설문이나 실험 등으로 우리가 데이터가 있을 경우 사용하는 프로그램입니다. 단지 사회과학에서 많이 사용하는 SPSS와 달리 사용자가 자신이 쉽게 프로그램을 짤 수 있습니다. 행렬이 있으면 역행렬 구하는 명령어가 있어 명령어 하나만 치면 바로 역행렬을 구해 줍니다.

 

 

 

그래서 최근에 어떤 방법론이 나오면 전세계 S나 R을 사용하는 학자나 개발자들이 사람들이 쉽게 쓸 수 있도록 모듈이나 라이브러리를 개발헤서 제공합니다. 그래서 이 모듈이나 라이브러리를 가져오면 최근에 나온 이론도 바로 사용할 수 있습니다.

 

 

 

저는 아직도 S-plus를 쓰고 있는데 R 쓰기 전에 이 프로그램을 얻어 사용하면 훨씬 편할 겁니다. 안에 여러 가지 도움 말들이 많이 있으니까 참고하기도 쉽습니다. S-plus를 원하시는 분은 저에게 메일을 주시기 바랍니다. R을 사용하지 않았지만 S에 나오는 명령문은 R에서도 똑같이 사용될 수 있습니다.

 

R을 잘 하고 싶다면 이 책을 권해 드립니다. 전에도 한번 소개한 적이 있는 S 프로그램의 고전적인 책입니다.

 

Becker, Chambers & Wilks의 “The New S Language: A Programming Environment for Data Analysis and Graphics"

 

 

 

그래서 R을 S의 짝퉁이라 생각하시면 됩니다. 이뮬레이션이라고 하죠. 지금 운영체제도 MS 윈도우을 빼면 전부 Unix 이뮬레이션인걸로 알고 있습니다. Linux, 맥 운영체제(이건 잡스가 개발한 Next 운영체제를 가져왔는데 이게 Unix 짝퉁입니다.), 또 구글이 안도로이드도 Linux를 가져와 썼다고 하니 이것도 Unix 짝퉁이라 할 수 있겠죠).

 

 

 

 

S와 R에서 사용하는 그래프의 예를 몇 개 보여주겠습니다. 다음은 정규분포 그림을 그리는 함수입니다. 함수형태로 안하고 그냥 명령문만 쭉 써서 해도 됩니다. 함수 형태로 하면 좋은 점이 있습니다. 아래 정규분포 그리는 함수를 예를 들면 평균과 표준편차를 명령문에 넣어 자유롭게 사용할 수 있고요. 그리고 함수 안에 나오는 변수들은 지역 변수라 함수를 빠져 나가면 그냥 메모리에서 사라집니다. 따라서 변수 관리도 편하고 프로그램도 매우 가벼워집니다. 즉 함수 안에 계산할 때만 임시로 사용되고 함수 안 계산이 다 끝나면 프로그램이 안에서 무슨 작업을 했는지 전혀 기억을 하지 않습니다. 프로그램을 짠 본 경험이 있는 분들은 무슨 이야기를 하는지 바로 아실 겁니다.

 

 

정규분포 그림을 그릴 때 처음 생각하기에 정규분포에서 랜덤으로 데이터를 매우 많이 뽑아내서 이걸 그래프로 찍으면 되지 않나 생각하는데 그렇게 하면 안됩니다. 이건 분포 추정(density estimation)이라고 전혀 다른 문제입니다.

 

 

 

그냥 정규분포식을 사용해서 x는 -5에서 5 정도로 랜덤으로 100개 정도 뽑고 그리고 나온 x 값에 따라 정규분포식에 넣어 y 값을 구하여 plot을 찍으면 됩니다. 이때 두 점을 연결할 때는 직선(line)을 사용하면 됩니다, 아래 원으로 사용하면 모양이 안 좋아집니다.

 

 

drawnormal<-function(m,sigma){

x<-seq(-5,5, length=100); # x는 -5에서 5사이에 순서대로 100개 값을 구한다. 많이 뽑아낼수록 더 정교하게 그래프를 그릴 수 있겠죠.

y<-(1/sqrt(2*pi*sigma))*exp(-((x-m)^2/2*(sigma^2))); # 나온 100개의 x 값에 해당하는 정규분포 높이 값 y를 100개 구한다.

plot(x,y, type="l"); # 두 점을 연결하는 것을 직선으로 한다

}

 

 

여기서 #는 comment입니다. 나중에 프로그램 이해하기 쉽게 하기 위해 적는 것입니다. 먼저 컴퓨터에서 작업하는 폴더를 하나 만듭니다. “R그래프”라는 폴더를 만듭니다. 그리고 R에서 작업 폴더를 이 폴더로 지정합니다. S-plus에서는 메뉴에서 바로 됩니다. 그런 다음 이 폴더 안에서 노트장을 이용해 위의 내용을 적은 다음 “drawnormal.txt"로 저장합니다. 그리고 R 명령문에서 source("drawnormal.txt")를 치고 , 그 다음에 draw(0, 1)이라는 명령문을 치면 평균이 0이고 표준편차가 1인 그래프가 그려집니다.

 

 

 

위 함수를 좀 더 일반화하려면 x를 뽑는 범위를 평균 m과 표준편차 sigma에 따라 달리해야 합니다. 즉 seq(-5, 5, 100)이 아니라 seq(-5*sigma+m, 5*sigma+m, max(100, 100*sigma))로 해야 합니다.

 

 

함수 안에서 구한 x와 y 값은 전혀 저장이 되지 않습니다. 단지 함수 안에서 계산시 사용되는 것이죠. 만약 이 x, y를 계속 이용하고 싶다면 함수 제일 마지막에 xy=cbind(x, y) 줄을 더 첨가하시고 나중에 명령문에서 z=drawnormal(0.1) 이렇게 하면 함수 안에서 구한 x, y 값이 z이라는 이름을 가진 변수에 저장되고 항상 사용할 수 있습니다. 

 

 

   

 

다음은 원으로 찍어낸 정규분포 그래프입니다.

 

drawnormal<-function(m,sigma){

x<-seq(-5,5,length=100);

y<-(1/sqrt(2*pi*sigma))*exp(-((x-m)^2/2*(sigma^2)));

plot(x,y, type="p");

}

 

 

type에서 l은 line, p는 point의 약자입니다.

 

 

 

 

  위의 그래프가 보기 안 좋아 데이터를 만개로 더 많이 뽑고 원의 크기를 줄였습니다. cex=1이면 디폴터로 여러분 모니터에 찍히는 크기이고 0.3이면 디폴터 크기의 3/10 크기로 원을 찍어라는 옵션입니다.

 

 

 

drawnormal<-function(m,sigma){

x<-seq(-5,5,length=10000);

y<-(1/sqrt(2*pi*sigma))*exp(-((x-m)^2/2*(sigma^2)));

plot(x,y, type="p", cex=0.3);

}

 

 

 

  

 

다음에 계속 더 하겠습니다.

'인공지능관련 > S, R 그래프 그리기' 카테고리의 다른 글

퓨리에 변환  (0) 2016.11.14
다차정규분포, 3d그래프  (0) 2016.11.11