IT grow. 2018. 11. 24. 17:18
반응형

오늘은 다양한 확률분포에 대해서 다뤄보고자 한다.

정리해 두면 나중에 볼 것 같아서 정리해 본다.

 

연속형 확률분포에는 다음과 같은 것들이 있다.

1.     정규분포 ( normal distribution ) : norm()

2.     균등분포 ( uniform distribution ) : unif()

3.     지수분포 ( exponential distribution ) : exp()

4.     T – 분포 ( T – distribution ) : t()

5.     F – 분포 ( F – distribution ) : f()

6.     카이제곱분포 ( chisq – distribution ) : chisq()

7.     등이 있다.

 

정규분포는 추정과 검정을 하는 추정통계학 , 회귀분석과 같은 모형 적합시 근간이 되는 확률 분포이다.

우리의 일상 주변에서 흔히 접할 수 있는 확률분포이며 , 중심 극한의 정리에 따라 샘플의 개수 n이 증가하면 이항분포 , 초기하분포 , 포아송분포 등의 이산형 확률분포와 t-분포, f-분포 등의 연속형 확률분포가 정규분포로 근사하게 된다. 따라서 정규분포는 통계에 있어서 정말 중요하고 많이 사용되는 확률분포라고 할 수 있다.

 

함수 구분 

R 함수파라미더 

 norm()

  밀도 함수

  (Density function)

 d

  dnorm(x, mean=0, sd=1)

  누적 분포 함수

 (Cumulative distribution function)

 p

  pnorm(q, mean=0, sd=1, lower.tail=TRUE/FALSE)

  분위수 함수

 (Quantile function)

 q

  qnorm(p, mean=0, sd=1, lower.tail=TRUE/FALSE)

  난수 발생

 (Random number generation)

 r

  rnorm(n, mean=0, sd=1)

 

 



정규분포 그래프 ( normal distribution plot ) : plot(x, dnorm(x))

 

X <- seq(-3, 3 , length = 200)

Plot(x , dnorm(x, mean=0, sd=1) , type=’1’ , main=”Normal distribution, x~n(0,1)”)

 

 

 

위의 그래프가 정규분포 곡선이다.

 

X <- seq(-3, 3, length=200)

Plot(x, pnorm(x, mean=0, sd=1), type=’1’, main=”Cumulative normal distribution, x~n(0,1)”)

위의 그래프는 누적 정규분포 곡선이다.

 

정규분포의 누적분포함수 값 계산 : pnorm()

# p(-1 <= x <= +1)


Pnorm(q=c(1) , mean=0 , sd=1)

Pnorm(q=c(-1), mean=0 , sd=1)

Pnorm(q=c(1), mean=0, sd=1) - Pnorm(q=c(-1), mean=0 , sd=1)

 

#p(-2 <= x <= +2)


Pnorm(q=c(2) , mean=0 , sd=1)

Pnorm(q=c(-2) , mean=0 , sd=1)

Pnorm(q=c(2) , mean=0 , sd=1) - Pnorm(q=c(-2) , mean=0 , sd=1)

 

# p ( -3 <= x <= +3 )


Pnorm(q=c(3) , mean=0 , sd=1)

Pnorm(q=c(-3) , mean=0 , sd=1)

Pnorm(q=c(3) , mean=0 , sd=1) - Pnorm(q=c(-3) , mean=0 , sd=1)

 

# lower.tail = FALSE

Pnorm(q=c(1) , mean=0 , sd=1 ,lower.tail = TRUE)

Pnorm(q=c(1) , mean=0 , sd=1 ,lower.tail = FALSE)

è  Pnorm(q,mean,sd,lower.tail=TRUE) 이면 분위수 q를 기준으로 왼쪽의 -inf 부터 q까지의 면적에 대한 합계 값을 보여주며 , pnorm(q, mean,sd,lower.tail = FALSE)이면 분위수 q를 기준으로 q 부터 +inf 까지의 오른쪽으로의 면적 합계 값을 보여주게 된다

 


분위수 함수 : qnorm(p, mean=0, sd=1 , lower.tail=TRUE/FALSE)

정규분포를 따르는 모집단에서 특정 누적분포함수 값 p에 해당하는 분위수 q를 알고 싶을 때 사용하는 R함수가 분위수 함수 gnorm()이 되겠다.

분위수 함수는 누적분포함수의 역함수이고 , 반대로 누적분포함수는 분위수 함수의 역함수라고 말할 수 있다.

아래를 보면 , 누적분포함수와 분위수 함수가 서로 왜 역함수 인지 알 수 있다.

 

 

> # (3) 분위수 함수 : qnorm(p, mean=0, sd=1, lower.tail=TRUE/FALSE)

