INTRODUCCIÓN

Este artículo aborda los conceptos de distribución que son comúnmente usados en la estadística. Las distribuciones manejadas serán cinco en total, donde veremos su concepto, uso, y un ejemplo práctico de la cotidianidad en donde estas distribuciones sean aplicadas. —

FUNCIONES MATEMATICAS BASE

Antes de comenzar, se definen las funciones matemáticas que se van a usar en todos los algoritmos.

# factorial
fact <- function(n) {
  r <- 1
  if (n > 0) for (i in 1:n) r <- r * i
  return(r)
}

# raiz cuadrada 
raiz <- function(v) {
  r <- v / 2.0
  for (k in 1:30) r <- (r + v / r) / 2.0
  return(r)
}

# exponencial e^x 
expo <- function(x) {
  if (x < 0) return(1 / expo(-x))
  s <- 0.0
  for (i in 0:100) s <- s + (x ^ i) / fact(i)
  return(s)
}

# logaritmo natural 
mi_log <- function(x) {
  if (x <= 0) return(0)
  z <- (x - 1.0) / (x + 1.0)
  z2 <- z * z
  p <- z
  s <- 0.0
  for (k in 0:100) {
    s <- s + p / (2 * k + 1)
    p <- p * z2
  }
  return(2.0 * s)
}

# pi
PI <- 3.141592653589793

DISTRIBUCIÓN LOGNORMAL

Por definición, la distribución lognormal es la distribución discreta y continua de una variable aleatoria, cuyo logaritmo está normalmente distribuido. En otras palabras, una distribución log-normal representa el logaritmo de variables aleatorias a partir de una curva normal. El logaritmo es el exponente necesario para elevar un número base y obtener una variable aleatoria (x) con distribución normal.

ASIMETRÍA

La asimetría es una medida que indica hacia qué lado se extiende la cola de una distribución. En la lognormal la asimetría es positiva, lo que significa que hay pocos valores muy altos que generan una cola larga hacia la derecha.

FORMULA

Esta es la fórmula de dos parámetros para la distribución lognormal: \[f(x; \mu , \sigma )=\frac{1}{x\sigma \sqrt{2\pi }}* exp(-\frac{(ln(x)-\mu ){^2}}{2\sigma {^2}}), \forall x >0\] Donde:

μ = es la media de la distribución y se define como:

\[e^{^{\mu +\frac{\sigma{^2}}{2}}}\] σ = Es la desviación estándar y se define como:

\[\sigma = \sqrt{e^{2\mu +\sigma {^2}}(e^{^{\sigma ^{2}}}-1)}\]

En el lenguaje de programación R, se puede observar la distribución log-norm como la función rlnorm, la cual devuelve la distribución logarítmica-normal de x, donde ln(x) se distribuye normalmente con los parámetros media y desv_estándar.

EJEMPLO

En el Hospital San José, los niveles de glucosa en sangre (mg/dL) de pacientes de consulta externa siguen una distribución lognormal con \(\mu = 4.8\) y \(\sigma = 0.3\).

- ALGORITMO PROPIO

lognormal <- function(x, mu, sigma) {
  if (x <= 0) return(0)
  denominador <- x * sigma * raiz(2 * PI)
  exponente <- -((mi_log(x) - mu)^2) / (2 * sigma^2)
  return((1 / denominador) * expo(exponente))
}

- COMPARACION CON LA FUNCION R

lognormal(120, 4.8, 0.3)
## [1] 0.0110553
dlnorm(120, 4.8, 0.3)
## [1] 0.0110721

- GRAFICA

mu <- 4.8
sigma <- 0.3
x <- seq(50, 300, length.out = 200)
mi_resultado <- sapply(x, lognormal, mu = mu, sigma = sigma)

plot(x, mi_resultado,
     type = "l",
     col = "steelblue",
     lwd = 2,
     main = "Distribucion Lognormal - Glucosa en sangre",
     sub = "Hospital San José, Buga",
     xlab = "Glucosa (mg/dL)",
     ylab = "Densidad")

