🎰 통계학 실습 - python/확률분포

🎲 확률분포

nyamin9 2023. 6. 27. 11:41

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!! 

 

 

 


🎲 00. 베르누이 시행

 

- 정의 : 성공과 실패의 결과을 가지는 시행이 반복되면서, 각 시행의 결과가 다른 시행의 결과에 영향을 주지 않는 경우

- 확률 : 성공 p, 실패 q = (1-p)

- 예시 : 동전 던지기(앞/뒤), 복원추출

 


🎲 01. 이산형확률분포

 

 

• 이산형확률분포 01. 이항분포

 

- 정의 : 성공 확률이 p인 베르누이 시행을 n번 반복하는 경우 성공 횟수를 X라 할 때, 이 확률변수 X의 확률분포

 

$X$ ~ $B(n, p)$

 

☑️ 이항분포의 확률질량함수

# X ~ B(n, p)
# 이항분포의 확률질량함수
# X ~ B(6, 0.5) 를 따른다고 할 때
# binom.pmf(k, n, p, loc = 0) 
# X ~ B(n, p) 일 때 P(X = k)의 값을 구함

from scipy.stats import binom

import numpy as np
import matplotlib.pyplot as plt

k = np.arange(0, 7)
px = binom.pmf(k, n = 6, p = 0.5)
plt.plot(k, px, 'C0o', linewidth = 1)
plt.vlines(k, 0, px, color = 'C0', linewidth = 2)
plt.title('Binomial distribution')
plt.show()

 

 

 

☑️ 이항분포의 확률계산

# 이항분포의 확률계산
# X ~ B(10, 0.5) 에 대해서
# 확률질량함수 = binom.pmf(k, n = 10, p = 0.5)

# 동전을 10번 던져서 3번 나올 확률
print(binom.pmf(3, 10, 0.5))

# 누적분포함수 P(X <= k) : cdf(k, n, p)
# 동전을 10번 던져서 앞면이 6번 이하로 나올 확률
print(binom.cdf(6, 10, 0.5))

# 동전을 10번 던져서 앞면이 7번 이상 나올 확률
print(1 - binom.cdf(6, 10, 0.5))

# 분위수 : binom.ppf(q, n, p)
# 누적확률이 q 이상이 되는 k(=x)를 구함
print(binom.ppf(0.3, 10, 0.5))

# 난수 생성 : binom.rvs(n, p, size)
# 동전을 10번 던지는 실험을 30번 반복
print(binom.rvs(10, 0.5, size = 30))
>> 0.1171875

>> 0.828125

>> 0.171875

>> 4.0

>> [7 4 4 6 6 9 2 7 6 6 6 6 3 5 6 5 4 6 6 4 2 7 6 7 4 5 6 3 7 3]

 

 

☑️ 이항분포 상황 적용

# 예제
## 예. 어느 생산 공정의 불량률은 10%라고 한다.

## (1) 이 공정에서 임의로 5개의 표본을 추출할 때, 불량품이 3개일 확률을 구하시오.
from scipy.stats import binom
print(binom.pmf(k = 3, n = 5, p = 0.1))

##(2) 이 공정에서 임의로 추출한 20개의 표본 중에서 불량품이 5개 이하일 확률은 얼마인가?
print(binom.cdf(5, n = 20, p = 0.1))
>> 0.0081

>> 0.988746865835491

 


 

• 이산형확률분포 02. 초기하분포

 

- 정의 : 요소가 N개인 모집단에서 A개만 성공인 경우, N개 중에서 n개를 비복원추출할 때 성공횟수 X의 확률분포

 

$X$ ~ $HG(N, A, n)$

 

 

☑️ 초기하분포의 확률계산

# X ~ HG(N, A, n)
# N개로 구성된 모집단에서 A개가 성공이고 나머지 N-A개가 실패일 때,
# N개 중에서 n개를 비복원추출하였을 때,
# 그 중 성공일 경우의 수 x의 확률분포를 초기하분포라고 함

