Fundamentos de estadística y probabilidad para Data Science

3.1 Distribuciones de probabilidad contínuas

Distribución Normal

La distribución normal tiene características matemáticas especiales que la hacen la base de la mayoría de los test estadísticos. La razón: el Teorema del Límite Central (TCL).

  • Fue fundamental para el desarrollo histórico de la estadística, pues permitió una aproximación matemática a la incertidumbre y variabilidad de los datos.

  • Aunque los datos en bruto no sigan una distribución normal, los errores con frecuencia lo hacen, al igual que los promedios y totales en muestras grances.

Youtube: explicación F. J. Barón López

El TCL nos da una idea de lo importante que es en estadística la distribución normal o gaussiana, ya que muestreando, con muestras suficientemente grandes, podemos estimar la media bastante bien (dependerá del error típico de la media, es decir, la precisión de la estimación de la media, hecha con una muestra, depende del tamaño de la muestra y de la desviación típica de la misma, a mayor muestras menor error típico de la media, mayor precisión), como sabemos que la distribución de las medias sigue una distribución normal, esto nos puede dar una idea de lo importante que es esta distribución.

¿Cómo de grande ha de ser la muestra?, pues tan grande como quiera que sea de pequeño el error típico de la media, es decir, va a depender de la desviación típica de los valores de la muestra. Así que no hay una receta mágica.

¿Cómo evaluamos la normalidad de una distribución?: Hay muchas formas de abordar este problema, pero básicamente hay dos estrategias:

  • Gráficamente: mediante histogramas, Q-Q plots. . .

  • Analíticamente: con contrastes de hipótesis de normalidad

Características de la distribución normal:

  • Simétrica respecto a la media, la mediana y la moda, que coinciden.

  • Requiere dos parámetros para su definición:\(\mu\) y \(\sigma\)

  • Para cualquier distribución normal \(X \sim \mathcal{N}(\mu,\,\sigma)\), se puede realizar una transformación llamada tipificación o normalización, de forma que \(\mu = 0\) y \(\sigma = 1\). De esta forma: \(Z \sim \mathcal{N}(0,\,1)\).

Función de densidad de probabilidad (f.d.p.)

\(\phi_{\mu, \sigma^2}(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\)

Ejemplo de distribución normal: Un data frame que contenga un vector con 5.000 medidas generadas aleatoriamente, que siguen una distribución normal con una media de 175 cm y una desviación estándar de 3 cm.

set.seed(12345)
muestras <- 5000
sigma <- 3
mu <- 175
x <- rnorm(muestras, mean=mu, sd=sigma)
alfa = 0.05
y <- 1/(sigma*sqrt(2*pi))*exp(-((x-mu)^2/(2*sigma^2))) # densidad calculada mediante fórmula

alturas_df <- data.frame(x,y)
alturas_df$fx <- dnorm(alturas_df$x, mu, sigma) # densidad calculada por R con dnorm

alturas_df$Fx <- pnorm(x, mu, sigma) # distribución acumulada calculada con R
mean(abs(alturas_df$y - alturas_df$fx)) # Media de las diferencias entre ambos cálculos
[1] 7.751484e-18

Cuantiles: 0.025, 0.0975 \(\alpha = 0.05\)

Cuantiles Dist. Normal con qnorm:

qnorm(alfa/2, mean = 175, sd = 3)
[1] 169.1201
qnorm(1-alfa/2, mean = 175, sd = 3)
[1] 180.8799

Cuantiles según los datos sintéticos generados con rnorm previamente y calculados con quantile:

quantile(alturas_df$x, alfa/2)
    2.5% 
169.0531 
quantile(alturas_df$x, 1-alfa/2)
   97.5% 
180.7557 

Funcón de distribución acumulada (F.D.)

\(\Phi_{\mu, \sigma^2}(x) = \int_{-\infty}^{x} \phi_{\mu, \sigma^2}(t) \, dt\)

a <- 177
ggplot() + 
  geom_line(data = alturas_df, aes(x, y), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df, x <= a), 
            fill = "grey", alpha = 0.5, aes(x, y)) +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-sigma, color = "green",
             linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+sigma, color = "green", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mu*1.0025, y = 0, 
           label = expression(mu), vjust = 0.5, size = 5) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de densidad Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "densidad") +
  theme_bw()

Cálculos de probabilidades. Funciones: pnorm, dnorm, qnorm, rnorm

