Autores:
Erik Fernando Tombe Montano erik.tombe@correounivalle.edu.co
Jhon Fredy Saavedra Saavedra.jhon@correounivalle.edu.co
Fecha de entrega: 13 de mayo de 2026
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.
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.
- 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.
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)
}
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.
Para modelar precios de acciones, tasas de retorno o ingresos personales.
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.
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.
Para estudiar tiempos de recuperación, crecimiento de bacterias o concentraciones de sustancias.
\[ f(x)=\frac{1}{x\sigma \sqrt{2\pi}}e^{-\frac{(\ln x-\mu)^2}{2\sigma^2}}, \quad x>0 \]
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.
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)))
}
lognormal_manual(30, 3, 0.5)
## [1] 0.01927575
dlnorm(30, meanlog = 3, sdlog = 0.5)
## [1] 0.01927575
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
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.
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(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \]
gaussiana_manual <- function(x, mu, sigma) {
if (sigma <= 0) return(0)
return((1 / (sigma * sqrt(2 * pi))) * exp(-((x - mu)^2) / (2 * sigma^2)))
}
gaussiana_manual(40, 35, 6)
## [1] 0.04698531
dnorm(40, mean = 35, sd = 6)
## [1] 0.04698531
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
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)
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)
}
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
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))
poisson_manual <- function(x, lambda) {
return((lambda^x * exp(-lambda)) / factorial(x))
}
poisson_manual(10, 7)
## [1] 0.07098327
dpois(10, 7)
## [1] 0.07098327
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
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)
exponencial_manual <- function(x, lambda) {
if (x < 0 || lambda <= 0) return(0)
return(lambda * exp(-lambda * x))
}
exponencial_manual(5, 1/12)
## [1] 0.05493672
dexp(5, rate = 1/12)
## [1] 0.05493672
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
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)
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.
- 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.