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

# # Conceptos básicos
#
# ## Experimento aleatorio
#
# <l class = "definition">Experimento aleatorio. </l> Experimento que efectuado en las mismas condiciones puede dar lugar a resultados diferentes
#
# <l class = "definition">Suceso elemental. </l> Cada uno de los posibles resultados del experimento aleatorio
#
# <l class = "definition">Espacio muestral. </l> Conjunto $\Omega$ formado por todos los sucesos elementales del experimento aleatorio
#
# <div class = "example">
# **Ejemplo**
#
# Lanzar una moneda es un experimento aleatorio
#
# Los sucesos elementales son: sacar cara ($C$) y sacar cruz ($+$)
#
# El espacio muestral de este experimento aleatorio es $\Omega = \{C,+\}$
# </div>
#
# ## Sucesos
#
# <l class = "definition">Suceso. </l> Subconjunto del espacio muestral
#
# <l class = "definition">Suceso total o seguro. </l> $\Omega$
#
# <l class = "definition">Suceso vacío o imposible. </l> $\emptyset$
#
# <div class = "example">
# **Ejemplo**
#
# Lanzar un dado es un experimento aleatorio
#
# Algunos sucesos podrían ser: sacar número par ($\{2,4,6\}$), sacar mayor que 4 ($\{5,6\}$), sacar número múltiplo de 3 ($\{3,6\}$)...
#
# El suceso total de este experimento aleatorio es $\Omega = \{1,2,3,4,5,6\}$
#
# Un ejemplo de suceso imposible de este experimento aleatorio es $\emptyset = \{7\}$ (sacar 7)
# </div>
#
#
# ## Sucesos
#
# <l class = "prop">Operaciones con sucesos. </l> Sean $A,B\subseteq \Omega$ sucesos. Entonces,
#
# - $A\cup B$ es el suceso unión (resultados pertenecen a $A$, o a $B$, o a ambos)
# - $A\cap B$ es el suceso intersección (resultados pertenecen a $A$ y $B$)
# - $A^c$ es el suceso complementario (resultados que no pertenecen a $A$)
# - $A-B = A\cap B^c$ es el suceso diferencia (resultados que pertenecen a $A$ pero no a $B$)
#
# <l class = "definition">Sucesos incompatibles. </l> Si $A\cap B = \emptyset$
#
# ## Probabilidad
#
# <l class = "definition">Probabilidad de un suceso. </l>Número entre 0 y 1 (ambos incluidos) que mide la expectativa de que se dé este suceso
#
# <div class = "example">
# **Ejemplo**
#
# - La probabilidad de sacar un 6 al lanzar un dado estándar no trucado es $\frac{1}{6}$
# - La probabilidad de sacar un 6 al lanzar un dado de 4 caras es $0$
# - La probabilidad de sacar un 6 al lanzar un dado de 20 caras es $\frac{1}{20}$
#
# </div>
#
# <div class = "aligncenter">
# ![](Imgs/dado.png)
# </div>
#
# ## Probabilidad
#
# <l class = "definition">Probabilidad. </l> Sea $\Omega$ el espacio muestral de un experimento aleatorio. Suponiendo que $\Omega$ es **finito**, una probabilidad sobre $\Omega$ es una aplicación $$p: \mathcal{P}(\Omega)\longrightarrow [0,1]$$ que satisface
#
# - $0\le p(A)\le 1 \ \forall A\in\mathcal{P}(\Omega)$
# - $p(\Omega) = 1$
# - Si $\{A_1,\dots,A_n\}$ son sucesos incompatibles dos a dos ($A_i\cap A_j=\emptyset \ \forall i\ne j$), entonces $$p(A_1\cup\cdots \cup A_n)=p(A_1)+\cdots+p(A_n)$$
#
# <l class = "important">Notación: </l> Si $a\in\Omega$, escribiremos $p(a)$ en vez de $p(\{a\})$
#
# # Variables aleatorias
#
# ## Variable aleatoria
#
# <l class = "definition">Variable aleatoria. </l> Una variable aleatoria (v.a.) sobre $\Omega$ es una aplicación $$X: \Omega\longrightarrow \mathbb{R}$$ que asigna a cada suceso elemental $\omega$ un número real $X(\omega)$ 
#
# Puede entenderse como una descripción numérica de los resultados de un experimento aleatorio
#
# <l class = "definition">Dominio de una variable aleatoria. </l> $D_X$, es el conjunto de los valores que puede tomar
#
# ## Sucesos de variables aleatorias
#
# Una variable aleatoria puede definir sucesos, de los cuales queremos conocer la probabilidad $p$
#
# - $p(X=a) = p(\{\omega\in\Omega \ |\  X(\omega) = a\})$
# - $p(X<b) = p(\{\omega\in\Omega \ |\  X(\omega) < b\})$
# - $p(X\le b) = p(\{\omega\in\Omega \ |\  X(\omega) \le b\})$
# - $p(a<X) = p(\{\omega\in\Omega \ |\  a<X(\omega)\})$
# - $p(a\le X) = p(\{\omega\in\Omega \ |\  a\le X(\omega)\})$
# - $p(a\le X\le b) = p(\{\omega\in\Omega \ |\  a\le X(\omega) \le b\})$
# - $p(a< X< b) = p(\{\omega\in\Omega \ |\  a< X(\omega) < b\})$
# - $p(X\in A) = p(\{\omega\in\Omega \ |\  X(\omega)\in A\})$
#
# ## Función de distribución
#
# <l class = "definition">Función de distribución de la v.a. $X$.</l> Es una función  $$F:\mathbb{R}\longrightarrow [0,1]$$ definida por $F(x)=p(X\le x)$
#
#
# Sea $F$ una función de distribución de una v.a. $X$ y digamos $$F(a^-)=\lim_{x\rightarrow a^-}F(x)$$
#
# - $p(X\le a)=F(a)$
# - $p(X<a)=\lim_{b\rightarrow a,\  b<a}p(X\le b) = \lim_{b\rightarrow a,\  b<a} F(b) = F(a^-)$
# - $p(X=a) = p(X\le a)-p(X<a)=F(a)-F(a^-)$
# - $p(a\le X\le b) = p(X\le b)-p(X< a)=F(b)-F(a^-)$
#
# ## Cuantiles
#
# <l class = "definition">Cuantil de orden $p$ de una v.a. $X$.</l> Es el $x_p\in\mathbb{R}$ más pequeño tal que $F(x_p)\ge p$
#
# Nótese que la mediana es el cuantil de orden 0.5
#
# # Variables aleatorias discretas
#
# ## Variable aleatoria discreta
#
# <l class = "definition">Variable aleatoria discreta.</l> Una v.a. $X:\Omega\longrightarrow \mathbb{R}$ es discreta cuando $D_X$ es finito o un subconjunto de $\mathbb{N}$ 
#
# <l class = "definition">Función de probabilidad.</l> Es la función $f:\mathbb{R}\longrightarrow[0,1]$ definida por $$f(x) = p(X=x)$$
#
# Nótese que $f(x)=0$ si $x\not\in D_X$. Por tanto, interpretaremos la función de probabilidad como la función $$f:D_X\longrightarrow [0,1]$$
#
# ## Esperanza
#
# <l class = "definition">Esperanza de una v.a. discreta.</l> Sea $f:D_X\longrightarrow[0,1]$ la función de probabilidad de $X$, entonces la esperanza respecto de la función de probabilidad es la suma ponderada de los elementos de $D_X$, multiplicando cada elemento $x$ de $D_X$ por su probabilidad, $$E(X) = \sum_{x\in D_X}x\cdot f(x)$$
#
# Si $g:D_X\longrightarrow \mathbb{R}$ es una aplicación $$E(g(X))=\sum_{x\in D_X}g(x)\cdot f(x)$$
#
#
# ## Varianza
#
# <l class = "definition">Varianza de una v.a. discreta.</l> Sea $f:D_X\longrightarrow[0,1]$ la función de probabilidad de $X$, entonces la varianza respecto de la función de probabilidad es el valor esperado de la diferencia al cuadrado entre $X$ y su valor medio $E(X)$, $$Var(X)= E((X-E(X))^2) $$
#
# La varianza mide como de variados son los resultados de $X$ respecto de la media
#
# <div class = "exercise"> **Ejercicio.** Demostrar la siguiente igualdad. $$Var(X)= E(X^2)-(E(X))^2$$</div>
#
# ## Varianza
#
# Si $X$ es una v.a. discreta y $g:D_X\longrightarrow \mathbb{R}$ una función, $$Var(g(X))=E((g(X)-E(g(X)))^2)=E(g(X)^2)-(E(g(X)))^2$$
#
# ## Desviación típica
#
# <l class = "definition">Desviación típica de una v.a. discreta.</l> Sea $f:D_X\longrightarrow[0,1]$ la función de probabilidad de $X$, entonces la desviación típica respecto de la función de probabilidad es $$\sigma(X)=\sqrt{Var(X)}$$
#
# Las unidades de la varianza son las de $X$ al cuadrado. En cambio, las de la desviación típica son las mismas unidades que las de $X$
#
# Si $X$ es una v.a. discreta y $g:D_X\longrightarrow \mathbb{R}$ una función, $$\sigma(g(X))=\sqrt{Var(g(X))}$$
#
# # Distribuciones de probabilidad
#
# ## Distribución de probabilidad
#
# <l class = "definition">[Distribución de probabilidad](https://es.wikipedia.org/wiki/Distribución_de_probabilidad).</l> En teoría de la probabilidad y estadística, la distribución de probabilidad de una variable aleatoria es una función que asigna a cada suceso definido sobre la variable la probabilidad de que dicho suceso ocurra.
#