> pnorm(q=c(1), mean=0, sd=1) # 누적분포함수

[1] 0.8413447

>

> qnorm(p=0.8413447, mean=0, sd=1, lower.tail = TRUE) # 분위수함수

[1] 0.9999998

>

> qnorm(pnorm(1))

[1] 1

 

정규분포 난수 발생 : rnorm()

> # 100s random sampling from normal distribution X~N(0,1)

> random_norm_100 <- rnorm(100, mean=0, sd=1)

> random_norm_100

  [1] -0.49990947  1.30162824 -0.55303626 -0.67823807  1.09867201  0.10112825  1.60729584

  [8] -0.49131533 -0.23875557 -0.10318560  0.37495367  2.37449966  0.17832867 -1.13884498

 [15] -0.04055883 -0.64884566 -0.77738880 -1.07587347 -0.64434199 -1.38282292  0.16584547

 [22]  0.44776193 -0.78980486  1.73319388 -0.57968848  1.25727796 -0.05320889  2.61784767

 [29]  0.78992548  0.42473023 -1.45674849  1.45782133  2.58232132 -1.85544752 -0.46611618

 [36]  0.54686807 -0.72847864  0.12996224  0.19426881  0.01652534 -0.03819245 -0.60196303

 [43] -1.33088212  0.33449997  0.08826498 -0.12122490  0.45268734 -0.27621040  0.65957252

 [50]  0.73278278  1.23812581  0.09450144  1.44667268 -0.71373007 -0.04135331  1.07079267

 [57]  0.85465336  0.10066264  0.07047791 -0.19465235  1.83187324 -0.06047522 -0.89295237

 [64] -1.35422679 -0.26235751  1.06455750  0.83675769 -0.16588313 -0.77936548  0.16614752

 [71]  0.18333754  0.25274271  1.24194101 -0.36543022 -1.25669837  0.16981720 -0.83342688

 [78]  2.58352657 -2.00730559  0.03383145  0.44008506  0.60350848  1.12223002  0.38470856

 [85] -1.06631289 -0.08023159  0.28374720  1.68415043 -0.06373142  0.25866477  0.04997717

 [92]  0.47737531 -1.07703969  0.25487228 -1.00018975 -0.81282824 -0.77747525 -0.44254534

 [99] -0.56190014  0.67733634

> hist(random_norm_100)

 

 


 

난수 발생은 매번 할 때마다 바뀌게 되기 때문에 , 위의 예제를 따라한다면 , 아마 위에 나열된 숫자 , 위에 제시된 히스토그램과는 다른 숫자 , 그래프가 나타날 것입니다.

평균 0을 중심으로 좌우 대칭형태의 정규분포를 띠는 것은 유사할 것이다.

출처: http://rfriend.tistory.com/102 [R, Python 분석과 프로그래밍 (by R Friend)]

 



T – 분포 ( T – distribution ) : t()

표본분포를 나타낼 때 , T-분포 , F-분포 , 카이제곱 분포 등을 사용한다.

 

T – 분포는 평균이 0 이며 , 평균을 중심으로 좌우 대칭형태로 되어 있다 .

정규분포보다 가운데의 높이가 조금 낮고 , 좌우의 옆 부분은 정규분포보다 조금 더 높은 형태를 취하고 있다.

T – 분포는 자유가를 모수로 가지고 있으며 , 자유도가 높을수록 , 즉 표본의 개수가 증가할수록 중심극한의 정리에 의해서 정규분포에 근사하게 된다.

표본의 수가 많으면 모집단을 대표할 신뢰도가 높아지게 되어 좋기는 하지만 , 많은 경우는 비용과 시간의 한계로 인해서 한정된 수의 표본만을 추출해서 분석해야 하는 경우가 생기게 된다.

표본의 수가 적은 경우에 표본이 모집단의 어느 한쪽으로 쏠려서 추출될 경우 모집단을 잘 대표할 수 없는 신뢰도 이슈를 보완하기 위해서 , 정규분포일 때보다 평균에서 양쪽으로 멀어지는 바깥쪽 부분의 확률의 수준을 더 높인 분포 T – 분포가 된다.

 

 

> install.packages("ggplot2") # install

> library(ggplot2)

> ggplot(data.frame(x=c(-3,3)), aes(x=x)) +

+   stat_function(fun=dnorm, colour="blue", size=1) +

+   stat_function(fun=dt, args=list(df=3), colour="red", size=2) +

+   stat_function(fun=dt, args=list(df=1), colour="yellow", size=3) +

+   annotate("segment", x=1.5, xend=2, y=0.4, yend=0.4, colour="blue", size=1) +

+   annotate("segment", x=1.5, xend=2, y=0.37, yend=0.37, colour="red", size=2) +

