본문 바로가기

R

R을 이용한 중심극한정리

1. 중심극한정리?


중심극한정리(Central Limit Theorem, CLT)는 동일한 확률분포를 가진 독립 확률 변수 n개의 평균값은 n이 적당히 크다면 정규분포에 가까워진다는 정리이다. 수학자 피에르시몽 라플라스는 1774년에서 1786년 사이의 일련의 논문에서 이러한 정리의 발견과 증명을 시도하였다. 확률과 통계학에서 큰 의미가 있으며 실용적인 면에서도 품질관리, 식스 시그마에서 많이 이용된다.(위키 발췌)


2. R로 증명하기


데이터 샘플을 만들어보면...

1~6의 수를 가진 주사위를 5번씩 던지며 그 작업을 500번 반복하는 데이터를 R에서 제공하는 sample 함수를 통해서 만들어보면 아래와 같다.


sample <- matrix(sample(1:6, 5 * 500, replace = T), ncol = 5, byrow = T)

총 2500번을 던지고 주사위라는 가정이기 때문에 중복된 수가 나올 수 있으므로 replace 속성을 T(true)로 설정했다. 그리고 그 데이터를 matrix 함수로 matrix type으로 변환 후 sample이라는 변수에 저장했다.


head(sample)

head함수를 통해 sample데이터를 확인해보면 아래와 같다.


##      [,1] [,2] [,3] [,4] [,5]
## [1,]    6    5    4    2    6
## [2,]    6    6    1    1    6
## [3,]    6    6    1    4    4
## [4,]    6    2    4    2    2
## [5,]    1    5    3    1    4
## [6,]    1    6    1    2    6

이제 sample 데이터를 통해 각 열(row)별로 평균값을 구해보자.


각 열(row)별로 평균값을 구하는 방법은 여러가지가 있다.


rowMeans함수를 사용한 방법

rowMeans(sample)

apply함수를 사용한 방법

apply(sample, 1, mean)

위 두가지 방법은 동일한 결과값을 보이며 R은 col, row별 빈번하게 사용되는 sum, mean에 대한 함수를 제공하고 있다. (ex colMeans, colSums, rowSums 등)


head함수를 통해 확인해보면 아래와 같다.


head(rowMeans(sample))
## [1] 4.6 4.0 4.2 3.2 2.8 3.2


지금까지 작업했던 소스를 함수로 만들어 사용해보면 아래와 같다.


CLT <- function(no.throw = 5, no.rep = 500) {
    exp.res <- matrix(sample(1:6, no.throw * no.rep, replace = T), ncol = no.throw, byrow = T)

# return(apply(exp.res, 1, mean)) return(rowMeans(exp.res)) }

CLT함수를 실행(CLT())하게 되면 sample데이터의 rowMeans결과값을 얻을 수 있다.

그 결과값으로 히스토그램 차트를 그려보면 아래와 같다.


hist(CLT(no.throw = 5, no.rep = 50000), nclass = 20, col = "light grey", border = "grey", main = "Central Limit Theorem")

plot of chunk unnamed-chunk-2

주사위를 많이 던질 수록 정규분포에 가까워지는 걸 확인할 수 있다.




'R' 카테고리의 다른 글

R PDF생성 시 한글폰트 깨짐 문제  (4) 2013.10.21
rChart  (0) 2013.06.13
[JRI] R Parsing data.frame to JSON  (1) 2013.06.11