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. —
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
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.
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.
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.
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\).
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))
}
lognormal(120, 4.8, 0.3)
## [1] 0.0110553
dlnorm(120, 4.8, 0.3)
## [1] 0.0110721
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)
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)
| 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 |
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.
\[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
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.
gaussiana <- function(x, mu, sigma) {
denominador <- sigma * raiz(2 * PI)
exponente <- -((x - mu)^2) / (2 * sigma^2)
return((1 / denominador) * expo(exponente))
}
gaussiana(122, 122, 14)
## [1] 0.02849588
dnorm(122, 122, 14)
## [1] 0.02849588
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)
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)
| 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 |
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í.
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.
\[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.
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.
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)
}
chi_cuadrado(4, 4)
## [1] 0.1353353
dchisq(4, 4)
## [1] 0.1353353
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")
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 | 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
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.
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.
\[P(X = k) = \frac{e^{-\lambda} \cdot \lambda^k}{k!}, \quad k = 0, 1, 2, \ldots\] Donde \(\lambda\) es el promedio de eventos.
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.
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.
poisson <- function(k, lambda) {
numerador <- expo(-lambda) * (lambda ^ k)
denominador <- fact(k)
return(numerador / denominador)
}
poisson(4, 4)
## [1] 0.1953668
dpois(4, 4)
## [1] 0.1953668
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")
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)
| 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 |
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.
\[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).
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).
exponencial <- function(x, lambda) {
if (x < 0) return(0)
return(lambda * expo(-lambda * x))
}
exponencial(2, 0.4)
## [1] 0.1797316
dexp(2, 0.4)
## [1] 0.1797316
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")
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)
| 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 <- 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)
| 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 |