# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# ### Probability distribution

# 확률은 사건이라는 표본의 집합에 대해 할당된 숫자라고 하였다.
# - 어떤 사건에 대해 어느 정도의 확률이 할당되었는지 묘사한 것을 확률 분포라고 한다.
#
# 대부분의 사건이 시작점과 끝점이라는 두 개의 숫자로 이루어진 단순간 구간을 사용하여 나타낼 수 있다. 따라서 이차원의 함수 $P(a, b)$를 사용하여 구현이 가능하다. 
#
# $$P(\{ a \leq x < b \}) = P(a, b) $$
#
# 그러나 구간 하나를 정의하기 위해 숫자 두 개가 필요하다는 점은 불편하다. 구간 시작점을 음수 무한대($-\infty$)로 통일하여 차원을 줄였다. 
#
# 확률 공간의 정의를 이용하여 각 구간들로부터 시작점이 무한대가 아닌 다른 구간에 대한 확률 값도 구할 수 있다.
#
# $$P(\{ a \leq x < b \}) = P(\{ -\infty \leq x < b \}) - P(\{ -\infty \leq x < a \})$$

# ### cumulative distribution function (누적 분포 함수)

# 위와 같은 방법으로 확률 분포를 묘사하는 방법을 누적 분포 함수라 하고, 약자로 **cdf**를 쓴다. 
#
# 실제 확률 변수 $X$에 대한 누적 확률 분포 $F(x)$의 수학적 정의는 다음과 같다.
#
# $$F(x) = P(\{X < x\}) $$
#
# 시계 바늘 확률 문제를 cdf로 표현할 경우 다음과 같이 생겼다.

# %matplotlib inline
t = np.linspace(-100, 500, 100)
F = t / 360
F[t < 0] = 0
F[t > 360] = 1
plt.plot(t, F)
plt.ylim(-0.1, 1.1)
plt.xticks([0, 180, 360])
plt.title("Cumulative Distribution Function")
plt.xlabel("$x$ (deg.)")
plt.ylabel("$F(x)$")
plt.show()

# ### probability density function (확률 밀도 함수)

# 누적 분포 함수로는 분포의 형상을 직관적으로 이해하기 힘든 단점이 있다. 다시 말해 어떤 확률 변수 값이 더 자주 나오는지에 대한 정보를 알기 힘들다는 점이다. 
#
# 구할 수는 있지만, 전체 구간을 아주 작은 폭을 가지는 구간들도 나누어 각 구간의 확률을 살펴보아야 한다. 이는 구간 폭(width)을 정하는 데에 추가적 약속이 필요하기 때문에 실효성이 떨어진다. (혹은 각 점에 대한 미분값을 구하거나)
#
# 이를 극복하기 위해 생각한 것이 절대적 확률이 아닌 **상대적인** 확률 분포 형태만을 보기 위한 확률 밀도 함수이다.
#
# 기울기를 구하느 수학적 연산이 미분이므로 확률 밀도 함수는 누적분포 함수의 미분으로 정의한다.
#
# $$\dfrac{dF(x)}{dx} = f(x)$$
#
# 적분으로 나타낼 경우 다음과 같다.
#
# $$F(x) = \int_{-\infty}^{x} f(u) du$$
#
# - 확률 밀도 함수는 특정 확률 변수 구간의 확률이 다른 구간에 비해 상대적으로 얼마나 높은가를 나타내는 것이며 그** 값 자체가 확률은 아니다 ** 
#
# 특징
# 1. $$\int_{-\infty}^{\infty} f(u)du = 1$$
# 1. $$ f(x) \geq 0 $$
#
# 시계 바늘 문제의 확률 밀도함수는 다음과 같다.

t = np.linspace(-100, 500, 1000)
F = t / 360
F[t < 0] = 0
F[t > 360] = 1
f = np.gradient(F, 600/1000)  # 수치미분
plt.plot(t, f)
plt.ylim(-0.0001, f.max()*1.1)
plt.xticks([0, 180, 360])
plt.title("Probability Density Function")
plt.xlabel("$x$ (deg.)")
plt.ylabel("$f(x)$")
plt.show()

# ### Probability mass function (확률 질량 함수)
#
# 이산 확률 분포는 확률 밀도 함수를 정의할 수 없는 대신 확률 질량 함수가 존재한다.
#
# 이산 확률 변수 또한 누적 분포 함수를 가지고 있다.

x = np.arange(1,7)
y = np.array([0.1, 0.1, 0.4, 0.2, 0.1, 0.1])
plt.stem(x, y)
plt.xlim(0, 7)
plt.ylim(-0.01, 0.5)
plt.show()

x = np.arange(1,7)
y = np.array([0.1, 0.1, 0.4, 0.2, 0.1, 0.1])
z = np.cumsum(y)
plt.step(x, z, where="post");
plt.xlim(0, 7);
plt.ylim(-0.01, 1.1)
plt.show()

StarcoderdataJupyterScriptsDedupFiltered