# ## Distribuciones en `Python`
#
# Dada cualquier variable aleatoria, en `Python` tenemos las mismas cuatro funciones, sin que su nombre dependa de la misma:
#
# - `pmf(k,...)` o `pdf(x,...)`: Función de probabilidad $f(k)$ o de densidad $f(x)$ de la variable aleatoria para los valores $k$ o $x$ del dominio.
# - `cdf(x,...)`: Función de distribución $F(x)$ de la variable aleatoria para el valor $k$ del dominio.
# - `ppf(p,...)`: Cuantil $p$-ésimo de la variable aleatoria (el valor de $x$ más pequeño tal que $F(x)\geq p$).
# - `rvs(size,...)`: Generador de $size$ observaciones siguiendo la distribución de la variable aleatoria.
#
# También vale la pena conocer la función `stats(moments='mvsk')` que nos devuelve cuatro valores con los estadísticos de la media `m`, la varianza `v`, el sesgo `s` y la curtosis `k` de la distribución.
#
# # Distribuciones discretas más conocidas
#
# ## Distribuciones discretas 
#
# - [Bernoulli](https://es.wikipedia.org/wiki/Distribución_de_Bernoulli)
# - [Binomial](https://es.wikipedia.org/wiki/Distribución_binomial)
# - [Geométrica](https://es.wikipedia.org/wiki/Distribución_geométrica)
# - [Hipergeométrica](https://es.wikipedia.org/wiki/Distribución_hipergeométrica)
# - [Poisson](https://es.wikipedia.org/wiki/Distribución_de_Poisson)
# - [Binomial Negativa](https://es.wikipedia.org/wiki/Distribución_binomial_negativa)

# ## Distribuciones de Probabilidad

# #### **Distribucion de Bernoulli**: es una distribución de probabilidad discreta.
#
# Toma valor 1 para la probabilidad de éxito $p$ y valor 0 para la probabilidad de fracaso $q = 1 - p$
#
# Si $X$ es variable aleatoria que mide el "numero de exitos" y se realiza un unico experimento con dos posibles resultados (exito, que toma valor de 1, o fracaso, que toma el valor de 0), diremos que $X$ se distribuye como una Bernoulli con parametro $p$:
#
# $X$ ~ $Be(p)$
#
# donde $p$ es la probabilidad de exito y que $q = 1 - p$ es la probabilidad de fracaso.
#
# * El dominio de $X$ sera $X(\Omega) = {0,1}$
# * La funcion de probabilidad vendra por:
#
# $$    
# f(k) = p^k(1-p)^{1-k} = \left\{
# \begin{array}{rl}
#         p & \text{si } k=1
#         \\ 1-p & \text{si } k=0
#         \\ 0& \text{en cualquier otro caso}
# \end{array}
# \right.
# $$

# Ejemplo: tirar una moneda y que salga cara o cruz, es exito o fracaso. 
#
# La distribucion vendra dada por:
#
# $$    
# f(k)  = \left\{
# \begin{array}{rl}
#       0 & \text{si } \ k < 0\\
#       q & \text{si } \ 0 ≤  k < 1 \\
#       1 & \text{si } \ k ≥ 1
# \end{array}
# \right.
# $$
#
# * Esperanza $E(X) = p$
# * Varianza $Var(X) = pq$
#
# #### Funcion de densidad:
#
#
#
# $$f(k) = p^k(1-p)^{1-p},\ k\in \{0,1\}$$
#
# ## Distribución de Bernoulli
#
# El código de la distribución de Beroulli:
#
# - En `R` tenemos las funciones del paquete `Rlab`: `dbenr(x,prob), pbenr(q,prob), qbenr(p,prob), rbenr(n, prob)` donde `prob` es la probabilidad de éxito.
# - En `Python` tenemos las funciones del paquete `scipy.stats.bernoulli`: `pmf(k,p), cdf(k,p), ppf(q,p), rvs(p, size)` donde `p` es la probabilidad de éxito.

# ### Experimentos de probabilidad:

# ### Ejemplo:
#
# Sea $X = Be(p =0.7)$, la distribucion que modela la probabilidad de obtener una cara usando una moneda trucada (se puede usar tambien para saber si aprobar un examen o no, si tener una enfermedad o no, etc.).

from scipy.stats import bernoulli
import matplotlib.pyplot as plt

p = 0.7

bernoulli.pmf(1, p) # probabilidad de obtener un exito.

bernoulli.pmf(0, p) # probabilidad de obtener un fracaso. 

bernoulli.cdf(1, p) # probabilidad acumulada de obtener un exito.

bernoulli.cdf(0, p) # probabilidad acumulada de obtener un fracaso. 

bernoulli.ppf(0.25, p) # el 25% de los datos o menos tendran un fracaso

bernoulli.ppf(0.50, p) # el 50% de los datos o menos tendran un exito

bernoulli.ppf(0.75, p) # el 75% de los datos o menos tendran un exito