abline(v = 126, col = "red", lty = 2)
legend("topright", legend = "Umbral diabetes (126)", col = "red", lty = 2)

- DATOS SIMULADOS

glucosa <- rlnorm(15, meanlog = mu, sdlog = sigma)

Estado <- c()
for (i in 1:length(glucosa)) {
  if (glucosa[i] < 100) {
    Estado <- c(Estado, "Normal")
  } else if (glucosa[i] < 126) {
    Estado <- c(Estado, "Prediabetes")
  } else {
    Estado <- c(Estado, "Diabetes")
  }
}

tabla_glucosa <- data.frame(
  Paciente = paste("Paciente", 1:15),
  Glucosa = round(glucosa, 1),
  Estado = Estado
)

kable(tabla_glucosa, caption = "Glucosa en pacientes del Hospital San José") %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Glucosa en pacientes del Hospital San José
Paciente Glucosa Estado
Paciente 1 112.6 Prediabetes
Paciente 2 120.0 Prediabetes
Paciente 3 178.8 Diabetes
Paciente 4 157.6 Diabetes
Paciente 5 206.2 Diabetes
Paciente 6 77.7 Normal
Paciente 7 216.5 Diabetes
Paciente 8 164.4 Diabetes
Paciente 9 119.4 Prediabetes
Paciente 10 130.6 Diabetes
Paciente 11 72.7 Normal
Paciente 12 158.7 Diabetes
Paciente 13 96.0 Normal
Paciente 14 83.6 Normal
Paciente 15 183.1 Diabetes

DISTRIBUCION NORMAL O GAUSSIANA

La distribución Gaussiana, también conocida como distribución Normal, es la distribución más importante en estadística. Tiene forma de campana simétrica y describe muchos fenómenos naturales como estaturas, pesos, errores de medición, calificaciones, entre otros.

CARACTERISTICAS PRINCIPALES:

  • Es simétrica alrededor de su media (μ)
  • La media, mediana y moda son iguales
  • Aproximadamente el 68% de los datos están dentro de 1 desviación estándar de la media
  • Aproximadamente el 95% de los datos están dentro de 2 desviaciones estándar
  • Aproximadamente el 99.7% de los datos están dentro de 3 desviaciones estándar (Regla 68-95-99.7)

FORMULA

\[f(x; \mu, \sigma) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\] μ (mu) = Media de la distribución (centro de la campana)

σ (sigma) = Desviación estándar (qué tan dispersos están los datos)

Nota importante: Cuando μ = 0 y σ = 1, se llama Distribución Normal Estándar

EJEMPLO

En una jornada de salud en el Parque Cabal , se midió la presión arterial sistólica de adultos. Los datos siguen una distribución normal con \(\mu = 122\) mmHg y \(\sigma = 14\) mmHg.

- ALGORITMO PROPIO

gaussiana <- function(x, mu, sigma) {
  denominador <- sigma * raiz(2 * PI)
  exponente <- -((x - mu)^2) / (2 * sigma^2)
  return((1 / denominador) * expo(exponente))
}

- COMPARACION CON LA FUNCION R

gaussiana(122, 122, 14)
## [1] 0.02849588
dnorm(122, 122, 14)
## [1] 0.02849588

- GRAFICA

mu2 <- 122
sigma2 <- 14
x2 <- seq(70, 180, length.out = 200)
mi_resultado2 <- sapply(x2, gaussiana, mu = mu2, sigma = sigma2)

plot(x2, mi_resultado2,
     type = "l",
     col = "green",
     lwd = 2,
     main = "Distribucion Normal - Presion arterial",
     sub = "Jornada de salud Parque Cabal, Buga",
     xlab = "Presion arterial sistolica (mmHg)",
     ylab = "Densidad")

abline(v = 130, col = "red", lty = 2)
legend("topright", legend = "Presion alta (130+)", col = "red", lty = 2)

- DATOS SIMULADOS

presion <- rnorm(15, mean = mu2, sd = sigma2)

