Distribución Lognormal

Modela variables positivas y asimétricas cuyo logaritmo sigue una distribución normal. Se usa para representar valores que no pueden ser negativos y presentan una cola hacia la derecha, como ingresos, precios, tiempos de vida o rendimientos financieros.

Fórmula

\[f(x)=\frac{1}{x\sigma \sqrt{2\pi }}e^{-\frac{(Lnx - \mu )^{2}}{2\sigma^{2} }}, x>0\] f(x) = función de densidad.
x = variable aleatoria positiva.
\(\mu\) = media del logaritmo de x.
\(\sigma\) = desviación estándar del logaritmo de x.
e = número de Euler

Ejemplo

En el informe económico de Guadalajara de Buga para el año 2025 se reportaron las ventas de diferentes sectores económicos del municipio. Se desea estudiar el comportamiento de las ventas registradas. La variable X corresponde a las ventas reportadas por sector económico (en pesos) y los valores observados son:

Sector Ventas (COP)
Agrícola y Pesquero 1.826.820.441.191
Industria Manufacturera 1.656.296.688.513
Comercio 1.311.424.914.006
Transporte 135.878.357.440
Alojamiento y Servicios de Comida 54.958.726.359
Construcción 73.992.500.441
Tratamiento de Aguas 79.980.683.220
Minas 1.772.257.000

Fuente: Informe Económico Guadalajara de Buga 2025

Algoritmo

# Datos reales del ejemplo: ventas por sector en pesos
ventas <- c(1826820441191, 1656296688513, 1311424914006,
            135878357440,  54958726359,   73992500441,
            79980683220,   1772257000)

sectores <- c("Agrícola y Pesquero", "Industria Manufacturera", "Comercio",
              "Transporte", "Alojamiento", "Construcción",
              "Tratamiento de Aguas", "Minas")

# Parámetros de la distribución lognormal
# Se estiman a partir del logaritmo de los datos
log_ventas <- log(ventas)
u <- mean(log_ventas)   # media del logaritmo
o <- sd(log_ventas)     # desviación estándar del logaritmo

cat("Media del logaritmo (mu):", round(u, 4), "\n")
## Media del logaritmo (mu): 25.758
cat("Desv. estándar del logaritmo (sigma):", round(o, 4), "\n\n")
## Desv. estándar del logaritmo (sigma): 2.3399
# Algoritmo manual de la función de densidad lognormal
lognormal <- function(x, u, o) {
  pi_val <- 3.141592653
  dis <- (1 / (x * o * sqrt(2 * pi_val))) * exp(-((log(x) - u)^2) / (2 * o^2))
  return(dis)
}

# Calcular f(x) para cada sector con el algoritmo propio
densidades_manual <- sapply(ventas, lognormal, u = u, o = o)

# Calcular f(x) para cada sector con la función de R
densidades_R <- dlnorm(ventas, meanlog = u, sdlog = o)

# Comparación de resultados
resultado <- data.frame(
  Sector      = sectores,
  Ventas_COP  = format(ventas, big.mark = ".", scientific = FALSE),
  f_x_manual  = format(densidades_manual, scientific = TRUE, digits = 4),
  f_x_R       = format(densidades_R,      scientific = TRUE, digits = 4)
)
## Warning in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
## 'big.mark' y 'decimal.mark' son ambos '.', lo cual puede ser confuso
knitr::kable(resultado,
             col.names = c("Sector", "Ventas (COP)", "f(x) Algoritmo", "f(x) dlnorm()"),
             caption = "Densidad lognormal por sector económico - Buga 2025",
             align = c("l","r","r","r"))
Densidad lognormal por sector económico - Buga 2025
Sector Ventas (COP) f(x) Algoritmo f(x) dlnorm()
Agrícola y Pesquero 1.826.820.441.191 5.333e-14 5.333e-14
Industria Manufacturera 1.656.296.688.513 6.143e-14 6.143e-14
Comercio 1.311.424.914.006 8.544e-14 8.544e-14
Transporte 135.878.357.440 1.253e-12 1.253e-12
Alojamiento 54.958.726.359 2.817e-12 2.817e-12
Construcción 73.992.500.441 2.195e-12 2.195e-12
Tratamiento de Aguas 79.980.683.220 2.050e-12 2.050e-12
Minas 1.772.257.000 1.561e-11 1.561e-11

Función de R