Si en nuestro ejemplo, la altura sigue una distribución normal, usando la función de distribución acumulada, podemos calcular la probabilidad de que, al extraer una muestra, ésta esté en un intervalo determinado. Para ello se ha de calcular el área bajo la curva. Afortunadamente, la informática hoy en día nos ahorra los cálculos, transformaciones y uso de tablas para resolver este problema. Así, en R tenemos diferentes funciones para:

Distribución acumulada: pnorm

Con la función pnorm, podemos generar la función de distribución acumulada:

alturas_df$Fx <- pnorm(x, 175, 3)
ggplot(alturas_df, aes(x,Fx)) +
  geom_line(color="blue", linewidth = 1) +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-sigma, color = "green", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+sigma, color = "green", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  labs(
    title = "Función de distribución de probabilidad acumulada",
    x = "altura",
    y = "probabilidad") +
  theme_bw()

Obtener la probabilidad de que x <= a: Ejemplo: probabilidad de que la altura sea menor de 177:

b <- 177
plow_177 <- pnorm(a, mean = mu, sd = sigma)
plow_177
[1] 0.7500033
a <- 177
ggplot() + 
  geom_line(data = alturas_df, aes(x, Fx), color="blue", linewidth = 1) +
  geom_hline(yintercept = pnorm(a, mu, sigma), color = "green", linewidth = 1, linetype = "dashed") +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = a, color = "green", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mu*1.0025, y = 0, 
           label = expression(mu), vjust = 0.5, size = 5) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de Distribución acumulada Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "P(x <= a)") +
  theme_bw()

a <- 177
ggplot() + 
  geom_line(data = alturas_df, aes(x, y), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df, x <= a), 
            fill = "grey", alpha = 0.5, aes(x, y)) +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-sigma, color = "green",
             linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+sigma, color = "green", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mu*1.0025, y = 0, 
           label = expression(mu), vjust = 0.5, size = 5) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de densidad Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "densidad") +
  theme_bw()

Ejemplo: probabilidad de que la altura sea mayor de 171:

a <- 171
ggplot() + 
  geom_line(data = alturas_df, aes(x, y), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df, x > a), 
            fill = "grey", alpha = 0.5, aes(x, y)) +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-sigma, color = "green",
             linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+sigma, color = "green", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu-2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = mu+2*sigma, color = "grey", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mu*1.0025, y = 0, 
           label = expression(mu), vjust = 0.5, size = 5) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de densidad Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "densidad") +
  theme_bw()

a <- 171
ggplot() + 
  geom_line(data = alturas_df, aes(x, Fx), color="blue", linewidth = 1) +
  geom_hline(yintercept = pnorm(a, mu, sigma), color = "green", linewidth = 1, linetype = "dashed") +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = mu, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = a, color = "green", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mu*1.0025, y = 0, 
           label = expression(mu), vjust = 0.5, size = 5) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de Distribución acumulada Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "P(x <= a)") +
  theme_bw()

a <- 171
pupp_171 <- pnorm(a, mean = mu, sd = sigma, lower.tail = FALSE)
pupp_171
[1] 0.9087888
1 - pnorm(a, mean = mu, sd = sigma)
[1] 0.9087888

Si queremos calcular la probabilidad de que la altura esté en el intervalo \([171,177]\):

P(a >= x <= b) = P(x < b) - P (x < a)

a <- 171
b <- 177
alturas_df_171_177 <- alturas_df %>% 
  filter(x > a, x <= b)
