복원추출 : 한번 관찰한 값을 다시 관찰할 수 있도록 모집단에 다시 포함시키는 추출방법 비복원 추출 : 한번 관찰한 값은 다시 모집단에 포함하지 않는 추출방법

R에서는 sample() , sample.int() 함수를 제공

A,B,C,D가 관찰된 확률이 각각 0.1, 0.2, 0.3, 0.4인 모집단에서 10개를 복원추출로 뽑는 모의 실험 과정

x <- LETTERS[1:4]
p <- seq(0.1,0.4,by=0.1)
sample(x,size=10,replace=T,prob=p) #replace = T복원 추출 
##  [1] "C" "D" "C" "C" "B" "C" "C" "C" "C" "D"

1부터 1000까지의 자연수에서 비복원으로 10개의 난수를 얻기 위한 명령문

sample(1:1000,size=10,replace=F,prob=rep(0.001,1000))
##  [1] 966 101 667 846 689 603 409 581 598 751
sample.int(1000, size=10)
##  [1] 918 896 281 637 481 122 105 370 143 489

공평한 동전을 1000번 던져서 나오는 앞면의 수

1000 - sum(sample(0:1, size=1000, replace=T, prob=c(0.5,0.5)))
## [1] 489

R에서 함수이름의 첫글자는 난수발생의 경우 r, 확률밀도 함수는 d, 누적분포함수는 p, 분위수는 q를 첫문자로 사용

두번째 글자부터는 분포이름의 약자를 사용 ex)runif, dunif, qunif, punif

일양분포(uniform distribution) 일양분포는 구간의 부분집합인 임의의 구간에서 구간의 길이가 같으면 확률이 같은 분포를 의미

f(x) = 1 / (b-a) , a < x < b

dunif(x, min=0, max=1, log=FALSE, …) punif(q, min=0, max=1, lower.tail=TRUE, …) qunif(p, min=0, max=1, lower.tail=TRUE, …) runif(n, min=0, max=1, …)

x,q 각각 확률밀도함수값을 얻을 x벡터, 누적확률을 얻을 q벡터 설정 p : 분위수를 얻을 확률값의 벡터 r : 발생할 난수의 개수를 설정 min, max : 일양분포의 범위로서 기본값은 각각 0, 1이다 lower.tail : 논리값을 설정하며 TRUE이면 확률은 P[ X <= x], 아니면 P[X > x]

U(0,1)은 0부터 1사이에 균일한 분포 확률을 가지므로 f(x) = 1,0 < x < 1임

dunif(1)
## [1] 1
punif(0.5)
## [1] 0.5

100개의 난수를 생성하여 평균을 계산해보면

mean(runif(100))
## [1] 0.495211

정규분포는 통계학에서 가장 자주 사용되는 분포 중의 하나이며 확률변수가 정규분포를 따르면 평균에 대해 좌우 대칭이며 분산이 클수록 더 많이 흩어진 분포를 갖게 됨

표준정규분포에서 2.5% 백분위수 z0.975는

qnorm(0.025)
## [1] -1.959964
dnorm(c(-1,0,1)) #-1, 0, 1의 dnorm값
## [1] 0.2419707 0.3989423 0.2419707
pnorm(c(-2.54,-1.96,0,1.96,2.54)) #누적값
## [1] 0.005542623 0.024997895 0.500000000 0.975002105 0.994457377

n=10인 경우 95%의 신뢰구간을 1000번 계산하여 1000개의 신뢰구간중 모평균 0을 포함하는 경우를 구해보기

z.ci <- function(ndata=10, alpah=0.05, nrep=1000){
  qz <- qnorm(1-alpah/2)
  se <- 1/sqrt(ndata)
  ncover <- 0
  for(i in 1:nrep){
    x <- rnorm(ndata)
    meanx <- mean(x)
    ubound <- meanx + qz*se
    lbound <- meanx - qz*se
    if(ubound > 0 & lbound < 0) ncover = ncover + 1
  }
  list(ncover=ncover)
}

z.ci()
## $ncover
## [1] 950

이항분포 dbinom(x, size, prob, log = FALSE) pbinom(q, size, prob, lower.tail = TRUE, log.p = FALSE) qbinom(p, size, prob, lower.tail = TRUE, log.p = FALSE) rbinom(n, size, prob)

주사위를 다섯번 던지는 실험을 100회 반복할때 의 눈금이 나온 회수의 평균과 분산이 이 값들과 얼마나 가까운지 알아보기

binom.par <- function(nrep=100, n=5, p = 1/6){
  x <- rbinom(nrep,n,p) #nrep개의 난수 발생
  meanx <- mean(x)      #난수 평균
  varx <- var(x)        #난수 분산
  list(meanx = meanx, varx = varx)
}

binom.par()
## $meanx
## [1] 0.77
## 
## $varx
## [1] 0.6435354

초기하 분포

주머니에 m개의 흰색공과 n개의 검은공이 있을때 임의로 k개를 비복원추출로 꺼내는 경우 흰색공의 개수가 x개가 될 확률

dhyper(x, m, n, k, log = FALSE) phyper(q, m, n, k, lower.tail = TRUE, log.p = FALSE) qhyper(p, m, n, k, lower.tail = TRUE, log.p = FALSE) rhyper(nn, m, n, k)

주머니 속에 빨간공 5개 파란공 6개가 있을때 이주머니에서 3개의 공을 비복원으로 추출할때 빨간공의 수가 2일 확률 구하기

dhyper(2,5,6,3)
## [1] 0.3636364
choose(5,2) * choose(6,1) / choose(11,3)
## [1] 0.3636364

빨간공의 개수가 2이상일 확률은

1- phyper(1,5,6,3)
## [1] 0.4242424
choose(5,2) * choose(6,1) / choose(11,3) + choose(5,3) * choose(6,0) / choose(11,3)
## [1] 0.4242424
dhyper(2,5,6,3) + dhyper(3,5,6,3)
## [1] 0.4242424