Categoria <- c()
for (i in 1:length(presion)) {
  if (presion[i] < 120) {
    Categoria <- c(Categoria, "Normal")
  } else if (presion[i] < 130) {
    Categoria <- c(Categoria, "Elevada")
  } else {
    Categoria <- c(Categoria, "Hipertension")
  }
}

tabla_presion <- data.frame(
  Persona = paste("Persona", 1:15),
  Presion = round(presion, 1),
  Categoria = Categoria
)

kable(tabla_presion, caption = "Presion arterial en jornada de salud - Buga") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Presion arterial en jornada de salud - Buga
Persona Presion Categoria
Persona 1 119.3 Normal
Persona 2 134.6 Hipertension
Persona 3 110.5 Normal
Persona 4 138.2 Hipertension
Persona 5 120.2 Elevada
Persona 6 122.9 Elevada
Persona 7 113.5 Normal
Persona 8 145.7 Hipertension
Persona 9 126.5 Elevada
Persona 10 134.9 Hipertension
Persona 11 99.1 Normal
Persona 12 109.2 Normal
Persona 13 130.0 Elevada
Persona 14 123.0 Elevada
Persona 15 120.1 Elevada

DISTRIBUCION CHI CUADRADO

La distribución chi-cuadrado se usa principalmente para pruebas estadísticas. Sirve para saber si dos variables categóricas están relacionadas entre sí.

CARACTERISTICAS PRINCIPALES:

  • Es no simétrica y está sesgada hacia la derecha
  • Solo toma valores positivos (χ² ≥ 0)
  • Su forma depende de los grados de libertad (k o df)
  • La media de la distribución es igual a los grados de libertad: μ = k
  • La desviación estándar es: σ = √(2k)
  • Cuando k > 90, la distribución se aproxima a la distribución normal
  • Hay una curva diferente para cada valor de grados de libertad

¿QUE SON LOS GRADOS DE LIBERTAD?

Los grados de libertad (k o df) representan el número de valores que pueden variar libremente en un cálculo. En la práctica, suele ser k = n - 1, donde n es el número de observaciones.

FORMULA

\[f(x; k) = \frac{x^{k/2-1} e^{-x/2}}{2^{k/2} \cdot \Gamma(k/2)}, \quad x > 0\] Donde \(k\) son los grados de libertad.

EJEMPLO

En barrios de Buga como Uninorte, Balboa y Alto Bonito, se quiere saber si el tipo de agua que consumen las familias (acueducto, pozo, río) está relacionado con enfermedades gastrointestinales. Se aplica la prueba chi-cuadrado.

- ALGORITMO PROPIO

chi_cuadrado <- function(x, k) {
  if (x <= 0) return(0)
  numerador <- (x ^ (k / 2 - 1)) * expo(-x / 2)
  denominador <- (2 ^ (k / 2)) * gamma(k / 2)
  return(numerador / denominador)
}

- COMPARACION CON LA FUNCION R

chi_cuadrado(4, 4)
## [1] 0.1353353
dchisq(4, 4)
## [1] 0.1353353

- GRAFICA

k <- 4
x3 <- seq(0.1, 20, length.out = 200)
mi_resultado3 <- sapply(x3, chi_cuadrado, k = k)

plot(x3, mi_resultado3,
     type = "l",
     col = "purple",
     lwd = 2,
     main = "Distribucion Chi-Cuadrado (k = 4)",
     sub = "Estudio fuente de agua vs enfermedades",
     xlab = "Valor chi-cuadrado",
     ylab = "Densidad")

- DATOS SIMULADOS

tabla_datos <- data.frame(
  Fuente = c("Acueducto", "Pozo", "Rio"),
  Con_enfermedad = c(12, 28, 47),
  Sin_enfermedad = c(88, 72, 53)
)

kable(tabla_datos, caption = "Fuente de agua vs Enfermedad gastrointestinal - Buga") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Fuente de agua vs Enfermedad gastrointestinal - Buga
Fuente Con_enfermedad Sin_enfermedad
Acueducto 12 88
Pozo 28 72
Rio 47 53
matriz <- as.matrix(tabla_datos[, 2:3])
prueba <- chisq.test(matriz)

