logo-univalle-oficial-rojo.png

Universidad del Valle

Seccional Buga

Programa de Ingeniería Industrial

LOGO FINAL FRAILEJON .png

Distribución Probabilística para Gestión de Datos en la Casa de Plantas Medicinales El Frailejón

Autores:

Erik Fernando Tombe Montano

Jhon Fredy Saavedra

Fecha de entrega: 13 de mayo de 2026

Introducción

En la Casa de Plantas Medicinales El Frailejón se desarrollan procesos de atención en salud tradicional, facturación, farmacia, producción de medicamentos naturales y registro de pacientes. Este contexto permite aplicar distribuciones de probabilidad para modelar ingresos, tiempos de atención, número de pacientes, demanda de medicamentos y tiempos entre llegadas de usuarios.

En este trabajo se desarrollan cinco distribuciones: lognormal, gaussiana, chi cuadrado, Poisson y exponencial. Para cada una se presenta su fórmula, un algoritmo propio en R, comparación con la función nativa de R, un ejemplo aplicado al contexto local, una tabla de datos y una gráfica.

Objetivos

Objetivo general

Desarrollar algoritmos en R para cinco distribuciones de probabilidad y compararlos con las funciones nativas de R, aplicándolos al contexto de la Casa de Plantas Medicinales El Frailejón.

Objetivos específicos

- Construir algoritmos manuales en R para las distribuciones lognormal, gaussiana, chi cuadrado, Poisson y exponencial. - Comparar cada algoritmo con la función correspondiente de R. - Modelar situaciones reales del contexto de la Casa de Plantas Medicinales. - Presentar gráficas, fórmulas y tablas de datos organizadas en data frames.

Contexto local

La Casa de Plantas Medicinales El Frailejón, ubicada en el resguardo de Guambia, integra actividades de facturación, atención por medicina tradicional, enfermería, partería, fisioterapia y farmacia. En este espacio se atienden pacientes subsidiados y particulares, se venden medicamentos naturales y se manejan diferentes tiempos de atención y flujos de usuarios. Por eso, este entorno es adecuado para ilustrar distribuciones de probabilidad con datos reales o simulados del funcionamiento institucional.

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

raiz <- function(v) {
  if (v < 0) return(NA_real_)
  if (v == 0) return(0)
  r <- v / 2
  for (k in 1:30) r <- (r + v / r) / 2
  return(r)
}

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

1. Distribución Lognormal

Definición

Una distribución lognormal representa variables positivas y asimétricas hacia la derecha. Es útil para modelar ingresos, ventas o valores monetarios cuando unos pocos casos presentan montos altos y la mayoría montos moderados.

Usos más comunes de la distribución lognormal:

  1. Economía y finanzas:

Para modelar precios de acciones, tasas de retorno o ingresos personales.

  1. Ingeniería:

Para analizar el tiempo de vida de componentes electrónicos o mecánicos, ya que muchos duran un tiempo normal y unos pocos duran mucho más.

  1. Ciencias naturales:

Para describir el tamaño de organismos, partículas, gotas de lluvia o granos de arena, donde la mayoría son pequeños y unos pocos muy grandes.

  1. Medicina y biología:

Para estudiar tiempos de recuperación, crecimiento de bacterias o concentraciones de sustancias.

Fórmula

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

Donde:

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

Problema local

En la Casa de Plantas Medicinales, el valor de venta de algunos productos puede ser positivo y asimétrico. Por ejemplo, los ingresos mensuales provenientes de productos de farmacia como jarabes, pomadas, jabones, aceites esenciales y medicamentos líquidos no siempre son iguales. Los pacientes subsidiados generan un flujo constante de ingresos, mientras que los pacientes particulares generan pagos más altos por evento o consulta. Por esta razón, la distribución lognormal permite modelar el comportamiento de los ingresos mensuales por ventas y atención.

En este estudio se analizarán dos grupos: - Pacientes subsidiados. - Pacientes particulares.

Además, se observará el comportamiento mensual durante un año para determinar cuál de los dos grupos genera más ingresos.

Algoritmo en R

lognormal_manual <- function(x, mu, sigma) {
  if (x <= 0 || sigma <= 0) return(0)
  return((1 / (x * sigma * sqrt(2 * pi))) * exp(-((log(x) - mu)^2) / (2 * sigma^2)))
}

Comparación con R

lognormal_manual(30, 3, 0.5)
## [1] 0.01927575
dlnorm(30, meanlog = 3, sdlog = 0.5)
## [1] 0.01927575

Datos y data frame

meses <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")

ingreso_subsidiados <- c(540000,585000,630000,615000,660000,690000,720000,705000,735000,750000,765000,780000)
ingreso_particulares <- c(350000,375000,400000,390000,425000,450000,460000,440000,475000,500000,510000,540000)

log_df <- data.frame(
  Mes = meses,
  Ingreso_Subsidiados = ingreso_subsidiados,
  Ingreso_Particulares = ingreso_particulares
)

