TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 - 수학 | 통계학>

[개발자를 위한 수학] 확률 - 이항 분포, 베타 분포 (+파이썬)

by 기록자_Recordian 2024. 10. 4.
728x90
반응형
이항 분포(binomial distribution) 파이썬에서 구현하기

 
이항 분포는 확률이 p일 때 n번의 시도 중 k 번이 성공할 가능성을 측정한다.
만약, 새로운 컴퓨터 비전 모델을 개발 중이고 10번의 테스트를 했으며, 그 결과로 8번의 성공과 2번의 실패가 있었다고 가정해본다.
그러나 어떤 머신러닝 엔지니어가 더 많은 테스트를 해야 한다고 주장하며, 테스트를 더 많이 하면 90% 이상의 성공률이 나올 수 있을 거라 했다. 
그렇다면 '기본 확률이 90%라고 가정할 때 80% 성공에 대한 가능도를 어떻게 결정하는가'를 계산할 때 이항 분포를 사용할 수 있다.
 
이항 분포를 파이썬에서 사이파이의 binom.pmf() 함수를 사용해 0에서 10까지의 이항 분포에 대한 11가지 이항 분포 확률을 모두 출력한다. (※ pmf: 확률 질량 함수, probability mass function)

# 이항분포 계산하기 (사이파이)
from scipy.stats import binom

n = 10
p = 0.9

for k in range(n+1):
    probability = binom.pmf(k, n, p)
    print("{0} - {1}".format(k, probability))

# 8회 이하 성공확률 합계 계산
prob_8_or_less = binom.cdf(8, n, p)
print("8회 이하 성공확률: {0}".format(prob_8_or_less))

기본 성공률이 90%인 경우에도 8회 이하로 성공할 확률이 26.39% 이다.


베타 분포 파이썬에서 구현하기

 
베타 분포는 알파(alpha) 번의 성공과 베타(beta) 번의 실패가 주어졌을 때 사건이 발생할 수 있는 다양한 기본 확률의 가능성을 보여준다.
 
앞서 이항 분포에서 문제가 될 수 있는 것은 기본 성공률을 90%로 가정했다는 것인데, 이를 90%가 아닌 다른 기본 성공률로 8/10의 성공을 거둔다고 가정하고 기본 확률의 확률을 탐색할 수 있는지에 대한 답변을 베타 분포를 통해 할 수 있다.
 
이항 분포에서와 마찬가지로 사이파이를 사용해 베타 분포를 구현할 수 있다.
베타 분포는 확률 분포의 일종으로, 전체 곡선 아래의 면적이 1.0 또는 100%이기 때문에 확률을 구하려면 특정한 범위 내의 면적을 계산해야 한다.
모든 연속 확률 분포에는 주어진 x값 까지의 면적을 계산하는 누적 분포 함수(CDF, cumulative distribution function)가 있다.
 
사이파이에서 beta.cdf() 함수는 x축의 값, 성공횟수 a, 실패 횟수 b를 입력하면 된다.

# 베타 분포 계산하기 (사이파이)
from scipy.stats import beta

a = 8
b = 2

p = beta.cdf(0.90, a, b)
print("베타 분포:",p)

# 오른쪽 면적 구하기
p_r = 1.0 - p
print("오른쪽 면적:",p_r)

▶ 
1) 위의 계산에 따르면 기본 성공 확률이 90% 이하일 가능성이 77.48% 이다.
2) CDF는 경계의 왼쪽만 계산하기 때문에, 0.9 이상을 계산하고 싶다면 1.0에서 0.9 이하의 확률을 빼면 된다.
따라서, 비전 테스트에서 성공이 8/10일 때 기본 성공률이 90%일 확률은 22.5%에 불과하다.
이를 정리하면, 테스트가 성공할 확률은 유리하지 않지만, 운이 좋으면 더 많은 테스트를 통해 22.5%의 가능성에 도박을 걸 수 있다.
 
만약, 더 많은 시도를 했을 경우에는 90% 성공률을 만족시킬 확률이 어떻게 될까?

# 더 많은 시도를 했을 경우 베타 분포
from scipy.stats import beta

a = 30
b = 6

p = 1.0 - beta.cdf(0.90, a, b)
print("베타 분포:",p)

확률이 22.5%에서 13.1%로 감소하였다.
 
만약, 기본 성공률이 80 - 90% 사이일 확률을 찾으려면 어떻게 해야할까?
이러한 경우에는, 0.90까지의 면적에서 0.80까지의 면적을 빼면 0.80에서 0.90 사이의 영역이 나온다.

# 베타 분포 중간 영역 계산
from scipy.stats import beta

a = 8
b = 2

p = beta.cdf(0.90, a, b) - beta.cdf(0.80, a, b)
print("베타 분포:",p)

이 면적은 33.86% 이다.


사이파이(SciPy)

 
SciPy(https://www.scipy.org/scipylib)는 과학 계산용 함수를 모아놓은 파이썬 패키지이다. 
SciPy는 과학적이고 기술적인 컴퓨팅을 위한 파이썬 오픈 소스 라이브러리이며, 수치 계산, 최적화, 신호 및 이미지 처리, 선형 대수, 통계 분석 등 다양한 기능을 제공한다.

SciPy는 Python 프로그래밍 언어의 라이브러리로, 주로 수치 해석, 과학적 계산, 통계, 신호 처리, 이미지 처리 및 최적화 등에 사용됩니다. SciPy는 다음과 같은 주요 특징을 가지고 있다:

◆ 모듈 구성: SciPy는 여러 서브패키지로 구성되어 있으며, 각 패키지는 특정한 기능을 제공. 예를 들어:

  • scipy.stats: 다양한 확률 분포와 통계 기능 제공
  • scipy.optimize: 최적화 문제를 해결하는 도구 제공
  • scipy.linalg: 선형 대수 관련 함수 포함

Numpy 기반: SciPy는 Numpy 배열을 기반으로 작동하여, 배열과 행렬을 효율적으로 처리할 수 있다. Numpy는 배열 연산을 위한 필수 라이브러리로, SciPy의 대부분 기능이 Numpy를 활용한다.

고성능: SciPy는 C, Fortran로 작성된 함수를 포함하여, 매우 효율적으로 복잡한 수치 계산을 수행할 수 있다. 이는 과학적 연구와 데이터 분석에서 매우 중요한 요소이다.

사용 용이성: Python의 간결한 문법 덕분에, SciPy는 사용자가 쉽게 접근할 수 있는 라이브러리이다. 초보자부터 전문가까지 폭넓게 사용된다.

Scipy는 수치해석을 Numpy를 이용하여 보다 본격적으로 이용할 수 있게 해준다. Scipy를 이용하면 Numpy만으로는 길게 코딩해야 하는 기법들을 단 2~3 줄에 구현할 수 있다. 게다가 Numpy로 구현하기 막막하거나 사실상 불가능한 것들도 Scipy로는 쉽게 결과를 얻을 수 있다. 따라서 Numpy와 Scipy를 적절하게 혼용하게 되면 더욱 생산성이 높아다.


[출처]
개발자를 위한 필수 수학
한곳에서 끝내는 파이썬 & 머신러닝 & 딥러닝
 

728x90
반응형