Distribución Exponencial con Python

Anavelyz Perez
qu4nt
Published in
8 min readFeb 2, 2019
Cortesía de pexels.com

Un Poco de Historia y Aspectos Básicos

La distribución exponencial se encuentra dentro de la familia de distribuciones gamma (Tipo III) discutido por Karl Pearson en 1895, tres décadas y media después es cuando la distribución exponencial aparece por sí misma en la literatura estadística. Kondo (1931) se refirió a la distribución exponencial mientras discutía la distribución muestral de la desviación estándar, como la distribución de Pearson Tipo X. Se han demostrado aplicaciones de la distribución exponencial en problemas actuariales, de biología y de ingeniería por Steffensen (1930), Teissier (1934) y Weibull (1939) entre otros.

W. Weibull, en un documento pionero en 1951, consideró una extensión de la distribución exponencial que ahora se conoce como las distribuciones de Weibull.

D.J. Davis (1952) discutió el análisis de datos de fallas usando la distribución exponencial y comparó el análisis con el basado en la distribución normal.

El trabajo actual sobre caracterizaciones de la distribución exponencial parece haberse originado a raíz de trabajos de matemáticos Europeos como Rényi (1956), quien caracterizó la exponencial a través de procesos de Poisson y procesos de renovación; Fisz (1958), quien la caracterizó a través de estadísticos de orden; y Rossberg (1960), por el rango y las razones de los estadísticos de orden.

Por su parte, Ghurye (1960) y Teicher (1961) derivaron caracterizaciones de la distribución exponencial que son modificaciones de las características de la distribución normal mediante la distribución de las estadísticos de tipo t y la propiedad de máxima verosimilitud. Desde entonces, los resultados de la distribución exponencial han gozado de gran prominencia, como se desprende claramente de la monografía de Galambos y Kotz (1978) y el volumen de Rao y Shanbhag (1994), entre otros.

Feller (1996), al analizar diversas propiedades de la distribución exponencial, también destaco algunas aplicaciones.

Muchos autores más, artículos, libros, ensayos y documentos agrupan gran cantidad de la historia de la distribución exponencial. Hemos podido comprender que la distribución exponencial permite resolver muchos problemas de origen común, especialmente en aquellos relacionados con la distribución Poisson y los intervalos de tiempo.

Cortesía de Pexels.com

Definición matemática

Sea X una variable aleatoria con distribución de probabilidad exponencial, entonces

Función de Densidad

Función de Distribución

Función Generatriz de Momentos

Media

Varianza

En la actualidad, muchos de los cálculos matemáticos así como todos los relacionados con la estadística se pueden realizar con el uso de software o cualquier otra herramienta computacional. Por ello, en este caso nos centraremos en el lenguaje de programación Python ya que nos brinda la posibilidad de hacer cálculos sobre variables distribuidas exponencial.

Raul E. Lopez Briega en su blog: Matemáticas, análisis de datos y Python, específicamente en la sección Probabilidad y Estadística con Python, nos indica lo siguiente:

Python se lleva muy bien con las matemáticas. Además, la comunidad Python es tan amplia que solemos encontrar una librería para cualquier problema al que nos enfrentemos. En este caso, los principales módulos que Python nos ofrece para trabajar con probabilidad y estadística, son:

· numpy: El popular paquete matemático de Python, se utiliza tanto que mucha gente ya lo considera parte integral del lenguaje. Nos proporciona algunas funciones estadísticas que podemos aplicar fácilmente sobre los arrays de Numpy.

· scipy.stats: Este submódulo del paquete científico Scipy es el complemento perfecto para Numpy, las funciones estadísticas que no encontremos en uno, las podemos encontrar en el otro.

· statsmodels: Esta librería nos brinda un gran número de herramientas para explorar datos, estimar modelos estadísticos, realizar pruebas estadísticas y muchas cosas más.