+   annotate("segment", x=1.5, xend=2, y=0.34, yend=0.34, colour="yellow", size=3) +

+   annotate("text", x=2.4, y=0.4, label="N(0,1)") +

+   annotate("text", x=2.4, y=0.37, label="t(3)") +

+   annotate("text", x=2.4, y=0.34, label="t(1)") +

+   ggtitle("Normal Distribution, t-distribution")

 

 

 

R에서 T-분포 (t-distribution)을 위해 사용하는 함수 및 Parameter는 아래와 같다.

정규분포는 평균과 표준편차를 parameter로 사용한다.

균등분포는 구간의 최소값과 최대값을 parameter로 사용한다.

지수분포는 Lamdaparameter로 사용하는데 반해 , T – 분포는 자유도를 parameter로 사용한다

# 자유도는 통계량을 구성하는 확률변수들 중에서 자유롭게 선택가능한 확률변수의 개수를 의미한다.

 함수 구분

함수/ Parameter 

t() 

  밀도함수

  (density function) 

  dt(x, df)

  누적분포함수

 (cumulative distribution function) 

p

  pt(q, df, lower.tail = TRUE/FALSE)

  분위수 함수

 (quantile function)

q

  qt(p, df, lower.tail = TRUE/FALSE)

  난수 발생

  (random number generation)

r

  rt(n, df)

 

밀도함수 : df(x,df)의 그래프를 정규분포와 비교해서 그려보았으며 , 아래에는 t – 분포의 누적분포 함수를 그래프로 그려보고 누적분포확률도 계산해 본다.

 

 

T – 분포 누적분포함수 그래프 : stat_function(fun=pt , args=list(df=1))

 

> # 누적 t분포 그래프 (Cumulative t-distribution plot) : fun=pt

> ggplot(data.frame(x=c(-3,3)), aes(x=x)) +

+   stat_function(fun=pt, args=list(df=1), colour="brown", size=1.5) +

+   ggtitle("Cumulative t-Distribution : t(1)")

 

 


 

T – 분포 누적분포함수 : pt(q,df,lower.tail= TRUE/FALSE)

 

위의 t(df=1) 그래프에서 x(-inf,1)범위의 누적분포확률은 0.75 임을 알 수 있다.

 

> # 누적 t분포 확률 계산 : pt(q, df, lower.tail=TRUE/FALSE)

> pt(q=1, df=1, lower.tail = TRUE)

[1] 0.75

 

 

T – 분포 분위수 함수 : qt(p, df , lower.tail = TRUE / FALSE )

 

누적확률분포와 분위수 함수는 역의 관계에 있는데 , 위의 pt(q=1, df=1 , lower.tail=T) = 0.75였으므로 누적확률분포값이 0.75 가 되는 분위수 q‘1’이 되는지 아래 R script로 확인해 보겠다.

 

> # t분포 분위수 함수 계산 : qt(p, df, lower.tail=TRUE/FALSE)

> qt(p=0.75, df=1, lower.tail = TRUE)

[1] 1

 

 

T – 분포 난수 발생 : rt(n,dt)

T 분포에서 rt(n,df) 함수를 이용해서 난수를 발생시켜보겠다. 난수는 매번 생성할 때마다 바뀌므로 매 시행마다 아래의 예제와는 조금씩 달라지게 된다.

평균 0을 중심으로 좌우 대칭형태를 띌 것이다.

 

> rt <- rt(50, df=1)

> rt

 [1] -1.89734826 -1.40787172 -2.38022561 -0.21218535  0.71259957 -0.37759519 -0.46671360 -0.20455553

 [9] -0.54603347  2.88325761  0.13593286  0.09719242  1.35843796 -1.86861627  5.69879846  1.23054665

[17] -1.24953468 -0.76327864  1.87092396 -0.39719483 -0.42141574  0.10862682  0.54106231  0.30827837

[25] -1.25508149  0.54352324 -1.92825750  0.22491497 -0.63797793 -0.37089263  7.31876302  2.25023970

[33] -1.60455685 -1.64779189 -5.54583982 -8.82959795  0.53445244 -0.47451960 -2.52582931  1.57372391

[41]  2.30557669 -0.04118914 -0.71146732 -0.27621122 -7.29220086 -0.52472800 -0.78465027 -2.07649916

[49]  0.38322764 -1.71782797

> 

> hist(rt, breaks=20)

 


 


출처: http://rfriend.tistory.com/110 [R, Python 분석과 프로그래밍 (by R Friend)]

 



R 균등분포 ( uniform distribution ) : Unif()

 