cat("Estadistico chi-cuadrado:", round(prueba$statistic, 3), "\n")
## Estadistico chi-cuadrado: 29.82
cat("Grados de libertad:", prueba$parameter, "\n")
## Grados de libertad: 2
cat("p-valor:", round(prueba$p.value, 5), "\n")
## p-valor: 0

DISTRIBUCION DE POISSON

La distribución Poisson cuenta cuántas veces ocurre un evento en un tiempo o espacio fijo. Se usa cuando los eventos son independientes y ocurren a una tasa constante.

- PROPIEDAD

Una de las propiedades más distintivas de la distribución de Poisson es que su media (valor esperado) es igual a su varianza. Ambos están representados por el parámetro λ (lambda), que denota el número medio de sucesos en el intervalo.

FORMULA

\[P(X = k) = \frac{e^{-\lambda} \cdot \lambda^k}{k!}, \quad k = 0, 1, 2, \ldots\] Donde \(\lambda\) es el promedio de eventos.

VARIACION DE LA FUNCION

La distribución Poisson cambia de forma dependiendo del valor de λ: Cuando λ es pequeño, menor a 10, la curva se inclina hacia la derecha, lo que quiere decir que lo más frecuente es que ocurran pocos eventos, aunque ocasionalmente pueden presentarse valores altos. A medida que λ crece y supera 10, la curva se va equilibrando y comienza a parecerse a una distribución normal, lo que indica que los eventos se distribuyen de manera más uniforme alrededor del promedio.

EJEMPLO

En el servicio de urgencias del Hospital Divino niño de Buga, los fines de semana festivos, llegan en promedio \(\lambda = 4\) pacientes por hora.

- ALGORITMO PROPIO

poisson <- function(k, lambda) {
  numerador <- expo(-lambda) * (lambda ^ k)
  denominador <- fact(k)
  return(numerador / denominador)
}

- COMPARACION CON LA FUNCION R

poisson(4, 4)
## [1] 0.1953668
dpois(4, 4)
## [1] 0.1953668

- GRAFICA

lambda <- 4
k_vals <- 0:12

mis_probs <- c()
for (k in k_vals) {
  mis_probs <- c(mis_probs, poisson(k, lambda))
}

barplot(mis_probs,
        names.arg = k_vals,
        col = "steelblue",
        main = "Distribucion Poisson - Pacientes por hora en urgencias",
        sub = "Hospital Divino niño - Buga ",
        xlab = "Numero de pacientes (k)",
        ylab = "Probabilidad")

- DATOS SIMULADOS

llegadas <- rpois(15, lambda = lambda)

tabla_poisson <- data.frame(
  Hora = paste("Hora", 1:15),
  Pacientes_llegaron = llegadas,
  Probabilidad = round(dpois(llegadas, lambda), 4)
)

kable(tabla_poisson, caption = "Llegadas de pacientes por hora - Urgencias HDN Buga") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Llegadas de pacientes por hora - Urgencias HDN Buga
Hora Pacientes_llegaron Probabilidad
Hora 1 3 0.1954
Hora 2 6 0.1042
Hora 3 2 0.1465
Hora 4 3 0.1954
Hora 5 2 0.1465
Hora 6 4 0.1954
Hora 7 2 0.1465
Hora 8 4 0.1954
Hora 9 1 0.0733
Hora 10 2 0.1465
Hora 11 1 0.0733
Hora 12 2 0.1465
Hora 13 6 0.1042
Hora 14 8 0.0298
Hora 15 5 0.1563

DISTRIBUCION EXPONENCIAL

La distribución exponencial modela el tiempo que pasa entre dos eventos consecutivos. Por ejemplo, cuánto tiempo hay que esperar hasta que llegue el próximo paciente.

FORMULA

\[f(x; \lambda)= \lambda \cdot e^{-\lambda x}, \quad x \geq 0\] donde:

