Las distribuciones de probabilidad son modelos matemáticos que describen cómo se comportan los datos aleatorios. Permiten estimar qué tan probable es que ocurra un resultado específico dentro de un conjunto de posibles valores. En este documento se presentan cinco distribuciones fundamentales, cada una con su fórmula, algoritmo desarrollado a pie, y un ejemplo aplicado al contexto local de Guadalajara de Buga, Valle del Cauca.
factorial <- function(n) {
r <- 1
if (n > 0) for (i in 1:n) r <- r * i
return(r)
}
raiz <- function(v) {
r <- v / 2.0
for (k in 1:30) r <- (r + v / r) / 2.0
return(r)
}
expo <- function(x) {
if (x < 0) return(1 / expo(-x))
s <- 0.0
for (i in 0:100) s <- s + (x^i) / factorial(i)
return(s)
}
logaritmo <- function(x) {
if (x <= 0) return(NaN)
z <- (x - 1) / (x + 1)
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)
}
Una variable aleatoria sigue una distribución lognormal cuando su logaritmo natural sigue una distribución normal. Es frecuente en fenómenos donde los datos son positivos y presentan asimetría hacia la derecha, como precios, ingresos o tiempos de espera.
\[f(x) = \frac{1}{x \cdot \sigma \sqrt{2\pi}} \; e^{-\dfrac{(\ln x - \mu)^2}{2\sigma^2}}, \quad x > 0\]
Parámetros:
x <- seq(0.01, 5, by = 0.01)
y <- dlnorm(x, meanlog = 0, sdlog = 0.5)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Lognormal (μ=0, σ=0.5)",
xlab = "Valores de x",
ylab = "Densidad de probabilidad")
El Mercado Central de Buga es uno de los centros comerciales más activos del municipio. Un investigador quiere modelar el gasto diario que realizan los compradores con una distribución lognormal con \(\mu = 2.5\) y \(\sigma = 0.4\). Se calcula la densidad para un gasto de $15,000.
lognormal <- function(x, mu, sigma) {
PI <- 3.141592653589793
if (x <= 0) return(0)
denominador <- x * sigma * raiz(2 * PI)
exponente <- -((logaritmo(x) - mu)^2) / (2 * sigma^2)
return((1 / denominador) * expo(exponente))
}
cat("Resultado: ", lognormal(15, 2.5, 0.4))
## Resultado: 0.05807829
cat("\nVerificación con R:", dlnorm(15, meanlog = 2.5, sdlog = 0.4))
##
## Verificación con R: 0.05807829
set.seed(42)
n <- 50
mercado <- data.frame(
ID = 1:n,
Seccion = sample(c("Frutas y Verduras", "Carnes", "Lácteos",
"Granos", "Miscelánea"), n, replace = TRUE),
Gasto = round(rlnorm(n, meanlog = 2.5, sdlog = 0.4), 2)
)
mercado <- mercado[order(mercado$Gasto, decreasing = TRUE), ]
knitr::kable(head(mercado, 10),
caption = "Tabla 1. Top 10 Compradores — Mercado Central de Buga (Gasto en miles de COP)")
| ID | Seccion | Gasto | |
|---|---|---|---|
| 18 | 18 | Frutas y Verduras | 22.88 |
| 46 | 46 | Carnes | 22.31 |
| 13 | 13 | Granos | 21.71 |
| 29 | 29 | Frutas y Verduras | 21.33 |
| 31 | 31 | Lácteos | 20.51 |
| 33 | 33 | Granos | 18.46 |
| 34 | 34 | Granos | 17.61 |
| 42 | 42 | Lácteos | 16.56 |
| 8 | 8 | Carnes | 16.50 |
| 35 | 35 | Carnes | 16.25 |
x <- seq(0.1, 60, by = 0.1)
y <- dlnorm(x, meanlog = 2.5, sdlog = 0.4)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Lognormal — Gasto en Mercado Central de Buga",
xlab = "Gasto (Miles de COP)",
ylab = "Densidad")
La distribución Gaussiana o Normal es la más utilizada en estadística. Describe fenómenos donde los datos se agrupan simétricamente alrededor de un valor promedio, formando la característica curva de campana.
\[f(x) = \frac{1}{\sigma\sqrt{2\pi}} \; e^{-\dfrac{(x-\mu)^2}{2\sigma^2}}\]
Parámetros:
x <- seq(-4, 4, length.out = 200)
y <- dnorm(x, mean = 0, sd = 1)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Gaussiana Estándar (μ=0, σ=1)",
xlab = "Z-Score",
ylab = "Densidad")
El Colegio Académico analizó las calificaciones de grado 11° en Matemáticas con \(\mu = 3.5\) y \(\sigma = 0.6\). Se calcula \(P(X \leq 4.0)\).
gaussiana <- function(x, mu, sigma) {
PI <- 3.141592653589793
den <- sigma * raiz(2 * PI)
e <- -((x - mu)^2) / (2 * sigma^2)
return((1 / den) * expo(e))
}
area <- 0
for (p in seq(-10, 4.0, by = 0.001)) {
area <- area + gaussiana(p, 3.5, 0.6) * 0.001
}
cat("P(X ≤ 4.0): ", round(area, 5))
## P(X ≤ 4.0): 0.79791
cat("\nVerificación con R:", round(pnorm(4.0, 3.5, 0.6), 5))
##
## Verificación con R: 0.79767
set.seed(77)
n <- 50
colegio <- data.frame(
ID = 1:n,
Estudiante = paste0("Est", sprintf("%02d", 1:n)),
Nota = round(rnorm(n, mean = 3.5, sd = 0.6), 2)
)
colegio$Estado <- ifelse(colegio$Nota >= 3.0, "Aprobado", "Reprobado")
colegio <- colegio[order(colegio$Nota, decreasing = TRUE), ]
knitr::kable(head(colegio, 10),
caption = "Tabla 2. Top 10 Calificaciones — Colegio Académico de Buga")
| ID | Estudiante | Nota | Estado | |
|---|---|---|---|---|
| 18 | 18 | Est18 | 4.76 | Aprobado |
| 29 | 29 | Est29 | 4.60 | Aprobado |
| 23 | 23 | Est23 | 4.57 | Aprobado |
| 22 | 22 | Est22 | 4.41 | Aprobado |
| 10 | 10 | Est10 | 4.36 | Aprobado |
| 30 | 30 | Est30 | 4.27 | Aprobado |
| 6 | 6 | Est06 | 4.18 | Aprobado |
| 2 | 2 | Est02 | 4.15 | Aprobado |
| 4 | 4 | Est04 | 4.13 | Aprobado |
| 17 | 17 | Est17 | 4.11 | Aprobado |
x <- seq(1.5, 5.5, by = 0.01)
y <- dnorm(x, mean = 3.5, sd = 0.6)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Normal — Notas Matemáticas Grado 11°\nColegio Académico, Buga",
xlab = "Calificación (0 a 5)",
ylab = "Densidad")
La distribución Chi Cuadrado (\(\chi^2\)) se utiliza para analizar la variabilidad de los datos y para pruebas de hipótesis sobre varianzas. El parámetro clave son los grados de libertad (\(k\)).
\[f(x; k) = \frac{x^{k/2 - 1} \; e^{-x/2}}{2^{k/2} \; \Gamma(k/2)}, \quad x > 0\]
\[\chi^2 = \frac{(n-1) \cdot S^2}{\sigma_0^2}\]
Parámetros:
x <- seq(0, 30, length.out = 200)
plot(x, dchisq(x, df = 5), type = "l", col = "blue", lwd = 2,
main = "Distribución Chi Cuadrado (df = 5)",
xlab = "Valor de Chi Cuadrado",
ylab = "Densidad")
El Hospital San José estudia la variabilidad en tiempos de atención. Varianza histórica \(\sigma_0^2 = 25\) min², muestra de 30 pacientes con \(S^2 = 38\) min².
chiestadistico <- function(n, s2, sigma2) {
gl <- n - 1
chi <- (gl * s2) / sigma2
return(list(chi = chi, gl = gl))
}
resultado <- chiestadistico(n = 30, s2 = 38, sigma2 = 25)
chi <- resultado$chi
gl <- resultado$gl
cat("Estadístico χ² calculado: ", round(chi, 4))
## Estadístico χ² calculado: 44.08
cat("\nGrados de libertad: ", gl)
##
## Grados de libertad: 29
cat("\nValor crítico χ²(0.95,29):", round(qchisq(0.95, df = gl), 4))
##
## Valor crítico χ²(0.95,29): 42.557
if (chi > qchisq(0.95, df = gl)) {
cat("\n→ Se rechaza H0: la varianza actual es significativamente mayor.")
} else {
cat("\n→ No se rechaza H0: no hay evidencia suficiente de mayor varianza.")
}
##
## → Se rechaza H0: la varianza actual es significativamente mayor.
set.seed(55)
n <- 30
hospital <- data.frame(
ID = 1:n,
Paciente = paste0("PAC", sprintf("%03d", 1:n)),
Especialidad = sample(c("Medicina General", "Pediatría",
"Ginecología", "Ortopedia"), n, replace = TRUE),
Tiempo = round(rnorm(n, mean = 22, sd = sqrt(38)), 1)
)
hospital <- hospital[order(hospital$Tiempo, decreasing = TRUE), ]
knitr::kable(head(hospital, 10),
caption = "Tabla 3. Tiempos de Atención — Hospital San José de Buga (minutos)")
| ID | Paciente | Especialidad | Tiempo | |
|---|---|---|---|---|
| 2 | 2 | PAC002 | Pediatría | 36.5 |
| 16 | 16 | PAC016 | Ginecología | 31.6 |
| 7 | 7 | PAC007 | Ortopedia | 31.2 |
| 13 | 13 | PAC013 | Pediatría | 30.7 |
| 26 | 26 | PAC026 | Pediatría | 29.1 |
| 3 | 3 | PAC003 | Ortopedia | 28.7 |
| 9 | 9 | PAC009 | Pediatría | 28.6 |
| 5 | 5 | PAC005 | Medicina General | 28.1 |
| 11 | 11 | PAC011 | Ortopedia | 27.9 |
| 29 | 29 | PAC029 | Ortopedia | 27.7 |
x <- seq(0, 70, by = 0.1)
y <- dchisq(x, df = 29)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Chi Cuadrado — Tiempos Hospital San José, Buga (df = 29)",
xlab = "Valor χ²",
ylab = "Densidad")
La distribución de Poisson modela el número de veces que ocurre un evento en un intervalo fijo de tiempo o espacio, cuando los eventos son independientes y ocurren a una tasa constante.
\[P(X = k) = \frac{e^{-\lambda} \cdot \lambda^k}{k!}, \quad k = 0, 1, 2, \ldots\]
Parámetros:
k <- 0:15
y <- dpois(k, lambda = 4)
plot(k, y, type = "h", col = "blue", lwd = 3,
main = "Distribución de Poisson (λ = 4)",
xlab = "Número de eventos (k)",
ylab = "Probabilidad")
El Hospital Divino Niño registra en promedio 5 llamadas de urgencia por hora. Se calcula la probabilidad de recibir exactamente 8 llamadas en una hora.
poisson <- function(k, lambda) {
numerador <- expo(-lambda) * (lambda^k)
denominador <- factorial(k)
return(numerador / denominador)
}
cat("P(X=8, λ=5): ", round(poisson(8, 5), 6))
## P(X=8, λ=5): 0.065278
cat("\nVerificación con R:", round(dpois(8, 5), 6))
##
## Verificación con R: 0.065278
set.seed(88)
horas <- 40
clinica <- data.frame(
Hora = paste0("H", sprintf("%02d", 1:horas)),
Turno = sample(c("Nocturno", "Diurno", "Tarde"), horas, replace = TRUE),
Llamadas = rpois(horas, lambda = 5)
)
clinica$Nivel <- ifelse(clinica$Llamadas >= 8, "Alto",
ifelse(clinica$Llamadas >= 5, "Medio", "Bajo"))
clinica <- clinica[order(clinica$Llamadas, decreasing = TRUE), ]
knitr::kable(head(clinica, 10),
caption = "Tabla 4. Llamadas de Urgencia por Hora — Hospital Divino Niño, Buga")
| Hora | Turno | Llamadas | Nivel | |
|---|---|---|---|---|
| 28 | H28 | Diurno | 10 | Alto |
| 1 | H01 | Tarde | 9 | Alto |
| 30 | H30 | Nocturno | 8 | Alto |
| 34 | H34 | Tarde | 8 | Alto |
| 37 | H37 | Diurno | 8 | Alto |
| 40 | H40 | Diurno | 8 | Alto |
| 21 | H21 | Nocturno | 7 | Medio |
| 7 | H07 | Nocturno | 6 | Medio |
| 10 | H10 | Nocturno | 6 | Medio |
| 14 | H14 | Nocturno | 6 | Medio |
k <- 0:18
y <- dpois(k, lambda = 5)
plot(k, y, type = "h", col = "blue", lwd = 3,
main = "Distribución de Poisson — Llamadas Urgencia\nHospital Divino NIño, Buga (λ = 5)",
xlab = "Número de llamadas por hora",
ylab = "Probabilidad")
La distribución Exponencial modela el tiempo entre eventos que siguen una distribución de Poisson. Tiene la propiedad de sin memoria: el tiempo ya esperado no afecta el tiempo restante.
Función de densidad: \[f(x) = \lambda \, e^{-\lambda x}, \quad x \geq 0\]
Función acumulada: \[F(x) = P(X \leq x) = 1 - e^{-\lambda x}\]
Parámetros:
x <- seq(0, 6, length.out = 200)
plot(x, dexp(x, rate = 1), type = "l", col = "blue", lwd = 2,
main = "Distribución Exponencial (λ = 1)",
xlab = "Tiempo entre eventos (x)",
ylab = "Densidad f(x)")
TransBuga opera rutas urbanas con un bus cada 8 minutos en promedio (\(\lambda = 1/8\)). Se calcula \(P(X \leq 5)\): la probabilidad de que el bus llegue en menos de 5 minutos.
exponencial <- function(x, lambda) {
if (x < 0) return(0)
return(1 - expo(-lambda * x))
}
lambda <- 1 / 8
cat("P(X ≤ 5 min): ", round(exponencial(5, lambda), 5))
## P(X ≤ 5 min): 0.46474
cat("\nVerificación con R:", round(pexp(5, rate = lambda), 5))
##
## Verificación con R: 0.46474
set.seed(66)
n <- 50
buses <- data.frame(
Registro = 1:n,
Ruta = sample(c("Centro - El Prado", "Centro - La Lorena",
"Centro - El Placer", "Centro - Versalles"),
n, replace = TRUE),
Tiempo = round(rexp(n, rate = 1/8), 2)
)
buses$Clasificacion <- ifelse(buses$Tiempo <= 5, "Puntual (≤ 5 min)",
ifelse(buses$Tiempo <= 10, "Normal (5-10 min)",
"Demorado (> 10 min)"))
buses <- buses[order(buses$Tiempo), ]
knitr::kable(head(buses, 10),
caption = "Tabla 5. Tiempos entre Llegadas de Buses — TransBuga (minutos)")
| Registro | Ruta | Tiempo | Clasificacion | |
|---|---|---|---|---|
| 47 | 47 | Centro - La Lorena | 0.16 | Puntual (≤ 5 min) |
| 46 | 46 | Centro - El Prado | 0.23 | Puntual (≤ 5 min) |
| 39 | 39 | Centro - La Lorena | 0.56 | Puntual (≤ 5 min) |
| 7 | 7 | Centro - El Prado | 1.00 | Puntual (≤ 5 min) |
| 41 | 41 | Centro - Versalles | 1.00 | Puntual (≤ 5 min) |
| 31 | 31 | Centro - La Lorena | 1.10 | Puntual (≤ 5 min) |
| 16 | 16 | Centro - Versalles | 1.30 | Puntual (≤ 5 min) |
| 49 | 49 | Centro - El Prado | 1.51 | Puntual (≤ 5 min) |
| 24 | 24 | Centro - El Prado | 1.66 | Puntual (≤ 5 min) |
| 21 | 21 | Centro - El Placer | 1.70 | Puntual (≤ 5 min) |
x <- seq(0, 40, by = 0.1)
y <- dexp(x, rate = 1/8)
plot(x, y, type = "l", col = "blue", lwd = 2,
main = "Distribución Exponencial — Tiempo entre Buses\nTransBuga, Guadalajara de Buga (λ = 1/8)",
xlab = "Tiempo entre buses (minutos)",
ylab = "Densidad f(x)")
resumen <- data.frame(
Distribucion = c("Lognormal", "Gaussiana", "Chi Cuadrado", "Poisson", "Exponencial"),
Tipo = c("Continua", "Continua", "Continua", "Discreta", "Continua"),
Parametros = c("μ, σ (del log)", "μ, σ", "k (grados libertad)", "λ (tasa media)", "λ (tasa)"),
Uso = c("Datos positivos asimétricos", "Fenómenos simétricos",
"Pruebas de varianza", "Conteo de eventos", "Tiempo entre eventos"),
Ejemplo = c("Gasto en Mercado Central", "Notas en Colegio La Inmaculada",
"Tiempos en Hospital San José", "Llamadas en Clínica Guadalupe",
"Tiempos entre buses TransBuga")
)
knitr::kable(resumen,
caption = "Tabla 6. Resumen de las Cinco Distribuciones Probabilísticas")
| Distribucion | Tipo | Parametros | Uso | Ejemplo |
|---|---|---|---|---|
| Lognormal | Continua | μ, σ (del log) | Datos positivos asimétricos | Gasto en Mercado Central |
| Gaussiana | Continua | μ, σ | Fenómenos simétricos | Notas en Colegio La Inmaculada |
| Chi Cuadrado | Continua | k (grados libertad) | Pruebas de varianza | Tiempos en Hospital San José |
| Poisson | Discreta | λ (tasa media) | Conteo de eventos | Llamadas en Clínica Guadalupe |
| Exponencial | Continua | λ (tasa) | Tiempo entre eventos | Tiempos entre buses TransBuga |