from scipy.stats import hypergeom

# 확률질량함수 : hypergeom.pmf(x, N, A, n)
# N:1000, A:200, n:50 -> P(X=10)
print(hypergeom.pmf(10, 1000, 200, 50))

# 누적분포함수 P(X <= x) : 복원추출 결과 성공이 10번 이하로 나올 때
print(hypergeom.cdf(10, 1000, 200, 50))

# 11번 이상 나올 떼
print(1 - hypergeom.cdf(10, 1000, 200, 50))

# 분위수 : hypergeom.ppf(p, N, A, n)
# 누적확률이 p 이상이 되는 x값 구해줌
print(hypergeom.ppf(0.5, 1000, 200, 50))

# 모의실험을 25번 반복하는 경우
print(hypergeom.rvs(1000, 200, 50, size = 25))
>> 0.14344796941073099

>> 0.5843039735710351

>> 0.41569602642896486

>> 10.0

>> [ 7 12  9  9  8 11  7 10 12 13 11 10  5 11  8 14  7 11 10 12  7  9 11 15 9]

 


 

• 이산형확률분포 03. 포아송분포

 

$X$ ~ $P(μ)$

 

단위 시간당 나타나는 사건의 건수를 설명하는 데 자주 사용되는 확률분포

  - 하루 동안 경부고속도로 상에서 일어나는 교통사고 건수
  - 일정시간 안에 걸려오는 전화의 수
  - 생산된 1000개 부품당 불량품의 개수
  - 일주일 동안에 어느 보험회사에서 접수되는 사망보험금 청구건수

 

 

☑️포아송분포의 확률계산

# X ~ P(μ)
# 단위 시간당 나타나는 사건의 건수를 설명하는 데 자주 사용되는 확률분포

from scipy.stats import poisson

# 확률질량함수 : P(X = x) : poisson.pmf(x, mu)
# mu = 5 에 대한 X = 7일 확률
print(poisson.pmf(7, 5))

# 누적분포함수 P(X <= x) : poisson.cdf(x, mu)
print(poisson.cdf(7, 5))

# 8번 이상 일어날 확률
print(1 - poisson.cdf(7, 5))

# 분위수 : poisson.ppf(q, mu)
# 누적확률이 q 이상이 되는 x
print(poisson.ppf(0.7, 5))

# 난수 : poisson.rvs(mu, size)
print(poisson.rvs(5, size = 30))
>> 0.10444486295705395

>> 0.8666283259299925

>> 0.1333716740700075

>> 6.0

>> [ 7  5  3  9  3  6  6  4  5  4  4  2  3  3  9  4  5  2  5  5  6  6  3  2 7  8  0 10  3  6]

 

 


 

🎲 03. 연속확률분포

 

• 00. 중심극한정리

 

모집단이 평균이 μ이고 표준편차가 σ인 임의의 분포를 따르고, 이 모집단으로부터 추출된 표본의 크기 n이 충분히 크다면, 이 표본의 평균들이 이루는 분포는 평균이 μ이고 표준편차가 σ / n½ 인 정규분포에 근접한다.

 

즉, n = 30인 표본을 400번 추출할 때, 이 400개 표본의 평균들이 이루는 분포가 중심극한정리에서의 표본평균 분포이다.

 

이때 n이 클수록, 표본평균의 분포가 평균이 μ이고 표준편차가 σ / n½ 인 정규분포에 가까워진다는 것이다.

 

따라서, 모집단의 분포 형태에 관계없이 추출한 표본의 크기가 충분히 크다면, 표본평균들의 분포가 모집단의 모수( μ, σ )에서 파생되는 정규분포를 이루기 때문에 특정 사건이 일어날 확률값을 계산할 수 있다. 중심극한정리는 표본 평균들이 이루는 분포와 모집단 간의 관계를 보여줌으로써, 수집한 표본의 통계량을 통해 모집단의 모수를 추정할 수 있는 수학적 근거를 마련해 준다.

 


 