· matplotlib: Es la librería más popular en Python para visualizaciones y gráficos. Ella nos va a permitir realizar los gráficos de las distintas distribuciones de datos.

· seaborn: Esta librería es un complemento ideal de matplotlib para realizar gráficos estadísticos.

· pandas: Esta es la librería más popular para análisis de datos y financieros. Posee algunas funciones muy útiles para realizar estadística descriptiva sobre nuestros datos y nos facilita sobremanera el trabajar con series de tiempo.

pyMC: pyMC es un módulo de Python que implementa modelos estadísticos bayesianos, incluyendo la cadena de Markov Monte Carlo(MCMC). pyMC ofrece funcionalidades para hacer el análisis bayesiano lo más simple posible.

¡Comencemos!

Cortesía de Pexels.com

Distribución Exponencial en Python (scipy.stats.expon)

Usaremos el submódulo del paquete científico Scipy específicamente expon. Como instancia de la clase rv_continuous, el objeto expon hereda de ella una colección de métodos genéricos y los completa con detalles específicos para esta distribución en particular.

Se poseen dos parámetros, uno de escala y otro de localización. El parámetro de escala está dado por 1/lambda, de esta manera se tiene que la f.d.p con la que se trabaja tiene la forma

Métodos Genéricos

Para hacer uso de los siguientes métodos genéricos se coloca expon seguido por un punto y la función o método que se desee.

