본문 바로가기

[파이썬 통계] 사건과 조건부확률 & 확률분포 응용하는 법!

Derrick 발행일 : 2023-11-06
728x90
반응형
사건과 확률에 대한 용어와 개념, 조건부 확률과 독립의 개념을 배우고
확률분포까지 확장하여 응용하는 법을 학습해보자!

 

 

1. 사건과 확률의 개념

1) 확률

여러 가능한 결과 중 하나 혹은 일부가 일어날 가능성으로 0과 1 사이의 값으로 정의
ex) 동전을 던지는 사건에 대해 앞면이 나올 확률 0.5
# 확률의 용어
 - 실험(Experiment) or 시행(Trial)
  : 여러 가능한 결과 중 하나가 일어나도록 하는 행위 (ex, 주사위를 1번 던짐)
 - 표본공간(Sample Space)
  : 실험에서 나타날 수 있는 모든 결과들을 모아둔 집합 (ex, 1~6의 눈)
 - 사건(Event)
  : 표본공간의 일부분(부분집합) 사건 A가 일어날 확률; P(A), or Pr(A) (ex, 1의 눈, 짝수가 나올 확률)
# 확률의 추출 방법
 1) 복원 추출
  : 모든 시행에서 똑같은 상황으로 시행하는 방법
    ex) 주머니에서 공을 꺼내 확인한 후, 다시 넣고 다음 공을 꺼내기

 2) 비복원 추출
  : 앞의 시행이 다음 시행에 영향을 주는 방법
    ex) 주머니에서 공을 꺼내 확인한 후, 다시 넣지 않고 다음 공 꺼내기

2) 경우의 수

먼저 '경우의 수'표본공간에서 사건 A가 발생할 확률을 의미한다.
P(A) = (A에 속하는 결과의 수 / 총 가능한 결과의 수)

※ 사건 A의 확률을 정의하기 위해서는 A에 속하는 결과의 수 파악이 필요하다
 : 사건의 원소 개수(사건에 속하는 결과의 수)
 = 1회 시행에서 일어날 수 있는 사건의 가짓수 = 사건의 경우의 수

- A와 B의 합사건은 'A or B', 곱사건은 'A and B'라고 표기하기도 한다.

# 합의 법칙
 - 두 사건 A와 B가 일어나는 경우의 수가 각각 m과 n일 때, 
  A와 B는 동시에 일어나지 않고, A 또는 B가 일어나는 경우의 수는 'm+n'이 된다.

# 곱의 법칙
 - 두 사건 A와 B가 동시에 또는 잇달아 일어나는 경우, 'mxn'이 된다.

3) 팩토리얼(!)

팩토리얼이란, 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것
→ 0! = 1, 1! = 1, n! = n * (n-1)!
  ex) 4명의 학생을 순서대로 세우는 경우의 수는 4!

 

# 팩토리얼(!) 함수
def fac(n):
    if n == 0:
    	return 1
    if n == 1:
    	return 1
    else:
    	return n * fac(n-1)
        
# 실행 테스트
print(fac(4))					# 24
print(fac(5))					# 120

4) 확률의 정리

# 공리
 : 증명을 필요로 하지 않거나 증명할 수 없지만, 직관적으로 자명한 진리의 명제 (다른 명제의 전제)
  → 항상 참으로 받아들여지는 명제

  Example)
  → 어떤 확률(P(A)도 0보다 작거나 1보다 클 수 없다.
  → 전체 표본공간, 즉 모든 확률의 합은 1이다.

 

[ 확률의 3가지 케이스 ]

 

2. 순열과 조합

1) 순열 (permutation)

순열서로 다른 n개의 원소를 일렬로 배열하는 방법을 의미한다. (순서가 중요)

# 순열 코드
from itertools import permutations
list(permutations([n], k))
위의 'permutations' 함수를 통해서 순열을 계산할 수 있다.
[] 안에 서로 다른 n개의 원소를 주고, 이 원소들 중 k개를 순서를 고려하여 뽑는 경우의 수 계산

# 예제 - 경품 추첨

