분위수들로부터 확률을 계산하는 법, 반대로 확률에서부터 분위수를 계산하는 법, 확률분포로부터 확률난수들을 생성하는 법, 분포의 그래프를 그리는 법 등을 다룬다.
R에는 모든 확률 분포의 축약형 이름이 따로 존재한다. 예를 들어 정규분포의 이름은 ‘norm’이다.
•
dnorm : 정규분포의 확률 밀도
•
pnorm : 정규분포의 함수
•
qnorm : 정규분포의 분위수 함수
•
rnorm : 정규분포의 난수
<이산 분포>
•
이항 : binom(n,p) : n은 시행 횟수, p는 성공 확률
•
기하 : geom(p) : p는 성공 확률
•
초기하 : hyper(m,n,k)
•
음이항 : nbinom(size,prob 또는mu) : size는 성공 횟수, prob은 성공 확률, mu는 평균. prob과 mu 중 하나 선택
•
푸아송 : pois(lambda) : lambda는 평균
<연속 분포>
•
베타 : beta(shape1,shape2)
•
코쉬 : cauchy(location,scale)
•
카이제곱 : chisq(df) : df는 자유도
•
지수 : exp(rate)
•
F분포 : f(df1,df2) : df1과 df2는 자유도
•
감마 : gamma(rate 또는 scale)
•
로그정규 : lnorm(meanlog, sdlog) : meanlog는 로그 척도로 된 평균, sdlog는 로그 척도로 된 표준편차
•
로지스틱 : logis(location, scale)
•
정규 : norm(mean,sd)
•
스튜던트화 t : t(df)
•
균등 : unif(min,max) : min은 하한, max은 상한
•
와이블 : weibull(shape, scale)
•
윌콕슨 : wilcox(m,n) : m은 첫 표본에 있는 관측값들의 개수, n은 둘째 표본에 있는 관측값들의 개수
또다른 패키지인 MASS는 몇몇 일반적인 분포의 최대우도 적합뿐만 아니라 다변량 정규분포에서의 표본추출 등 분포에 대한 추가적인 지원을 제공한다.
8.1 조합의 개수 세기
전체 n개 항목들 중 한 번에 k개씩 선택하는 조합의 개수를 계산한다.
choose 함수를 사용한다. —> choose(n,k)
이산 변수들의 확률을 계산할 때 자주 접하는 조합의 개수 세기다.
> choose(5,3)
[1] 10
> choose(50,3)
[1] 19600
> choose(50,30)
[1] 4.712921e+13
R
복사
8.2 조합 생성하기
choose함수는 조합의 개수를 세 주는 함수이고 실제 조합을 생성하는 함수는 combn함수다.
—> combn(항목들, k)
예를들어 combn(1:5,3) 은 1~5까지의 숫자를 한 번에 세 개씩 선택하는 모든 조합이다.
combn(1:5,3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 2 2 2 3
[2,] 2 2 2 3 3 4 3 3 4 4
[3,] 3 4 5 4 5 5 4 5 5 5
R
복사
이 함수는 숫자에만 국한되지 않고 문자열의 조합도 생성할 수 있다.
> combn(c("T1","T2","T3","T4","T5"),3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "T1" "T1" "T1" "T1" "T1" "T1" "T2" "T2" "T2" "T3"
[2,] "T2" "T2" "T2" "T3" "T3" "T4" "T3" "T3" "T4" "T4"
[3,] "T3" "T4" "T5" "T4" "T5" "T5" "T4" "T5" "T5" "T5"
R
복사
8.3 난수 생성하기
0과 1사이의 균등 난수를 생성하려면 runif함수를 사용한다.
> runif(1) # 균등 난수 하나 생성
[1] 0.1622843
> runif(10) # 균등 난수 10개 생성
[1] 0.47453586 0.52124627 0.89538444 0.75950741 0.43131546 0.05705578 0.41573344 0.37350509
[9] 0.46719268 0.22105755
> runif(1,min=-3,max=3) # -3과 3 사이의 균일 난수 한 개
[1] -2.00729
R
복사
주어진 분포의 난수 생성기 이름은 그 분포의 축약형 앞에 ‘r’을 붙이는 것이다.
> rnorm(1) # 표준정규분포의 랜덤 난수
[1] -0.849445
> rnorm(1,mean=100,sd=15) # 평균 100, 표준편차 15의 정규 난수 한 개
[1] 81.74474
R
복사
> rbinom(1,size=10,prob=0.5) # 이항 난수 한 개
[1] 5
> rpois(1,lambda = 10) # 푸아송 난수 한 개
[1] 13
> rexp(1,rate=0.1) # 지수 난수 한 개
[1] 7.805232
> rgamma(1,shape=2,rate=0.1) # 감마 난수 한 개
[1] 40.57515
R
복사
물론, 인자들은 벡터여도 된다. 랜덤 값들을 생성하면서 벡터의 원소를 순차적으로 사용할 것이다.
> rnorm(3, mean=c(-10,0,10), sd=1) # 평균인자가 벡터다
[1] -9.9750751 0.2196626 9.9692346
R
복사
위의 방식은 모수들 자체가 난수일 때 쓰기 좋은 기능이다.
> means <- rnorm(100, mean=0,sd=0.2)# 모수 자체가 난수
> rnorm(100,mean=means,sd=1)
[1] 0.64294909 -0.35042061 -0.11507522 -0.48589562 -0.14835247 -1.10306860 -0.53483244
[8] 0.27913743 0.75119761 -1.34760655 -0.48052162 0.41375768 -0.67329673 0.53857870
[15] -0.40284813 -0.93966952 -0.44564730 1.17423378 0.63206875 1.08749768 -0.05037525
[22] 1.13930956 0.73935819 -1.08371551 0.64132378 -0.11127668 1.19725843 0.64568532
[29] -0.67125959 1.16071744 0.15230562 0.14242469 -1.27299403 -0.35115088 0.48736894
[36] 1.16814938 2.05464753 -0.86124682 -1.26135265 1.69461417 -1.21647814 -0.10294728
[43] 0.62319378 0.13944864 0.32135830 2.17236769 -0.95081164 -2.49126700 -0.15673974
[50] 0.81895131 -0.17249636 1.23915064 -1.61512462 0.12017280 -1.99699773 -0.93737963
[57] -0.03192326 -1.15666464 -1.23803494 -0.03171003 -0.03319964 0.94791545 -0.53856860
[64] 1.15720329 -0.87011032 1.42959423 1.04579389 -1.14067595 -1.07537977 1.21219509
[71] 1.92402072 -0.07685847 -1.30487277 -0.35955077 -1.58387465 -0.10021099 1.28814999
[78] 1.13698993 -1.22874992 -1.42660422 0.31825154 -0.45415781 0.45030011 0.78287948
[85] 0.11513525 -0.80256604 0.08895424 -1.81223227 -2.34651896 0.62090368 0.92680266
[92] -0.86584670 0.55497196 0.03319096 -0.99011014 1.02130277 0.49965986 1.74501814
[99] 0.26894437 -0.54787980
R
복사
8.4 재현 가능한 난수 생성하기
난수로 된 수열을 생성하려 하는데, 프로그램을 실행할 때마다 동일한 수열이 다시 만들어져으면 한다고 하자.
set.seed 함수를 사용해서 난수 생성기를 알려진 상태로 초기설정한다. 임의의 정수 인자를 하나 받는다. 물론 동일한 초기 상태로 만들려면 항상 같은 숫자를 사용해야 한다.
—> ex ) set.seed(666)
위의 함수는 프로그램이 실행될 때마다 항상 동일한 랜덤 숫자들을 다시 만들어내고 싶은 경우에 사용한다. 그렇게 되면 결과는 일관되고 재현가능한 결과가 된다.
> set.seed(165)
> runif(10)
[1] 0.1159132 0.4498443 0.9955451 0.6106368 0.6159386 0.4261986 0.6664884 0.1680676 0.7878783
[10] 0.4421021
> set.seed(165)
> runif(10)
[1] 0.1159132 0.4498443 0.9955451 0.6106368 0.6159386 0.4261986 0.6664884 0.1680676 0.7878783
[10] 0.4421021
R
복사
8.5 확률 표본 생성하기
데이터세틑에서 랜덤한 표본을 추출하고 싶다. sample함수는 벡터에서 n개의 항목을 랜덤으로 선택한다.
—> sample(vec,n) :벡터에서 n개의 항목을 랜덤으로 선택한다.
물론 sample을 다시 실행하면 다른 결과가 나올 것이다. sample함수는 일반적으로 ‘비복원’으로 표본을 추출한다. 즉, 동일한 항목을 다시 선택하지 않는다.
하지만 어떤 통계 절차들은 ‘복원’ 추출을 써야 하는 것도 있다. 표본을 복원 추출하려면 replace=TRUE로 지정한다.
8.6 랜덤 수열 생성하기
sample 함수를 사용한다. 가능한 값들의 집합에서 표본을 추출하며 replace=TRUE 로 설정한다.
•
sample(set, n , replace=TRUE)
다음예는 동전을 10번 던진 랜덤 수열을 생성한다.
sample(c("H","T"),10,replace=TRUE)
R
복사