#Números Aleatorios
rvs(loc=0, scale=1, size=1, random_state=None)
#Función de densidad de Probabilidad
pdf(x, loc=0, scale=1)
#Logaritmo de la función de densidad de Probabilidad
logpdf(x, loc=0, scale=1)
#Función de distribución acumulada.
cdf(x, loc=0, scale=1)
#Logaritmo de la función de distribución acumulada.
logcdf(x, loc=0, scale=1)
#Función de supervivencia (también definida como 1 — cdf, pero sf a veces es más precisa)
sf(x, loc=0, scale=1)
#Logaritmo de la función de supervivencia
logsf(x, loc=0, scale=1)
#Función de puntos porcentuales (inversa de cdf — percentiles)
ppf(q, loc=0, scale=1)
#Inversa de la función de supervivencia (inverse of sf)
isf(q, loc=0, scale=1)`
#Momento no central de orden n
moment(n, loc=0, scale=1)
#Media(‘m’), varianza(‘v’), simetría (‘s’), y/o kurtosis(‘k’)
stats(loc=0, scale=1, moments=’mv’)
#(Diferencial) entriopía de la RV
entropy(loc=0, scale=1)
#Estimaciones de parámetros para datos genéricos
fit(data, loc=0, scale=1)
#Valor esperado de una función (de un argumento) con respecto a la distribución
expect(func, args=(), loc=0, scale=1, lb=None, ub=None, conditional=False, **kwds)
#Mediana de la distribución
median(loc=0, scale=1)
# Media de la distribución
mean(loc=0, scale=1)
# Varianza de la distribución
var(loc=0, scale=1)
#Desviación estándar de la distribución
std(loc=0, scale=1)
#Límites del rango que contiene el alpha porciento de la distribución
interval(alpha, loc=0, scale=1)

Ejemplos de aplicación de algunos de los métodos (scipy.stats.expon)

El tiempo de reparación de unas máquinas de escribir tiene una distribución aproximadamente exponencial, con media 22 minutos.

  1. Hallar la probabilidad de que el tiempo de reparación sea menor que diez minutos.

2. El costo de reparación es de 2000 pesetas. por cada media hora o fracción. ¿Cuál es la probabilidad de que una reparación cueste 4000 pesetas?

Solución: Definamos una variable aleatoria X que representa el tiempo de reparación (en minutos) de las máquinas y sigue una distribución exponencial de parámetro.

Ahora tenemos que

  1. La probabilidad de que un tiempo de reparación sea menor que diez minutos esta dado por P(X<10), la linea de código que calcula esta probabilidad es
import numpy as np
from scipy import stats
from scipy.stats import expon
expon.cdf(10, loc=0, scale=22) #Calcula P(X<10)

de donde obtenemos que P(X<10)=0,3653.

2. De acuerdo con el enunciado, para un tiempo de reparación dado, el costo de reparación se obtendrá a partir del número total de fracciones de media hora y el conjunto de minutos restantes, inferiores a 30. (Todos, este ultimo inclusive, se cobran a 2000 pesetas). Teniendo esto en cuenta, se observa que una reparación costara 4000 pesetas siempre que su duración sea superior a 30 minutos e inferior o igual a 60 minutos (y así cada fracción de la segunda media hora se cobrará como una media hora entera). Por ello la probabilidad pedida se calcula a partir de P(30 < X < 60)= P( X < 60 )- P(X< 30), utilizando las siguientes lineas de código (con las librerías y módulos ya importados) :

a = expon.cdf(30, loc=0, scale=22)
#Calcula P(X< 30)y lo guarda en a
b = expon.cdf(60, loc=0, scale=22)
#Calcula P(X<60)y la almacena en b
b-a #Calcula P(X<60)-P(X< 30)=P(30<X<60)

se obtiene así que P(30<X<60)= 0,1903.

También podemos calcular la mediana, media y la varianza para X que representa el tiempo de reparación (en minutos) de las máquinas a partir de lo siguiente:

expon.median(loc=0, scale=22) #Calcula la mediana
expon.mean(loc=0, scale=22)
#Calcula la media
expon.var(loc=0, scale=22)
#Calcula la varianza

lo que resulta, Mediana= 15.24, Media=22 y Varianza=484.

Ejemplo generando números aleatorios provenientes de una distribución exponencial.

Lo siguiente muestra un número aleatorio que proviene de una distribución exponencial con parámetros de localización igual a cero y de escala igual a 1

expon.rvs(loc=0, scale=1, size=1, random_state=None)

La siguiente linea de código genera una muestra de 10 números aleatorios que provienen de una distribución exponencial con parámetros de localización igual a 0 y de escala igual a 1.

expon.rvs(1, size=10)

Graficando la Distribución Exponencial

Para generar un gráfico de la distribución exponencial, procedemos como sigue:

import numpy as np
from scipy import stats
from scipy.stats import expon
import matplotlib.pyplot as plt
# Graficando la Distribución Exponencialx = np.linspace(expon.ppf(0.01),
expon.ppf(0.99), 100)
plt.plot(x, expon.pdf(x))
plt.title(‘Distribución Exponencial’)
plt.ylabel(‘f(x)’)
plt.xlabel(‘X’)
plt.show()

Elaborando un histograma de números Aleatorios Exponencial

# Histograma de números Aleatorios Exponencialrv = expon.rvs(size=1000) # Genera números aleatorioscuenta, cajas, ignorar = plt.hist(rv, 20)
plt.ylabel('Frecuencia')
plt.xlabel('X')
plt.title('Histograma Exponencial')
plt.show()

Referencias

Balakrishnan N. & Basu A. P (Edit.). (1995). The Exponential Distribution. Theory, Methods and Applications. Amsterdam, Netherlands: Gordon and Breach Publishers.

S/A. S/F. Distribución Exponencial. Disponible desde: https://es.wikipedia.org/wiki/Distribuci%C3%B3n_exponencial

Lopez, B. Raúl E. (2016). Matemáticas, análisis de datos y python. Disponible desde: https://relopezbriega.github.io/. https://relopezbriega.github.io/blog/2015/06/27/probabilidad-y-estadistica-con-python/

S/A Statistical functions https://docs.scipy.org/doc/scipy/reference/stats.html

Universidad Jaume I. Material de Estudio con Ejercicios de Estadística Resueltos. Disponible desde: www3.uji.es/~mateu/t4-alumnos.pdf

--

--