수강생들을 대상으로 경품 추첨을 하게 되었다. 참가한 학생은 6명이고, 이 중 2명에게만 상품을 주려고 한다. (등수마다 경품이 다르다) 이 때, 경우의 수와 그 갯수를 코드로 확인해보자
파이썬 itertools 모듈에 있는 permutations 함수 사용하여 순열 계산하시오

 

from itertools import permutations
from itertools import combinations

# 순열 계산 
# 6명의 수강생 중 2명에게 순위별 상품을 주는 경우의 수
rank_per = list(permutations(["가", "나", "다", "라", "마", "바"], 2))
rank_per_num = len(rank_per)

print("경우의 수 :")
print(rank_per, "\n")
print("경우의 수의 가짓수 :")
print(rank_per_num)

 

[ 실행 결과 ]

2) 조합 (combination)

조합은 서로 다른 n개의 원소에 대해 k개를 순서에 상관없이 선택하는 방법

 

# 조합 코드
from itertools import combinations
list(combinations([n], k))
조합은 itertools 모듈 내 combinations 함수를 통해서 구할 수 있다.
[] 안에 서로 다른 n개의 원소를 주고, 이들 중 k개를 순서를 고려하지 않고 뽑는 경우의 수를 계산

# 예제 - 경품 추첨

위의 순열을 구했던 동일한 예제로 이번에는 조합을 구해보자
itertools 모듈에 있는 combinations 함수를 사용하시오

 

from itertools import permutations
from itertools import combinations

# 조합 : 6명 수강생 중 2명에게 순위 상관없이 상품을 주는 경우의 수
rank_com = list(combinations(["가", "나", "다", "라", "마", "바"], 2))
rank_com_num = len(rank_com)

print("경우의 수 :")
print(rank_com, "\n")
print("경우의 수의 가짓수 :")
print(rank_com_num)

 

[ 실행 결괴 ]

3) 중복순열

중복순열은, 중복을 허용하여 서로 다른 n개의 원소 중에서 r개를 뽑아 일렬로 배열하는 경우
ex) a, b 중에서 중복을 허용하여 3개를 뽑아 배열하는 경우 = 8개

 

# 중복순열 코드
from itertools import product
list(product([n], repeat = k))
[] 안에 서로 다른 n개의 원소를 주고, 이 원소들 중 k개를 중복을 허용하면서 순서를 고려하여 뽑는 경우의 수를 계산

# 예제 - 비밀번호 변경

비밀번호를 바꾸려고 합니다. A부터 E까지의 알파벳 5개 중 하나씩을 뽑아서 3자리의 비밀번호를 만든다고 하면, 이에 대한 경우의 수는 몇 가지인지 계산하시오. (중복해서 비밀번호를 입력할 수 있음)
product 함수를 사용하여 중복순열로 계산!

 

from itertools import product
from itertools import combinations_with_replacement

# 중복 순열
re_per = list(product(["A", "B", "C", "D", "E"], repeat=3))
re_per_num = len(re_per)

print("경우의 수 :")
print(re_per, "\n")
print("경우의 수의 가짓수 :")
print(re_per_num)

 

[ 실행결과 ]

4) 중복조합

중복조합은, 중복을 허용해서 서로 다른 n개의 대상 중 r개를 순서를 고려하지 않고 뽑는 경우를 말한다.
ex) 집합 S = {1,2,3,4}에서 중복을 허용하여 3개의 원소를 뽑는 경우

 

# 중복조합
from itertools import combinations
list(combinations_with_replacement([n], k))
[] 안에 서로 다른 n개의 원소를 주고, 이들 중 k개를 순서를 중복을 허락하여 순서를 고려하지 않고 뽑는 경우의 수

# 예제 - 비밀번호 변경

중복순열에서 수행했던 동일한 상황에서 중복조합으로 구해보자
- re_com : 순서를 고려하지 않고 5가지 중 3개를 중복이 가능하게 뽑는 경우의 수
- re_com_num : 're_com'의 경우의 수가 몇 가지인지 계산

 

from itertools import product
from itertools import combinations_with_replacement

# 중복조합
re_com = list(combinations_with_replacement(["A", "B", "C", "D", "E"], 3))
re_com_num = len(re_com)

print("경우의 수 :")
print("re_com, "\n")
print("경우의 수의 가짓수 :")
print(re_com_num)

 

[ 실행 결과 ]

 

 

반응형

 

3. 조건부 확률과 독립

1) 조건부 확률