log_df
##    Mes Ingreso_Subsidiados Ingreso_Particulares
## 1  Ene              540000               350000
## 2  Feb              585000               375000
## 3  Mar              630000               400000
## 4  Abr              615000               390000
## 5  May              660000               425000
## 6  Jun              690000               450000
## 7  Jul              720000               460000
## 8  Ago              705000               440000
## 9  Sep              735000               475000
## 10 Oct              750000               500000
## 11 Nov              765000               510000
## 12 Dic              780000               540000

Gráfica lognormal

par(mfrow = c(1, 2))

mu_sub <- mean(log(ingreso_subsidiados))
sd_sub <- sd(log(ingreso_subsidiados))

mu_par <- mean(log(ingreso_particulares))
sd_par <- sd(log(ingreso_particulares))

x1 <- seq(0.1, max(ingreso_subsidiados) * 1.1, length.out = 300)
y1 <- dlnorm(x1, meanlog = mu_sub, sdlog = sd_sub)

x2 <- seq(0.1, max(ingreso_particulares) * 1.1, length.out = 300)
y2 <- dlnorm(x2, meanlog = mu_par, sdlog = sd_par)

plot(x1, y1,
     type = "l", col = "brown", lwd = 2,
     main = "Lognormal - Subsidiados",
     xlab = "Ingreso mensual", ylab = "Densidad")

plot(x2, y2,
     type = "l", col = "darkgreen", lwd = 2,
     main = "Lognormal - Particulares",
     xlab = "Ingreso mensual", ylab = "Densidad")

par(mfrow = c(1, 1))

#———————————————————————————————————-

## Warning: package 'kableExtra' was built under R version 4.5.3
Meses Ingreso_subsidiado Ingreso_Particulares
Ene 540000 350000
Feb 585000 375000
Mar 630000 400000
Abr 615000 390000
May 660000 425000
Jun 690000 450000
Jul 720000 46000
Ago 705000 440000
Sep 735000 475000
Oct 750000 500000
Nov 765000 510000
Dec 780000 540000

#———————————————————————————————————- ## Modelación de comportamiento

Para este caso, se observa el comportamiento de los ingresos mensuales durante un año. En los datos simulados, los pacientes subsidiados generan un ingreso mensual promedio mayor que los pacientes particulares, porque su volumen de atención es más alto. Sin embargo, los particulares pueden aportar mayor valor por consulta o evento. Esta comparación permite analizar cuál grupo tiene mayor impacto económico en la institución.

2. Distribución Gaussiana

Definición

La distribución gaussiana o normal describe variables que se concentran alrededor de un promedio. Su forma es simétrica y se usa frecuentemente para tiempos de atención, medidas físicas y valores observados alrededor de una media central.

Fórmula

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

Algoritmo en R

gaussiana_manual <- function(x, mu, sigma) {
  if (sigma <= 0) return(0)
  return((1 / (sigma * sqrt(2 * pi))) * exp(-((x - mu)^2) / (2 * sigma^2)))
}

Comparación con R

gaussiana_manual(40, 35, 6)
## [1] 0.04698531
dnorm(40, mean = 35, sd = 6)
## [1] 0.04698531

Tabla de datos

trabajador <- c("Medico tradicional","Partera","Enfermera","Fisioterapeuta","Facturacion")
tiempo_estimado <- c(25, 35, 18, 45, 8)
desviacion <- c(5, 7, 4, 10, 2)

gauss_df <- data.frame(
  Trabajador = trabajador,
  Tiempo_Estimado_Min = tiempo_estimado,
  Desviacion_Estandar = desviacion
)

gauss_df
##           Trabajador Tiempo_Estimado_Min Desviacion_Estandar
## 1 Medico tradicional                  25                   5
## 2            Partera                  35                   7
## 3          Enfermera                  18                   4
## 4     Fisioterapeuta                  45                  10
## 5        Facturacion                   8                   2

Gráfica por trabajador

barplot(tiempo_estimado,
        names.arg = trabajador,
        col = c("brown","darkorange","goldenrod","steelblue","darkgreen"),
        main = "Tiempo estimado de atención por trabajador",
        ylab = "Minutos",
        las = 2)

3. Distribución Chi cuadrado

Algoritmo en R

chi_cuadrado_manual <- function(O, E) {
  suma <- 0
  for (i in 1:length(O)) {
    suma <- suma + ((O[i] - E[i])^2) / E[i]
  }
  return(suma)
}

Comparación con R

observado <- c(22, 28, 19, 31, 24)
esperado <- c(20, 25, 20, 30, 25)

chi_cuadrado_manual(observado, esperado)
## [1] 0.6833333
sum((observado - esperado)^2 / esperado)
## [1] 0.6833333

Gráficas

chi_df <- data.frame(
  Categoria = c("Tiempo1","Tiempo2","Tiempo3","Tiempo4","Tiempo5"),
  Observado = observado,
  Esperado = esperado
)

par(mfrow = c(1, 2))

barplot(rbind(observado, esperado),
        beside = TRUE,
        col = c("brown","skyblue"),
        names.arg = chi_df$Categoria,
        main = "Tiempos observados y esperados",
        ylab = "Minutos")

legend("topright", legend = c("Observado","Esperado"),
       fill = c("brown","skyblue"))