bernoulli.ppf(1, p) # el 100% de los datos o menos tendran un exito.

mean, var, skew, kurt = bernoulli.stats(p, moments = 'mvsk')

print("Media %f"% mean) # es el valor que mas se repite. 
print("Varianza %f"% var)
print("Sesgo %f"% skew) # sesgo a la izquierda. 
print("Curtosis %f"% kurt)

# +
fix, ax = plt.subplots(1,1)
x = bernoulli.rvs(p, size = 1000)
ax.plot(x)
plt.show()

# valor relleno es un exito y un valor vacio es un fracaso. 
# -

# #### Ejemplo con muestras y tamanos: 

fix, ax = plt.subplots(1,1)
x = bernoulli.rvs(p, size = 1000)
ax.hist(x)
plt.show()

# #### **Distribucion Binomial** es una distribución de probabilidad discreta.
#
# Nos dice el porcentaje en que es probable obtener un resultado entre dos posibles al realizar un número n de pruebas. 
#
# Si $X$ es variable aleatoria que mide el "numero de exitos" y se realizan $n$ ensayos de Bernoulli independientes entre si, diremos que $X$ se distribuye como una Binomial con parametros $n$ y $p$.
#
# $X$ ~ $B(n,p)$
#
# donde $p$ es la probabilidad de exito y $q = 1-p$ es la probabilidd de frascaso.
#
# * El domonio de $X$ sera $D_{X} = {0,1,2,..., n}$
# * La funcion de densidad vendra dada por:
#
# $$f(k) = (\frac{n}{k})p^{k}(1-p)^{n-k}$$
# En este caso, la probabilidad puede ser 1, 2, 3, ..., n. 
#
# - La **función de distribución** vendrá dada por 
#
# $$F(x) = \left\{
# \begin{array}{cl}
#      0 & \text{si } x<0 
#   \\ \sum_{k=0}^xf(k) & \text{si } 0\le x<n
#   \\ 1 & \text{si } x\ge n
# \end{array}
# \right.$$
#
#
# - **Esperanza** $E(X) = np$
# - **Varianza** $Var(X) = npq$
#
# <l class = "important">Atención.</l> Observar que la distribución de Bernoulli es un caso particular de la Binomial. Basta tomar $n=1$ y tendremos que $X\sim \text{Be}(p)$ y $X\sim\text{B}(1,p)$ son equivalentes.
#
# ## Distribución Binomial
#
# El código de la distribución Binomial:
#
# - En `R` tenemos las funciones del paquete `Rlab`: `dbinom(x, size, prob), pbinom(q,size, prob), qbinom(p, size, prob), rbinom(n, size, prob)` donde `prob` es la probabilidad de éxito y `size` el número de ensayos del experimento.
# - En `Python` tenemos las funciones del paquete `scipy.stats.binom`: `pmf(k,n,p), cdf(k,n,p), ppf(q,n,p), rvs(n, p, size)` donde `p` es la probabilidad de éxito y `n` el número de ensayos del experimento.
#
#

# #### Ejemplo:

# Teniendo una n de 7 experimentos y una probabilida de 0.4, calcular las probabilidad asociadas:

# +
from scipy.stats import binom
import numpy as np

ig, ax = plt.subplots(1,1)
n = 7
p = 0.4

mean, var, skew, kurt = binom.stats(n, p, moments = 'mvsk')

print("Media %f"% mean) # es el valor que mas se repite. 
print("Varianza %f"% var)
print("Sesgo %f"% skew) # sesgo a la derecha, positivo.
print("Curtosis %f"% kurt) # tiene una concentracion de datos y luego baja a la derecha. 

x = np.arange(0, n+1) # n+1 porque python empieza en 0. 
ax.plot(x, binom.pmf(x,n,p), 'bo', ms = 8, label = 'Funcion de densidad de B(7,0.4)')
ax.vlines(x, 0, binom.pmf(x,n,p), colors = 'b', lw = 4, alpha = 0.5)

rv = binom(n,p)
ax.vlines(x,0,rv.pmf(x), colors = "k", linestyles = "--", lw = 1, label = "Distribucion teorica")

ax.legend(loc = "upper left", frameon = False)

plt.show()
# -

r = binom.rvs(n, p, size = 10)
print(r) # los valores aleatorios obtenidos de rango 1 a 7. 

fix,ax = plt.subplots(1,1)
r = binom.rvs(n,p, size = 10000)
ax.hist(r, bins = n)
plt.show()

# #### Ejemplo 2:

# Teniendo una n de 11 experimentos y una probabilida de 0.5, calcular las probabilidad asociadas: (recordar que en este caso se tiene que para 11 experimentos sacar los numeros (valores de exitos) con la misma probabilidad de salir y siendo independientes entre ellos). 

n = 11 # probabilidad de exitos a obtener
p = 0.5 # probabilidad asociada
k = np.arange(0, 77)

# +
binom.pmf(k, n, p)
# Recordar que: 

# Para n =1, hay una probabilidad de obtener 0.00048828, para n = 2, 0.00537109 (...)

# +
binom.cdf(k, n, p)

# Recordar que esta es la funcion de probabilidad acumulada: 

# Para n =1, hay una probabilidad de obtener 4.88281250e-04, para n = 2, 5.85937500e-03 (...)
# -

binom.ppf(0.25, n, p) # el 25% del experimento es o esta por debajo de 4 exitos. 

binom.ppf(0.5, n, p) # el 50% del experimento es o esta por debajo de 6 exitos. 

binom.rvs(n, p, size = 20) # asi se obtienen los valores independientes y con la misma probabilidad

# +
fix,ax = plt.subplots(1,1)
plt.title("Probabilidades de X cantidad de numeros independientes")
r = binom.rvs(n,p, size = 20)
ax.hist(r, bins = n)
plt.show()

# Representaciomn grafica 
# -

# #### **Distribución Geométrica** distribucion de probabilidad discreta:
#
# Si $X$ es variable aleatoria que mide el "número de repeticiones independientes del experimento hasta haber conseguido éxito", diremos que $X$ se distribuye como una Geométrica con parámetro $p$
#
# $$X\sim \text{Ge}(p)$$
# donde $p$ es la probabilidad de éxito y $q = 1-p$ es la probabilidad de fracaso
#
# - El **dominio** de $X$ será $D_X= \{0,1,2,\dots\}$ o bien $D_X = \{1,2,\dots\}$ en función de si empieza en 0 o en 1, respectivamente
#
# - La **función de probabilidad** vendrá dada por $$f(k) = (1-p)^{k}p \qquad\text{ si empieza en 0}$$
# $$f(k) = (1-p)^{k-1}p \qquad\text{ si empieza en 1}$$
#
# ### Ejemplo: 
#
# Recordar que esta funcion se modela por la probabilidad de exito asociada, entonces un ejemplo puede ser:
#
# 1. Si una persona esta ebria, y anda un juego de llaves y tiene n cantodad de llaves, entonces tienen que probar n veces hasta tener un exito. Sin embargo, tener cuidado porque se puede probar 500 veces y hay un fallo, pero se prueba 100 mas y hay fallo, entonces no hay exito.
# 2. Cuando una pareja intenta quedar embarazada, el exito va a estar modelado por cuando la mujer logre quedar embarazada. 
#
#
# #### Distribución Geométrica
#
# - La **función de distribución** vendrá dada por 
#
# $$F(x) = \left\{
# \begin{array}{cl}
#      0 & \text{si } x<0 
#   \\ 1-(1-p)^{k+1} & \text{si } k\le x<k+1,\ k\in\mathbb{N}
# \end{array}
# \right.$$ 
#
#
# - **Esperanza** $E(X) = \frac{1-p}{p}$ si empieza en 0 y E$(X) = \frac{1}{p}$ si empieza en 1
# - **Varianza** $Var(X) = \frac{1-p}{p^2}$
# - <l class = "prop">Propiedad de la falta de memoria.</l> Si $X$ es una v.a. $\text{Ge}(p)$, entonces, $$p\{X\ge m+n:\ X\ge n\} = p\{X\ge m\}\ \forall m,n=0,1,\dots$$
#
#
# #### Distribución Geométrica
#
# El código de la distribución Geométrica:
#
# - En `R` tenemos las funciones del paquete `Rlab`: `dgeom(x, prob), pgeom(q, prob), qgeom(p, prob), rgeom(n, prob)` donde `prob` es la probabilidad de éxito  del experimento.
# - En `Python` tenemos las funciones del paquete `scipy.stats.geom`: `pmf(k,p), cdf(k,p), ppf(q,p), rvs(p, size)` donde `p` es la probabilidad de éxito del experimento.

