import numpy as np
import scipy.stats as sp
import matplotlib.pylab as plt

mu1 = 90; mu2 = 60; std1 = 5; std2 = 10
rv1 = sp.norm(mu1, std1); rv2 = sp.norm(mu2, std2)

xx1 = np.linspace(70, 110, 100); xx2 = np.linspace(30, 90, 100)
fig = plt.figure(figsize=(8, 3))

plt.subplot(1, 2, 1)
plt.plot(xx1, rv1.pdf(xx1))
plt.title("English")
plt.xticks([70, 80, 90, 100, 110])
plt.ylim(0)
plt.scatter(90, 0, color='blue', linewidths=5)
plt.scatter(80, 0, color='red', linewidths=10)
plt.annotate("80", xy=(80, 0), xytext=(80, 0.01),
            arrowprops=dict(facecolor="black", linewidth=0.5),
            fontsize=15
            )

plt.subplot(1, 2, 2)
plt.plot(xx2, rv2.pdf(xx2))
plt.title("Math")
plt.xticks([40, 50, 60, 70, 80])
plt.ylim(0)
plt.scatter(60, 0, color='blue', linewidths=5)
plt.scatter(75, 0, color='red', linewidths=10)
plt.annotate("75", xy=(75, 0), xytext=(75, 0.005),
            arrowprops=dict(facecolor="black", linewidth=0.5),
            fontsize=15
            )
plt.show()

"""
Explanation: Ch7. 연속확률분포

균일분포
정규분포


1. 균일분포 ( Uniform Distribution )

연속확률분포 중에서 가장 간단한 분포
확률변수가 취하는 모든 구간에서 각 사건의 발생확률이 일정하다

균일분포의 확률밀도함수(pdf)

<br >
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Uniform_Distribution_PDF_SVG.svg/500px-Uniform_Distribution_PDF_SVG.svg.png", width=350>
<center> < figure.  Uniform Distribution > </center> 
2. 정규분포 ( Gaussian Normal Distribution )
정규분포의 의미

가우스 분포라고도 불리는 정규분포는 연속확률분포 중에서 가장 널리 이용되는 중요한 분포
정규분포는 표본을 통한 통계적 추정 및 가설검정이론의 기본이 되며, 실제로 우리가 사회적, 자연적 현상에서 접하는 여러 자료들의 분포도 정규분포와 비슷한 형태를 띠게 되는 것이 보통
현실적인 자료가 이론적인 정규분포와 완전히 일치하는 것은 아니지만 정규분포의 형태에 가깝게 나타나므로 이를 자료분석에 이용할 수 있다는 점

정규분포의 확률밀도함수(pdf)

$$
\begin{align}
\mu &: 분포의 평균 \
\sigma &: 분포의 표준편차 \
\pi &: 3.1416(원주율: 상수) \
e &: 2.7183(자연대수: 상수) \
\end{align}
$$

식에서 분포의 평균 $\mu$와 표준편차 $\sigma$를 제외하고는 모두 상수이고 $X$는 확률변수이기 때문에, 정규분포의 모양과 위치를 결정하는 것은 분포의 평균과 표준편차 두 요인임을 알 수 있다.
정규분포공식에서 $\bar{X}$와 $S$ 대신 $\mu$와 $\sigma$를 사용한 것은 이 공식이 하나의 이론적 모형이기 때문에 모집단의 기초를 사용

<br >
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Normal_Distribution_PDF.svg/700px-Normal_Distribution_PDF.svg.png", width=450>
<center> < figure. Normal Distribution > </center> 
정규분포의 특성
1. 정규분포의 모양과 위치는 분포의 평균과 표준편차로 결정된다.
1. 정규분포의 확률밀도함수는 평균($\mu$)을 중심으로 대칭인 종모양이다.
1. 정규곡선은 $X$축에 맞닿지 않으므로 확률변수 $X$가 취할 수 있는 값의 범위는 $-\infty \le X \le +\infty$ 이다.
1. 분포의 평균($\mu$)과 표준편차($\sigma$)가 어떤 값을 갖더라도, 정규곡선과 $X$축 사이의 전체 면적은 1이다.
표준정규분포

정규분포는 평균과 표준편차에 따라 모양과 위치가 각기 다르기 때문에 두 분포의 성격을 비교하거나 특정 정규분포에서 확률을 계산하기 위해서는, 먼저 모든 정규분포의 평균과 표준편차를 표준화하여 표준적인 정규분포를 만들어야 한다


ex. 어느 학생이 영어와 수학 시험을 치렀다. 그 결과 영어점수는 80점이고 수학점수는 75점이었
다. 이 학생은 어느과목을 더 잘했다고 할 수 있는가?
ex. 추가정보 : 영어과목에서는 전체학급의 평균은 90점, 표준편차는 5점 그리고 수학과목에서는 평균이 60점, 표준편차가 10점이라고 한다.
End of explanation
"""


