오늘도 잊지 않고 돌아왔습니다.
물론 어디까지나 저는 통계학과 3학년이고 아직 다 배우지 않았기에 아는 곳까지만 알려드릴거에요
5~6을 마지막으로 생각하고 있고 마지막에는 특별한 서비스를 준비했습니다 기대해주세요
오늘은 여러가지 확률 분포들을 시험해 볼 생각입니다. 통계학과이신 분들은 여러가지 실험하실 일 있을거에요.
1. 균일분포
Uniform Distribution이라고도 합니다. 기본은 0과 1사이 구간에 균일하게 퍼진 수를 임의로 꺼내는 방법입니다.
보시면 아시겠지만 runif(n) {n은 생성하고 싶은 숫자의 갯수} 입니다.
히스토그램을 그려본 결과 랜덤하게 0에서 1 사이에 100개의 숫자가 분포된 것을 볼 수 있습니다.
이를 이용해서 무엇을 구할 수 있을까요?? - 가장 간단한 예시를 들어보겠습니다.
10분 간격으로 운행되는 버스가 있습니다. 당신은 버스가 보이지 않을 때 정류장에 도착했습니다. 당신이 굉장히 운이 없다고 가정했을 때, 평균적으로 얼마나 기다려야 버스를 탈 수 있을까요?
보시면 아시겠지만 runif()함수로 10개의 수를 뽑아냈습니다. 그 후 max()함수를 이용해 가장 큰 수를 M행렬에 저장했습니다.
n<-10과 u<-runif(n)은 n에 10이라는 숫자를 집어넣어 u라는 변수에 runif()함수로 10개의 수를 넣겠다는 뜻입니다.
M<-rep(0,N)과 M[i]<-max(u)는 M을 0을 1000개 가진 행렬로 만들어 그 i번째 값에 u의 max값을 넣겠다는 뜻입니다.
이 시행을 1000번 반복하여 나온 결과 Median(중간값 - 50%, 2nd quartile)이 0.9349가 되었군요.
즉 당신은 운이 없을 경우 9.3분을 기다려야 버스를 탈 수 있게 됩니다.
참 쉽죠?
2. 베르누이 분포(Bernoulli) - 이항분포
확률변수 X가 0또는 1을 취하는데 있어서 P{X=1}=p 즉 X가 1일 확률을 p라고 할 때 이 분포를 베르누이 분포라고 합니다.
함수는 rbinom을 사용합니다.
보시면 0과 1이 0.5의 확률로 10번의 시행을 거쳐 만들어진 것을 볼 수 있습니다.
음 베르누이 분포는 쉽게 말해서 확률이 써진 주사위를 굴리는 겁니다. 확률이 1/2라면 코인토스, 확률이 1/6이라면 주사위. 그래서 원하는 숫자나 표식이 나오는 경우 1, 나오지 않는 경우를 0으로 써서 분포를 만드는 거죠.
동일한 확률을 지니는 독립 시행이 이 베르누이 분포를 따르게 됩니다. 그리고 이 베르누이 분포의 합은 이항분포를 따르게 되는데 자세한건 그 뒤에...
이 베르누이 분포로는 어떤 문제를 풀 수 있냐, 다음과 같습니다.
ASKY씨는 5원을 가지고 도박을 시작하는데 도박에서 이길 확률은 0.5, 이기면 1원을 따고 지면 1원을 잃습니다. 20원이 되거나 0원이 되면 게임이 종료된다고 가정할 때 이 사람이 게임을 끝낸 순간의 평균 금액은?
1000회 반복시행을 해서 구해보겠습니다.
ASKY씨는 5원입니다.
n.repeat(반복횟수) 는 1000회입니다.
M은 0을 n.repeat개 가진 행렬입니다.
i가 1에서 1000까지일 때, balance는 ASKY, 즉 5원이 됩니다. max.balance는 20원입니다. balance가 0보다 크거나 20원보다 작을 때 우리는 rbinom 함수를 이용해서 베르누이 시행을 합니다.
ASKY씨가 1원을 딸 확률은 베르누이 시행을 통해 1이 나왔을 경우 2*베르누이 시행-1, 1원을 잃을 확률 역시 0이 나왔을 경우 2*베르누이 시행-1
그래서 balance는 balance+2*rbinom(1,1,0.5)-1이 되는겁니다.
0원이 되거나 20원이 된 balance를 M[i](i번째 시행의 결과물)에 저장하고 그 시행을 1000번 반복해서 얻은 결과를 평균냅니다.
4.92원. 네 ASKY씨는 1원을 딸 확률이 1/2인 도박을 했지만 자기 본전보다 적은 돈을 평균적으로 남기게 됩니다. 이 얼마나 불쌍한가요.
참 쉽죠?
오늘은 자주 쓰이는 분포들을 가지고 문제를 풀어보았습니다. 내일은 그래프를 가지고 다시 한번 찾아뵙도록 하겠습니다
p.s r을 따로 공부하고 싶은 분들께 드리는 코드
K팀 투수는 0.7의 확률로 아웃을 만들고 Y팀 투수는 0.6의 확률로 아웃을 만듭니다. 타자가 아웃을 회피하면 안타를 1회 치고, 안타는 무조건 1루타라고 가정합니다. 이 경우 K팀이 이길 확률은 얼마나 될까요? 모든 경기는 3아웃에 1이닝이 종료되며 9이닝까지만 진행합니다.
#Y팀의 점수를 구하는 방법입니다.
prob<-0.7 #K팀 투수가 Y팀 타자를 아웃시킬 확률입니다.
N<-1000
y1.score<-rep(0,N)
for (i in 1:N){
score<-rep(0,9)
for(j in 1:9){ #2 한번에 9이닝을 계산해서 한 경기의 점수를 구하는 방법
n.hit<-0
n.out<-0
while(n.out<3){ #아웃이 3회가 될 때까지 binom을 진행합니다.
out<-rbinom(1,1,prob)
if(out>0.3) #0.3보다 크다 - 즉 Y팀 타자가 아웃을 피하지 못했을 경우
n.out<-n.out+1 #아웃이 한개 늘어납니다.
else{
n.hit<-n.hit+1 #그렇지 않으면 히트가 늘어나구요
}
if(n.hit>3)
score[j]<-n.hit-3 #히트가 3보다 크다면 히트에서 3을 뺀 것이 점수가 됩니다. 1타당 1루타이므로 4번은 1점 5번은 2점...
else
score[j]<-0 #3보다 작다면 그저 0점이겠죠
}
y1.score[i]<-sum(score) score를 모두 모아 [i]번 경기의 점수로 넣습니다.
}
}
이를 이용해 mean을 구해서
> mean(y1.score,2)
[1] 0
> mean(k1.score,2)
[1] 3
이 경우 K팀의 승패에 대한 확률은
> table(result)
result
-11 -7 -6 -5 -4 -3 -2 -1 0 1 2 3
1 3 4 2 7 31 38 75 149 140 140 107
4 5 6 7 8 9 10 11 12 13 14 15
82 68 49 35 26 16 7 9 3 4 1 1
16 21
1 1
K팀이 Y팀을 이길 확률은 0.690
K팀이 Y팀과 비길 확률은 0.149
K팀이 Y팀에게 질 확률은 0.161