균등분포는 연속형 확률 분포 중에서 가장 간단한 형태로서 , 구간 [mi=a,max=b]에서 값이 균등하게 퍼져 있는 집단 , 일어날 확률이 균등한 분포를 말한다.

예를 들자면 , 김포공항에서 제주도 공항까지 비행기로 이륙에서 착륙까지 걸리는 총 비행시간이 1시간~1시간5분 사이라고 하면 , 0~5959초까지는 비행기가 도착할 확률이 0 ,

1시간 ~1시간5분 사이에 도착할 확률은 1, 1시간 5분 이후는 다시 확률이 0이 되는 균등분포를 따른다고 할 수 있다.

 

R 에서 사용하는 균등분포 함수 및 파라미터들은 아래와 같으며 , 필요한 함수 , 파라미터를 가져다 사용하면 되겠다.

 함수 구분

 균등분포 함수/파라미더

 unif()

  밀도함수

  (density function)

 d

  dunif(x, min, max)

  누적분포함수

 (cumulative distribution function)

 p

  punif(q, min, max, lower.tail=TRUE/FALSE)

  분위수 함수

 (quantile function)

 q

  qunif(p, min, max, lower.tail=TRUE/FALSE)

  난수 발생

 (random number generation)

 r

  runif(n, min, max)

 

균등분포 그래프 : fun = dunif

Ggplot2 fun = dunif() 함수를 사용해서 균등분포를 그래프로 그려보면 아래와 같이 특정 구간 [a , b] 에서 확률이 균등함을 알 수 있다.

 

> library(ggplot2)

> # uniform distribution plot (min=0, max=10)

> # 균등분포 : fun = dunif

> ggplot(data.frame(x=c(-2,20)), aes(x=x)) +

+   stat_function(fun=dunif, args=list(min = 0, max = 10), colour="black", size=1) +

+   ggtitle("Uniform Distribution of (min=1, max=10)")

 

 

 

 

누적 균등분포 그래프 : fun = punif

누적 균등분포 그래프를 그려보면 아래와 같다.

 

> # (2) 누적균등분포 함수 그래프 (Cumulative Uniform distribution plot) : fun = punif

> ggplot(data.frame(x=c(-2,20)), aes(x=x)) +

+   stat_function(fun=punif, args=list(min = 0, max = 10), colour="black", size=1) +

+   ggtitle("Cumulative Uniform Distribution of (min=0, max=10)")

 

 

 

누적 균등분포 함수의 확률 값 계산 : punif()

 

 

> # (3) 누적 균등분포함수(cumulative uniform distribution function) 확률 계산 : punif()

> # : punif(q, min, max, lower.tail = TRUE/FALSE)

> punif(3, min=0, max=10, lower.tail=TRUE)

[1] 0.3

>

>

> # Uniform Distribution of (min=1, max=10), x from 0 to 3"

> ggplot(data.frame(x=c(-2,20)), aes(x=x)) +

+   stat_function(fun=dunif, args=list(min = 0, max = 10), colour="black", size=1) +

+   annotate("rect", xmin=0, xmax=3, ymin=0, ymax=0.1, alpha=0.2, fill="yellow") +

+   ggtitle("Uniform Distribution of (min=1, max=10), x from 0 to 3")

 

 

균등분포 분위수 함수 값 계산 : qunif(p, min , max , lower.tail= TRUE/FALSE)

 

이전 정규분포와 함수는 qunif()로 동일하지만 , 괄호 안의 parameter 들은 다르다.

 

> # (4) 분위수 함수 : qunif(p, min, max, lower.tail=TRUE/FALSE)

> qunif(0.3, min=0, max=10, lower.tail = TRUE)

[1] 3

 

 

난수 발생 : runif(n, min, max)

난수는 매번 실행할 때마다 바뀌므로 제가 아래에 제시한 것과는 다른 숫자 , 다른 그래프가 그려질 것이지만 , 형태는 균등분포를 띠는 유사한 모양이 될 것이다.

 

> ru_100 <- runif(n=100, min=0, max = 10)

