np.set_printoptions(precision=4)
pmf1 = np.array([[0, 1, 2, 3, 2, 1],
                 [0, 2, 4, 6, 4, 2],
                 [0, 4, 8,12, 8, 4],
                 [0, 2, 4, 6, 4, 2],
                 [0, 1, 2, 3, 2, 1]])
pmf1 = pmf1/pmf1.sum()
pmf1

sns.heatmap(pmf1)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Joint Probability (Independent)")
plt.show()

"""
Explanation: 확률 밀도 함수의 독립
만약 두 확률 변수 $X$, $Y$의 결합 확률 밀도 함수(joint pdf)가 주변 확률 밀도 함수(marginal pdf)의 곱으로 나타나면 두 확률 변수가 서로 독립(independent)이라고 한다.
$$ f_{XY}(x, y) = f_X(x)f_Y(y) $$
이 함수 식에서 볼 수 있듯이 독립인 경우에는 각각의 주변 확률 밀도 함수만으로 결합 확률 밀도 함수가 결정된다. 즉, $Y$가 어떤 값을 가지더라도 $X$의 주변 확률 밀도 함수는 변하지 않는다.
독립 확률 변수의 기댓값
독립 확률 변수들의 기댓값은 다음 성질을 만족한다. 
$$ \text{E}[XY] = \text{E}[X]\text{E}[Y] $$
(증명)
$$ 
\begin{eqnarray}
\text{E}[XY] 
&=& \int xy \;f_{XY}(x, y) \; dx dy  \
&=& \int xy \;f_{X}(x)f_{Y}(y) \; dx dy \
&=& \int x \;f_{X}(x) \; dx \int y \;f_{Y}(y) \; dy  \
&=& \text{E}[X] \text{E}[Y] \
\end{eqnarray}
$$
독립 확률 변수들의 분산
또한 독립 확률 변수들의 분산은 다음 성질을 만족한다. 
$$ \text{Var}[X+Y] = \text{Var}[X] + \text{Var}[Y] $$
(증명)
$$ 
\begin{eqnarray}
\text{Var}[X + Y] 
&=& \text{E}[((X + Y) - (\mu_X + \mu_Y))^2] \
&=& \text{E}[(X+Y)^2 - 2(X+Y)(\mu_X + \mu_Y) + (\mu_X + \mu_Y)^2] \
&=& \text{E}[X^2+2XY+Y^2] - 2(\mu_X + \mu_Y)\text{E}[X+Y] + (\mu_X + \mu_Y)^2 \
&=& \text{E}[X^2+2XY+Y^2] - 2(\mu_X + \mu_Y)^2 + (\mu_X + \mu_Y)^2 \
&=& \text{E}[X^2]+2\text{E}[XY]+\text{E}[Y^2] - (\mu_X + \mu_Y)^2 \
&=& \text{E}[X^2]+2\text{E}[X]\text{E}[Y]+\text{E}[Y^2] - (\mu_X^2 + 2\mu_X\mu_Y + \mu_Y^2) \
&=& \text{E}[X^2]-\mu_X^2+\text{E}[Y^2]-\mu_Y^2+2\text{E}[X]\text{E}[Y] - 2\mu_X\mu_Y \
&=& \text{Var}[X]+\text{Var}[Y] \
\end{eqnarray}
$$
조건부 확률 분포
또한 조건부 확률 밀도 함수에는 다음과 같은 관계가 성립한다.
$$ f_{X \mid Y} (x | y_0) = \dfrac{f_{XY}(x, y=y_0)}{f_{Y}(y_0)} = \dfrac{f_{X}(x) f_{Y}(y_0)}{f_{Y}(y_0)} = f_{X}(x) $$
$$ f_{Y \mid X} (y | x_0) = \dfrac{f_{XY}(x=x_0, y)}{f_{X}(x_0)} = \dfrac{f_{X}(x_0) f_{Y}(y)}{f_{X}(x_0)} = f_{Y}(y) $$
확률 변수 $X$가 다른 확률 변수 $Y$에 독립이면 조건부 확률 분포가 조건이 되는 확률 변수의 값에 영향을 받지 않는다. 즉, $Y$ 값이 $y_1$일 때와 $y_2$일 때의 조건부 확률 분포 $f(x \mid y_1)$과 $f(x \mid y_2)$이 같다는 의미이다. 
예를 들어 다음과 같은 두 이산 확률 변수의 결합 확률 분포를 보자.
End of explanation
"""


pmf1_marginal_x = pmf1.sum(axis=0)
pmf1_marginal_y = pmf1.sum(axis=1)
pmf = pmf1_marginal_x * pmf1_marginal_y[:, np.newaxis]
pmf/pmf.sum()

"""
Explanation: 이 확률 분포는 다음 식에서 보다시피 주변 확률 분포의 곱으로 표현된다.
End of explanation
"""


cond_x_y0 = pmf1[0, :]/pmf1_marginal_y[0]
cond_x_y0

cond_x_y1 = pmf1[1, :]/pmf1_marginal_y[1]
cond_x_y1

cond_x_y2 = pmf1[2, :]/pmf1_marginal_y[2]
cond_x_y2

"""
Explanation: 여러 가지 Y값을 바꾸어도 조건부 확률은 변하지 않는 것을 확인할 수 있다.
End of explanation
"""


pmf2 = np.array([[0, 0, 0, 0, 1, 1],
                 [0, 0, 1, 2, 1, 0],
                 [0, 1, 3, 3, 1, 0],
                 [0, 1, 2, 1, 0, 0],
                 [1, 1, 0, 0, 0, 0]])
pmf2 = pmf2/pmf2.sum()
pmf2

sns.heatmap(pmf2)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Joint Probability (Dependent)")
plt.show()

"""
Explanation: 이번에는 다음과 같은 결합 확률 분포를 보자. 이 경우에는 독립 조건이 성립하지 않는다.
End of explanation
"""


pmf2_marginal_x = pmf2.sum(axis=0)
pmf2_marginal_y = pmf2.sum(axis=1)

cond_x_y0 = pmf2[0, :]/pmf2_marginal_y[0]
cond_x_y0

cond_x_y1 = pmf2[1, :]/pmf2_marginal_y[1]
cond_x_y1

cond_x_y2 = pmf2[2, :]/pmf2_marginal_y[2]
cond_x_y2

"""
Explanation: 이 경우에는 y값에 따라 x의 조건부 확률 분포가 달라지는 것을 확인할 수 있다.
End of explanation
"""


