<jupyter_start><jupyter_text>Distribuciones de probabilidad<jupyter_code># Importamos librerías a trabajar en todas las simulaciones
import matplotlib.pyplot as plt
import numpy as np
from itertools import cycle  # Librería para hacer ciclos
import scipy.stats as st     # Librería estadística
from math import factorial as fac # Importo la operación factorial

%matplotlib inline<jupyter_output><empty_output><jupyter_text>1. Distrución de probabilidad uniforme$X\sim U(a,b)$ Parámetros  $a,b \rightarrow $ intervalo$$\textbf{Función de densidad de probabilidad}\\f(x)=\begin{cases}\frac{1}{b-a} & a\leq x \leq b\\0& \text{otro caso}\end{cases}$$ $$ \textbf{Función de distribución de probabilidad}\\F(x)=\begin{cases}0& x<a\\\frac{x-a}{b-a} & a\leq x \leq b\\1& x\geq b\end{cases}$$![imagen.png](attachment:imagen.png)  Uso en python<jupyter_code>a,b=1,2 # Interval
U = np.random.uniform(a,b)
U

st.uniform.rvs(loc=a, scale=b, size=2)<jupyter_output><empty_output><jupyter_text>2. Distribución normal$X\sim N(\mu,\sigma^2)$ Parámetros: Media=$\mu$ y varianza=$\sigma^2$$$ \textbf{Función de densidad de probabilidad}\\ f(x)= \frac{1}{\sigma\sqrt{2\pi}}e^{\frac{-(x-\mu)^2}{2\sigma^2}}$$$$ \textbf{Función de distribución de probabilidad}\\ F(x)= \frac{1}{\sigma\sqrt(2\pi)}\int_{-\infty}^{x}e^{\frac{-(v-\mu)^2}{2\sigma^2}}dv$$![imagen.png](attachment:imagen.png)  Propiedades![imagen.png](attachment:imagen.png)  Estandarización de variables aleatorias normalesComo consecuencia de que la función normal es simétrica en $\mu$ es posible relacionar todas las variables aleatorias normales con la distribución normal estándar.Si $X\sim N(\mu ,\sigma ^{2})$, entonces$$Z = \frac{X - \mu}{\sigma}$$es una variable aleatoria normal estándar: $Z\sim N(0,1)$. El Teorema del Límite CentralEl Teorema del límite central establece que bajo ciertas condiciones (como pueden ser independientes e idénticamente distribuidas con varianza finita), la suma de un gran número de variables aleatorias se distribuye aproximadamente como una normal. **(Hablar de la importancia del uso)** IncidenciaCuando en un fenómeno se sospecha la presencia de un gran número de pequeñas causas actuando de forma aditiva e independiente es razonable pensar que las observaciones serán "normales". **(Debido al TLC)** Hay causas que pueden actuar de forma multiplicativa (más que aditiva). En este caso, la suposición de normalidad no está justificada y es el logaritmo de la variable en cuestión el que estaría normalmente distribuido. **(log-normal)**. Ejemplo de aplicaciónEn variables financieras, el modelo de Black-Scholes, el cúal es empleado para estimar el valor actual de una opción europea para la compra (Call), o venta (Put), de acciones en una fecha futura, supone normalidad en algunas variables económicas. ver:https://es.wikipedia.org/wiki/Modelo_de_Black-Scholes  para información adicional.> Referencia: https://es.wikipedia.org/wiki/Distribuci%C3%B3n_normal  Uso en python<jupyter_code>mu, sigma = 0, 0.1 # mean and standard deviation
N = np.random.normal(mu, sigma,5)
N
st.norm.rvs(loc=a, scale=sigma, size=5)<jupyter_output><empty_output><jupyter_text>3. Distribución exponencial$X\sim Exp(\beta)$ Parámetros: Media $\beta>0$ o tasa = $\lambda = 1/\beta$$$\textbf{Función de densidad de probabilidad}\\f(x) = \frac{1}{\beta} e^{-\frac{x}{\beta}}$$$$\textbf{Función de distribución de probabilidad}\\F(x) = 1-e^{-\frac{x}{\beta}}$$![imagen.png](attachment:imagen.png) EjemplosEjemplos para la distribución exponencial **es la distribución de la longitud de los intervalos de una variable continua que transcurren entre dos sucesos**, que se distribuyen según la distribución de Poisson.   - El tiempo transcurrido en un centro de llamadas hasta recibir la primera llamada del día se podría modelar como una exponencial.   - El intervalo de tiempo entre terremotos (de una determinada magnitud) sigue una distribución exponencial.   - Supongamos una máquina que produce hilo de alambre, la cantidad de metros de alambre hasta encontrar una falla en el alambre se podría modelar como una exponencial.   - En fiabilidad de sistemas, un dispositivo con tasa de fallo constante sigue una distribución exponencial.    RelacionesLa suma de k  variables aleatorias independientes de distribución exponencial con parámetro $\lambda$ es una variable aleatoria de distribución de Erlang.> Referencia: https://en.wikipedia.org/wiki/Exponential_distribution  Uso en python<jupyter_code>beta = 4
E = np.random.exponential(beta,1)
E
st.expon<jupyter_output><empty_output><jupyter_text>4. Distribución erlangParámetros: Tamaño $k \in \mathbb{N}$, escala=$\frac{1}{\beta}$$$\textbf{Función de densidad de probabilidad}\\f(x)=x^{k-1}\frac{e^{-x/\beta}}{\beta^k\Gamma(k)}\equiv x^{k-1}\frac{e^{-x/\beta}}{\beta^k(k-1)!}$$$$\textbf{Función de distribución de probabilidad}\\F(x)=1-\sum_{n=0}^{k-1}\frac{1}{n!}e^{-\frac{1}{\beta}x}\big(\frac{x}{\beta}\big)^n$$![imagen.png](attachment:imagen.png) SimplificacionesLa distribución Erlang con tamaño $k=1$ se simplifica a una distribución exponencial. Esta es una distribución de la suma de $k$ variables exponenciales donde cada una tiene media $\beta$  Ocurrencia**Tiempos de espera**Los eventos que ocurren de forma independiente con una tasa promedio se modelan con un proceso de Poisson. Los tiempos de espera entre k ocurrencias del evento son distribuidos Erlang. (La cuestión relacionada con el número de eventos en una cantidad de tiempo dada descrita por una distribución de Poisson).Las fórmulas de Erlang se han utilizado en economía de negocios para describir los tiempos entre compras de un activo.> Referencia: https://en.wikipedia.org/wiki/Erlang_distribution  Uso en python<jupyter_code>N = 10000        # Número de muestras
k,scale = 3,1/4 # Parámetros de la distribución 

