확률(probability)
확률은 미래에 발생할 사건에 대한 믿음의 측정으로 과거의 데이터를 기반으로 합니다. 즉, 과거의 데이터들로부터 전체 중에서 특정한 대상이 되는 사건(event)의 발생 비율을 확률(probability)이라고 정의할 수 있습니다. 확률은 다음의 공리를 가집니다.
[확률 공리]
- 확률은 0과 1 사이의 값: 0 ≤ P(x) ≤ 1,
- 모든 확률의 합은 1: ∑P(x) = 1
실험에서 특별한 사건이 일어날 확률에 대한 개념은 다양한 방식으로 적용되고 해석 될 수 있습니다. 예를 들어 내일은 비올 확률이 70%라는 예보에 대해 과거 기후 조건의 데이터들을 분석하여 오늘의 날씨와 유사한 조건에서 70%가 비가 온다는 결과로서 해석할 수 있으며 또한 예보자의 주관적인 생각의 결과로 해석할 수도 있습니다. 전자의 경우는 기존 데이터들에서 대상이 되는 사건들의 빈도로 확률을 계산하는 방식으로 빈도적 해석 (frequency interpretation)이라 하고 후자의 경우는 주관적인 추론에 의한 결과로서 주관적 해석 (subjective interpretation)이라고 합니다. 이와 같이 확률은 두 가지 시각으로 해석할 수 있으며 모든 경우에 사용되는 기본적인 용어들이 있습니다.
- 확률실험(random experiment, 시행)
- 모든 사건들의 확률이 동일하다고 가정할 수 있는 시행
- ex 1) 동전 던지기: 앞과 뒤가 나올 확률은 동일
- ex 2) 일일 주가의 변화율: 정확한 결과를 예측할 수 없고 각 값들이 생성될 확률은 동일
- 요소(element) 또는 표본점 (sample point)
- 확률 실험에서의 일어날 수 있는 기본 결과
- 표본공간(sample space)
- 확률실험에서 나타나는 모든 표본점(결과)들의 집합
- Ex) 주사위 시행의 모든 표본점들은 1, 2, 3, 4, 5, 6이며 모든 요소들의 집합이 표본 공간 S가 됩니다.
- S = {1, 2, 3, 4, 5, 6}
- 사건(event)
- 확률실험에서 관심의 대상이 되는 요소들의 모임. 표본공간의 특정한 요소(들)의 집합으로 사건의 확률은 식 2.1.1과 같이 계산됩니다.
- 확률변수(random variable)
- 확률이 동일한 사건들을 나타내는 변수
- 상호 배타적 또는 독립적(mutually exclusive, disjoint, independent)
- 두개 이상의 사건들의 교집합이 공집합
- A ∩ B ∩ … = ∅
- 상호 배타적 ≡ 배반사건 ≡ 독립사건
확률 | = | 특정사건의 빈도 | (식 1) |
---|---|---|---|
표본공간의 모든 빈도 |
표본공간에서 특정한 사건들의 관계는 집합을 사용하여 명확히 나타낼 수 있습니다.
- 전체집합 : 표본공간을 나타냅니다.
- 공집합: 요소가 하나도 없는 집합 (∅)
- 합집합: 두개 이상의 사건들에 속한 모든 요소들을 결합한 집합
- 두 집합 A와 B의 합집합: A or B = A ∪ B
- 합집합의 확률은 식 2와 같이 계산됩니다.
- 교집합: 여러 집합들에 공통으로 속한 요소(들)의 집합
- 두 집합 A와 B의 교집합: A and B = A ∩ B
- 두 사건이 독립일 경우 그 확률은 식 3과 같이 계산됩니다.
- 식 3이 성립되지 않은 경우 두 사건은 독립이 아니며 상호간에 영향을 주는 교호작용 (interaction)의 존재를 의미합니다.
P(A ∪ B) = P(A) + P(B) − P(A ∩ B) | (식 2) |
---|---|
P(A ∩ B) = P(A) × P(B) | (식 3) |
예 1)
동전 3개를 던지는 확률실험(시행)에서 앞면이 두 개 이상 나올 확률을 구해봅니다.
동전 3개를 던지는 시행의 모든 결과 즉, 표본공간은 다음과 같습니다.
확률 실행의 표본은 반복문을 파이썬의 사용하여 나타낼 수 있지만 itertools 모듈의 여러 함수를 사용하는 것이 편리합니다. 다음은 itertools.product()
함수를 사용하여 나타낸 것입니다.
- itertools.product(객체, repeat=1)
- 객체를 시행할 경우 모든 경우를 반환
- 인수 repeat은 시행횟수를 지정하며 기본값은 1
- 이 함수의 결과는 게으른 평가로 이루어지므로 결과에 대해 자료형을 지정해 주어야 함
import itertools S=list(itertools.product(('H','T'), repeat=3));S
[('H', 'H', 'T'), ('H', 'T', 'H'), ('H', 'T', 'T'), ('T', 'H', 'H'), ('T', 'H', 'T'), ('T', 'T', 'H'), ('T', 'T', 'T')]
len(S)
8
각 동전의 시행에서 앞면과 뒷면이 나올 확률이 동일할 뿐만 아니라 동전들 사이의 시행은 상호 배타적입니다. 즉, 각 동전의 시행은 독립적입니다. 그러므로 동전 3개를 시행하는 한번의 사건에서 2개이상이 앞면이 나올 확률은 다음과 같습니다.
$$\frac{1}{2}\frac{1}{2}\frac{1}{2}=\frac{1}{8}$$
위 결과를 수치형(앞면:1, 뒷면:0)으로 전환하여 표본공간을 다시 작성합니다. 이 전환에 의해 전체 샘플 중에 두개이상이 앞면인 경우는 각 요소의 합이 2이상인 경우가 될 것입니다.
S=list(itertools.product((1, 0), repeat=3)) print(S)
[(1, 1, 1), (1, 1, 0), (1, 0, 1), (1, 0, 0), (0, 1, 1), (0, 1, 0), (0, 0, 1), (0, 0, 0)]
event_sum=np.sum(S, axis=1) print(event_sum)
[3 2 2 1 2 1 1 0]
eventMore2=np.where(event_sum>=2) print(eventMore2[0])
[0, 1, 2, 4]
prob=1/8*len(eventMore2[0]); prob
0.5
위 코드에서 함수 np.where(조건)
은 조건에 맞는 부분의 인덱스를 반환하는 numpy 라이브러리 함수입니다.
- numpy.where(조건)
- 조건이 참인 경우의 인덱스를 튜플 형식으로 반환
예 2)
A와 B가 게임을 하는데 A의 평균 전적은 $\frac{2}{3}$ 입니다. 이 조건에서 두 게임을 할 경우 A가 적어도 한번 이길 확률?
A와 B의 경기에서 과거 확률은 다음과 같습니다.
$$\text{P(A)}=\frac{2}{3}\quad \text{P(B)}=\frac{1}{3}$$
두번의 경기를 할 경우 모든 결과 즉, 표본공간은 다음과 같습니다.
S=list(itertools.product(("A", "B"), repeat=2));S
[('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
A가 적어도 한번 이길 확률은 전체 확률(1)에서 B가 모두 이긴 확률을 제외한 확률이 됩니다.
pa=2/3 pb=1/3 S=list(itertools.product((pa, pb), repeat=2)) print(np.around(S, 3))
[[0.667 0.667] [0.667 0.333] [0.333 0.667] [0.333 0.333]]
prob=[i*j for i, j in S] print(np.around(prob, 3))
[0.444 0.222 0.222 0.111]
round(1-prob[3], 3)
0.889
위 코드에서 사용된 함수 np.around(배열객체, 자릿수)
와 round(실수, 자릿수)
는 각각 배열 객체와 실수를 지정된 자릿수까지 반올림합니다. 배열 객체는 numpy패키지의 array()
함수에 의해 생성된 벡터 또는 행렬객체 등을 의미합니다.
예 3)
예 2의 조건에서 3번의 경기를 할 때 A가 B 보다 먼저 2번 이길 확률?
pa=2/3 pb=1/3 S=list(itertools.product((pa, pb), repeat=3)) print(np.around(S, 3))
[[0.667 0.667 0.667] [0.667 0.667 0.333] [0.667 0.333 0.667] [0.667 0.333 0.333] [0.333 0.667 0.667] [0.333 0.667 0.333] [0.333 0.333 0.667] [0.333 0.333 0.333]]
prob=[i*j*k for i, j, k in S if (i==2/3)&(j==2/3)] print(np.around(prob, 3))
[0.296 0.148]
round(sum(prob), 3)
0.444
위 코드에서 사용한 함수 sum(x)
은 리스트 객체인 x의 모든 요소들의 합을 계산합니다.
댓글
댓글 쓰기