Universidad del Valle — Seccional Buga

Ingeniería Industrial


Introducción

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.


Funciones auxiliares

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)
}

1. Distribución Lognormal

Definición

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órmula

\[f(x) = \frac{1}{x \cdot \sigma \sqrt{2\pi}} \; e^{-\dfrac{(\ln x - \mu)^2}{2\sigma^2}}, \quad x > 0\]

Parámetros:

  • \(\mu\) = media del logaritmo natural de la variable
  • \(\sigma\) = desviación estándar del logaritmo natural
  • \(x > 0\) = valor de la variable (solo valores positivos)

Gráfica General

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")

Ejemplo — Mercado Central de Buga

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.

Algoritmo:

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

Data Frame — Compradores del Mercado Central:

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)")
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

Gráfica del Ejemplo:

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")


2. Distribución Gaussiana (Normal)

Definición

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órmula

\[f(x) = \frac{1}{\sigma\sqrt{2\pi}} \; e^{-\dfrac{(x-\mu)^2}{2\sigma^2}}\]

Parámetros:

  • \(\mu\) = media (centro de la campana)
  • \(\sigma\) = desviación estándar
  • \(e\) = número de Euler ≈ 2.71828

Gráfica General

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")

Ejemplo — Colegio Académico de Buga

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)\).

Algoritmo:

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

Data Frame — Calificaciones de Estudiantes:

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")
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

Gráfica del Ejemplo:

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")


3. Distribución Chi Cuadrado

Definición

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órmula

\[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:

  • \(k\) = grados de libertad
  • \(S^2\) = varianza muestral
  • \(\sigma_0^2\) = varianza poblacional de referencia

Gráfica General

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")

Ejemplo — Hospital San José de Buga

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².

Algoritmo:

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.

Data Frame — Tiempos de Atención:

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)")
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

Gráfica del Ejemplo:

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")


4. Distribución de Poisson

Definición

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.

Fórmula

\[P(X = k) = \frac{e^{-\lambda} \cdot \lambda^k}{k!}, \quad k = 0, 1, 2, \ldots\]

Parámetros:

  • \(\lambda\) = número promedio de eventos por intervalo
  • \(k\) = número de eventos (entero \(\geq 0\))

Gráfica General

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")

Ejemplo — Hospital Divino Niño, Buga

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.

Algoritmo:

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

Data Frame — Llamadas de Urgencia por Hora:

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")
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

Gráfica del Ejemplo:

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")


5. Distribución Exponencial

Definición

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.

Fórmula

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:

  • \(\lambda\) = tasa de ocurrencia de eventos
  • \(\frac{1}{\lambda}\) = tiempo promedio entre eventos

Gráfica General

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)")

Ejemplo — TransBuga (Transporte Urbano de Buga)

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.

Algoritmo:

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

Data Frame — Tiempos entre Buses:

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)")
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)

Gráfica del Ejemplo:

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 Comparativo

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")
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

Referencias