• 01. 표준편차 / 표준오차

 

표준편차 ( s ) : 추출한 표본에서 얻은 각 관측값과 표본평균의 차이를 나타내는 값

표준오차 ( SE = s / n½ ) : 표본평균들의 편차 - 표본이 크고, 모표준편차 σ를 모르는 경우 표준오차를 통해 신뢰구간 결정

 


 

• 연속확률분포 02. 정규분포

 

$X$ ~ $N(μ,σ^2)$

 

☑️ 정규분포의 확률밀도함수

# X ~ N(μ,σ^2)
# 정규분포의 확률밀도함수 그리기

from scipy.stats import norm

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100, endpoint = True)

fx = norm.pdf(x, loc = 0, scale = 1)
plt.plot(x, fx, color = 'C0', linewidth = 1, linestyle = '-')
plt.title('Standard normal distribution')
plt.show()

 

 

 

☑️ 정규분포의 확률계산

# 정규분포의 확률계산
# X ~ N(42, 5^2)

# 확률밀도함수 : norm.pdf(x, mu,sigma)
# f(x = 40) : x = 40 일 확률
print(norm.pdf(40, 42, 5))

# 누적분포함수 : norm.cdf(x, mu, sigma)
# P(x <= 54)
print(norm.cdf(54, 42, 5))

# P(40 <= x <= 54) = P(x <= 54) - P(x < 40)
print(norm.cdf(54, 42, 5) - norm.cdf(40, 42, 5))

# 분위수 : norm.ppf(q, mu, sigma)
# 누적확률이 0.9 이상인 x
print(norm.ppf(0.9, 42, 5))

# 난수생성 : norm.rvs(mu, sigma, size= k)
# 모의실험을 7번 하는 경우
print(42, 5, 7)
>> 0.07365402806066466

>> 0.9918024640754038

>> 0.647224205685728

>> 48.407757827723

>> 42 5 7

 

 

☑️ 정규분포 상황 적용

# 예. A회사에서 생산되는 전구의 수명은 평균이 2000시간이고 
# 표준편차가 200시간 정규분포를 따른다고 한다.

# (1) 이 회사 제품인 전구의 수명은 평균이 2500시간 이하일 확률을 구하시오
# X ~ N(2000, 200^2)
print(norm.cdf(2500, 2000, 200))

# (2) 이 회사 제품인 전구의 수명이 1800시간 이상일 확률을 구하시오.
print(1 - norm.cdf(1800, 2000, 200))
>> 0.9937903346742238

>> 0.8413447460685429

 

 

# 예. IQ테스트에서 상위 2% 이내의 점수를 받아야 멘사 회원의 자격이 주어진다고 한다. 
# 만약 IQ 테스트의 점수가 평균이 100이고 표준편차가 15인 정규분포를 따를 때, 
# 멘사 회원이 되기 위해서는 약 몇 점 이상의 점수를 받아야 하는가?

# X ~ N(100, 15^2)
# 누적확률이 0.98이 되는 x 값을 구하면 됨
print(norm.ppf(0.98, 100, 15))
>> 130.80623365947733

 


 

• 연속확률분포 03. 카이제곱분포

 

$\frac{(n-1)s^2}{σ^2}$ ~ ${χ^2}_{n-1}$

 

  - 정규모집단분포부터의 랜덤 표본의 분포

  - k개의 서로 독립적인 표준확률변수를 각각 제곱한 다음 합해서 얻어지는 분포   

  - 표본이 $z_1, z_2...z_k$ ~ $N(0,1)$ 일때, $V = z_1^2 + z_2^2 + ... + z_k^2$의, 자유도 k를 따르는 분포

  - 표본분산을 보고 모분산을 추측하는 것이 카이제곱분포의 주요 용도

  - 범주형 자료 준석에 사용 : 모분산 검정, 적합도 검정, 독립성 / 동질성 검정

 

 