import numpy as np
import scipy.stats as sp
import matplotlib.pylab as plt
from matplotlib.patches import Polygon

mu1 = 100; mu2 = 0; std1 = 10; std2 = 1
rv1 = sp.norm(mu1, std1); rv2 = sp.norm(mu2, std2)

xx1 = np.linspace(70, 130, 100); xx2 = np.linspace(-3, 3, 100)

fig = plt.figure()

ax1 = fig.add_subplot(211)
plt.plot(xx1, rv1.pdf(xx1), 'r', linewidth=2)

ix1 = np.linspace(mu1, mu1+std1)
iy1 = rv1.pdf(ix1)
verts1 = [(mu1, 0)] + list(zip(ix1, iy1)) + [(mu1+std1, 0)]
poly1 = Polygon(verts1, facecolor='0.7', edgecolor='0.5')
ax1.add_patch(poly1)


ax2 = fig.add_subplot(212)
plt.plot(xx2, rv2.pdf(xx2), 'r', linewidth=2)

ix2 = np.linspace(mu2, mu2+std2)
iy2 = rv2.pdf(ix2)
verts2 = [(mu2, 0)] + list(zip(ix2, iy2)) + [(mu2+std2, 0)]
poly2 = Polygon(verts2, facecolor='0.7', edgecolor='0.5')
ax2.add_patch(poly2)

plt.text(0.5, 0.1, "0.3413", horizontalalignment="center", fontsize=10)
plt.show()

"""
Explanation: 이처럼 개인의 각 과목점수($X$)는 각 과목의 평균과 표준편차를 동시에 비교해야만 더욱 의미있는 해석을 할 수 있다. 즉, $X$가 각 분포에서 어떤 위치에 있느냐를 살펴보고 분석할 수 있다.

표준정규분포
- 표준정규분포는 모든 정규분포를 평균 $\mu=0$, 표준편차 $\sigma=1$이 되도록 표준화한 것이다. 어떤 확률변수 $X$의 관찰값이 그 분포의 평균으로부터 표준편차의 몇 배 정도나 떨어져 있는가를 다음과 같이 표준화된 확률변수 $Z$로 나타내기 때문에 표준정규분포를 $Z$-분포 라고도 한다.
$$
Z = \frac{X-\mu}{\sigma}
$$

앞에서 든 예를 $Z$의 척도로 바꾸어 보면,
$$
영어 \quad Z = \frac{80 - 90}{5} = -2, \quad 수학 \quad Z = \frac{75 - 60}{10} = 1.5
$$

<img src="http://www.ktword.co.kr/img_data/1995_4.JPG", width=250>
<center> < figure. Standard Normal Distribution > </center> 
<img src="http://growingknowing.com/Images/NormalTable1.png", width=380>
<center> < figure. Table of Standard Normal Distribution Probability > </center> 
정규분포의 확률계산
 Q. 예제  <br />

$Z=0$부터 $Z=1.5$ 사이에 확률변수가 있을 확률 <br >
$P(0 \le Z \le 1.5) = 0.4332$
$Z=-1$부터 $Z=1$ 사이에 확률변수가 있을 확률 <br >
$P(-1 \le Z \le 0) + P(0 \le Z \le 1) = 2 \times 0.3413 = 0.6826 $
$Z=-1.5$부터 $Z = -0.5$ 사이에 확률변수가 있을 확률 <br >
$P(0 \le Z \le 1.5) - P(0 \le Z \le 0.5) = 0.4332 - 0.1915 = 0.2417 $
$Z=-2$보다 작거나 $Z = 2$ 보다 큰 사이에 확률변수가 있을 확률 <br >
$P( Z \le -2) + P( Z \ge 2) = 2 \times ( 0.5 - 0.4772) = 0.0456 $

 Q. 연습문제  <br />

한 초등학교 전교생의 IQ를 측정해 본 결과 평균 $\mu = 100$, 표준편차 $\sigma = 10$ 이었다. 이 초등학교 학생들의 IQ 분포가 정규분포를 이룬다고 가정할 때, IQ가 100에서 110사이인 학생의 비율은 얼마나 될까?
End of explanation
"""


fig, ax = plt.subplots()
plt.plot(xx2, rv2.pdf(xx2), 'r', linewidth=2)

ix = np.linspace(mu2+2*std2, mu2+3*std2)
iy = rv2.pdf(ix)
verts = [(mu2+2*std2, 0)] + list(zip(ix, iy)) + [(mu2+3*std2, 0)]
poly = Polygon(verts, facecolor='0.7', edgecolor='0.5')
ax.add_patch(poly)

plt.text(2.5, 0.01, "0.0228", horizontalalignment="center", fontsize=10)
plt.show()

"""
Explanation: 정답 :
$$ P(100 \le X \le 110) = p(0 \le Z \le 1) = 0.3413 $$
 Q. 연습문제  <br />

그렇다면 IQ 가 120 이상인 학생의 비율은 얼마나 될까?
End of explanation
"""