> ru_100

 

 [1] 7.33957568 2.78596723 6.30797744 5.01438337 6.57949706 5.90883342 3.51446293 9.28736811

  [9] 9.55213668 5.59377524 4.71003185 3.29525512 0.25759555 9.40326151 6.56466466 2.44973803

 [17] 4.88714900 3.10710648 3.84375758 8.55017741 3.09487276 0.13411621 0.44285713 8.90632265

 [25] 0.07968823 5.03465390 4.64601169 1.23565062 4.81310463 1.59225023 7.03799510 0.68870704

 [33] 4.03014086 9.97756283 5.55815726 2.01819345 7.00497545 8.50399118 2.29608430 2.92359120

 [41] 0.85656712 6.52544881 6.37193951 6.15247601 5.29502105 7.68988134 6.37691223 0.37387705

 [49] 6.89023959 1.65049129 3.75195268 7.97220092 6.50160025 9.52491436 1.70569894 9.80475205

 [57] 0.24770673 8.47412000 4.66718922 2.52269224 2.81985175 8.79845402 6.03852213 8.10848875

 [65] 1.10510449 9.35548906 1.83535387 0.47889795 6.54578585 1.61742080 4.51840400 3.99912651

 [73] 4.82545376 4.04589108 0.71750065 7.56085867 1.22887762 2.97822070 5.14541682 3.59126885

 [81] 5.00911758 1.02152702 7.78324707 4.69437196 1.13090493 3.70933500 0.03173870 5.74159309

 [89] 2.68879279 3.36398725 9.34593590 6.18818473 9.43490689 5.82578697 4.49576854 2.90029081

 [97] 3.34726356 7.19013351 9.97276521 9.39421932

 

 

> # density plot of runif(n=100, min=0, max = 10) & adding line of 0.1 uniform probability

> hist(ru_100, freq=FALSE, breaks=10, col="yellow")

> abline(h=0.1, lty=3, lwd=3, col="red")

 

 

 



출처: http://rfriend.tistory.com/106 [R, Python 분석과 프로그래밍 (by R Friend)]

 



지수분포 (exponential distribution) : exp()

지수분포는 어떤 특정 사건이 발생하기 전까지 걸리는 시간을 나타내기 위해 많이 사용되는 확률분포이다.

지수분포의 예로는 전자레인지의 수명시간 , 콜센터에 전화가 걸려 올 때까지 걸리는 시간 , 경부고속도로 안성나들목에서 다음번 교통사고가 발생할 때까지 걸리는 시간 , 은행 지점에 고객이 내방하는데 걸리는 시간 등이 있겠다.

 

이산형 확률분포 중에서 포아송 분포가 단위 시간 혹은 단위공간에서 특정 사건이 발생하는 횟수에 대한 분포를 나타낼 때 주로 사용한다고 했는데 , 헷갈리지 않도록 주의를 해야겠다.

 

 

확률변수 X의 확률밀도함수가 위와 같을 때 , 확률변수 X는 모수 λ 인 지수분포를 따른다고 말한다.

R에서 지수분포와 관련된 함수 및 파라미터는 다음과 같다.

 

 함수 구분

지수분포 함수/파라미터 

 exp()

 밀도 함수
 (Density function)

 d

  dexp(x, rate)

 누적분포 함수

 (Cumulative distribution function)

 p

  pexp(q, rate, lower.tail=TRUE/FALSE)

 분위수 함수

 (Quantile function)

 q

  qexp(p, rate, lower.tail=TRUE/FALSE)

 난수 생성

 (Random number generation)

 r

  rexp(n, rate)

 

지수분포 그래프 : fun = dexp

 

> library(ggplot2)

> # (1) 지수분포 그래프 (Exponential distribution plot) : fun=dexp

> ggplot(data.frame(x=c(0,10)), aes(x=x)) +

+   stat_function(fun=dexp, args=list(rate=1), colour="brown", size=1.5) +

+   ggtitle("Exponential Distribution")

>     +   ggtitle("Exponential Distribution")

 

 

 

누적 지수분포 그래프 : fun = pexp

 

> # (2) (Cumulative exponential distribution plot) : fun=pexp

> ggplot(data.frame(x=c(0,10)), aes(x=x)) +

+   stat_function(fun=pexp, args=list(rate=1), colour="brown", size=1.5) +

+   ggtitle("Cumulative Exponential Distribution")

 

 

누적 지수분포 확률 값 계산 : pexp(q, rate , lower.tail = TRUE/FALSE)

 

 

> pexp(q=2, rate=1, lower.tail = TRUE)

[1] 0.8646647

 

 

λ (rate) = 1 인 지수분포에서 0~1까지의 누적 확률 값은 0.8646647 임을 알 수 있다.

 

지수분포 분위수 함수 값 계산 : qexp(p, rate , lower.tail=TRUE/FALSE)

 

> qexp(p=0.8646647, rate=1, lower.tail = TRUE)

[1] 2

 

qexp()pexp()와 역의 관계에 있다고 보면 되겠다.

 

지수분포 난수 발생 : rexp(n, rate)

 

