본문 바로가기
@ 필수과목/손으로 푸는 확률분포

[손으로 푸는 확률분포] 다항분포 (6) 그래프

by bigpicture 2020. 2. 15.
반응형

 

 

(6) 그래프 

 

다항분포의 그래프를 인간이 그리기에는 차원의 한계가 있습니다. 우리는 좌표공간인 3차원까지만 그래프를 그릴 수 있습니다. (색(color)를 이용하면 차원을 하나 늘일 수는 있습니다)

먼저 좌표평면에 그래프를 그려봅시다. 좌표평면에 그래프를 그리려면 독립변수 하나와 종속변수 하나가 필요합니다. 확률분포에서 독립변수는 확률변수이고 종속변수는 확률입니다. 

다항분포가 하나의 독립변수를 갖는 경우는 시행의 결과가 두가지 사건으로 나뉠때 입니다. 이는 이항분포와 같고 지난강의에서 설명했습니다. 이항분포의 그래프는 아래와 같습니다. 시행횟수가 커질 수록 좌우 대칭인 종모양에 가까워져갑니다. 이항분포에서 n을 무한대로 보내면 정규분포로 수렵합니다. 

 

(참고영상 : http:// https://youtu.be/iLY-oE_ilSY)

 

 

이번에는 좌표공간에 그래프를 그려봅시다. 독립변수 2개와 종속변수 1개가 필요합니다. 다항분포에서 독립변수를 2개 가지려면 시행의 결과가 세개의 사건으로 나뉘면 됩니다. 사건 A,B,C로 나뉜다고 합시다. 세 사건 중 독립변수를 설정해주어야 합니다. 사건 A와 B를 독립변수로 설정하겠습니다. 

A의 확률을 0.2로 B의 확률을 0.3으로 설정하였습니다. n이 10일 때와 50일 때의 그래프를 그려보면 아래와 같습니다.

 

 

n이 커지면 그래프가 종 모양이 되는 것을 알 수 있습니다. n=50일 때 각 사건의 기댓값을 구해보면 아래와 같습니다. 

E(X)=50*0.2=10
E(Y)=50*0.3=15

평균 근처에서 봉우리가 형성되어 있는 것을 알 수 있습니다. 사건 B가 발생할 확률을 0.5로 키워보겠습니다. 기댓값은 25가 됩니다.

봉우리의 위치가 Y=25 근처로 이동한 것을 알 수 있습니다. 

 

그림에 사용된 R 코드는 아래와 같습니다. 그림 순서와 같습니다. 

 

plot(0,type="n",
     xlim=c(0,30),ylim=c(0,0.4),ann=FALSE)
x=0:50
y=dbinom(x,10,0.2)
points(x,y,type="p",col=rainbow(1)[1],pch=20)

x=0:50
y=dbinom(x,10,0.5)
points(x,y,type="p",col=rainbow(3)[2],pch=20)

x=0:50
y=dbinom(x,30,0.5)
points(x,y,type="p",col=rainbow(5)[4],pch=20)

title(xlab="x",ylab="p(x)",cex.main=2,cex.lab=1.2)

box("outer",col="gray")
legend("topright",legend=c("n=10,p=0.2","n=10,p=0.5","n=30,p=0.2"),
       col=c(rainbow(1)[1],rainbow(3)[2],rainbow(5)[4]),lty=1)

 

library(latticeExtra)

n=10
P_A=0.2
P_B=0.3

nc=5
nr=5
mat=matrix(1:nc*nr*3,nrow=nc*nr,ncol=3)

colnames(mat)=c('X','Y','Z')

for (i in 1:nc) {
  for (j in 1:nr){
     mat[(i-1)*nc+j,1]=i
    mat[(i-1)*nc+j,2]=j
    mat[(i-1)*nc+j,3]=factorial(n)/(factorial(i)*factorial(j)*factorial(n-i-j))*(P_A^i)*(P_B^j)*((1-P_A-P_B)^(n-i-j))
  }
}

mat=as.data.frame(mat)

cloud(Z~X+Y, mat, panel.3d.cloud=panel.3dbars, col.facet='grey', 
      xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
      par.settings = list(axis.line = list(col = "transparent")),
      xlim=c(0,nc+1),ylim=c(0,nr+1),main="n=10")

 

library(latticeExtra)

n=50
P_A=0.2
P_B=0.3

nc=25
nr=25
mat=matrix(1:nc*nr*3,nrow=nc*nr,ncol=3)

colnames(mat)=c('X','Y','Z')

for (i in 1:nc) {
  for (j in 1:nr){ 
    mat[(i-1)*nc+j,1]=i
    mat[(i-1)*nc+j,2]=j
    mat[(i-1)*nc+j,3]=factorial(n)/(factorial(i)*factorial(j)*factorial(n-i-j))*(P_A^i)*(P_B^j)*((1-P_A-P_B)^(n-i-j))
  }
}

mat=as.data.frame(mat)

cloud(Z~X+Y, mat, panel.3d.cloud=panel.3dbars, col.facet='grey', 
      xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
      par.settings = list(axis.line = list(col = "transparent")),
      xlim=c(0,nc+1),ylim=c(0,nr+1),main="n=50")

box("outer",col="gray")

 

 

library(latticeExtra)

n=50
P_A=0.2
P_B=0.5

nc=25
nr=25
mat=matrix(1:nc*nr*3,nrow=nc*nr,ncol=3)

colnames(mat)=c('X','Y','Z')

for (i in 1:nc) {
  for (j in 1:nr){
      mat[(i-1)*nc+j,1]=i
    mat[(i-1)*nc+j,2]=j
    mat[(i-1)*nc+j,3]=factorial(n)/(factorial(i)*factorial(j)*factorial(n-i-j))*(P_A^i)*(P_B^j)*((1-P_A-P_B)^(n-i-j))
  }
}

mat=as.data.frame(mat)

cloud(Z~X+Y, mat, panel.3d.cloud=panel.3dbars, col.facet='grey', 
      xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
      par.settings = list(axis.line = list(col = "transparent")),
      xlim=c(0,nc+1),ylim=c(0,nr+1),main="n=50")

box("outer",col="gray")

 

반응형

댓글