# Gráfica de la distribución ajustada a los datos
x_seq <- seq(min(ventas) * 0.1, max(ventas) * 1.5, length.out = 500)
y_seq <- dlnorm(x_seq, meanlog = u, sdlog = o)

plot(x_seq, y_seq, type = "l", col = "steelblue", lwd = 2,
     main = "Distribución Lognormal - Ventas por Sector (Buga 2025)",
     xlab = "Ventas (COP)", ylab = "Densidad f(x)",
     cex.main = 0.9)
points(ventas, dlnorm(ventas, meanlog = u, sdlog = o),
       col = "red", pch = 19, cex = 0.9)
legend("topright", legend = c("Curva lognormal", "Sectores observados"),
       col = c("steelblue", "red"), lty = c(1, NA), pch = c(NA, 19))


Distribución Gaussiana

La distribución gaussiana o normal es simétrica respecto a su media y describe muchos fenómenos naturales, como alturas, pesos o errores de medición. Es la base de la estadística inferencial.

Fórmula

\[f(x)=\frac{1}{\sigma \sqrt{2\pi }}e^{-\frac{(x - \mu )^{2}}{2\sigma^{2}}}\]
f(x) = función densidad.
x = valor de la variable.
\(\mu\) = media de la distribución.
\(\sigma\) = desviación estándar

Ejemplo

En Guadalajara de Buga se registró el número total de empresas durante varios periodos consecutivos. Se desea estudiar el comportamiento de la cantidad de empresas registradas a lo largo del tiempo. La variable X corresponde al número de empresas registradas por año y los valores observados son:

Año Empresas registradas
2021 4.568
2022 4.868
2024 4.960
2025 5.065

Fuente: Cámara de Comercio de Guadalajara de Buga

Algoritmo

# Datos reales del ejemplo: empresas registradas por año
empresas <- c(4568, 4868, 4960, 5065)
anios    <- c(2021, 2022, 2024, 2025)

# Parámetros estimados a partir de los datos
u <- mean(empresas)   # media
o <- sd(empresas)     # desviación estándar

cat("Media (mu):", round(u, 2), "empresas\n")
## Media (mu): 4865.25 empresas
cat("Desviación estándar (sigma):", round(o, 2), "empresas\n\n")
## Desviación estándar (sigma): 213.89 empresas
# Algoritmo manual de la función de densidad gaussiana
gauss <- function(x, u, o) {
  pi_val <- 3.141592653
  dis <- (1 / (o * sqrt(2 * pi_val))) * exp(-(1/2) * ((x - u) / o)^2)
  return(dis)
}

# Calcular f(x) para cada año con el algoritmo propio
densidades_manual <- sapply(empresas, gauss, u = u, o = o)

# Calcular f(x) con la función de R
densidades_R <- dnorm(empresas, mean = u, sd = o)

# Comparación de resultados
resultado <- data.frame(
  Año         = anios,
  Empresas    = empresas,
  f_x_manual  = round(densidades_manual, 8),
  f_x_R       = round(densidades_R,      8)
)

knitr::kable(resultado,
             col.names = c("Año", "Empresas", "f(x) Algoritmo", "f(x) dnorm()"),
             caption = "Densidad gaussiana - Empresas registradas Buga",
             align = c("c","r","r","r"))
Densidad gaussiana - Empresas registradas Buga
Año Empresas f(x) Algoritmo f(x) dnorm()
2021 4568 0.0007101 0.0007101
2022 4868 0.0018651 0.0018651
2024 4960 0.0016909 0.0016909
2025 5065 0.0012060 0.0012060

Función de R

# Gráfica de la distribución normal ajustada
x_seq <- seq(u - 4*o, u + 4*o, length.out = 400)
y_seq <- dnorm(x_seq, mean = u, sd = o)

plot(x_seq, y_seq, type = "l", col = "darkgreen", lwd = 2,
     main = "Distribución Gaussiana - Empresas Registradas (Buga)",
     xlab = "Número de empresas", ylab = "Densidad f(x)")
points(empresas, dnorm(empresas, mean = u, sd = o),
       col = "red", pch = 19, cex = 1.1)
text(empresas, dnorm(empresas, mean = u, sd = o),
     labels = anios, pos = 3, cex = 0.75, col = "darkred")
abline(v = u, lty = 2, col = "gray50")
legend("topright", legend = c("Curva normal", "Años observados"),
       col = c("darkgreen", "red"), lty = c(1, NA), pch = c(NA, 19))


Distribución Chi Cuadrado