> rexp(100, rate=1)

  [1] 0.805385854 1.077017598 0.941678341 2.059229603 0.517943248 0.955476408 0.575837716

  [8] 0.851462637 0.086982322 1.243358626 1.077268675 2.604957888 0.007571515 1.793674221

 [15] 0.118729103 0.096055712 0.015758928 0.201158101 0.914114063 0.130984491 2.752139235

 [22] 0.829986667 0.651976457 1.265562156 2.635988993 1.190808342 0.444055191 1.480476206

 [29] 1.741018226 2.692880185 0.804053361 3.127147071 0.902618388 1.432761851 0.369694262

 [36] 0.290926187 0.576759913 0.827636680 1.634353038 2.113214617 0.570110160 0.609782309

 [43] 1.985241502 1.067016441 0.098556668 3.326005637 2.261946740 6.395236475 1.906314444

 [50] 0.503994692 1.578938061 0.144050682 0.361734510 1.495605791 1.167056286 1.397221429

 [57] 1.598533234 0.370363955 0.153343928 0.351399011 0.957647500 1.053767695 0.272256882

 [64] 1.176451771 0.222995248 1.125289913 0.076051627 3.489328747 0.199440748 3.143880822

 [71] 1.640546855 4.492400575 1.102261695 0.189814932 0.222941682 2.305212835 0.069710370

 [78] 1.972949872 0.201703040 1.783014953 1.297271054 2.173743544 2.350792197 2.018307233

 [85] 0.417343667 2.533255698 0.522270208 2.068958899 1.062778262 0.210765630 0.804149691

 [92] 1.261281259 0.006859250 0.620238345 3.478939042 2.692230696 0.557543887 1.830330845

 [99] 0.478452368 0.904496278

> hist(rexp(100, rate=1), breaks=10)

 

 

Dexp(x, rate , log=TRUE)

 

Log = TRUE 옵션을 설정하면 지수분포의 확률밀도함수값에 밑이 e (2.17)인 자연로그 In을 취한 값을 계산한다 .

아래에는 X 가 모수가 1인 지수분포를 따른다고 했을 때 , x : 1 , 2 , …. 10 의 확률밀도함수값을 계산한 것이다.

Log = TRUE 라는 옵션을 취한값과 , log(dexp)라는 수식을 직접 입력해서 계산한 값이 서로 정확히 일치함을 알 수 있다.

 

> # dexp(x, rate, log=TRUE)

> dexp <- dexp(c(1:10), rate=1)

> dexp_log <- dexp(c(1:10), rate=1, log=TRUE)

>

> exp_df <- data.frame(cbind(c(1:10), dexp, dexp_log))

> exp_df

   V1         dexp dexp_log

1   1 3.678794e-01       -1

2   2 1.353353e-01       -2

3   3 4.978707e-02       -3

4   4 1.831564e-02       -4

5   5 6.737947e-03       -5

6   6 2.478752e-03       -6

7   7 9.118820e-04       -7

8   8 3.354626e-04       -8

9   9 1.234098e-04       -9

10 10 4.539993e-05      -10

>

> exp_df <- transform(exp_df, dexp_logarithm = log(dexp))

> exp_df

   V1         dexp dexp_log dexp_logarithm

1   1 3.678794e-01       -1             -1

2   2 1.353353e-01       -2             -2

3   3 4.978707e-02       -3             -3

4   4 1.831564e-02       -4             -4

5   5 6.737947e-03       -5             -5

6   6 2.478752e-03       -6             -6

7   7 9.118820e-04       -7             -7

8   8 3.354626e-04       -8             -8

9   9 1.234098e-04       -9             -9

10 10 4.539993e-05      -10            -10

 

디폴트인 dexp(x , log=FLASE) dexp( x, log=TRUE) 옵션 설정해서 나온 값을 가지고 그래프로 그려서 비교해보면 아래와 같다 . log = TRUE 설정을 해서 자연로그를 취했더니 , 원래 밑으로 축 쳐졌던 지수분포 그래프가 곧은 직선으로 변환되었음을 알 수 있다.

 

> my_par = par(no.readonly = TRUE)

> par(oma = c(0, 0, 1, 0))

> par(mfrow = c(1, 2))

>

> plot(dexp, main = "dexp : log = F")

> plot(dexp_log, main = "dexp : log = T")

>

> mtext("density function of exponential distributin : log = FALSE vs. log = TRUE",
         outer = TRUE, cex = 1.2)

 

 



출처: http://rfriend.tistory.com/107 [R, Python 분석과 프로그래밍 (by R Friend)]

 

 




포아송 분포 ( Poisson distribution ) : pois()

 

이산형 확률 분포에는

1.     이항분포 ( Binomial distribution ) : binom()

2.     초기하분포 ( Hypergeom etric distribution ) : hyper()

3.     포아송 분포 ( Poisson distribution ) : pois()

4.     …. 등이 있다 .

 

