<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 베르누이 확률 분포
베르누이 시도
결과가 성공(Success) 혹은 실패(Fail) 두 가지 중 하나로만 나오는 것을 베르누이 시도(Bernoulli trial)라고 한다. 예를 들어 동전을 한 번 던져 앞면(H
Step1:  pmf 메서드를 사용하면 확률 질량 함수(pmf
Step2:  시뮬레이션을 하려면 rvs 메서드를 사용한다.
Step3:  결과를 seaborn의 countplot 명령으로 시각화한다.
Step4:  이론적인 확률 분포와 샘플의 확률 분포를 동시에 나타내려면 다음과 같은 코드를 사용한다.
NumPy의 bincount 명령으로 값이 0인 데이터의 수와 값이 1인 데이터의 수를 세고 이를 데이터프레임에 정리했다.
Step5:  seaborn의 barplot 명령으로 시각화하면 다음과 같다.
Step6:  베르누이 분포의 모멘트
베르누이 분포의 모멘트는 다음과 같다.
기댓값
$$\text{E}[X]  = \theta$$
(증명)
$$\text{E}[X]  = 1 \cdot \theta + 0 \cdot (1 - \theta) =  \theta$$
분산
$$\text{Var}[X] = \theta(1-\theta)$$
(증명)
$$\text{Var}[X] = (1 - \theta)^2 \cdot \theta + (0 - \theta)^2 \cdot (1 - \theta) = \theta(1-\theta)$$
앞의 예에서는 $\theta = 0.6$이였으므로 이론적인 기댓값과 분산은 다음과 같다.
$$ \text{E}[X] = 0.6 $$
$$ \text{Var}[X] = 0.6 \cdot (1 - 0.6) = 0.24 $$
데이터에서 계산한 샘플 평균 및 샘플 분산은 다음과 같이 계산한다.
Step7:  SciPy의 describe 명령을 쓰면 다음과 같이 계산할 수 있다.
Step8:  또는 Pandas의 Series객체로 바꾸어 describe 메서드를 써서 다음과 같이 계산한다.
<ASSISTANT_TASK:>
Python Code:
theta = 0.6
rv = sp.stats.bernoulli(theta)
rv
Explanation: 베르누이 확률 분포
베르누이 시도
결과가 성공(Success) 혹은 실패(Fail) 두 가지 중 하나로만 나오는 것을 베르누이 시도(Bernoulli trial)라고 한다. 예를 들어 동전을 한 번 던져 앞면(H:Head)이 나오거나 뒷면(T:Tail)이 나오게 하는 것은 베르누이 시도의 일종이다.
베르누이 시도의 결과를 확률 변수(random variable) $X$ 로 나타낼 때는 일반적으로 성공을 정수 1 ($X=1$), 실패를 정수 0 ($X=0$)으로 정한다. 때로는  실패를 0 이 아닌 -1($X=-1$)로 정하는 경우도 있다.
베르누이 분포
베르누이 확률 변수는 0, 1 두 가지 값 중 하나만 가질 수 있으므로 이산 확률 변수(discrete random variable)이다. 따라서 확률 질량 함수(pmf: probability mass function)와 누적 분포 함수(cdf:cumulataive distribution function)으로 정의할 수 있다. 
베르누이 확률 변수는 1이 나올 확률 $\theta$ 라는 하나의 모수(parameter)만을 가진다. 0이 나올 확률은 $1 - \theta$ 로 정의된다.
베르누이 확률 분포의 확률 질량 함수는 다음과 같다.
$$
\text{Bern}(x;\theta) = 
\begin{cases} 
\theta   & \text{if }x=1, \
1-\theta & \text{if }x=0
\end{cases}
$$
이를 case문 없이 하나의 수식으로 표현하면 다음과 같이 쓸 수도 있다.
$$
\text{Bern}(x;\theta) = \theta^x(1-\theta)^{(1-x)}
$$
만약 베르누이 확률 변수가 1과 -1이라는 값을 가진다면 다음과 같은 수식으로 써야 한다.
$$ \text{Bern}(x; \theta) = \theta^{(1+x)/2} (1-\theta)^{(1-x)/2} $$
만약 어떤 확률 변수 $X$가 베르누이 분포에 의해 발생된다면 "확률 변수 $X$가 베르누이 분포를 따른다"라고 말하고 다음과 같이 수식으로 쓴다.
$$ X \sim \text{Bern}(x;\theta) $$
SciPy를 사용한 베르누이 분포의 시뮬레이션
Scipy의 stats 서브 패키지에 있는 bernoulli 클래스가 베르누이 확률 분포를 위한 클래스다. p 인수로 분포의 모수 $\theta$을 설정한다. 
다음 예에서는 p = 0.6 으로 설정하였다.
End of explanation
xx = [0, 1]
plt.bar(xx, rv.pmf(xx), align="center")
plt.xlim(-1, 2)
plt.ylim(0, 1)
plt.xticks([0, 1], ["X=0", "X=1"])
plt.ylabel("P(x)")
plt.title("pmf of Bernoulli distribution")
plt.show()
Explanation: pmf 메서드를 사용하면 확률 질량 함수(pmf: probability mass function)를 계산할 수 있다.
End of explanation
x = rv.rvs(100, random_state=0)
x
Explanation: 시뮬레이션을 하려면 rvs 메서드를 사용한다.
End of explanation
sns.countplot(x)
plt.show()
Explanation: 결과를 seaborn의 countplot 명령으로 시각화한다.
End of explanation
y = np.bincount(x, minlength=2)/float(len(x))
df = pd.DataFrame({"theoretic": rv.pmf(xx), "simulation": y}).stack()
df = df.reset_index()
df.columns = ["value", "type", "ratio"]
df.pivot("value", "type", "ratio")
Explanation: 이론적인 확률 분포와 샘플의 확률 분포를 동시에 나타내려면 다음과 같은 코드를 사용한다.
NumPy의 bincount 명령으로 값이 0인 데이터의 수와 값이 1인 데이터의 수를 세고 이를 데이터프레임에 정리했다.
End of explanation
sns.barplot(x="value", y="ratio", hue="type", data=df)
plt.show()
Explanation: seaborn의 barplot 명령으로 시각화하면 다음과 같다.
End of explanation
np.mean(x)
np.var(x, ddof=1)
Explanation: 베르누이 분포의 모멘트
베르누이 분포의 모멘트는 다음과 같다.
기댓값
$$\text{E}[X]  = \theta$$
(증명)
$$\text{E}[X]  = 1 \cdot \theta + 0 \cdot (1 - \theta) =  \theta$$
분산
$$\text{Var}[X] = \theta(1-\theta)$$
(증명)
$$\text{Var}[X] = (1 - \theta)^2 \cdot \theta + (0 - \theta)^2 \cdot (1 - \theta) = \theta(1-\theta)$$
앞의 예에서는 $\theta = 0.6$이였으므로 이론적인 기댓값과 분산은 다음과 같다.
$$ \text{E}[X] = 0.6 $$
$$ \text{Var}[X] = 0.6 \cdot (1 - 0.6) = 0.24 $$
데이터에서 계산한 샘플 평균 및 샘플 분산은 다음과 같이 계산한다.
End of explanation
s = sp.stats.describe(x)
s[2], s[3]
Explanation: SciPy의 describe 명령을 쓰면 다음과 같이 계산할 수 있다.
End of explanation
pd.Series(x).describe()
Explanation: 또는 Pandas의 Series객체로 바꾸어 describe 메서드를 써서 다음과 같이 계산한다.
End of explanation
<END_TASK>