costos_obs <- c(120000, 135000, 110000, 150000, 128000)
costos_exp <- c(115000, 130000, 115000, 145000, 125000)

barplot(rbind(costos_obs, costos_exp),
        beside = TRUE,
        col = c("darkred","gray"),
        names.arg = chi_df$Categoria,
        main = "Costos observados y esperados",
        ylab = "COP")

legend("topright", legend = c("Observado","Esperado"),
       fill = c("darkred","gray"))

par(mfrow = c(1, 1))

4. Distribución Poisson

Algoritmo en R

poisson_manual <- function(x, lambda) {
  return((lambda^x * exp(-lambda)) / factorial(x))
}

Comparación con R

poisson_manual(10, 7)
## [1] 0.07098327
dpois(10, 7)
## [1] 0.07098327

Data frame

atenciones_eps <- c(14, 15, 13, 16, 14, 18, 17, 19, 18, 20, 21, 22)
atenciones_particulares <- c(6, 7, 5, 8, 7, 9, 8, 10, 9, 11, 10, 12)

ventas_eps <- c(20, 22, 19, 24, 21, 25, 23, 26, 24, 27, 28, 30)
ventas_particulares <- c(11, 12, 10, 13, 12, 14, 13, 15, 14, 16, 15, 17)

pois_df <- data.frame(
  Mes = meses,
  Atenciones_EPS = atenciones_eps,
  Atenciones_Particulares = atenciones_particulares,
  Ventas_Medicamentos_EPS = ventas_eps,
  Ventas_Medicamentos_Particulares = ventas_particulares
)

pois_df
##    Mes Atenciones_EPS Atenciones_Particulares Ventas_Medicamentos_EPS
## 1  Ene             14                       6                      20
## 2  Feb             15                       7                      22
## 3  Mar             13                       5                      19
## 4  Abr             16                       8                      24
## 5  May             14                       7                      21
## 6  Jun             18                       9                      25
## 7  Jul             17                       8                      23
## 8  Ago             19                      10                      26
## 9  Sep             18                       9                      24
## 10 Oct             20                      11                      27
## 11 Nov             21                      10                      28
## 12 Dic             22                      12                      30
##    Ventas_Medicamentos_Particulares
## 1                                11
## 2                                12
## 3                                10
## 4                                13
## 5                                12
## 6                                14
## 7                                13
## 8                                15
## 9                                14
## 10                               16
## 11                               15
## 12                               17

Gráfica

k <- 0:15
y_eps <- dpois(k, lambda = mean(atenciones_eps))
y_part <- dpois(k, lambda = mean(atenciones_particulares))

plot(k, y_eps, type = "b", col = "brown", pch = 16, lwd = 2,
     main = "Poisson: pacientes atendidos por hora",
     xlab = "Número de pacientes", ylab = "Probabilidad")

lines(k, y_part, type = "b", col = "darkgreen", pch = 16, lwd = 2)

legend("topright",
       legend = c("EPS","Particulares"),
       col = c("brown","darkgreen"),
       lty = 1, pch = 16)

5. Distribución Exponencial

Algoritmo en R

exponencial_manual <- function(x, lambda) {
  if (x < 0 || lambda <= 0) return(0)
  return(lambda * exp(-lambda * x))
}

Comparación con R

exponencial_manual(5, 1/12)
## [1] 0.05493672
dexp(5, rate = 1/12)
## [1] 0.05493672

Data frame

proceso <- c("Facturacion EPS","Facturacion Particular","Medico Tradicional","Partera","Enfermera","Fisioterapeuta")
tiempo_espera <- c(6, 9, 12, 18, 10, 25)

exp_df <- data.frame(
  Proceso = proceso,
  Tiempo_Espera_Promedio_Min = tiempo_espera
)

exp_df
##                  Proceso Tiempo_Espera_Promedio_Min
## 1        Facturacion EPS                          6
## 2 Facturacion Particular                          9
## 3     Medico Tradicional                         12
## 4                Partera                         18
## 5              Enfermera                         10
## 6         Fisioterapeuta                         25

Gráfica

plot(1:length(proceso), tiempo_espera, type = "b", col = "brown", pch = 16, lwd = 2,
     main = "Tiempos de espera promedio por proceso",
     xlab = "Proceso", ylab = "Minutos", xaxt = "n")
axis(1, at = 1:length(proceso), labels = proceso, las = 2)

Conclusiones

El desarrollo de los algoritmos manuales permitió comparar cada distribución con la función nativa de R y verificar resultados consistentes. Además, el contexto de la Casa de Plantas Medicinales El Frailejón permitió aplicar las distribuciones a situaciones reales de atención, farmacia, facturación y producción.

La distribución lognormal resultó útil para estudiar ingresos positivos y asimétricos; la gaussiana sirvió para modelar tiempos promedio de atención; chi cuadrado permitió comparar observados y esperados; Poisson modeló el número de eventos; y la exponencial describió los tiempos entre llegadas de pacientes.

Referencias

- Manuales de R y funciones de distribución estadística. - Material de clase. - Documento guía de exposición. - Contexto institucional de la Casa de Plantas Medicinales El Frailejón.