(11주차) 11월18일
정적분의 계산, 랜덤변수, 샘플링
-
(1/8) 지난시간 숙제풀이
-
(2/8) 정적분의 계산 (1)
-
(3/8) 정적분의 계산 (2)
-
(4/8) 정적분의 계산 (3)
-
(5/8) 균등분포, 베르누이분포, 이항분포의 생성
-
(6/8) 샘플링 (1)
-
(7/8) 샘플링 (2)
-
(8/8) 숙제설명
(문제) $\int_0^2 |x^2(x-1)| dx $ 의 값은?
(1) $\frac{3}{2}$
(2) $2$
(3) $\frac{5}{2}$
(4) $3$
(5) $\frac{7}{2}$
(풀이)
x=seq(from=0, to=2, by=0.01)
y=abs(x**2 * (x-1))
plot(x,y,type='l')
-
아이디어: (1) 가로가 2 세로가 4인 작사각형에 임의의 점을 뿌린다. (2) 전체점의 수와 함수 아래에 위치한 점의 갯수를 센다. (3) 점의 갯수를 바탕으로 넓이를 추론한다.
xx=runif(10000) # 0~1 사이의 점을 랜덤으로 10000개 뽑음
xx = xx*2 # 0~2사이의 값을 랜덤으로 10000개 뽑은것과 같은 효과
yy=runif(10000)*4 # 0~4 사의의 점을 랜덤으로 10000개 뽑음
plot(xx,yy)
가로가 2, 세로가 4인 직사각형에 무작위로 점이 흩뿌려져 있다.
plot(xx,yy)
lines(x,y,col='red',lwd=3)
붉은선 아래의 점들이 몇개일까?
test = function(xx,yy){
yy < abs(xx**2 * (xx-1))
}
print(c(xx[1],yy[1])) ## xx[1], yy[1] 의 값 = 무작위로 찍힌 값
print(abs(xx[1]**2 *(xx[1]-1))) ## xx[1]에 해당하는 붉은점의 값
test(xx[1],yy[1])
plot(xx,yy,col='gray')
lines(x,y,col='red',lwd=3)
points(xx[1],yy[1],col='blue')
points(xx[1],abs(xx[1]**2 * (xx[1]-1)),col='red')
tst = c()
for (i in 1:10000) tst[i] = test(xx[i],yy[i])
head(tst)
plot(xx,yy,col='gray')
lines(x,y,col='red',lwd=3)
points(xx[tst],yy[tst],col='red')
붉은점들의 갯수는? tst==TRUE
인 점들의 수
sum(tst)
전체 10000개 중에서 1829개정도가 붉은점임. 따라서
$$\frac{s}{8} \approx \frac{1829}{10000}$$
이므로 구하는 넓이는 대략적으로
1829/10000 * 8
따라서 답은 1번 3/2 이다.
-
이와 같은 방법을 몬테카를로 방법이라고 한다.
-
꽤 복잡한 함수에 대하여서도 정적분의 값을 근사적으로 계산해낼 수 있다는 장점이 있음.
(풀이2)
-
사실 그냥 아래와 같이 풀어도 된다.
sum(yy < abs(xx^2 * (xx-1)) )
-
목표: 구간 [0,1]에서 하나의 임의의 값을 뽑는것 (이때 구간 [0,1]에서 각 점이 뽑힐 확률은 동일)
runif(1)
-
목표: 구간 [0,1]에서 10개의 값을 뽑고 싶다면?
runif(10)
-
10000개의 값을 뽑아보고 평균이 0.5근처인지 체크해보자.
runif(10000) %>% mean
-
목표: 구간 [0,2]에서 하나의 값을 임의로 뽑고 싶다. (이때 구간 [0,2]에서 각 점이 뽑힐 확률은 동일)
-
방법1
runif(n=1,min=0,max=2)
-
방법2
runif(1)*2
- 왜 방법2처럼 해도되는가? $X \sim U(0,1)$ 이면 $2X \sim U(0,2)$ 이므로
- 이론적인 내용은 수리통계학에서 배울것임
-
10000개의 값을 뽑아보고 평균이 1인지 살펴보자.
runif(n=10000,min=0,max=2) %>% mean
(runif(10000)*2) %>% mean
-
목표: 동전을 한번 던져서 앞면이 나오는 경우를 생성하고 싶음 (이때 동전은 공평한 동전이라 가정하자. 즉 앞면이 나올 횟수와 뒷면이 나올 횟수는 같다고 하자.)
rbinom(1,size=1,prob=0.5)
- 앞면이 1, 뒷면이 0이라고 생각
-
잘 되는것이 맞는지 한번 체크해보자. (10000개 정도의 동전을 던져서 결과를 저장하고 평균이 0.5인지 체크하자)
rbinom(10000,size=1,prob=0.5) %>% mean
-
동전이 공평하지 않다고 하자. 예를들어 앞면이 나올 확률이 0.8이라고 생각하자.
rbinom(10000,size=1,prob=0.8) %>% mean
-
목표: 동전을 10회던져 앞면이 나올 총 횟수를 생성하자.
- 동전을 10회던져 앞면이 나온 횟수를 $X$라고 하자. $X$를 생성하라.
rbinom(1,size=10,prob=0.5)
-
평균적으로 5가 나와야 한다. (10000번 정도 뽑아보고 관찰하자)
rbinom(10000,size=10,prob=0.5) %>% mean
-
베르누이 분포는 이항분포의 특수한 경우이다.
-
직관적으로 생각하면 아래와 같이 이항분포를 생성해도 될 것 같다.
rbinom(10,size=1,prob=0.5) %>% sum
X=c()
for (i in 1:10000) X[i] = rbinom(10,size=1,prob=0.5) %>% sum
X
- 직관적으로 생각하면 X는
rbinom(10000,size=10,prob=0.5)
와 같은 효과 (랜덤성 때문에 같은 값은 아님) 일 것 같은데 이는 실제로 그러하다. (좀 더 엄밀한 증명은 수리통계 시간에 배운다)
X %>% mean()
-
주머니에서 빨간공 2개와 파란공 3개가 있다고 하자.
set = c(rep("red",2),rep("blue",3))
set
-
이러한 집합에서 랜덤으로 3개의 원소를 고르고 싶다면? (단, 뽑은 공은 다시 넣지 않는다)
sample(set,size=3)
-
50번정도 해보자.
for (i in 1:50) sample(set,size=3) %>% print
- 빨간공을 3번 뽑지는 못함
-
뽑은공을 다시 넣는다고 가정한다면?
set = c(rep("red",2),rep("blue",3))
set
for (i in 1:50) sample(set, size=3,replace = TRUE) %>% print
- 빨간공을 3번 뽑을 수 있음
-
예제6의 코드는 아래와 같다.
set = c('red','blue') ## 인덱스..
p = c(0.4,0.6) ## 인덱스에 해당하는 확률
sample(set,size=3, prob=p, replace = T)
-
아래와 같은 코드로도 응용가능하다.
sample(set,size=20,prob=c(0.95,0.05),replace=T)
-
예제7의 코드에서 replace를 제외한다면?
set = c('red','blue') ## 인덱스..
sample(set,size=20,prob=c(0.95,0.05))
- 당연히 에러가남 (원소가 2개 있는 set에서 20개를 뽑으라고 하니..)
-
아래는 에러가 나지 않을 것임
sample(set,size=2,prob=c(0.95,0.05))
-
의미는?
rslt = matrix(rep("-",1000*2),ncol=2)
head(rslt)
for (i in 1:1000) rslt[i,] = sample(set,size=2,prob=c(0.95,0.05))
head(rslt)
sum(rslt[,1]=='red')/1000
- 대략 95%
-
첫번째가 붉은 공이 뽑힐 확률은 95%임. 그리고 두번째 공은 첫번째 공과 다른색이 뽑힘
(유리,강화유리)의 쌍으로 이루어진 징검다리가 총 5개 있다고 하자. (따라서 징검다리는 모두 10개이다)
강화유리로 된 징검다리를 밟으면 살아남지만 유리로 된 징검다리를 밟으면 죽는다.
따라서 강화유리로 된 징검다리를 계속 골라야 살아남을 수 있다.
A씨는 유리공장에서 20년 근무한 장인으로 유리와 강화유리를 구분할수 있는 능력을 가졌다고 하자.
그래서 강화유리로 된 징검다리를 고를 확률이 80%라고 하자.
A씨가 살아남을 확률을 시뮬레이션을 통하여 구하여라.
Hint: 총 1000번의 시뮬레이션을 수행하고 그중에서 A씨가 살아남는 케이스가 몇회정도 되는지 찾아라.