from scipy.stats import geom

# +
fig, ax = plt.subplots(1,1)

p = 0.3

mean, var, skew, kurt = binom.stats(n, p, moments = 'mvsk')

print("Media %f"% mean) # en promedio hay que probar 3.30 veces hasta acertar
print("Varianza %f"% var) # la varianza es de 2.31
print("Sesgo %f"% skew) # sesgo positivo a la derecha
print("Curtosis %f"% kurt) #curtosis negativa 

x = np.arange(geom.ppf(0.01, p), geom.ppf(0.99, p))
ax.plot(x, geom.ppf(x,p), 'bo', ms = 8, label = 'Funcion de probabilidad de Geom(0.3)')
ax.vlines(x, 0, geom.pmf(x, p), colors = 'b', lw = 4, alpha = 0.5)

rv = geom(p)
ax.vlines(x, 0, rv.pmf(x), colors = 'k', linestyles = "--", lw = 1, label = "Frozen PMF")
ax.legend(loc = "best")
plt.show()

# +
fig, ax = plt.subplots(1,1)
prob = geom.cdf(x,p)
ax.plot(x, prob, 'bo', ms = 8, label = "Funcion de distribucion acumulada")
plt.show()

# Funcion de probabilidad acumulada
# -

fig, ax = plt.subplots(1,1)
plt.title("Distribucion de probabilidades Geometrica")
r = geom.rvs(p, size = 10000)
plt.hist(r)
plt.show()

# #### Ejemplo 3: 
#
# Teniendo una $k$ de dominio [0,45] y una probabilidad de 0.35, calcular las probabilidad asociadas:

p = 0.35
k = np.arange(0,45)

geom.pmf(k,p) # esto da las probabilidades de exito para cada uno de los intentos. 

geom.cdf(k,p) # Probabilidades acumuladas de exito para las distribucione. 
# Atencion: a partir del intento 12 es cuando se empieza a ver una mejoria. 

geom.ppf(0.25, p) # el 25% de los datos o menos hay una probabilidad de exito de 1. 

geom.ppf(0.50, p) # el 50% de los datos o menos registra una probabilidad de exito de 2.

geom.ppf(0.75, p)  # el 75% de los datos o menos registra una probabilidad de exito de 4.

geom.ppf(1, p) # el 100% de los datos o menos registra una probabilidad de exito inf. 

# +
media = geom.rvs(p, size = 17) # Podemos observar que en muchas ocasiones solo tuvo que intentar una vez, lo que 
# lo hace experimentos mas certeros. 

# Comprobemos la media del experimento
# -

media.mean() # en promedio la cantidad de veces que tiene que intentar hasta obtener un exito es 2.88 veces.

media.std() # la desviacion de los datos con respecto a la media es de 1.64 intentos. 

# #### **Distribución Hipergeométrica** es una distribución discreta relacionada con muestreos aleatorios y sin reemplazo.
#
# Consideremos el experimento "extraer a la vez (o una detrás de otra, sin retornarlos) $n$ objetos donde hay $N$ de tipo A y $M$ de tipo B". Si $X$ es variable aleatoria que mide el "número de objetos del tipo A", diremos que $X$ se distribuye como una Hipergeométrica con parámetros $N,M,n$
# $$X\sim \text{H}(N,M,n)$$
#
# - El **dominio** de $X$ será $D_X = \{0,1,2,\dots,N\}$ (en general)
# - La **función de probabilidad** vendrá dada por 
#
# $$f(k) = \frac{{N\choose k}{M\choose n-k}}{N+M\choose n}$$
#
# Por ejemplo: se tiene una bolsa o una caja y se tienen objetos de dos tipos, entonces contabiliza la cantidad de $n$ objetos extraidos y sin retornarlos. Donde podemos obtener un objeto A y de B, solo de A, o solo de B y con $n$ combinatorias conocidas. Este es un problema tradicional de combinatorias. Aunque se trabaka tradicionalmente con bolas, se puede aplicar a infinidad de escenarios, como peces (diferentes especies) o diversos animales, diversos tipos de zapatos, diversos tipos de monedas, etc. 
#
# #### Distribución Hipergeométrica
#
# - La **función de distribución** vendrá dada por $$F(x) = \left\{
# \begin{array}{cl}
#      0 & \text{si } x<0 
#   \\ \sum_{k=0}^xf(k) & \text{si } 0\le x<n
#   \\ 1 & \text{si } x\ge n
# \end{array}
# \right.$$
# - **Esperanza** $E(X) = \frac{nN}{N+M}$ 
# - **Varianza** $Var(X) = \frac{nNM}{(N+M)^2}\cdot\frac{N+M-n}{N+M-1}$
#
# #### Distribución Hipergeométrica
#
# El código de la distribución Hipergeométrica:
#
# - En `R` tenemos las funciones del paquete `Rlab`: `dhyper(x, m, n, k), phyper(q,  m, n, k), qhyper(p,  m, n, k), rhyper(nn,  m, n, k)` donde `m` es el número de objetos del primer tipo, `n` el número de objetos del segundo tipo y `k` el número de extracciones realizadas.
# - En `Python` tenemos las funciones del paquete `scipy.stats.hypergeom`: `pmf(k,M, n, N), cdf(k,M, n, N), ppf(q,M, n, N), rvs(M, n, N, size)` donde `M` es el número de objetos del primer tipo, `N` el número de objetos del segundo tipo y `n` el número de extracciones realizadas.
#
#

from scipy.stats import hypergeom

[M, n, N] = [20, 7, 12]
rv = hypergeom(M, n, N)
x = np.arange(0, n+1)
y = rv.pmf(x)

# +
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'bo')
ax.vlines(x, 0, y, lw = 2, alpha = 0.5)
ax.set_xlabel("Numero de perros entre los 12 elegidos al azar")
ax.set_ylabel("Distribicion de probabilida de una H(12, 7, 12)")
plt.show()

# La probabilida de que salgan 0 es casi nula, hay mas probabilidad de que salgan 4. 

