본문 바로가기

코딩으로 익히는 Python/통계

[Python] 8. 이산확률분포

728x90
반응형
SMALL
import scipy.stats as stats
from scipy.special import comb,perm
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False

지난 시간 복습용 연습문제

 

1. 숫자 1부터 10까지 적혀있는 카드 10장이 있다. 이 중에서 하나의 카드를 뽑았을 때, 8이 적힌 카드가 나올 확률을 구하시오.

 

2. 주사위를 하나 던져 3이 나올 확률을 구하시오

 

3. 주사위를 2개 던져 눈금의 합이 6이 나올 확률을 구하시오

 

4. 1000 개의 사탕이 들어있는 바구니가 있다(갈색, 파랑, 보라) 100개 표본 임의 추출하여 확인했더니 갈색 사탕 비율이 36%가 나왔다. 갈색 사탕이 몇% 정도 들어있는지 신뢰구간 95%로 추정하시오 (실제 갈색 사탕의 비율 40.3%)

 

5. 1000 개의 사탕이 들어있는 바구니가 있다(갈색, 파랑, 보라) 50개 표본 임의 추출하여 확인했더니 갈색20, 파랑 17, 보라 13개가 나왔다. 갈색 사탕이 몇% 정도 들어있는지 신뢰구간 99%로 추정하시오 (실제 갈색 사탕의 비율 40.3%)


Solution

 

1. 숫자 1부터 10까지 적혀있는 카드 10장이 있다. 이 중에서 하나의 카드를 뽑았을 때, 8이 적힌 카드가 나올 확률을 구하시오.

 

mu = 1/10
rv = stats.bernoulli(mu)
xx = [0,1]
rv.pmf(xx) # [뽑히지않을확률,뽑힐확률]
[OUT] :

array([0.9, 0.1])

 

rv.mean()
[OUT] :

0.1

 

rv.var() # 0.1*(1-0.1)
[OUT] :

0.09000000000000001

 

2. 주사위를 하나 던져 3이 나올 확률을 구하시오

 

mu = 1/6
rv = stats.bernoulli(mu)
xx = [0,1]
rv.pmf(xx)
[OUT] :

array([0.83333333, 0.16666667])

 

plt.bar(xx, rv.pmf(xx))
plt.xlim(-1, 2)
plt.ylim(0, 1)
plt.xticks([0, 1], ["x=0", "x=1"])
plt.xlabel("표본값")
plt.ylabel("P(x)")
plt.title("베르누이 확률변수의 확률질량함수")
plt.show()

 

3. 주사위를 2개 던져 눈금의 합이 6이 나올 확률을 구하시오

 

mu = 5/36
rv = stats.bernoulli(mu)
xx = [0,1]
rv.pmf(xx)
[OUT] :

array([0.86111111, 0.13888889])

 

rv.mean()
[OUT] :

0.1388888888888889

 

rv.var()
[OUT] :

0.11959876543209878

 

4. 1000 개의 사탕이 들어있는 바구니가 있다(갈색, 파랑, 보라) 100개 표본 임의 추출하여 확인했더니 갈색사탕비율이 36%가 나왔다. 갈색 사탕이 몇% 정도 들어있는지 신뢰구간 95%로 추정하시오 (실제 갈색 사탕의 비율 40.3%)

 

p = 0.36
n = 100

start = p-1.96*np.sqrt((p*(1-p))/n)
end = p+1.96*np.sqrt((p*(1-p))/n)

print(f'[{start},{end}]')
print(f'{100*p}% +- {100*(end-start)/2}%') 
[OUT] :

[0.26592,0.45408]
36.0% +- 9.408%

 

5. 1000 개의 사탕이 들어있는 바구니가 있다(갈색, 파랑, 보라) 50개 표본 임의 추출하여 확인했더니 갈색20, 파랑 17, 보라 13개가 나왔다. 갈색 사탕이 몇% 정도 들어있는지 신뢰구간 99%로 추정하시오 (실제 갈색 사탕의 비율 40.3%)

 

