반응형
6단원. 이산형 확률분포¶
- 추측 통계의 목표: 한정된 표본으로부터 모집단의 평균, 분산을 추정
- 모수적 기법: 이 때 모집단이 어떠한 성질일 것이므로 이러한 형태를 지닌 확률분포일 것이다라는 가정을 하고, 확률분포의 기댓값과 분산을 결정하는 파라미터를 추측
- 비모수적 기법: 모집단의 확률분포에 어떠한 가정도 하지 않음
- 다양한 확률분포, 특히 이산형 확률분포에 대해 소개
- 각각의 확률분포를 어떠한 상황에서 사용하는지 설명
6.1. 베르누이 분포(Bernoulli distribution)¶
- 확률변수가 취할 수 있는 값이 0과 1밖에 없는 분포
- 1이 나오는 확률을 $p$, 0이 나오는 확률을 $1-p$
- 파라미터: $p$
- 기댓값과 분산
In [1]:
import numpy as np
def Bern(p):
x_set = np.array([0, 1])
def f(x):
if x in x_set:
return p ** x * (1 - p) ** (1 - x)
else:
return 0
return x_set, f
In [2]:
p = 0.3
X = Bern(p)
print(X)
In [3]:
def E(X):
x_set, f = X
return np.sum([x_k * f(x_k) for x_k in x_set])
def V(X):
x_set, f = X
mean = E(X)
return np.sum([(x_k - mean) ** 2 * f(x_k) for x_k in x_set])
def check_prob(X):
x_set, f = X
prob = np.array([f(x_k) for x_k in x_set])
assert np.all(prob >= 0), "minus probability"
# assert는 뒤의 조건이 참이 아니면 AssertError를 발생시킴
# numpy.all() 배열의 모든 데이터가 조건과 맞으면 참, 하나라도 다르면 거짓
prob_sum = np.round(np.sum(prob), 2)
# Computation error 때문에 반올림해줘야 함!
assert prob_sum == 1, f"sum of probability {prob_sum}"
# f-문자열이 가독성 좋음
print(f"expected value {E(X): .4}")
print(f"variance {V(X): .4}")
In [4]:
check_prob(X)
In [5]:
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
fontPath = "./NanumGothic.ttf"
fontProp = fm.FontProperties(fname = fontPath)
def plot_prob(X):
x_set, f = X
prob = np.array([f(x_k) for x_k in x_set])
fig = plt.figure(figsize = (15, 5))
ax = fig.add_subplot(111)
ax.bar(x_set, prob, color = "0.5", label = "확률")
ax.vlines(E(X), 0, 1, label = "평균")
ax.set_xticks(np.append(x_set, E(X)))
ax.set_ylim(0, 1)
ax.set_xlabel("x")
ax.set_ylabel("p(x)")
ax.legend(prop = fontProp)
ax.grid(True)
plt.show()
In [6]:
plot_prob(X)
In [7]:
p = 0.5
X = Bern(p)
check_prob(X)
plot_prob(X)
In [8]:
p = 0.7
X = Bern(p)
check_prob(X)
plot_prob(X)
6.2. 이항 분포(Binomial distribution)¶
- 성공 확률이 $p$인 베르누이 시행을 $n$번 했을 때의 성공 횟수가 따르는 분포
- 파라미터: 성공 확률 $p$, 시행 횟수 $n$
- 기댓값과 분산
In [9]:
from scipy.special import comb
def Bin(n, p):
x_set = np.arange(n + 1)
def f(x):
if x in x_set:
return comb(n, x) * p ** x * (1 - p) ** (n - x)
else:
return 0
return x_set, f
In [10]:
n = 10
p = 0.3
X = Bin(n, p)
print(X)
In [11]:
check_prob(X)
In [12]:
plot_prob(X)
In [13]:
n = 10
p = 0.5
X = Bin(n, p)
check_prob(X)
plot_prob(X)
In [14]:
n = 10
p = 0.7
X = Bin(n, p)
check_prob(X)
plot_prob(X)
6.3. 기하 분포(Geometric distribution)¶
- 베르누이 시행에서 처음 성공할 때까지 반복한 시행 횟수가 따르는 분포
- 파라미터: 성공 확률 $p$
- 기댓값과 분산
In [15]:
def Ge(p):
x_set = np.arange(1, 25)
def f(x):
if x in x_set:
return (1 - p) ** (x - 1) * p
else:
return 0
return x_set, f
In [16]:
p = 0.5
X = Ge(p)
print(X)
In [17]:
check_prob(X)
In [18]:
plot_prob(X)
In [19]:
p = 0.2
X = Ge(p)
check_prob(X)
plot_prob(X)
6.4. 포아송 분포(Poisson distribution)¶
- 사건이 단위 시간당 발생하는 건수가 따르는 확률분포
- 파라미터: 평균 발생 건수 $\lambda$
- 기댓값과 분산
In [20]:
from scipy.special import factorial
def Poi(lam):
x_set = np.arange(20)
def f(x):
if x in x_set:
return np.power(lam, x) / factorial(x) * np.exp(-lam)
else:
return 0
return x_set, f
In [21]:
lam = 3
X = Poi(lam)
In [22]:
check_prob(X)
In [23]:
plot_prob(X)
In [24]:
from scipy import stats
lams = [3 , 5 , 8 ]
linestyles = ["-", "--", ":"]
fig = plt.figure(figsize = (10, 6))
ax = fig.add_subplot(111)
x_set = np.arange(20)
for lam, ls in zip(lams, linestyles):
rv = stats.poisson(lam)
ax.plot(x_set, rv.pmf(x_set), label = f"lam: {lam}", ls = ls, color = "0.25")
ax.set_xticks(x_set)
ax.set_xlabel("x")
ax.set_ylabel("p(x)")
ax.legend()
plt.show()
반응형
'과학 > 통계' 카테고리의 다른 글
샘플링 전략 (Sampling Strategy) (2) | 2023.01.30 |
---|---|
9-2. 독립동일분포(표본평균의 분포) (0) | 2020.10.06 |
9-1. 독립동일분포(독립성, 합의 분포) (0) | 2020.09.15 |
1. 데이터 (0) | 2020.07.29 |