조건부확률은, 어떤 사건에 대한 정보가 주어졌을때 특정한 사건의 확률을 구하는 경우를 말한다.
다른 사건에 대한 정보를 이용하여 확률을 구하기 때문에 기존의 확률과 달라질 수 있다.

# 기존의 확률
 : 확률 = (구하려는 사건의 경우의 수) / (전체 경우의 수)

# 조건부 확률
 : 조건부확률 = (구하려는 사건이 일어날 확률) / (정보가 주어진 사건의 확률)

위의 표처럼 수강생 30명에 대한 응답에서 임의로 학생 1명을 선택할 경우, 

1) 선택된 학생의 응답이 A일 확률 (일반 확률)
 : 전체 학생이 30명, A응답 학생이 15명이므로 15/30 (=1/2)가 된다. 

2) 여학생을 선택했을 때 응답이 A일 확률 (조건부확률)
 : 여학생 수는 12명, A응답 여학생이 5명이므로 확률은 5/12가 된다.

2) 독립

독립이란, 일반적으로 두 사건은 서로 연관성이 없는 경우를 말한다.
ex) 동전을 2번 던졌을 때, 앞면이 2번 나오는 사건(A)과 앞면이 1번 나오는 사건(B)는 서로 독립이라고 볼 수 있다.

 

조건부 확률은 두 사건의 '연관성'에 따라 달라진다.

[ 조건부확률 - 두 사건의 연관성 ]

두 사건 A와 B가 서로 독립이라면, 사건 B가 A의 확률에 영향을 주지 않는다!
→ 아래 계산식이 성립된다. 

[ 독립일 경우 계산식 ]

 

4. 확률 분포

1) 확률 분포 

# 확률 변수 
: 각각의 근원사건에 실수값을 대응시킨 함수 (X, Y .. 등)
 → 시행 전에 어떤 값을 갖게 될지 알 수 없음. 실제측정값들은 소문자로 표시 x, y 등
 → P(X=x1) : 확률변수 X가 x1일 확률

# 확률 분포
: 확률변수가 가질 수 있는 값들은 무엇이고, 그 값을 가질 가능성(=확률)이 어떻게 분포되어 있는지를 0 이상의 실수로 나타낸 것을 말한다.

2) 이산 확률 분포

# 이산확률변수
 : 확률변수의 값의 개수를 셀 수 있는 경우. 각각의 값들이 떨어져서 분포됨 (ex, 1, 2, 3 등)

[ 이산확률분포 ]

 f(x1) = P(X=x1)
 : 확률변수 X가 x1이 되는 확률

※ 모든 확률을 더하면 '1'이 된다.

[ 이산확률분포 ]

2-1) 확률질량함수

어떤 확률변수 x가 갖는 확률을 나타내는 함수로, 이산 확률 분포에서 사용됨.
y = f(x) : x가 갖는 확률은 y이다. ex) P(X=0) = ?

→ 어떤 경우에도 0 이상이고 1 이하의 값을 가지고, 모두 더하면 1이 된다. 

 

3) 연속 확률 분포

# 연속확률변수
 : 확률변수의 값이 연속적인 구간에 속하는 경우. (ex, 몸무게 측정 구간)
 → 특정 x값에 대한 확률은 항상 0이므로( f(x) = 0 ), 특정 구간(a~b)에서 적분한 값으로 확률을 구한다.

[ 확률 밀도 함수의 조건 ]
[ 평균과 표준편차가 다른 정규분포 ]

mu (μ) : 평균, sigma : 표준편차 
→ 평균이 0, 표준편차가 1인 분포가 표준정규분포

3-1) 확률밀도함수

연속확률변수 X가 갖는 확률의 분포를 표현한 것
어느 구간의 확률이 더 크고 작은 지 나타낼 수 있는 함수. ex) P(0 ≤ X ≤ 1) = ?

4) 누적분포함수

X가 가질 수 있는 가장 작은 값부터 x까지 해당하는 확률질량함수의 값을 누적해서 더한 것
→ F(x) = P(X ≤ x)라고 표시

[ 연속형 누적분포함수 ]
[ 이산형 누적분포함수 ]

 

 

댓글