# +
mean, var, skew, kurt = rv.stats(moments = 'mvsk')

print("Media %f"% mean) # en promedio se pueden sacar 4.20 perros
print("Varianza %f"% var) # la varianza es de 1.14
print("Sesgo %f"% skew) # sesgo negativo a la izquierda. 
print("Curtosis %f"% kurt) #curtosis negativa, ya que tiene un ligero pico
# -

# #### Ejemplo 4: 
#
# Supongamos que en una caja tenemos 30 animales y de esos 30, 11 son perros, entonces queremos medir la probabilidad de encontrar un numero determinado de perros si elegimos $x=9$ animales al azar.

[M, n, N] = [30, 11, 9]
k = np.arange(0, 30)

hypergeom.pmf(k, M, n, N)
# La probabilidad de sacar en el intento 0, elijamos perros es de 6.45677161e-03, en el intento 1 es de 
# 5.81109445e-02, en el intento 2 es de 1.93703148e-01 y asi consecutivamente. 

hypergeom.cdf(k, M, n, N) # La probabilidad acumulada de obtener en el intento 0 perros es de: 0.00645677
# en el intento 1 es de 0.06456772, en el dos es de 0.25827086 y asi consecutivamente. 

hypergeom.ppf(0.25, M, n, N) # en el primer cuartil podemos encontrar 2 perros o menos. 

hypergeom.ppf(0.50, M, n, N) # en la mediana podemos encontrar 3 perros o menos. 

hypergeom.ppf(0.75, M, n, N) # en el tercer cuartil podemos encontrar 4 perros o menos.

hypergeom.rvs(M, n, N, size = 100)
# estas serian las probabilidad haciendo 100 intentos aleatorios de exttaccion, por ejemplo, 
# en el intento 0, podemos encontrar 4 perros, en el 1, 5, en el 2 4 y asi sucesivamente. 

# #### **Distribución de Poisson** es una distribución de probabilidad discreta. 
#
#
# Si $X$ es variable aleatoria que mide el "número de eventos en un cierto intervalo de tiempo", diremos que $X$ se distribuye como una Poisson con parámetro $\lambda$
#
# $$X\sim \text{Po}(\lambda)$$
# donde $\lambda$ representa el número de veces que se espera que ocurra el evento durante un intervalo dado
#
# - El **dominio** de $X$ será $D_X = \{0,1,2,\dots\}$
#
# - La **función de probabilidad** vendrá dada por $$f(k) = \frac{e^{-\lambda}\lambda^k}{k!}$$
#
# #### Ejemplo:
#
# El numero de personas por unidad de tiempo, por ejemplo el numero de personas que entran a una tienda por cada minuto/hora. 
#
# El numero de errores que hay por cada pagina en un libro. 
#
# #### Distribución de Poisson
#  
# - La **función de distribución** vendrá dada por $$F(x) = \left\{
# \begin{array}{cl}
#      0 & \text{si } x<0 
#   \\ \sum_{k=0}^xf(k) & \text{si } 0\le x<n
#   \\ 1 & \text{si } x\ge n
# \end{array}
# \right.$$ 
# - **Esperanza** $E(X) = \lambda$
# - **Varianza** $Var(X) = \lambda$

from scipy.stats import poisson

# +
fig, ax = plt.subplots(1,1)
mu = 0.8 # (0.8 errores por pagina)

print("Media %f"% mean) # en promedio hay 0.8 errores por pagina
print("Varianza %f"% var) # la varianza es de 0.8 por pagina
print("Sesgo %f"% skew) # sesgo positivo a la derecha
print("Curtosis %f"% kurt) # curtosis positiva ya no es tan puntiaguada la distribucion

mean, var, skew, kurt = poisson.stats(mu, moments = 'mvsk')
x = np.arange(0, 12)
ax.plot(x, poisson.pmf(x, mu), 'bo', ms = 8, label = 'Funcion de Poisson (0.8)')
ax.vlines(x, 0, poisson.pmf(x, mu), colors = 'b', lw = 4, alpha = 0.5)
ax.legend(loc = 'best', frameon = False)
plt.show()
# -

# #### Ejemplo 5: 
#
# Suponga que se quiere saber la probabilidad de clientes que entran a una tienda cada 10 minutos. 
#
# Para ello tenemus que $\mu = 3$
#
# Calcule todos los tipos de probabilidad:

# +
mu = 3
k = np.arange(0, 10)
poisson.pmf(k, mu)

# La probabilidad de que entren 3 clientes en 10 minutos para el minuto 0 es de 0.04978707, en el minuto 1: 0.14936121, en el 2:
# 0.22404181 etc. 
# -

poisson.cdf(k, mu) # la distribucion acumulada, la podemos plotear para ver que nos puede decir. 

plt.hist(poisson.cdf(k, mu))
plt.title("Distribucion de Poisson Acumulada (0.3)")
plt.show()

poisson.ppf(0.25, mu) # en el 25% del tiempo van a entrar 2 clientes o menos.

poisson.ppf(0.75, mu) # en el 75% del tiempo van a entrar 4 clientes o menos. 

data = poisson.rvs(mu, size = 250)
print(data) # numeros aleatorios de veces que pueden entrar personas a una tienda en 250 minutos. 

plt.hist(data)

# #### **Distribución Binomial Negativa** distribucion de probabilidad discreta. 
#
# Si $X$ es variable aleatoria que mide el "número de repeticiones hasta observar los $r$ éxitos en ensayos de Bernoulli", diremos que $X$ se distribuye como una Binomial Negativa con parámetros $r$ y $p$, $$X\sim\text{BN}(r,p)$$ donde $p$ es la probabilidad de éxito.
#
# Mide la cantidad de exitos $r$ y probabilidad de exito en $p$.
#
# - El **dominio** de $X$ será $D_X = \{r, r+1, r+2,\dots\}$
# - La **función de probabilidad** vendrá dada por $$f(k) = {k-1\choose r-1}p^r(1-p)^{k-r}, k\geq r$$
#
# Ejemplo 1: caja de cerillas de Banach. 
# Ejemplo 2: Tenemos dos cajas de cigarrillos, una de cada lado en cada uno de los bolsillos de nuestro pantalon, cuando nos acabamos una caja de cigarrillos, cuantos cigarrillos nos quedan en la restante. 
#
#
# #### Distribución Binomial Negativa
#  
# - La **función de distribución** no tiene una expresión analítica. 
# - **Esperanza** $E(X) = \frac{r}{p}$
# - **Varianza** $Var(X) = r\frac{1-p}{p^2}$
#
# #### Distribución Binomial Negativa
#
# ```{r, echo = FALSE}
# par(mfrow = c(1,2))
# exitos = 5
# size = 20
# plot(c(rep(0,exitos),exitos:(size+exitos)), c(rep(0,exitos),dnbinom(0:size,exitos,0.5)),col = "purple", xlab = "", ylab = "", main = "Función de probabilidad de una BN(5, 0.5)")
# plot(c(rep(0,exitos),exitos:(size+exitos)), c(rep(0,exitos),pnbinom(0:size,exitos,0.5)),col = "purple", xlab = "", ylab = "", main = "Función de distribución de una BN(5, 0.5)")
# par(mfrow= c(1,1))
# ```
#
# #### Distribución  Binomial Negativa
#
# El código de la distribución Binomial Negativa:
#
# - En `R` tenemos las funciones del paquete `Rlab`: `dnbinom(x, size, prop), pnbinom(q, size, prop), qnbinom(p, size, prop), rnbinom(n, size, prop)` donde `size` es el número de casos exitosos y `prob` la probabilidad del éxito.
# - En `Python` tenemos las funciones del paquete `scipy.stats.nbinom`: `pmf(k,n,p), cdf(k,n,p), ppf(q,n,p), rvs(n,p)` donde `n`es el número de casos exitosos y `p` la probabilidad del éxito.
#
# #### Ejemplo 6: 
#
# Supongamos que tenemos dos cajas de bolas y cada una de ellas tienen 120 bolitas, calcule cuanta es la probabilidad de que en una caja queden 5 bolitas despues de sacar cantidades al azar de ellas, con una probabilidad dada de 0.4. 