Modela la suma de cuadrados de variables normales estándar y solo toma valores positivos. Se utiliza principalmente en pruebas de hipótesis e inferencia estadística, como la prueba de independencia o la de bondad de ajuste.

Fórmula

\[\chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}\] \(\chi^2\) = Estadístico chi cuadrado
k = Número de categorías.
\(O_i\) = Frecuencia observada.
\(E_i\) = Frecuencia esperada.

Ejemplo

En el estudio empresarial de Guadalajara de Buga se registró la participación de cada sector económico sobre el total de ventas del municipio durante 2025. Se aplica la prueba chi cuadrado para verificar si existe diferencia significativa entre la participación de los sectores (hipótesis de distribución uniforme). La variable X corresponde a la participación porcentual de cada sector en las ventas totales:

Sector Participación (%)
Industria Manufacturera 34.04
Agrícola y Pesquero 30.86
Comercio 24.43
Transporte 2.53
Tratamiento de Aguas 1.49
Construcción 1.38
Alojamiento y Servicios de Comida 1.02
Minas 0.03

Fuente: Informe Económico Guadalajara de Buga 2025

Algoritmo

# Datos reales del ejemplo: participación porcentual por sector
# (se trabaja con los porcentajes escalados a frecuencias enteras)
participacion <- c(34.04, 30.86, 24.43, 2.53, 1.49, 1.38, 1.02, 0.03)

sectores <- c("Ind. Manufacturera", "Agrícola y Pesquero", "Comercio",
              "Transporte", "Tratamiento Aguas", "Construcción",
              "Alojamiento", "Minas")

# Se escalan los porcentajes para obtener frecuencias observadas enteras
# (multiplicamos por 100 y redondeamos para simular frecuencias sobre 10000)
o <- round(participacion * 100 / sum(participacion) * 1000)
k <- length(o)
n <- sum(o)

# Frecuencia esperada bajo hipótesis de distribución uniforme
e <- rep(n / k, k)

cat("Frecuencias observadas (escaladas):\n")
## Frecuencias observadas (escaladas):
print(o)
## [1] 35540 32220 25506  2641  1556  1441  1065    31
cat("\nFrecuencia esperada por sector:", round(e[1], 2), "\n\n")
## 
## Frecuencia esperada por sector: 12500
# Algoritmo manual del estadístico chi cuadrado
chi_cu <- function(o, k, e) {
  a <- 0
  for (i in 1:k) {
    dis <- ((o[i] - e[i])^2) / e[i]
    a   <- a + dis
  }
  return(a)
}

chi_manual <- chi_cu(o, k, e)
chi_R      <- chisq.test(o)

cat("Chi cuadrado (algoritmo):", round(chi_manual, 4), "\n")
## Chi cuadrado (algoritmo): 137150.7
cat("Chi cuadrado (chisq.test):", round(chi_R$statistic, 4), "\n")
## Chi cuadrado (chisq.test): 137150.7
cat("Grados de libertad:", chi_R$parameter, "\n")
## Grados de libertad: 7
cat("Valor p:", round(chi_R$p.value, 6), "\n\n")
## Valor p: 0
# Tabla de aportes por sector
aportes <- ((o - e)^2) / e
resultado <- data.frame(
  Sector       = sectores,
  Part_pct     = participacion,
  Obs          = o,
  Esp          = round(e, 1),
  Aporte_chi2  = round(aportes, 4)
)

knitr::kable(resultado,
             col.names = c("Sector", "Part. (%)", "Obs.", "Esp.", "Aporte χ²"),
             caption = paste0("Prueba Chi Cuadrado por sector - χ² = ",
                              round(chi_manual, 2), ", p = ",
                              round(chi_R$p.value, 4)),
             align = c("l","r","r","r","r"))
Prueba Chi Cuadrado por sector - χ² = 137150.7, p = 0
Sector Part. (%) Obs. Esp. Aporte χ²
Ind. Manufacturera 34.04 35540 12500 42467.328
Agrícola y Pesquero 30.86 32220 12500 31110.272
Comercio 24.43 25506 12500 13532.483
Transporte 2.53 2641 12500 7775.990
Tratamiento Aguas 1.49 1556 12500 9581.691
Construcción 1.38 1441 12500 9784.119
Alojamiento 1.02 1065 12500 10460.738
Minas 0.03 31 12500 12438.077

Función de R

