생각 작업실 The atelier of thinking

31. R을 이용한 경우의 수 구하기 본문

통계학 이야기

31. R을 이용한 경우의 수 구하기

knowledge-seeker 2023. 10. 9. 21:51

Chapter 31. R을 이용한 경우의 수 구하기

 

지난 회차에 확률과 경우의 수에 대해서 알아봤습니다.

 

2023.10.08 - [통계학 이야기] - 30. 확률과 경우의 수(The Number of Cases)

 

30. 확률과 경우의 수(The Number of Cases)

Chapter 30. 확률과 경우의 수 1. 경우의 수 확률을 계산하기 위해서는 표본공간과 사건에 있는 원소의 갯수를 효율적으로 계산하는 것이 중요합니다. 즉, 표본공간의 크기와 사건의 크기를 알아내

thinking-atelier.tistory.com

 

주머니 안에 1부터 10까지의 10개 공이 있을 때, 공을 3개 추출하는 방법과 순서 고려 여부에 따라 경우의 수를 구해보고자 합니다.

 

1. 중복 순열

 

중복순열은 복원추출이고 순서를 고려합니다. 구하는 산식은 아래와 같습니다.

위 예시에서 n = 10 , k=3 이므로 구하는 R 코드는,

n <- 10
k <- 3

n^k
[1] 1000

결과값은 1,000 입니다.

 

2. 순열

순열은 비복원추출이며 순서를 고려합니다. 구하는 산식은 아래와 같습니다.

R 코드는, factorial( ) 함수를 사용합니다.

factorial(n) / factorial(n-k)
[1] 720

결과값은 720 입니다.

 

3. 조합

조합은 비복원추출이며 순서를 고려하지 않습니다. 구하는 산식은 아래와 같습니다.

R 코드에서 choose( ) 함수를 사용합니다. 이 함수는 위 조합을 구하는 것입니다.

 

choose(n,k)
[1] 120

결과값은 120 입니다.

 

4. 중복조합

중복조합은 복원추출이며 순서를 고려하지 않습니다. 구하는 산식은 아래와 같습니다.

중복조합은 앞선 조합의 n 대신에 n+k-1 을 넣어 계산할 수 있습니다.

choose(n+k-1,k)
[1] 220

결과값은 220 입니다.

 

5. Birthday Problem

Birthday Problem은 모인 인원들의 생일 중에 적어도 두 사람이 동일한 확률을 구하는 통계학에서 자주 언급하는 문제입니다. 일반적으로 어느 그룹에서 두 사람이 생일이 같을 확률은 낮아보이지만, 일반적으로 23명의 사람이 모였을 때 적어도 두 사람이 동일한 생일을 가질 확률은 50%가 넘는다고 알려져 있습니다.

 

(1) 5명의 학생이 있을 때, 모두 생일이 다를 확률을 구하려면 어떻게 해야 할까요?

 

 우선 1년을 365일 이라고 할 때, 1월 1일 생은 1, ...12월31일 생은 365로 표현해 봅니다.

 모두 생일이 다르다는 것을 사건 A 라고 하면, 사건 A 가 일어날 확률은 사건 A가 일어날 경우의 수를 표본공간으로 나누어 주면 됩니다.

 

표본공간은 5 명의 학생이 가질 수 있는 생일의 경우의 수로 나타낼 수 있습니다.

첫번째 학생이 가질 수 있는 생일의 경우의 수는 365, 두번째 학생도 365, 즉, 각 학생은 365의 경우의 수를 가집니다. 따라서, 중복순열의 산식을 이용해 구할 수 있습니다.

n = 365, k=5 입니다.

n <- 365
k <- 5

n^k
[1] 6.478349e+12

 

사건 A 모든 학생의 생일이 다를 경우의 수는 비복원 추출로 1~365에서 5개를 뽑으면 동일한 숫자가 나오지 않습니다. 이는 순열을 사용하여 구할 수 있습니다.

factorial(n) / factorial(n-k)

하지만 이렇게 계산하면 에러가 발생합니다. 이유는 R에서 factorial( ) 함수의 숫자가 너무 크면 무한대로 표시하기 때문입니다. 이러한 이유로 prod( ) 함수를 사용하는 것이 좋습니다.

 

prod(n:(n-k+1))
[1] 6.302555e+12

 

5명의 생일이 모두 다른 사건 A의 확률은 (사건A의 경우의 수 / 표본공간의 경우의 수) 로 계산할 수 있습니다.

P <- n^k

A <- prod(n:(n-k+1))

A/P
[1] 0.9728644

 

(2) 각 5,10,20,30,40,50명 일 때 생일이 모두 다른 경우의 확률을 구하려면 어떻게 해야 할까요?

 

n <- 365
ks <- c(5,10,20,30,40,50)
result <- NULL

for (k in ks)
{
  j <- 0:(k-1)
  result <- c(result,prod(1-j/n))
  
}

result <-round(result,4)
names(result)<-ks
result
     5     10     20     30     40     50 
0.9729 0.8831 0.5886 0.2937 0.1088 0.0296