x es la variable aleatoria (normalmente representa el tiempo). λ es el parámetro de la tasa (λ > 0).

EJEMPLO

En el puesto de salud del barrio La Habana en Buga, durante una jornada de vacunación del PAI (Programa Ampliado de Inmunización), el tiempo entre la llegada de dos pacientes sigue una distribución exponencial con \(\lambda = 0.4\) (un paciente cada 2.5 minutos en promedio).

- ALGORITMO PROPIO

exponencial <- function(x, lambda) {
  if (x < 0) return(0)
  return(lambda * expo(-lambda * x))
}

- COMPARACION CON LA FUNCION R

exponencial(2, 0.4)
## [1] 0.1797316
dexp(2, 0.4)
## [1] 0.1797316

- GRAFICA

lambda_exp <- 0.4
x4 <- seq(0, 15, length.out = 200)

mis_densidades <- c()
for (val in x4) {
  mis_densidades <- c(mis_densidades, exponencial(val, lambda_exp))
}

plot(x4, mis_densidades,
     type = "l",
     col = "orange",
     lwd = 2,
     main = "Distribucion Exponencial - Tiempo entre llegadas",
     sub = "Jornada de vacunacion PAI - Barrio La Habana, Buga",
     xlab = "Tiempo entre llegadas (minutos)",
     ylab = "Densidad")

- DATOS SIMULADOS

tiempos <- rexp(15, rate = lambda_exp)

tabla_exp <- data.frame(
  Paciente = paste("Paciente", 1:15),
  Tiempo_espera_min = round(tiempos, 2),
  Prob_esperar_mas = round(1 - pexp(tiempos, rate = lambda_exp), 4)
)

names(tabla_exp)[3] <- "P(T > t)"

kable(tabla_exp, caption = "Tiempos entre llegadas - Vacunacion PAI barrio La Habana, Buga") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tiempos entre llegadas - Vacunacion PAI barrio La Habana, Buga
Paciente Tiempo_espera_min P(T > t)
Paciente 1 1.01 0.6670
Paciente 2 0.67 0.7641
Paciente 3 0.81 0.7233
Paciente 4 4.03 0.1994
Paciente 5 0.07 0.9714
Paciente 6 2.59 0.3552
Paciente 7 0.60 0.7878
Paciente 8 1.26 0.6030
Paciente 9 6.38 0.0778
Paciente 10 3.03 0.2977
Paciente 11 4.46 0.1682
Paciente 12 0.56 0.7982
Paciente 13 3.01 0.2999
Paciente 14 0.39 0.8559
Paciente 15 0.71 0.7513

RESUMEN

resumen <- data.frame(
  Distribucion = c("Lognormal", "Normal", "Chi-Cuadrado", "Poisson", "Exponencial"),
  Parametros = c("mu=4.8, sigma=0.3", "mu=122, sigma=14", "k=4", "lambda=4", "lambda=0.4"),
  Tipo = c("Continua", "Continua", "Continua", "Discreta", "Continua"),
  Ejemplo_en_Buga = c(
    "Glucosa en sangre - Hospital San José",
    "Presion arterial - Jornada Parque Cabal",
    "Agua vs enf. gastrointestinal - Barrios de Buga",
    "Pacientes por hora - Urgencias",
    "Tiempo entre llegadas - Vacunacion PAI La Habana"
  )
)

kable(resumen, caption = "Resumen de las distribuciones estudiadas - Buga, Valle del Cauca") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = TRUE)
Resumen de las distribuciones estudiadas - Buga, Valle del Cauca
Distribucion Parametros Tipo Ejemplo_en_Buga
Lognormal mu=4.8, sigma=0.3 Continua Glucosa en sangre - Hospital San José
Normal mu=122, sigma=14 Continua Presion arterial - Jornada Parque Cabal
Chi-Cuadrado k=4 Continua Agua vs enf. gastrointestinal - Barrios de Buga
Poisson lambda=4 Discreta Pacientes por hora - Urgencias
Exponencial lambda=0.4 Continua Tiempo entre llegadas - Vacunacion PAI La Habana