확률변수 x 가 이항분포 B(n,p)를 따를 때 , np = λ 로 일정하게 두고 , n이 충분히 크고 p0에 가까울 때 이항분포에 근사하는 포아송 분포는 아래와 같다 .

포아송 분포는 일정한 단위 시간 , 단위 공간에서 어떤 사건이 랜덤하게 발생하는 경우에 사용할 수 있는 이산형 확률분포이다.

예를 들어서 1시간 동안 은행에 방문하는 고객의 수 , 1시간 동안 콜센터로 걸려오는 전화의 수 , 1달 동안 경부고속도로에서 교통사고가 발생하는 거수 , 1년 동안 비행기가 사고가 발생하는 건수 등이 있다.

포아송 분포에서 모수 λ (lambda 라고 발음함) 는 일정한 단위 시간 또는 단위 공간에서  랜덤하게 발생하는 사건의 평균 횟수를 의미한다.

함수 구분

포아송 분포 R 함수/ 모수

pois() 

  밀도 함수

 d

  dpois(x, lambda)

  누적 분포 함수

 p

  ppois(q, lambda, lower.tail = TRUE/FALSE

  분위수 함수

 q

  qpois(p, lambda, lower.tail = TRUE/FALSE

  난수 발생

 r

  rpois(n, lambda)

 

 

λ = 3 인 포아송 분포 그래프 (Poisson distribution plot of lambda = 3)

 

 

> # (1) 포아송 분포 그래프 (Poisson distribution plot)

> plot(dpois(x=c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), lambda = 3),

+      type='h',

+      main = "Poisson distribution, lambda = 3")

 

 

 

 P ( X = 15 ) 확률 계산 : dpois ( x , lambda )

예를 들어서 , 어느 은행의 1시간당 방문 고객 수가 λ = 20 인 포아송 분포를 따른다고 한다 .

그렇다면 1시간당 방문고객수가 15명일 확률은?

 

> # (2) P(X = 15) in Poisson distribution with lambda = 20

> dpois(x=15, lambda = 20)

[1] 0.05164885

 

 

P( x <= 15 ) 확률 계산 : ppois ( q , lambda , lower.tail = TRUE )

어느 은행의 1시간 당 방문 고객 수가 λ = 20 인 포아송 분포를 따른다고 할 때 , 1시간당 방문고객수가 15명 이하일 확률은??

 

> # (3) P(X =< 15) in Poisson distribution with lambda = 20

> ppois(q=15, lambda = 20, lower.tail = TRUE)

[1] 0.1565131

> 

 

> sum(dpois(x=c(0:15), lambda = 20)) # the same result with the ppois()

[1] 0.1565131

 

 

특정 확률 값에 해당하는 분위수 계산 : gpois( p, lambda , lower.tail = TRUE )

어느 은행의 1시간 당 방문 고객 수가 λ = 20 인 포아송 분포를 따른다고 한다.

만약 1시간 동안 방문한 고객수에 해당하는 확률이 15.65131% 라면 이는 몇 명에 해당하는 가 ?

 

> qpois(p=0.1565131, lambda = 20, lower.tail = TRUE)

[1] 15

 

 

난수 발생 : rpois ( n , lambda )

λ = 20 인 포아송 분포에서 n = 1000 개의 난수를 발생시키고, 도수분포표를 구하고, 도수별 막대그래프를 그려보아라.

 

 

> rpois(n=1000, lambda = 20)

   [1] 18 17 21 16 19 25 18 22 18 24 28 23 21 11 19 25 20 27 24 27 12 17 11 16 17 18 21 17 16 22 16

  [32] 20 24 18 26 15 20 17 25 18 16 23 18 17 20 28 18 16 21 18 21 20 16 21 22 11 20 18 20 10 15 17

  [63] 14 15 22 20 16 26 18 25 14 11 22 24 23 19 26 12 17 23 17 24 21 17 19 24 28 26 18 24 17 19 18

  [94] 19 24 22 23 20 25 21 22 16 20 24 20 22 24 25 22 23 20 19 28 19 21 15 27 27 17 14 20 25 26 25

 [125] 26 16 22 16 22 21 15 15 21 19 29 15 23 21 23 31 16 33 18 21 24 28 34 25 19 24 22 23 30 27 21

 [156] 20 16 18 18 13 21 20 23 21 15 12 18 25 16 15 26 18 22 18 10 26 23 19 13 18 22 23 21 22 12 20

 [187] 20 19 17 18 18 15 20 11 25 21 20 20 20 22 19 31 18 23 16 18 21 29 19 20 20 16 22 18 16 22 18

 [218] 14 18 23 18 22 15 15 14 19 20 23 11 20 17 21 23 17 21 12 28 22 19 16 20 14 27 20 26 19 22 19

 [249] 22 21 20 24 21 23 25 14 19 18 22  8 20 13 19 22 22 20 18 15 22 22 13 20 24 18 25 18 19 30 22

 [280] 18 30 22 10 25 21 18 19 19  7 25 15 27 23 26 21 16 21 19 21 24 16 18 18 21 25 10 15 25 18 21

 [311] 18 27 15 26 21 33 13 20 18 22 27 16 11 18 18 26 20 28 20 17 22 19 24 25 13 13 16 21 21 21 20

 [342] 18 21 18 16 11 15 24 19 24 31 23 24 17 21 20 19 16 20 23 27 18 23 20 14 27 14 26 15 14 10 23

 [373] 22 29 20 17 24 29 26 17 15 16 23 27 14 17 21 21 14 22 27 16 22 19 19 15 25 20 23 16 20 16 16

 [404] 20 18 18 16 31 15 13 15 16 18 17 23 19 20 18 24 13 24 20 25 22 15 17 25 12 11 19 16 19 26 29

 [435] 23 18 17 15 23 18 32 23 30 21 19 24 24 21 17 22 23 27 21 23 17 20 20 22 15 15 21 32 23 24 16

 [466] 28 18 23 24 22 20 18 19 18 15 16 16 20 17 16 12 18 25 23 21 17 19 21 24 20 16 20 26 19 21 28

 [497] 25 16 14 19 16 19 25  9 12 20 20 18 23 27 19 12  9 21 15 27 17 21 23 18 17 11 23 20 19 25 18

 [528] 17 19 22 18 28 25 25 17 26 30 26 17 22 16 22 16 31 15 25 16 23 15 23 15 20 20 18 21 19 15 23

 [559] 24 23 21 21 14 15 20 23 29 19 15 18 18 12 19 17 22 33 24 19 10 26 22 24 23 25 14 16 19 18 21

 [590] 19 32 18 20 22 23 16 18 22 16 25 14 19 23 19 14 17 24 26 19 18 27 20 21 19 21 27 20 30 17 26

 [621] 23 27 23 23 24 26 21 21 13 21 20 22 16 23 22 27 16 22 25 26 14 32 27 34 19 18 23 19 19 17 15

 [652] 29 15 19 18 16 19 19 15 16 19 28 18 19 17 14 19 23 25 31 24 24 14 19 17 19 25 20 24 21 17 20

 [683] 20 25 24 18 16 22 20 18 16 22 17 12 20 25 21 39 22 19 12 12 25 18 31 23 15 20 20 23 15 23 15

 [714] 22 17 14 14 13 16 17 22 18 14 26 28 21 17 24 26 26 17 14 15 24 26 11 25 31 20 24 19 27 19 30

 [745] 18 16 24 14 23 19 19 24 18 19 18 19 16 21 18 18 14 19 12 20 27 23 20 25 31 17 17 24 20 32 14

 [776] 29 19 26 22 21 21 17  9 19 23 23 19 28 15 19 17 19 26 20 23 19 18 20 14 21 14 22 16 16 12 25

 [807] 23 14 13 18 19 22 16 21 25 21 24 13 20 21 24 20 21 35 15 23 16 12 25 16 16 18 28 18 27 19 18

 [838] 19 27 25 23 16 26 16 17 17 21 12 20 26 18 22 15 26 16 21 20 16 13 25 14 16 13 23 19 12 23 21

 [869] 17 16 17 29 24 16 15 14 17 24 25 22 23 23 24 22 22 26 20 21 18 26  8 20 18 18 22 21 23 23 19

 [900] 16 13 23 14 17 20 23 18 20 19 23 22 21 19 19 17 15 22 26 22 17 18 29 14 16 26 21 19 17 15 21

 [931] 26 19 23 23 18 23 15 15 24 22 25 16 18 19 13 18 25 19 22 15 18 20 28 15 24 20 17 21 20 23 17

 [962] 22 18 25 19 21 21 22 21 18 18 21 17 26 16 23 25 27 33 30 20 22 24 17 14 21 21 24 20 24 23 14

 [993] 20 29 12 25 18  6 14 22

 

> table(rpois(n=1000, lambda = 20))

 

 7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

 1  2  3  6 13 17 33 31 45 74 76 77 87 95 86 73 65 59 37 36 28 16 14 12  4  8  2

 

 

> plot(table(rpois(n=1000, lambda = 20)))

 

 

위 그래프를 보면 λ = 20 이므로 평균이 20인 위치에서 가장 높게 모여있고 , 오른쪽으로 꼬리가 긴 포아송 분포를 따르고 있음을 알 수 있따.

 



출처http://rfriend.tistory.com/101 [R, Python 분석과 프로그래밍 (by R Friend)]

 




반응형