E1 = st.erlang.rvs(k,scale=scale,size=N)
E2 = np.random.gamma(k,scale,N)   # Erlang como caso particular de la distribución gamma

plt.figure(1,figsize=[12,4])
plt.subplot(121)
plt.hist(E1,50,density=True,label='Usando Lib. scipy')
plt.legend()
plt.subplot(122)
plt.hist(E2,50,density=True,label='Usando Lib. numpy')
plt.legend()
plt.show()<jupyter_output><empty_output><jupyter_text>5. Distribución binomial$X\sim B(n,p)$ Parámetros: $n$ y $p$$$\textbf{Función de densidad de probabilidad}\\p_i=P(X=i)={n \choose i}p^i(1-p)^{n-i}= \frac{n!}{i!(n-i)!}p^i(1-p)^{n-i},\quad i=0,1,\cdots,n$$>Recordar:$$p_{i+1}=\frac{n-i}{i+1}\frac{p}{1-p} p_i $$$$\textbf{Función de distribución de probabilidad}\\F(x)=\sum_{i=0}^{k-1}\frac{n!}{i!(n-i)!}p^i(1-p)^{n-i}$$  Método vectorizado<jupyter_code># Función que calcula la probabilidad acumulada optimizada
def proba_binomial(n:'Cantidad de ensayos',p:'Probabilidad de los eventos',
                   N:'Cantidad de puntos a graficar'):
    Pr = np.zeros(N)
    Pr[0] = (1-p)**n
    def pr(i):
        nonlocal Pr
        c  = p/(1-p)
        Pr[i+1]=(c*(n-i)/(i+1))*Pr[i]
        
    # Lleno el vector Pr usando compresión de listas
    [pr(i) for i in range(N-1)]
    return Pr
# Comprobación de función creada
# Distintos parámetros para graficar la función binomial
n = [50,100,150]
# Parámetro p de la dristribución
p = 0.5
# Resultado usando método convencional
P = list(map(lambda x,n: proba_binomial(n,p,100),range(len(n)),n))
P = np.asmatrix(P)
print(P.shape)