from scipy.stats import nbinom

# +
k = np.arange(0,120)
n = 5
p = 0.4

mean, var, skew, kurt = binom.stats(n, p, moments = 'mvsk')

print("Media %f"% mean) # en promedio hay que probar 3.30 veces hasta acertar
print("Varianza %f"% var) # la varianza es de 2.31
print("Sesgo %f"% skew) # sesgo positivo a la derecha
print("Curtosis %f"% kurt) #curtosis negativa 
# -

caja = nbinom.pmf(k, n, p) # la probabilidad en el intento 0 es de 1.02400000e-02, en el 1 es de 3.07200000e-02 (...)
print(caja)

plt.hist(caja)
plt.title("Distribucion por cada intento binomial negativa")
plt.show()

bino = nbinom.cdf(k, n, p)  # a partir del intento 6 se ve que hay mayor probabilidad. 
bino

plt.hist(bino)
plt.title("Distribucion acumulada binomial negativa")
plt.show()

nbinom.ppf(0.25, n, p) # en el primer cuartil el 25% de los datos o menos van a tener 4 exitos. 

nbinom.ppf(0.75, n, p)  # en el tercer cuartil el 75% de los datos o menos van a tener 10 exitos. 

aleatorio = nbinom.rvs(n, p, size = 100) 

plt.hist(aleatorio)
plt.title("Distribucion de probabilidades binomial (100)")
plt.show()

# ## Distribuciones discretas en R y Python
#
# R y Python conocen las distribuciones de probabilidad más importantes.
#
# Distribución |  Instrucción en R  |  Instrucción en Python  |  Parámetros                                
# --------------------|--------------------|--------------------|--------------------
# Bernoulli | `bern` | `scipy.stats.bernoulli` | probabilidad de éxito $p$
# Binomial | `binom` | `scipy.stats.binom` | tamaño de la muestra $n$ y probabilidad de éxito $p$
# Geométrica | `geom` | `scipy.stats.geom` | probabilidad de éxito $p$
# Hipergeométrica | `hyper` | `scipy.stats.hypergeom` | $N,M,n$
# Poisson | `pois` | `scipy.stats.poisson` | esperanza $\lambda$
# Binomial Negativa | `nbinom` | `scipy.stats.nbinom` | número de éxitos $r$ y probabilidad de éxito $p$

# # Variables aleatorias continuas
#
# #### Variable aleatoria continua
#
# <l class = "definition">Variable aleatoria continua.</l> Una v.a. $X:\Omega\longrightarrow\mathbb{R}$ es continua cuando su función de distribución $F_X:\mathbb{R}\longrightarrow[0,1]$ es continua
#
# En este caso, $F_X(x)=F_X(x^-)$ y, por este motivo, $$p(X=x)=0\ \forall x\in\mathbb{R}$$
# pero esto no significa que sean sucesos imposibles
#
# #### Función de densidad
#
# <l class = "definition">Función de densidad.</l> Función $f:\mathbb{R}\longrightarrow\mathbb{R}$ que satisface 
#
# - $f(x)\ge 0\ \forall x\in\mathbb{R}$
# - $\int_{-\infty}^{+\infty}f(t)dt=1$
#
# Una función de densidad puede tener puntos de discontinuidad
#
# #### Variable aleatoria continua
#
# Toda variable aleatoria $X$ con función de distribución 
#
# $$F(x)=\int_{-\infty}^{x}f(t)dt\ \forall x\in\mathbb{R}$$ para cualquier densidad $f$ es una v.a. continua
#
# Diremos entonces que $f$ es la función de densidad de $X$
#
# A partir de ahora, considerareos solamente las v.a. $X$ continuas que tienen función de densidad
#
#
# #### Esperanza
#
# <l class = "definition">Esperanza de una v.a. continua.</l> Sea $X$ v.a. continua con densidad $f_X$. La esperanza de $X$ es $$E(X)=\int_{-\infty}^{+\infty}x\cdot f_X(x)dx$$
#
# Si el dominio $D_X$ de $X$ es un intervalo de extremos $a<b$, entonces $$E(X)=\int_a^b x\cdot f_X(x)dx$$
#
# #### Esperanza
#
# Sea $g:D_X\longrightarrow \mathbb{R}$ una función continua. Entonces, 
#
# $$E(g(X)) = \int_{-\infty}^{+\infty}g(x)\cdot f_X(x)dx$$
#
# Si el dominio $D_X$ de $X$ es un intervalo de extremos $a<b$, entonces $$E(g(X))=\int_a^b g(x)\cdot f_X(x)dx$$
#
# #### Varianza
#
# <l class = "definition">Varianza de una v.a. continua.</l> Como en el caso discreto, $$Var(X)=E((X-E(X))^2)$$
#
# y se puede demostrar que
#
# $$Var(X)=E(X^2)-(E(X))^2$$
#
# #### Desviación típica
#
# <l class = "definition">Desviación típica de una v.a. continua.</l> Como en el caso discreto, $$\sigma = \sqrt{Var(X)}$$
#
# #### Distribuciones continuas más conocidas
#
# #### Distribuciones continuas
#
# - [Uniforme](https://es.wikipedia.org/wiki/Distribución_uniforme_continua)
# - [Exponencial](https://es.wikipedia.org/wiki/Distribución_exponencial)
# - [Normal](https://es.wikipedia.org/wiki/Distribución_normal)
# - [Khi cuadrado](https://es.wikipedia.org/wiki/Distribución_χ²)
# - [t de Student](https://es.wikipedia.org/wiki/Distribución_t_de_Student)
# - [F de Fisher](https://es.wikipedia.org/wiki/Distribución_F)