ggplot() + 
  geom_line(data = alturas_df, aes(x, y), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df_171_177, x > a), 
            fill = "grey", alpha = 0.5, aes(x, y)) +
  scale_x_continuous(breaks = ((mu-3*sigma)):(mu+3*sigma)) +
  geom_vline(xintercept = a, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = b, color = "green",
             linetype = "dashed", linewidth = 1) +
  annotate("text", x = b, y = 0, label = "x = b", vjust = -1, color = "darkgreen") +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "red") +
  
  labs(
    title = bquote("Función de densidad Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "densidad") +
  theme_bw()

a <- 171
b <- 177

# P(171 < x < 177) es P(x < 177) - P (x < 171)

# P(x < 171) es 1 - P(x > 171)
pnorm(b, mean = mu, sd = sigma)
[1] 0.7475075
pnorm(a, mean = mu, sd = sigma)
[1] 0.09121122
pnorm(b, mean = mu, sd = sigma) - pnorm(a, mean = mu, sd = sigma)
[1] 0.6562962
plow_177 - (1 - pupp_171)
[1] 0.658792
a <- 171
b <- 177
ggplot() + 
  geom_line(data = alturas_df, aes(x, Fx), color="blue", linewidth = 1) +
  geom_hline(yintercept = pnorm(a, mu, sigma), color = "red", linewidth = 1, linetype = "dashed") +
  geom_hline(yintercept = pnorm(b, mu, sigma), color = "green", linewidth = 1, linetype = "dashed") +
  geom_vline(xintercept = a, color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = b, color = "green", linetype = "dashed", linewidth = 1) +
  annotate("text", x = a, y = 0, label = "x = a", vjust = -1, color = "brown") +
  annotate("text", x = b, y = 0, label = "x = b", vjust = -1, color = "darkgreen") +
  labs(
    title = bquote("Función de Distribución acumulada Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "P(x <= a)") +
  theme_bw()

Densidad de probabilidad: dnorm

Esta función nos sirve para generar la función de densidad. En variable contínua para obtener probabilidades de que un dato se tenga un determinado valor, tenemos que fijar un intervalo (a,b), pues la anchura para un valor concreto es 0.

Generar la función de densidad de probabilidad a partir de una secuencia de valores x:

# Generamos valores de x
x <- seq(160, 190, length.out = 100)
# Calculamos la densidad de la distribución normal a partir de los cuantiles
y <- dnorm(x, mean = mu, sd = sigma)

# Creamos el gráfico
ggplot() + 
  geom_line(data = data.frame(x,y), aes(x, y), color="blue", linewidth = 1) +
  labs(
    title = bquote("Función de densidad Normal: " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "altura",
    y = "densidad") +
  theme_bw()

Cuantiles: qnorm

Calcula los cuantiles a partir de las probabilidades

qnorm(0.025, mean = 175, sd = 3)
[1] 169.1201
qnorm(0.975, mean = 175, sd = 3)
[1] 180.8799
# Generamos valores de x
q <- seq(0, 1000)/1000
# Calculamos los cuantiles (percentiles)
x <- qnorm(q, mu, sigma)
perc_df <- data.frame(q = q[2:1000], x = qnorm(q, mu, sigma)[2:1000])
# Creamos el gráfico
ggplot() +
  geom_line(data = perc_df, aes(q, x), color="blue", linewidth = 1) +
  labs(
    title = bquote("Gráfica de cuantiles " ~ mu ~ "= 175, " ~ sigma ~ "= 3"),
    x = "Cuantiles",
    y = "Altura") +
  theme_bw()

Generación de números aleatorios siguiendo una distribución normal rnorm

Genera una distribución de n datos aleatorios siguiendo una distribución normal de media mu y desviación típica sigma. En las cuatro funciones, si no se especifican los parámetros, se generan siguiendo una distribución normal estándar.

set.seed(123)
x <- rnorm(n = 500, mu, sigma)
ggplot(data.frame(x,y), aes(x)) +
  geom_density()

Tipificación de la distribución normal

La distribución normal cumple dos propiedades importantes:

  • Si \(X \sim \mathcal{N}(\mu, \sigma)\), entonces para cualquier constante ( a ) y ( b ), la transformación lineal ( aX + b ) también sigue una distribución normal, es decir, \(aX + b \sim \mathcal{N}(a\mu + b, a\sigma)\).

  • Si \(X \sim \mathcal{N}(\mu_a, \sigma_a)\) y \(Y \sim \mathcal{N}(\mu_b, \sigma_b)\), entonces la suma de ellas, \(X + Y\), también sigue una distribución normal dada por \((X + Y) \sim \mathcal{N}(\mu_a + \mu_b, \sqrt{\sigma_a^2 + \sigma_b^2})\).

Podemos transformar una distribución \(X \sim \mathcal{N}(\mu,\,\sigma)\), de forma que \(\mu = 0\) y \(\sigma = 1\). De esta forma: \(Z \sim \mathcal{N}(0,\,1)\).

La transformación consiste en hacer aplicar a todos los elementos de la distribución la operación:

\(Z = \frac{X - \mu}{\sigma}\)

De este modo, la función de densidad queda:

\(f(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{x^2}{2}}, \quad x \in \mathbb{R}\)

alturas_df <- alturas_df %>%
  mutate(z = (x-mu)/sigma) %>%
  mutate(fz = 1/(sqrt(2*pi))*exp((-(z)^2)/2)) %>%
  mutate(Fz = pnorm(z))
ggplot() + 
  geom_line(data = alturas_df, aes(z,fz), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df, ( (z >= 2) & (z <= 2) ) ),
            mapping = aes(z,fz),
            fill = "grey", alpha = 0.5) +
  scale_x_continuous(breaks = -3:3) +
  labs(
    title = bquote("Función de densidad Normal Tipificada: " ~ mu ~ "= 0, " ~ sigma ~ "= 1"),
    x = "altura escalada (z-score)",
    y = "densidad") +
  theme_bw()

alturas_df %>%
ggplot() + 
  geom_line(data = alturas_df, aes(z,Fz), color="blue", linewidth = 1) +
  geom_area(data = subset(alturas_df, ( (z >= 2) & (z <= 2) ) ),
            mapping = aes(z,fz),
            fill = "grey", alpha = 0.5) +
  scale_x_continuous(breaks = -3:3) +
  labs(
    title = bquote("Función de distribución acumulada: " ~ mu ~ "= 0, " ~ sigma ~ "= 1"),
    x = "altura escalada (z-score)",
    y = "probabilidad") +
  theme_bw()

alturas_df <- alturas_df %>%
  mutate(z = (x-mu)/sigma) %>%
  mutate(fz = 1/(sqrt(2*pi))*exp((-(z)^2)/2)) %>%
  mutate(Fz = pnorm(z))
ggplot() + 
  geom_line(data = alturas_df, aes(z,fz), color="blue", linewidth = 1) +
  geom_line(data = alturas_df, aes(z,Fz), color="black", linewidth = 1) +
  geom_area(data = subset(alturas_df, ( (z >= 2) & (z <= 2) ) ),
            mapping = aes(z,fz),
            fill = "grey", alpha = 0.5) +
  scale_x_continuous(breaks = -3:3) +
  labs(
    title = bquote("Funciones de densidad y acumulada Normal Tipificada: " ~ mu ~ "= 0, " ~ sigma ~ "= 1"),
    x = "altura escalada (z-score)",
    y = "probabilidad/densidad") +
  theme_bw()

Ejemplo: probabilidad de que la altura normalizada sea mayor de -2:

a <- -2
pnorm(a, lower.tail = FALSE)
[1] 0.9772499

Escalamiento

El proceso de escalamiento es necesario en muchas ocasiones para poder realizar ciertos análisis o modelos, pues en muchas ocasiones, el peso de las variables está influenciado por la magnitud o escala de medida. Sin embargo, para los modelos, no importa la magnitud ni la escala, sino que todos los datos se encuentren en la misma escala para ser comparables.

Z-Score

Es el proceso que acabamos de observar. Se modifica el dataset para que las variables tengan media 0 y desviación estándar, usando la fórmula \(Z = \frac{X - \mu}{\sigma}\)

Estandarización por rangos (0-1)

En este proceso, los nuevos valores no podrán ser negativos ni mayores que uno. Se llama escalado o estandarización por rangos. A cada valor se le resta el mínimo y se divide por el rango de la distribución.

\(x_{\text{new}_i} = \frac{x_{\text{old}_i} - \min(x_{\text{old}_i})}{\max(x_{\text{old}_i}) - \min(x_{\text{old}_i})}\)

min_x <- min(alturas_df$x)
rg <- max(alturas_df$x) - min_x
alturas_df %>%
  mutate(x_rang = (x - min_x)/rg) %>%
  ggplot(aes(x_rang)) + 
  geom_density()+
  theme_bw()

Escalamiento decimal.

Se obtiene m (número de dígitos del mayor dato) y se divide cada dato entre 10 elevado a m

\(x_{\text{new}_i} = \frac{x_{\text{old}_i}}{10^m}\)

Distribución Uniforme

La distribución uniforme es comúnmente usada para modelar situaciones donde se asume que los eventos son igualmente probables en un intervalo continuo y finito. Es una distribución importante en estudios de simulaciones donde se requieren muestras aleatorias de variables continuas.

La distribución uniforme tiene una memoria completa, lo que significa que la probabilidad de que ocurra un evento en un intervalo es la misma sin importar los eventos anteriores.

La función de densidad de probabilidad y la función de distribución acumulada son simples, lo que facilita su uso en cálculos y simulaciones.

Características de la distribución uniforme:

  • Simétrica, todos los valores tienen la misma probabilidad.

  • Dos parámetros \(a\) y \(b\) la definen completamente, que son los límites inferior y superior del intervalo en el cual la variable puede tomar valores.

Función de densidad de probabilidad (f.d.p.)

\(f(x; a, b) = \frac{1}{b - a} \quad \text{para} \quad a \leq x \leq b\)

set.seed(12345)
a <- 0
b <- 1
x <- runif(100000, min = a, max = b)
y <- dunif(x, min = a, max = b)
FD <- (x - a) / (b - a)
valores_df <- data.frame(x, y, FD)
valores_0 <- data.frame(
  x = c(seq(-0.1:-0.0001, by = 0.001, length.out = 100), seq(1.0001:1.1, by = 0.001, length.out = 100)),
  y = rep(0, 200)
)
valores_0 <- valores_0 %>%
  mutate(FD = if_else(x < 0, 0, 1))

valores_df <- rbind(valores_0, valores_df)

ggplot() +
  geom_line(data = valores_df, mapping = aes(x,y), color="blue", linewidth=1) +
  labs(
    title = "Función de densidad de probabilidad de la distribución Uniforme entre 0 y 1",
    x = "x",
    y = "densidad") +
  theme_bw()

Función de distribución acumulada (F.D)

\(F(x; a, b) = \frac{x - a}{b - a} \quad \text{para} \quad a \leq x \leq b\)

ggplot(valores_df, aes(x,FD)) +

  geom_line(color="blue", linewidth=1) +

  labs(

    title = "Función de distribución acumulada Uniforme contínua: (0,1)",

    x = "x",

    FD = "cdf") +

  theme_bw()

Cálculos de probabilidades. Funciones punif, dunif, qunif, runif

punif

Ejemplo: Si un bus llega en cualquier momento dentro de una ventana de tiempo de 30 minutos, ¿cuál es la probabilidad de que llegue antes de los primeros 10 minutos?

punif(10, min = 0, max = 30)
[1] 0.3333333

Ejemplo: ¿cuál es la probabilidad de que el bus llegue después de los primeros 20 minutos?

punif(20, min = 0, max = 30, lower.tail = FALSE)
[1] 0.3333333
1 - punif(20, min = 0, max = 30)
[1] 0.3333333

qunif

Ejemplo: ¿Cuál es el punto medio del intervalo de tiempo para la llegada del bus? ¿Y cuáles son los tiempos correspondientes al primer y tercer cuartil?

qunif(0.5, min = 0, max = 30)
[1] 15
qunif(0.25, min = 0, max = 30)
[1] 7.5
qunif(0.75, min = 0, max = 30)
[1] 22.5

runif

Muy utilizada para generar números aleatorios con idéntica probabilidad, en un intervalo contínuo

runif(10,1,10)
 [1] 1.548081 6.827917 1.817802 8.178226 1.641735 9.116961 4.519858 7.185464
 [9] 2.819277 5.735051

dunif

En esta distribución t es constante

dunif(runif(2,1,10),1,10)
[1] 0.1111111 0.1111111

Distribución Exponencial

La distribución exponencial es frecuentemente utilizada para modelar el tiempo entre eventos que ocurren de manera continua e independiente a una tasa constante. Es una distribución clave en el estudio de procesos de Poisson.

La distribución exponencial no tiene memoria, lo que significa que la probabilidad de que ocurra un evento en un intervalo es independiente de cuándo ocurrió el último evento.

La función de densidad de probabilidad y la función de distribución acumulada tienen formas matemáticas simples, lo que facilita su uso en cálculos y simulaciones.

Características de la distribución:

No simétrica, se inclina hacia la derecha (sesgo positivo).

Un único parámetro \(\lambda\) la define completamente, donde \(\lambda\) es la tasa de ocurrencia de eventos.

Función de densidad de probabilidad (f.d.p.)

\(f(x;\lambda) = \lambda e^{-\lambda x}\) para \(x \geq 0\)

muestras <- 5000
lambda <- 2 # llegadas/ud. tiempo, por ejemplo. Tiempo medio entre llegadas 1/2
x <- rexp(muestras, rate = lambda)
y <- lambda*exp(-lambda*x) # densidad calculada mediante fórmula
df <- data.frame(x,y)
df$fx <- dexp(df$x, rate = lambda) # densidad calculada por R con dexp
df$Fx <- pexp(df$x, rate = lambda) # distribución acumulada calculada con R
mean(abs(df$y - df$fx)) # Media de las diferencias entre ambos cálculos
[1] 0

Función de distribución acumulada (F.D.)

\(F(x;\lambda) = \int_{0}^{\infty} \left[ \lambda e^{-\lambda x} \right] dx = 1 - e^{-\lambda x}\)

Ejemplo de distribución exponencial: Un vector de datos que contenga tiempos entre eventos que siguen una distribución exponencial con una tasa de 2 eventos por minuto.

ggplot() + 
  geom_line(data = df, aes(x,Fx), color="blue", linewidth = 1) +
  geom_vline(xintercept = mean(df$x), color = "green",
              linetype = "dashed", linewidth = 1) +
  geom_hline(yintercept = mean(df$x), color = "green",
              linetype = "dashed", linewidth = 1) +
  geom_hline(yintercept = pexp(0.5, rate = lambda), color = "green",
              linetype = "dashed", linewidth = 1) +
  labs(
    title = bquote("Función de distribución acumulada Exponencial: " ~ lambda ~ "= 2 llegadas /ud. tiempo"),
    x = "tiempo entre llegadas: ",
    y = "probabilidad") +
  theme_bw()

Características

Una propiedad interesante de la distribución exponencial es su relación con los procesos de Poisson. Por ejemplo, si los eventos ocurren siguiendo un proceso de Poisson, entonces el tiempo entre eventos sigue una distribución exponencial.

  • La transformación se basa en el uso de la tasa \(\lambda\):

  • Desviación estándar: \(1/\lambda\):

\(X \sim \text{Exp}(\lambda)\)

Con \(X\) siendo el tiempo hasta el próximo evento.

Podemos también escalar la distribución exponencial cambiando la tasa \(\lambda\). Por ejemplo, si queremos modelar el tiempo en horas en lugar de minutos y sabemos que \(\lambda\) es de 0.1 por minuto, entonces para horas sería:

\(\lambda_{\text{hora}} = \lambda_{\text{minuto}} \times 60\)

Esto es debido a que la tasa \(\lambda\) es recíproca al tiempo esperado entre eventos.

Cálculos de probabilidades. Funciones: pexp, dexp, qexp, rexp

pexp

Ejemplo: Una empresa de telecomunicaciones envía paquetes de datos en una red con un promedio que sigue una distribución exponencial. Si la tasa \(\lambda\) es de 10 paquetes por segundo, es decir, el tiempo medio entre llegadas es 0.1 segundos ¿cuál es la probabilidad de que el tiempo entre la llegada de dos paquetes consecutivos sea inferior a 0.1 segundos?

pexp(0.1, rate = 10)
[1] 0.6321206

Ejemplo: ¿cuál es la probabilidad de que el tiempo entre la llegada de dos paquetes consecutivos sea superior a 0.2 segundos?

pexp(0.2, rate = 10, lower.tail = FALSE)
[1] 0.1353353

qexp

Ejemplo: ¿Cuál es la mediana, el Q1 y el Q3 del tiempo entre llegadas? ¿Y cuál es el tiempo entre llegadas para el percentil 99?

qexp(0.5, rate = 10)
[1] 0.06931472
qexp(0.25, rate = 10)
[1] 0.02876821
qexp(0.75, rate = 10)
[1] 0.1386294
qexp(0.99, rate = 10)
[1] 0.460517
# Generamos valores de x
q <- seq(0, 100)/100
# Calculamos los cuantiles (percentiles)
x <- qexp(q, rate = lambda)
perc_df <- data.frame(q = q[2:100], x = qexp(q, rate = lambda)[2:100])
# Creamos el gráfico
ggplot() +
  geom_line(data = perc_df, aes(q, x), color="blue", linewidth = 1) +
  labs(
    title = bquote("Gráfica de cuantiles exp. " ~ lambda),
    x = "Cuantiles",
    y = "tiempo entre llegadas") +
  theme_bw()

rexp

Generación aleatoria de n elementos, siguiendo la distribución

rexp(1000, rate=lambda) %>%
  boxplot()

Desviación estándar: \(1/\lambda\):

rexp(50, rate=2) %>%
  sd()
[1] 0.4520959
rexp(10000, rate=2) %>%
  sd()
[1] 0.5058874

Otras distribuciones de probabilidad contínuas

  • t Student

  • Logística

  • Gamma

  • Beta

  • Chi-cuadrado

  • Cauchy