def grafica_distribucion_prob(P:'Matriz de probabilidades binomiales'):
    # Gráfica de densidad de probabilidad
    fig,(ax1,ax2) = plt.subplots(1,2)
    fig.set_figwidth(10)
    ax1.plot(P.T,'o',markersize=3)
    ax1.legend(['n=50','n=100','n=150'])
    ax1.set_title('Densidad de probabilidad')
    # ax1.show()

    # Probabilidad acumulada
    F = np.cumsum(P,axis=1)
    # plt.figure(2)
    ax2.plot(F.T,'o',markersize=3)
    ax2.legend(['n=%d'%n[0],'n=%d'%n[1],'n=%d'%n[2]])
    ax2.set_title('Distribución acumulada')

    plt.show()
st.binom   
# Gráfica del método convencional y vectorizado
grafica_distribucion_prob(P)<jupyter_output>(3, 100)<jupyter_text>CaracterísticasLa distribución binomial es una distribución de probabilidad discreta que cuenta el número de éxitos en una secuencia de **n ensayos de Bernoulli independientes entre sí**, con una probabilidad `fija` p de ocurrencia del éxito entre los ensayos. A lo que se denomina «éxito», tiene una probabilidad de ocurrencia p y al otro, «fracaso», tiene una probabilidad q = 1 - p. En la distribución binomial el anterior experimento se repite n veces, de forma independiente, y se designa por $X$ a la variable que mide el número de éxitos que se han producido en los n experimentos. Cuando se dan estas circunstancias, se dice que la variable $X$ sigue una distribución de probabilidad binomial, y se denota $X\sim B(n,p)$. EjemploSupongamos que se lanza un dado (con 6 caras) 51 veces y queremos conocer la probabilidad de que el número 3 salga 20 veces. En este caso tenemos una $X \sim B(51, 1/6)$ y la probabilidad sería $P(X=20)$:$$P(X=20)={51 \choose 20}(1/6)^{20}(1-1/6)^{51-20} $$<jupyter_code>n = 51; p=1/6; X=20
print('P(X=20)=',st.binom(n,p).pmf(X))<jupyter_output>P(X=20)= 7.444834157690862e-05<jupyter_text>Relaciones con otras variables aleatoriasSi n tiende a infinito y p es tal que el producto entre ambos parámetros tiende a $\lambda$, entonces la distribución de la variable aleatoria binomial tiende a una distribución de Poisson de parámetro $\lambda$.Por último, se cumple que cuando $p =0.5$ y n es muy grande (usualmente se exige que $n\geq 30$) la distribución binomial puede aproximarse mediante la distribución normal, con parámetros $\mu=np,\sigma^2=np(1-p)$.> Referencia: https://en.wikipedia.org/wiki/Binomial_distribution<jupyter_code>p = .5; n = 50
mu = n*p; sigma = np.sqrt(n*p*(1-p))

# Usando nuetra función creada
Bi = proba_binomial(n,p,n)
plt.figure(1,figsize=[10,5])
plt.subplot(121)
plt.plot(Bi,'o')
plt.title('Distribución binomial n=%i,p=%0.2f'%(n,p))

