# ---
# 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
# ---

# # 4. Scipy로 공부하는 확률 변수
#
# ## 00장. Scipy의 확률 분포 기능
#
# - Scipy는 각종 수치 해석 기능을 제공하는 파이썬 패키지
# - Scipy는 여러 개의 서브 패키지로 구성
# - scipy.stats 서브패키지는 여러 가지 확률 분포 분석을 위한 기능을 제공

import scipy as sp
import numpy as np
import seaborn as sns

mpl.rcParams["font.family"]
mpl.matplotlib_fname()
import matplotlib.font_manager as fm
font_location = "/Library/Fonts/AppleGothic.ttf"
font_name = fm.FontProperties(fname=font_location).get_name()
print(font_name)
mpl.rc('font', family=font_name)

# +
# 1. 확률 분포 객체 생성 (각 분포에 맞는 객체를 생성한다.)
# 2. 확률 분포 객체의 메서드 호출

# +
# scipy.stats 서브패키지 안에 명령이 포함되어 있다.
# -

# - - -
# ## 1. 확률 분포 객체 생성 

import scipy as sp

# 확률 분포 객체 생성 가우시안 정규분포를 따르는 객체를 생성
rv = sp.stats.norm()
type(rv)

# 확률 분포 객체 생성시 파라미터 공통적으로 loc (기댓값), scale (표준편차) 들어간다.
rv = sp.stats.norm(loc=1, scale=2)

# - - -
# ## 2. 확률 분포 메서드
# - pdf, pmf, cdf, rvs

# ### 확률 밀도 함수

xx = np.linspace(-8, 8, 100)
pdf = rv.pdf(xx)
plt.plot(xx, pdf)
plt.show()

# ### 누적 분포 함수

xx = np.linspace(-8, 8, 100)
cdf = rv.cdf(xx)
plt.plot(xx, cdf)
plt.show()

# ### 랜덤 샘플 생성

# size : 샘플 생성시 생성될 샘플의 크기
# random_state : 샘플 생성시 사용되는 시드 값
rv.rvs(size=(3,5), random_state=0)

sns.distplot(rv.rvs(size=10000, random_state=0))
plt.xlim(-8, 8)
plt.show()

# - - -
# ### 연습문제
#
# rvs 명령으로 N개의 정규 분포 샘플 데이터를 생성하고 이 샘플 데이터로부터 샘플 평균과 비편향 샘플 분산을 구한다. 이 값이 인수로 넣은 기댓값과 분산과 비슷한지 비교하라.
#
# - N
#  =10인 경우
# - N
#  =10000인 경우

rv = sp.stats.norm(loc=1, scale=2)

x1 = rv.rvs(size=10, random_state=0)

np.mean(x1), np.var(x1, ddof=1)

# - - -

x2 = rv.rvs(size=10000, random_state=1)

np.mean(x2), np.var(x2, ddof=1)

# 샘플 갯수가 커질 수록 인수로 넣은 기댓값과 분산 값에 더 가까운 결과가 나온다.

# - - -
# ### 연습 

import scipy as sp
# 확률 분포의 객체를 만든다. 여러 확률 분포 종류중 가우시안 정규분포 만들어보자 loc 기댓값이 1이고, scale 표준편차가 2인 정규분포 만든다.
rv = sp.stats.norm(loc=0, scale=2)

xx = np.linspace(-8,8,100)

pdf = rv.pdf(xx) #기댓값은 0, 표준편차는 2를 가지는 정규분포에 xx -8부터 8사이 100개의 값을 넣어서 정규분포의 확률 분포를 볼 수 있음

pdf

# 그래프로 나타내면 pdf 값 볼 수 있다.
plt.plot(xx,pdf)
plt.show()
# 기댓값은 0 표준편차는 2를 가지는 표를 볼 수 있다.

# cdf 도 나타내보자!
xx = np.linspace(-8,8,100)
cdf = rv.cdf(xx)
plt.plot(xx, cdf)
plt.show()

rv.rvs(size=(3,3), random_state=0)

sns.distplot(rv.rvs(size=10000, random_state=0))
plt.xlim(-8,8)
plt.show()

# - - -

# +
# 전체 과정 다시 한번 더 연습
# scipy 각종 수치 해석 도와주는 패키지 - scipy.stats 는 여러 확률 분포를 분석해주는 서브 패키지이다.
# from scipy import stats 하면 메모리 적게 사용할 수 있다.
# -

# 1. 확률 분포 분석 위해서 객체 생성 해야, 파라미터 공통으로 기댓값 loc과 표준편차 scale 넣어줘야 한다.
rv = sp.stats.norm(loc=0, scale=2)

# +
# 2. 확률 분포 분석을 위한 객체 생성 후 메서드 사용 가능하다. 각 확률 분포의 pdf, pmf, cdf 알 수 있고 직접 샘플 생성해보는 샘플링도 rvs를 이용해서 가능하다.

xx = np.linspace(-8,8,100)
pdf = rv.pdf(xx)
plt.plot(xx, pdf)
plt.show()
# -

xx = np.linspace(-8,8,100)
cdf = rv.cdf(xx)
plt.plot(xx, cdf)
plt.show()

# 해당 확률 분포로 랜덤 값 뽑고 싶을 때
sns.distplot(rv.rvs(size=10000, random_state=0))
plt.xlim(-8, 8)
plt.show()

StarcoderdataJupyterScriptsDedupFiltered