# Gráfica de la distribución chi cuadrado con gl = k-1
gl <- k - 1
x_seq <- seq(0, chi_manual * 1.8, length.out = 400)
y_seq <- dchisq(x_seq, df = gl)

plot(x_seq, y_seq, type = "l", col = "purple", lwd = 2,
     main = paste0("Distribución Chi Cuadrado (gl = ", gl, ") - Sectores Buga 2025"),
     xlab = expression(chi^2), ylab = "Densidad")
abline(v = chi_manual, col = "red", lty = 2, lwd = 2)
x_region <- seq(qchisq(0.95, df = gl), max(x_seq), length.out = 200)
polygon(c(x_region, rev(x_region)),
        c(dchisq(x_region, df = gl), rep(0, 200)),
        col = rgb(1, 0, 0, 0.2), border = NA)
legend("topright",
       legend = c("Densidad χ²", paste0("χ² observado = ", round(chi_manual,2)),
                  "Zona de rechazo (α=0.05)"),
       col = c("purple","red", rgb(1,0,0,0.4)),
       lty = c(1, 2, NA), fill = c(NA, NA, rgb(1,0,0,0.2)),
       border = c(NA, NA, "red"))


Distribución Poisson

Describe el número de eventos que ocurren en un intervalo de tiempo o espacio, cuando estos son independientes y tienen una tasa promedio constante. Se aplica para contar llegadas, errores o fallas, por ejemplo llamadas por minuto o defectos por metro cuadrado.

Fórmula

\[P\left (X = k \right )= \frac{e^{-\lambda }\lambda ^{k}}{k!}\]
P(X=k) = probabilidad de que ocurran k eventos en el intérvalo.
\(\lambda\) = tasa promedio.
k = conteo de eventos.

Ejemplo

La Cámara de Comercio de Guadalajara de Buga reportó la cantidad de empresas registradas durante diferentes años. Se modela el número de nuevas empresas registradas por año con una distribución Poisson, usando como tasa promedio (\(\lambda\)) el promedio histórico de registros anuales. La variable X corresponde al número de empresas registradas por periodo:

Año Empresas registradas
2021 4.568
2022 4.868
2024 4.960
2025 5.065

Fuente: Cámara de Comercio de Guadalajara de Buga

Algoritmo

# Datos reales del ejemplo
empresas <- c(4568, 4868, 4960, 5065)
anios    <- c(2021, 2022, 2024, 2025)

# Lambda = promedio histórico de empresas registradas por año
lam <- mean(empresas)
cat("Lambda (promedio anual):", round(lam, 2), "empresas\n\n")
## Lambda (promedio anual): 4865.25 empresas
# Algoritmo manual del factorial
factorial_manual <- function(x) {
  a <- 1
  for (i in 1:x) {
    a <- a * i
  }
  return(a)
}

# Algoritmo manual de la distribución Poisson
pois <- function(k, lam) {
  e <- 2.71828182845
  dis <- ((e^-lam) * (lam^k)) / factorial_manual(k)
  return(dis)
}

# Para valores grandes de lambda, se usa el logaritmo para evitar desbordamiento numérico
pois_log <- function(k, lam) {
  # log P(X=k) = -lam + k*log(lam) - log(k!)
  log_prob <- -lam + k * log(lam) - sum(log(1:k))
  return(exp(log_prob))
}

# Calcular P(X = empresas_i) para cada año observado
prob_manual <- sapply(empresas, pois_log, lam = lam)
prob_R      <- dpois(empresas, lambda = lam)

# Tabla comparativa
resultado <- data.frame(
  Año         = anios,
  k           = empresas,
  P_manual    = format(prob_manual, scientific = TRUE, digits = 4),
  P_R         = format(prob_R,      scientific = TRUE, digits = 4)
)

knitr::kable(resultado,
             col.names = c("Año", "k (empresas)", "P(X=k) Algoritmo", "P(X=k) dpois()"),
             caption = paste0("Distribución Poisson con λ = ", round(lam, 2),
                              " - Empresas registradas Buga"),
             align = c("c","r","r","r"))
Distribución Poisson con λ = 4865.25 - Empresas registradas Buga
Año k (empresas) P(X=k) Algoritmo P(X=k) dpois()
2021 4568 5.554e-07 5.554e-07
2022 4868 5.713e-03 5.713e-03
2024 4960 2.265e-03 2.265e-03
2025 5065 9.810e-05 9.810e-05

Función de R