# Usando la función de la librería scipy para graficar la normal
x = np.arange(0,n)
Bi_norm = st.norm.pdf(x,loc=mu,scale=sigma)
plt.subplot(122)
plt.plot(Bi_norm,'o')
plt.title('Distribución~normal(np,np(1-p))')
plt.show()<jupyter_output><empty_output><jupyter_text>6. Distribución PoissonParámetros: media=$\lambda>0 \in \mathbb{R}$, N°Ocurrencias = k   - k es el número de ocurrencias del evento o fenómeno (la función nos da la probabilidad de que el evento suceda precisamente k veces).   - λ es un parámetro positivo que representa el **número de veces que se espera que ocurra el fenómeno durante un intervalo dado**. Por ejemplo, si el suceso estudiado tiene lugar en promedio 4 veces por minuto y estamos interesados en la probabilidad de que ocurra k veces dentro de un intervalo de 10 minutos, usaremos un modelo de distribución de Poisson con λ = 10×4 = 40$$\textbf{Función de densidad de probabilidad}\\p(k)=\frac{\lambda^k e^{-\lambda}}{k!},\quad k\in \mathbb{N}$$ AplicaciónEl número de sucesos en un intervalo de tiempo dado es una variable aleatoria de distribución de Poisson donde $\lambda$ es la media de números de sucesos en este intervalo. Relación con distribución Erlang o GammaEl tiempo hasta que ocurre el suceso número k en un proceso de Poisson de intensidad $\lambda$ es una variable aleatoria con distribución gamma o (lo mismo) con distribución de Erlang con $ \beta =1/\lambda $ Aproximación normalComo consecuencia del teorema central del límite, para valores grandes de $\lambda$ , una variable aleatoria de Poisson X puede aproximarse por otra normal, con parámetros $\mu=\sigma^2=\lambda$. Por otro lado, si el cociente $$Y=\frac{X-\lambda}{\sqrt{\lambda}}$$converge a una distribución normal de media 0 y varianza 1. EjemploSi el 2% de los libros encuadernados en cierto taller tiene encuadernación defectuosa, para obtener la probabilidad de que 5 de 400 libros encuadernados en este taller tengan encuadernaciones defectuosas usamos la distribución de Poisson. En este caso concreto, k es 5 y, λ, el valor esperado de libros defectuosos es el 2% de 400, es decir, 8. Por lo tanto, la probabilidad buscada es$$P(5;8)={\frac {8^{5}e^{-8}}{5!}}=0,092$$> Referencia: https://es.wikipedia.org/wiki/Distribuci%C3%B3n_de_Poisson<jupyter_code>k=5; Lamda = 8
print('P(5;8)=',st.poisson(Lamda).pmf(k))<jupyter_output>P(5;8)= 0.09160366159257921<jupyter_text>Usando el paquete estadístico `stats`<jupyter_code># Parámetros
Lamda = [8,20]
k=np.arange(0,40); 

# Distribución de probabilidad
P = np.array([st.poisson(Lamda[i]).pmf(k) for i in range(len(Lamda))])

# Distribución de probabilidad acumulada
P_acum = np.array([st.poisson(Lamda[i]).cdf(k) for i in range(len(Lamda))])

fig,[ax1,ax2] = plt.subplots(1,2,sharey=False,figsize=[12,4])
ax1.plot(P.T,'o',markersize=3)
ax1.legend(['$\lambda$=%d'%i for i in Lamda])
ax1.title.set_text('Distribución de probabilidad')

ax2.plot(P_acum.T,'o',markersize=3)
[ax2.hlines(P_acum[i,:],range(len(k)),range(1,len(k)+1)) for i in range(len(Lamda))]
plt.legend(['$\lambda$=%d'%i for i in Lamda])
ax2.title.set_text('Distribución de probabilidad')

plt.show()
# P_acum.shape<jupyter_output><empty_output><jupyter_text>Usando las expresiones matemáticas<jupyter_code>import scipy.special as sps 

p = lambda k,l:(l**k*np.exp(-l))/sps.gamma(k+1)
k = np.arange(0,50)
l = [1,10,20,30]
P = np.asmatrix(list(map(lambda x:p(k,x*np.ones(len(k))),l))).T
print(P.shape)
plt.figure(1,figsize=[12,4])
plt.subplot(121)
plt.plot(P,'o',markersize=3)
plt.legend(['$\lambda$=%d'%i for i in l])
plt.title('Distribución de probabilidad')

# Probabilidad acumulada 
P_ac = np.cumsum(P,axis=0)

plt.subplot(122)
plt.plot(P_ac,'o',markersize=3)
[plt.hlines(P_ac[:,i],range(len(P_ac)),range(1,len(P_ac)+1)) for i in range(len(l))]
plt.legend(['$\lambda$=%d'%i for i in l])
plt.title('Distribución de probabilidad acumulada')
plt.show()<jupyter_output>(50, 4)
{'fraction_non_alphanumeric': 0.1334010005075038, 'fraction_numerical': 0.024070180526353947, 'mean_word_length': 5.436770881941204, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 49, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '3597', 'license': 'MIT', 'n_tokens_mistral': 5341, 'n_tokens_neox': 5067, 'n_words': 1446, 'path': 'TEMA-2/Clase12_DistribucionesProbabilidad.ipynb', 'repo_name': 'anehik/SPF-2020-II-G1', 'size': '13793'}