☑️ 카이제곱분포의 확률계산

from scipy.stats import chi2

# 확률밀도함수 f(X=x) : chi2.pdf(x, v)
# 자유도 = v = 3인 카이제곱분포, f(X=1)
print(chi2.pdf(1, 3))

# 누적분포함수 P(X <= x) : chi2.cdf(x, v)
# P(X <= 1)
print(chi2.cdf(1, 3))

# 분위수 : chi2.ppf(q, v)
# 누적확률이 0.9 이상이 되는 x
print(chi2.ppf(0.9, 3))

# 난수생성 : chi2.rvs(v, size)
# 모의실험을 10번 반복하는 경우
print(chi2.rvs(3, size = 10))
>> 0.24197072451914337

>> 0.19874804309879915

>> 6.251388631170325

>> [0.38402881 5.11578318 2.6200179  2.87919349 0.91619747 0.12736358
    2.33938728 5.48496231 1.43972606 0.62355219]

 


 

• 연속확률분포 04. T분포

 

$\frac{\bar{X} - μ}{s/\sqrt{n}}$ ~ $t_{n-1}$

 

  - 표준정규분포를 따르는 Z와 카이제곱분포를 따르는 U와의 비에서 정의되는 분포.

  - $t = \frac{Z}{\sqrt{U/v}}$ ~ $t_{v}$ (단, $v$는 자유도. $n-1$)

  - 모표준편차 대신 표본표준편차의 값을 이용한 T분포로 모평균 추측

  - 독립표본 t 검정 : 두 집단 간의 차이 비교 (등분산 / 이분산)  

  - 대응표본 t 검정 : 같은 집단의 전후 차이 비교

 

 

☑️ T분포의 확률계산

from scipy.stats import t

# 확률밀도함수 f(X=x) : t.pdf(x, v)
# 자유도 5인 t-분포. f(X = 1.64)
print(t.pdf(1.64, 5))

# 누적분포함수 P(X <= x) : t.cdf(x, v)
# P(X <= 1.64)
print(t.cdf(1.64, 5))

# 분위수 : t.ppf(q, v)
# 누적확률이 0.9 이상이 되는 t 값
print(t.ppf(0.9, 5))

# 모의실험을 10번 반복하는 경우
print(t.rvs(5, size = 10))
>> 0.10435965219804018

>> 0.9190351742553341

>> 1.4758840487820273

>> [-0.89633319 -2.81677958  1.56827634  1.28425609 -1.30632326  0.13472634
     0.74057534  0.03702968  0.10830647  0.34438492]

 


 

• 연속확률분포 05. F분포

 

$\frac{{s^2}_1/{σ^2}_1}{{s^2}_2/{σ^2}_2}$ ~ $F_{n_1-1,\, n_2-1}$

 

  - 두 정규모집단에서 랜덤표본을 추출했을 때, 두 집단의 표본분산 비에 대한 분포.

  - 분산 비 검정, 분산 분석(정량변수-범주형변수 관계 분석), 회귀 분석 등에 사용  

 

 

☑️ F분포의 확률계산

from scipy.stats import f

# 확률밀도함수 f(X = x) : f.pdf(x, v1, v2)
# 자유도 5,5 인 F 분포. f(X = 2)
print(f.pdf(2, 5, 5))

# 누적분포함수 P(X <= x) : f.cdf(x, v1, v2)
# P(X <= 2)
print(f.cdf(2, 5, 5))

# 분위수 : f.ppf(0.9, 5, 5)
print(f.ppf(0.9, 5, 5))

# 난수 : 모의실험을 10번 반복하는 경우
print(f.rvs(5, 5, size= 10))
>> 0.15808023109480038

>> 0.7674886808696213

>> 3.4529822480379053

>> [ 2.88771788  1.63613897  0.98826918  0.38587367 10.49539494  2.77641
     0.73505146  3.79974154  1.9476103   3.48451504]