# #### Distribución Uniforme
#
# Una v.a. continua $X$ tiene distribución uniforme sobre el intervalo real $[a,b]$ con $a<b$, $X\sim\text{U}(a,b)$ si su función de densidad es $$f_X(x)=\left\{
# \begin{array}{rl}
#      \frac{1}{b-a} & \text{si } a\le x\le b
#   \\ 0 & \text{en cualquier otro caso}
# \end{array}
# \right.$$
#
# Modela el elegir un elemento del intervalo $[a,b]$ de manera equiprobable
#
# #### Distribución Uniforme
#
# - El **dominio** de $X$ será $D_X = [a,b]$
#
# - La **función de distribución** vendrá dada por $$F_X(x)=\left\{
# \begin{array}{rl}
#     0 & \text{si } x<a
#   \\ \frac{x-a}{b-a} & \text{si } a\le x< b
#   \\ 1 & \text{si } x\ge b
# \end{array}
# \right.$$
#
# - **Esperanza** $E(X) = \frac{a+b}{2}$
# - **Varianza** $Var(X) = \frac{(b-a)^2}{12}$
#
# #### Ejemplo:
#
# Elegir un numero al azar entre $a$ y $b$, es una distribucion uniforme en dicho intervalo porque es equiprobable. 
#
# Posibilidad de mover un jugador en un juego en diferentes tipos de angulos o direcciones. 
#
#
# #### Distribución Uniforme
#
# El código de la distribución Uniforme:
#
# - En `R` tenemos las funciones del paquete `stats`: `dunif(x, min, max), punif(q, min, max), qunif(p, min, max), runif(n,  min, max)` donde `min` y `max` són los extremos de los intervalos de la distribución uniforme.
# - En `Python` tenemos las funciones del paquete `scipy.stats.uniform`: `pdf(k,loc, scale), cdf(k,loc, scale), ppf(q,loc, scale), rvs(n,loc, scaler)` donde la distribución uniforme está definida en el intervalo `[loc, loc+scale]`.

# #### Ejemplo: 
# Supongamos que $X\sim u([0,1])$ entonces podemos estudiar sus parametros:

# +
from scipy.stats import uniform

a = 0
b = 1

loc = a
scale = b-a # recordar que el scale en python es distinto y esta modelado por la escala entre a y b

# +
fig, ax = plt.subplots(1,1)

rv = uniform(loc = loc, scale = scale)
mean, var, skew, kurt = rv.stats(moments = 'mvsk')

print("Media %f"% mean) # Se puede ver que la media es de 0.50 (porque es la mitad entre 0 y 1)
print("Varianza %f"% var) # la varianza es 0.083
print("Sesgo %f"% skew) # el sesgo es nulo
print("Curtosis %f"% kurt) # la curtosis es negativa 


x = np.linspace(-0.1, 1.1, 120) # se generan 120 valores entre los intervalos
ax.plot(x, rv.pdf(x), 'k-', lw = 2, label = 'U(0,1)')
r = rv.rvs(size = 100000)
ax.hist(r, density = True, histtype = "stepfilled", alpha = 0.25)

ax.legend(loc = 'best', frameon = False)
plt.show()

# +
a = 0
b = 1

loc = a
scale = b-a # recordar que el scale en python es distinto y esta modelado por la escala entre a y b
x = x = np.linspace(-0.1, 1.1, 120) 
# -

uniform.pdf(x, loc, scale) # como se puede ver la distribicion es de 0 y 1 esperados. 

uniform.cdf(x, loc, scale) # probabilidades acumuladas

uniform.ppf(0.25, loc, scale) # obviamente el 25% de los datos o menos va a estar en 0.25 

uniform.rvs(loc, scale, size = 40) 

plt.hist(uniform.rvs(loc, scale, size = 100000))
plt.show()

# #### Distribución Exponencial
#
# Una v.a. $X$ tiene distribución exponencial de parámetro $\lambda$, $X\sim\text{Exp}(\lambda)$, si su función de densidad es $$f_X(x)=\left\{
# \begin{array}{rl}
#      0 & \text{si }  x\le 0
#   \\ \lambda\cdot e^{-\lambda x} & \text{si }x>0
# \end{array}
# \right.$$
#
# <l class = "prop">Teorema. </l> Si tenemos un proceso de Poisson de parámetro $\lambda$ por unidad de tiempo, el tiempo que pasa entre dos sucesos consecutivos es una v.a. $\text{Exp}(\lambda)$ 
#
# <l class = "prop">Propiedad de la pérdida de memoria. </l> Si $X$ es v.a. $\text{Exp}(\lambda)$, entonces $$p(X>s+t\ :\ X>s)=p(X>t)\ \forall s,t>0$$
#
# #### Por ejemplo: 
#
# Frecuencia del bus, es decir, el tiempo que espera una persona para tomar un bus; es una exponencial de parametro $\lambda$ (propiedad de falta de memoria). Si una persona tiene que espera el bus 10 minutos, entonces es: $1/\lambda$
#
# #### Distribución Exponencial
#
# - El **dominio** de $X$ será $D_X = [0,\infty)$
#
# - La **función de distribución** vendrá dada por $$F_X(x)=\left\{
# \begin{array}{rl}
#     0 & \text{si } x\le 0
#   \\ 1-e^{-\lambda x} & \text{si } x>0
# \end{array}
# \right.$$
#
# - **Esperanza** $E(X) = \frac{1}{\lambda}$
# - **Varianza** $Var(X) = \frac{1}{\lambda^2}$
#
# #### Distribución Exponencial
#
# El código de la distribución Exponencial:
#
# - En `R` tenemos las funciones del paquete `stats`: `dexp(x, rate), pexp(q, rate), qexp(p, rate), rexp(n,  rate)` donde `rate`$=\lambda$ es el tiempo entre dos sucesos consecutivos de la distribución.
# - En `Python` tenemos las funciones del paquete `scipy.stats.expon`: `pdf(k, scale), cdf(k, scale), ppf(q, scale), rvs(n, scaler)` donde `scale`$=1/\lambda$ es la inversa del tiempo entre dos sucesos consecutivos de la distribución.

# #### Ejemplo: 
#
# Calcule la probabilidad de espera de un bus que pasa cada 3 minutos por el sitio donde usted vive. 

# +
from scipy.stats import expon

fig, ax = plt.subplots(1,1)

lam = 3
rv = expon(scale = 1/lam)

mean, var, skew, kurt = rv.stats(moments = 'mvsk')

print("Media %f"% mean) # la media de espera es de 0.333 
print("Varianza %f"% var) # la varianza es de 0.111
print("Sesgo %f"% skew) # es positivo a la derecha
print("Curtosis %f"% kurt) # es positiva y no es plana

x = np.linspace(0, 3, 1000)
ax.plot(x, rv.pdf(x), 'r-', lw = 5, alpha = 0.6, label = 'Exp(10)')

r = rv.rvs(size = 100000)
ax.hist(r, density = True, histtype = 'stepfilled', alpha = 0.2 )
ax.legend(loc = 'best', frameon = False)
plt.show()
# -

lam = 3
scale = 1/lam
x = np.linspace(0, 10, 30)
expon.pdf(x, scale) # probabilidad de que pase un bus cada 3 minutos durante 30 observaciones. 

expon.cdf(x, scale) # acumulada

expon.ppf(0.25, scale) # en el 25% de los datos o menos la probabilidad de que pase un bus cada 3 minutos es de 0.62%

expon.ppf(0.75, scale)

data = expon.rvs(size = 2000, scale = 1/lam)

plt.hist(data)
plt.show()