# Gráfica de probabilidades Poisson alrededor de lambda
k_seq <- seq(max(0, round(lam) - 200), round(lam) + 200, by = 10)
probs <- dpois(k_seq, lambda = lam)

plot(k_seq, probs, type = "h", col = "steelblue", lwd = 1.5,
     main = paste0("Distribución Poisson (λ = ", round(lam, 0), ") - Empresas Buga"),
     xlab = "Número de empresas (k)", ylab = "P(X = k)")
points(empresas, dpois(empresas, lambda = lam),
       col = "red", pch = 19, cex = 1.2)
text(empresas, dpois(empresas, lambda = lam),
     labels = anios, pos = 3, cex = 0.75, col = "darkred")
legend("topright", legend = c("P(X=k)", "Años observados"),
       col = c("steelblue", "red"), lty = c(1, NA), pch = c(NA, 19))


Distribución Exponencial

La distribución exponencial es una distribución de probabilidad continua que modela el tiempo que transcurre hasta que ocurre un evento específico en un proceso donde los eventos ocurren de manera independiente a una tasa constante.

Fórmula

\[f(x) = \lambda e^{-\lambda x}, x>0\] f(x) = función densidad.
x = tiempo de espera (o valor positivo de la variable).
\(\lambda\) = tasa de eventos por unidad de tiempo.

Ejemplo

En Guadalajara de Buga se registró el crecimiento porcentual anual del sector de alojamiento y servicios de comida. La distribución exponencial se ajusta a estos datos para modelar la tasa de crecimiento. La variable X corresponde al crecimiento porcentual anual del sector:

Periodo Crecimiento (%)
1 13.54
2 14.86
3 14.99
4 21.36

Fuente: Informes Económicos Guadalajara de Buga

Algoritmo

# Datos reales del ejemplo: crecimiento porcentual anual del sector
crecimiento <- c(13.54, 14.86, 14.99, 21.36)
periodos    <- c(1, 2, 3, 4)

# Lambda = inverso de la media (tasa de la distribución exponencial)
lam <- 1 / mean(crecimiento)
cat("Media de crecimientos:", round(mean(crecimiento), 4), "%\n")
## Media de crecimientos: 16.1875 %
cat("Lambda estimado (1/media):", round(lam, 6), "\n\n")
## Lambda estimado (1/media): 0.061776
# Algoritmo manual de la función de densidad exponencial
exponencial <- function(x, lam) {
  e <- 2.71828182845
  dis <- lam * (e^(-lam * x))
  return(dis)
}

# Calcular f(x) para cada valor observado
densidades_manual <- sapply(crecimiento, exponencial, lam = lam)
densidades_R      <- dexp(crecimiento, rate = lam)

# Tabla comparativa
resultado <- data.frame(
  Periodo    = periodos,
  Crec_pct   = crecimiento,
  f_x_manual = round(densidades_manual, 6),
  f_x_R      = round(densidades_R,      6)
)

knitr::kable(resultado,
             col.names = c("Periodo", "Crecimiento (%)", "f(x) Algoritmo", "f(x) dexp()"),
             caption = paste0("Distribución Exponencial (λ = ", round(lam, 4),
                              ") - Crecimiento sector alojamiento Buga"),
             align = c("c","r","r","r"))
Distribución Exponencial (λ = 0.0618) - Crecimiento sector alojamiento Buga
Periodo Crecimiento (%) f(x) Algoritmo f(x) dexp()
1 13.54 0.026764 0.026764
2 14.86 0.024668 0.024668
3 14.99 0.024471 0.024471
4 21.36 0.016510 0.016510

Función en R

# Gráfica de la distribución exponencial ajustada
x_seq <- seq(0, max(crecimiento) * 1.5, length.out = 400)
y_seq <- dexp(x_seq, rate = lam)

plot(x_seq, y_seq, type = "l", col = "darkorange", lwd = 2,
     main = "Distribución Exponencial - Crecimiento Sector Alojamiento (Buga)",
     xlab = "Crecimiento anual (%)", ylab = "Densidad f(x)")
points(crecimiento, dexp(crecimiento, rate = lam),
       col = "red", pch = 19, cex = 1.2)
text(crecimiento, dexp(crecimiento, rate = lam),
     labels = paste0("P", periodos), pos = 3, cex = 0.8, col = "darkred")
legend("topright", legend = c(paste0("Curva exp. (λ=", round(lam,4),")"),
                               "Periodos observados"),
       col = c("darkorange","red"), lty = c(1, NA), pch = c(NA, 19))