p = 20/50
n = 50

start = p-2.58*np.sqrt((p*(1-p))/n)
end = p+2.58*np.sqrt((p*(1-p))/n)

print(f'[{round(start,2)},{round(end,2)}]')
print(f'{100*p}% +- {round(100*(end-start)/2,2)}%') 
[OUT] :

[0.22,0.58]
40.0% +- 17.87%

이항 분포

 

이항 분포는 이산 확률분포에서 가장 많이 사용하는 분포로, 이전 글에서 알아보았던 베르누이 분포의 업그레이드 버전이다. 먼저 베르누이 분포가 “성공”과 “실패” 이렇게 2가지의 상황만 나오는 실험에서 사용한다고 했었는데, (참고) 이항 분포도 마찬가지다. 그래서 베르누이 분포와 똑같이 성공확률은 p이고, 실패 확률은 1-p이다.

 

from scipy.special import factorial,comb

 

comb(10,3)
[OUT] :

120.0

 

factorial(10)/ (factorial(3)*factorial(7))
[OUT] :

120.0

연습문제

 

1. 주사위를 10번 던졌을 때 눈금 5가 3번 나올 확률을을 구하시오

 

2. 한 축구 선수가 페널티킥을 차면 5번 중 4번은 성공한다고 한다. 그럼 이 선수가 10번의 페널티킥을 차서 7번 성공할 확률을 구하고 확률 질량 함수와 누적 분포 함수를 시각화하여 나타내시오

 

3. 스마트폰의 한 부품을 만드는 회사가 있는데, 이 회사에서 만드는 부품의 불량률은 5%라고 한다. 그럼 부품 20개를 조사했을 때, 불량품이 2개 이하로 나올 확률을 구하시오

 

4. 어떤 희귀 바이러스에 감염되었을 때, 회복할 수 있는 치료율은 20%라고 한다. 그럼 바이러스에 감염된 환자 15명을 치료했을 때, 적어도 2명 이상은 회복할 확률을 구하시오


Solution

 

1. 주사위를 10번 던졌을 때 눈금 5가 3번 나올 확률을 구하시오

 

N = 10
mu = 1/6
rv = stats.binom(N,mu)
rv.pmf(3)
[OUT] :

0.15504535957425197

 

2. 한 축구 선수가 페널티킥을 차면 5번 중 4번은 성공한다고 한다. 그럼 이 선수가 10번의 페널티킥을 차서 7번 성공할 확률을 구하고 확률 질량 함수와 누적 분포 함수를 시각화하여 나타내시오

 

N = 10
mu = 4/5
rv = stats.binom(N,mu)
rv.pmf(7)
[OUT] :

0.20132659200000014

 

xx = np.arange(N+1)
fig = plt.figure(figsize=(12,5))
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax1.bar(xx, rv.pmf(xx)) # 확률질량함수
ax2.plot(xx,rv.cdf(xx),'ro--') # 누적분포함수
plt.show()

 

3. 스마트폰의 한 부품을 만드는 회사가 있는데, 이 회사에서 만드는 부품의 불량률은 5%라고 한다. 그럼 부품 20개를 조사했을 때, 불량품이 2개 이하로 나올 확률을 구하시오

 

N = 20
mu = 5/100
rv = stats.binom(N,mu)
rv.cdf(2) # rv.pmf( 2 ) + rv.pmf( 1 ) + rv.pmf( 0 )
[OUT] :

0.9245163262115035

 

4. 어떤 희귀 바이러스에 감염되었을 때, 회복할 수 있는 치료율은 20%라고 한다. 그럼 바이러스에 감염된 환자 15명을 치료했을 때, 적어도 2명 이상은 회복할 확률을 구하시오

 

N = 15
mu = 20/100
rv = stats.binom(N,mu)
1-rv.cdf(1)
[OUT] :

0.8328742325780478

review
- pmf, pdf,  cdf, ppf 숙지 (모르면 0.SciPy Library복습)
728x90
반응형
LIST