# #### **Distribución Normal**
#
# Una v.a. $X$ tiene distribución normal o gaussiana de parámetros $\mu$ y $\sigma$, $X\sim\mathcal{N}(\mu,\sigma)$ si su función de densidad es $$f_X(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}\quad \forall x\in\mathbb{R}$$
#
# La gráfica de $f_X$ es conocida como la <l class = "definition">**Campana de Gauss**</l>
#
# Cuando $\mu = 0$ y $\sigma = 1$, diremos que la v.a. $X$ es <l class = "definition">estándar</l> y la indicaremos usualmente como $Z$, la cual tendrá función de densidad
# $$f_Z(z)=\frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}}\quad \forall z\in\mathbb{R}$$
#
# #### Distribución Normal
#
# - **Esperanza** $E(X) = \mu$
# - **Varianza** $Var(X) = \sigma^2$
#
# En particualr, si $Z$ sigue una distribución estándar,
#
# - **Esperanza** $E(X) = 0$
# - **Varianza** $Var(X) = 1$
#
# #### Ejemplo:
#
# 1. Notas en un examen. 
# 2. Altura, peso de una persona. 
# 3. Tiempo que se le dedica a estudiar cada dia, a jugar, etc.
#
# #### Distribución Normal
#
# El código de la distribución Normal:
#
# - En `R` tenemos las funciones del paquete `stats`: `dnorm(x, mean, sd), pnorm(q,  mean, sd), qnorm(p,  mean, sd), rnorm(n,   mean, sd)` donde `mean` es la media y `sd` es la desviación estándar de la normal $N(\mu, \sigma)$.
# - En `Python` tenemos las funciones del paquete `scipy.stats.normal`: `pdf(k, mu, scale), cdf(k,  mu, scale), ppf(q,  mu, scale), rvs(n,  mu, scale)`  donde `mu` es la media y `scale` es la desviación estándar de la normal $N(\mu, \sigma)$.

# #### Ejemplo: 
#
# ¿Cuál es la probabilidad de que una persona que se presenta el examen obtenga una calificación superior a 72?
# Se supone que los resultados del examen siguen una distribución normal con media 78 y desviación típica 36.

loc = 78
scale = 36

from scipy.stats import norm
import scipy

norm.pdf(72, loc, scale)  # se debe obtener p valor. 

norm.cdf(0.010928881002831665) # La probabilidad de que una persona tenga mas de un 70% es de un 50%

norm.ppf(0.75, loc, scale) # el tercer cuartil es igual o menor a 102.28

norm.ppf(.90, loc, scale) # el percentil 9 es de 78.06

norm.rvs(loc, scale, size = 100) # notas aleatorias. 

data = norm.rvs(mu, scale, size = 100) # notas aleatorias
plt.hist(data)
plt.title("Distribucion normal de calificaciones")
plt.show()

# #### Distribución Normal
#
# <l class = "prop">Estandarización de una v.a. normal.</l> Si $X$ es una v.a. $\mathcal{N}(\mu,\sigma)$, entonces $$Z=\frac{X-\mu}{\sigma}\sim\mathcal{N}(0,1)$$
#
# Las probabilidades de una normal estándar $Z$ determinan las de cualquier $X$ de tipo $\mathcal{N}(\mu,\sigma)$:
#
# $$p(X\le x)=p\left(\frac{X-\mu}{\sigma}\le\frac{x-\mu}{\sigma}\right)=p\left(Z\le\frac{x-\mu}{\sigma}\right)$$
#
# #### Distribución Normal
#
# $F_Z$ no tiene expresión conocida.
#
# Se puede calcular con cualquier programa, como por ejemplo R, o bien a mano utilizando las [tablas de la $\mathcal{N}(0,1)$](https://github.com/joanby/r-basic/blob/master/teoria/TablaNormal.pdf)
#
# Con las tablas se pueden calcular tanto probabilidades como cuantiles
#
# #### Distribución Normal en R y Python
#
# Si a la hora de llamar a alguna de las 4 funciones siguientes: `dnorm`, `pnorm`, `qnorm` o `rnorm` no especificásemos los parámetros de  la media ni la desviación típica, R entiende que se trata de la normal estándar: la $\mathcal{N}(0,1)$.
#
# Es decir, R interpreta $\mu = 0$ y $\sigma = 1$
#
# En Python ocurre exactamente lo mismo.
#
# #### Otras distribuciones importantes
#
# - La distribución $\chi^2_k$, donde $k$ representa los grados de libertad de la misma y que procede de la suma de los cuadrados de $k$ distribuciones normales estándar independientes:
#
# $$X = Z_1^2 + Z_2^2+\cdots + Z_k^2\sim \chi_k^2$$
#
# #### Otras distribuciones importantes
#
# - La distribución $t_k$ surge del problema de estimar la media de una población normalmente distribuida cuando el tamaño de la muestra es pequeña y procede del cociente
#
# $$T = \frac{Z}{\sqrt{\chi^2_k/k}}\sim T_k$$
#
# #### Otras distribuciones importantes
#
# - La distribución $F_{n_1,n_2}$ aparece frecuentemente como la distribución nula de una prueba estadística, especialmente en el análisis de varianza. Viene definida como el cociente
#
# $$F = \frac{\chi^2_{n_1}/n_1}{\chi^2_{n_2}/n_2}\sim F_{n_1,n_2}$$
#
# #### Distribuciones continuas en R y Python
#
# Distribución |  Instrucción en R |  Instrucción en Python |  Parámetros                                
# --------------------|--------------------|--------------------|--------------------
# Uniforme | `unif` | `scipy.stats.uniform` | mínimo y máximo
# Exponencial | `exp` | `scipy.stats.expon` | $\lambda$
# Normal | `norm` | `scipy.stats.normal` | media $\mu$, desviación típica $\sigma$
# Khi cuadrado | `chisq` | `scipy.stats.chi2` | grados de libertad
# t de Student | `t` | `scipy.stats.t` | grados de libertad
# F de Fisher | `f` | `scipy.stats.f` | los dos grados de libertad
#
# #### Otras distribuciones conocidas
#
# - Distribución de Pareto (Power Law)
# - Distribución Gamma y Beta
# - Distribución Log Normal
# - Distribución de Weibull
# - Distribución de Cauchy
# - Distribución Exponencial Normal
# - Distribución Von Mises
# - Distribución Rayleigh
# - ...

# #### Ejemplo:
#
# Estandarizacion:
#
# La media de los pesos de 500 estudiantes de una calse universitaria es 75 kg, con una desviacion tipia de 4 kg. Suponiendo que los pesos se distribuyen normalmente, hallar cuantos estudiantes pesan: 
#
#     a) Entre 65 y 80 kg.
#     b) Mas de 90 kg. 
#     c) 69 kg. 
#     d) Menos de 70 kg. 
#     e) 69 kg o mas.

mu = 75
scale = 4

# +
# A)

p1 = (80 - 75)/4
p2 = (65-75)/4

print(p1, p2)
# -

p1 = norm.cdf(1.25)
p2 = norm.cdf(-2.5)
print(p1, p2)

pvalue = p1 - p2
print("La respuesta es:" + str(pvalue))

# +
# B)

p4 = (90 - 75)/4
p4
# -

p5 = norm.cdf(3.75)

final = 1- p5
final

# +
# C) 
# La probabilidad es de 0, porque es exacto. 

# +
# D)

p6 = (70 - 75)/4
p6
# -

prob = norm.cdf(-1.25)
print("La respuesta es:" + str(prob))

# +
# E)

p6 = (69-75)/4
p6
# -

calculo = norm.cdf(-1.5)
calculo

final = 1 - calculo
print("La respuesta es: " + str(final))

# ## Resumen Grafico

from IPython.display import Image
Image(filename="/Users/heinerleivagmail.com/foto.png")



StarcoderdataJupyterScriptsDedupFiltered