Módulo 2: Teoría de la probabilidad
Distribuciones Discretas y Continuas
1.- Una entidad financiera de Ecuador desea evaluar el riesgo crediticio de una cartera de 100 préstamos otorgados a pequeñas y medianas empresas la cual sigue una distribución binomial. Según los supuestos establecidos para este estudio, cada préstamo tiene una probabilidad del 5% de imcumplir sus obligaciones financieras. Se considera que los incumplimientos de los distintos créditos son independientes y que la probabilidad de incumplimiento permanece constante.
El departamento de riesgo necesita estimar el número promedio de créditos incumplidos por cartera mediante el método de simulación de Monte Carlo.
— Parámetros del modelo:
n = 100, Número de créditos.
p = 0.05, probabilidad de incumplimiento.
Tamaño de simulación: B = 10 B = 50 B = 100 B = 1000 B = 10000
Número esperado de créditos incumplidos por cartera
n <- 100
p <- 0.05
Esp <- n*p;
print(Esp)
## [1] 5
cat("Se espera un promedio de", Esp, "créditos incumplidos por cada cartera de 100 préstamos")
## Se espera un promedio de 5 créditos incumplidos por cada cartera de 100 préstamos
El gráfico FMP representa la probabilidad de que exactamente k créditos incumplan sus obligaciones financieras, considerando una cartera de 100 préstamos y una probabilidad de incumplimiento del 5 % por crédito. Las barras azules indican las probabilidades asociadas a cada resultado posible. La distribución se concentra alrededor de los 5 créditos incumplidos, Los valores cercanos a este promedio tienen mayor probabilidad que los valores muy alejados.
El gráfico FDA representa la probabilidad acumulada de que el número de créditos incumplidos sea menor o igual a un valor determinado. La curva roja muestra cómo aumenta progresivamente la probabilidad acumulada a medida que se consideran mayores cantidades de incumplimientos. Este gráfico permite determinar la probabilidad de que la cartera presente como máximo una cantidad específica de incumplimientos. Por ejemplo, se puede calcular la probabilidad de que existan como máximo 5 créditos incumplidos mediante P(X≤5). Esta información es útil para evaluar escenarios y establecer límites de riesgo crediticio.
px_bin <- dbinom(0:100,size =n, prob =p)#vector de probabilidad
par(mfrow = c(1,2))
plot (0:100, px_bin, type = "h", lwd = 3, col="blue", main = "FMP",
xlab ="Número de créditos incumplidos (k)", ylab = " Probabilidad de incumplimiento de exactamente (k) créditos ")
plot(stepfun(0:100,c(0,pbinom(0:100,n,p))), main = "FDA",lwd =3, col="red",
xlab = "Número de créditos incumplidos (k)", ylab = " Probabilidad acumulada de incumplimiento")
TAMAÑO DE SIMULACIÓN
B = 10
B <- 10
incumplimiento <- replicate(B, sum(rbinom(n, size =1, prob =p)))
El histograma representa la distribución del número de créditos incumplidos en las 10 carteras simuladas mediante el método de Monte Carlo. Considerando que cada cartera contiene 100 créditos y que la probabilidad individual de incumplimiento es del 5 %, el número esperado de incumplimientos es de 5 por cartera. El promedio teórico es 5 incumplimientos, pero el promedio obtenido en las 10 simulaciones puede ser diferente debido a la variabilidad aleatoria.
h <- hist(incumplimiento, breaks = seq(-0.5, max(incumplimiento) + 0.5, by =1), prob = T, col = "gray", border = "white", main="Histograma de incumplimiento",
xlab = "Número de créditos incumplidos",
ylab = "Densidad")
abline(v = n*p, col = "blue", lty = 2, lwd = 2)
k <- 0:n
prob_binomial <- dbinom(k, size =n, prob =p)
curva<- spline(k, prob_binomial, n =500)
lines(curva, col ="darkred", lwd=2)
El gráfico de convergencia permite observar cómo evoluciona el promedio acumulado del número de créditos incumplidos a medida que aumenta la cantidad de simulaciones de Monte Carlo.
La línea verde representa el promedio acumulado de incumplimientos obtenido en cada simulación, mientras que la línea roja discontinua representa el valor teórico esperado de 5 créditos incumplidos por cada cartera de 100 préstamos, calculado a partir de una probabilidad de incumplimiento del 5 %.
Al inicio de la simulación, el promedio acumulado puede presentar variaciones debido al carácter aleatorio de los resultados. Sin embargo, conforme aumenta el número de escenarios simulados, se espera que la línea verde se estabilice y se aproxime a la línea roja.
promedio_acumulado<- cumsum(incumplimiento)/(1:B)
plot(promedio_acumulado, type ="l", col="darkgreen", lwd =2, main ="Convergencia del promedio de incumplimientos", xlab ="Número de simulaciones", ylab ="Promedio acumulado de icnumplimiento")
media_teorica <- n*p
abline(h = media_teorica, col ="red", lty =2, lwd =2)
TAMAÑO DE SIMULACIÓN
B = 50
B <- 50
incumplimiento <- replicate(B, sum(rbinom(n, size =1, prob =p)))
El histograma permite observar cómo se distribuye el número de créditos incumplidos en las carteras simuladas. Se espera que los resultados se concentren alrededor de 5 incumplimientos, que corresponde al promedio teórico. La línea azul identifica este valor esperado, mientras que la curva roja representa de manera suavizada las probabilidades calculadas mediante la distribución binomial.
h <- hist(incumplimiento, breaks = seq(-0.5, max(incumplimiento) + 0.5, by =1), prob = T, col = "gray", border = "white", main="Histograma de incumplimiento",
xlab = "Número de créditos incumplidos",
ylab = "Densidad")
abline(v = n*p, col = "blue", lty = 2, lwd = 2)
k <- 0:n
prob_binomial <- dbinom(k, size =n, prob =p)
curva<- spline(k, prob_binomial, n =500)
lines(curva, col ="darkred", lwd=2)
El gráfico de convergencia permite observar cómo evoluciona el promedio acumulado del número de créditos incumplidos a medida que aumenta el número de simulaciones de Monte Carlo. La línea verde representa el promedio acumulado obtenido en cada escenario, mientras que la línea roja discontinua indica el valor teórico esperado de 5 créditos incumplidos por cada 100 préstamos.
promedio_acumulado<- cumsum(incumplimiento)/(1:B)
plot(promedio_acumulado, type ="l", col="darkgreen", lwd =2, main ="Convergencia del promedio de incumplimientos", xlab ="Número de simulaciones", ylab ="Promedio acumulado de icnumplimiento")
media_teorica <- n*p
abline(h = media_teorica, col ="red", lty =2, lwd =2)
TAMAÑO DE SIMULACIÓN
B = 100
B <- 100
incumplimiento <- replicate(B, sum(rbinom(n, size =1, prob =p)))
La curva roja representa una aproximación suavizada de las probabilidades calculadas mediante la distribución binomial teórica. La comparación permite observar si los resultados simulados presentan un comportamiento similar al esperado según el modelo probabilístico.
h <- hist(incumplimiento, breaks = seq(-0.5, max(incumplimiento) + 0.5, by =1), prob = T, col = "gray", border = "white", main="Histograma de incumplimiento",
xlab = "Número de créditos incumplidos",
ylab = "Densidad")
abline(v = n*p, col = "blue", lty = 2, lwd = 2)
k <- 0:n
prob_binomial <- dbinom(k, size =n, prob =p)
curva<- spline(k, prob_binomial, n =500)
lines(curva, col ="darkred", lwd=2)
A medida que aumenta el número de simulaciones, se espera que el promedio acumulado se aproxime a la media teórica, de acuerdo con la Ley de los Grandes Números. Esto demuestra que, al realizar suficientes simulaciones, el promedio experimental tiende a estabilizarse alrededor del valor esperado, lo que permite comprobar la consistencia de los resultados de la simulación.
promedio_acumulado<- cumsum(incumplimiento)/(1:B)
plot(promedio_acumulado, type ="l", col="darkgreen", lwd =2, main ="Convergencia del promedio de incumplimientos", xlab ="Número de simulaciones", ylab ="Promedio acumulado de icnumplimiento")
media_teorica <- n*p
abline(h = media_teorica, col ="red", lty =2, lwd =2)
TAMAÑO DE SIMULACIÓN
B = 1000
B <- 1000
incumplimiento <- replicate(B, sum(rbinom(n, size =1, prob =p)))
Al comparar el histograma con la curva teórica, se puede evaluar si los resultados simulados se ajustan al modelo binomial. Si ambas representaciones presentan una forma similar, se puede concluir que la simulación reproduce adecuadamente el comportamiento esperado del número de créditos incumplidos. Las posibles diferencias se deben a la variabilidad aleatoria propia de las simulaciones y pueden disminuir al aumentar el número de observaciones.
h <- hist(incumplimiento, breaks = seq(-0.5, max(incumplimiento) + 0.5, by =1), prob = T, col = "gray", border = "white", main="Histograma de incumplimiento",
xlab = "Número de créditos incumplidos",
ylab = "Densidad")
abline(v = n*p, col = "blue", lty = 2, lwd = 2)
k <- 0:n
prob_binomial <- dbinom(k, size =n, prob =p)
curva<- spline(k, prob_binomial, n =500)
lines(curva, col ="darkred", lwd=2)
El gráfico permite comprobar si el promedio acumulado de incumplimientos tiende a aproximarse a la media teórica conforme aumenta el número de simulaciones. Si la línea verde se estabiliza cerca de la línea roja, esto indica que los resultados de la simulación son consistentes con el valor esperado, de acuerdo con la Ley de los Grandes Números
promedio_acumulado<- cumsum(incumplimiento)/(1:B)
plot(promedio_acumulado, type ="l", col="darkgreen", lwd =2, main ="Convergencia del promedio de incumplimientos", xlab ="Número de simulaciones", ylab ="Promedio acumulado de icnumplimiento")
media_teorica <- n*p
abline(h = media_teorica, col ="red", lty =2, lwd =2)
TAMAÑO DE SIMULACIÓN
B = 10000
B <- 10000
incumplimiento <- replicate(B, sum(rbinom(n, size =1, prob =p)))
Si las barras grises presentan una forma similar a la distribución teórica y se concentran alrededor de la media indicada por la línea azul, esto sugiere que la simulación representa adecuadamente el comportamiento del número de créditos incumplidos.
h <- hist(incumplimiento, breaks = seq(-0.5, max(incumplimiento) + 0.5, by =1), prob = T, col = "gray", border = "white", main="Histograma de incumplimiento",
xlab = "Número de créditos incumplidos",
ylab = "Densidad")
abline(v = n*p, col = "blue", lty = 2, lwd = 2)
k <- 0:n
prob_binomial <- dbinom(k, size =n, prob =p)
curva<- spline(k, prob_binomial, n =500)
lines(curva, col ="darkred", lwd=2)
Este comportamiento se explica mediante la Ley de los Grandes Números, que establece que el promedio de los resultados de muchas simulaciones independientes tiende a aproximarse al valor esperado.
Por lo tanto, si la línea verde se acerca a la línea roja, se puede considerar que los resultados de la simulación son consistentes con la media teórica de la distribución binomial. Esto permite evaluar la estabilidad y la confiabilidad de los resultados obtenidos.
promedio_acumulado<- cumsum(incumplimiento)/(1:B)
plot(promedio_acumulado, type ="l", col="darkgreen", lwd =2, main ="Convergencia del promedio de incumplimientos", xlab ="Número de simulaciones", ylab ="Promedio acumulado de icnumplimiento")
media_teorica <- n*p
abline(h = media_teorica, col ="red", lty =2, lwd =2)
1.- ¿ Por qué se deben simular los datos?
La simulación es necesaria porque permite estudiar el comportamiento de una cartera de crédito bajo condiciones de incertidumbre, sin tener que esperar a que ocurran los incumplimientos reales. Ademas como:
2.- Restricciones al tomar una muestra aleatoria
Al realizar una simulación, es importante considerar varias restricciones:
Tamaño de la muestra: cuando se realizan pocas simulaciones, el promedio puede alejarsedel valor esperado de 5 incumplimientos.
Variabilidad aleatorio: incluso con un modelo correctamente definido, pueden aparecer diferencias entre el promedio simulado y el promedio teórico.
Probabilidad constante: se supone que todos los créditos tienen una probabilidad de incumplimiento del 5%. En la práctica, el riesgo puede variar según el sector económico y la capacidad de pago de cada empresa.
3.- ¿ En qué valor de B se observa una estabilización visual clara?
Se considera que existe una estabilización cuando B = 10000, conforme aumenta el número de simulaciones, existe una estabilización visual cuando la curva comienza a oscilar alrededor de cinco y las variaciones se vuelven relativamente pequeñas.
4.- La ley de los grandes números
Establece que, bajo condiciones apropiadas de independecia e idéntica distribución, el promedio de una cantidad suficientemente grande de observaciones tiende a aproximarse a su valor esperado. Esto significa que, a medida que se incrementa en número de carteras simuladas, el promedio de incumplimientos tiende acercarse a cinco.
Una empresa dedicada a la producción y comercialización de productos lácteos procesa aproximadamente 5.000 litros de leche diarios para elaborar queso fresco y queso doble crema. La gerencia necesita estimar las pérdidas económicas ocasionadas por productos no conformes, devoluciones comerciales, desperdicio de materia prima y problemas de conservación.
Para este ejercicio académico, se considera que el 5 % de los lotes presenta no conformidades que generan pérdidas económicas. La pérdida por cada lote afectado sigue una distribución exponencial con una tasa de \(\lambda = 0.025\), expresada en miles de pesos colombianos.
Se simularán 100 lotes por escenario y se realizarán 5.000 simulaciones independientes.
La simulación Monte Carlo permite estudiar la incertidumbre de las pérdidas económicas mediante la generación repetida de escenarios aleatorios. En una empresa láctea, las pérdidas pueden variar por devoluciones, fallas en la conservación, desperdicio de materias primas y problemas de calidad.
Este método permite estimar las pérdidas promedio, analizar escenarios desfavorables y apoyar decisiones relacionadas con el control de calidad, el mantenimiento de equipos y la conservación de los productos.
# Parámetros del modelo
set.seed(123)
p <- 0.05
lambda <- 0.025
n_lotes <- 100
n_simulaciones <- 5000
# Valor esperado teórico de la pérdida por lote afectado
media_teorica <- 1 / lambda
# Generar la condición de conformidad de cada lote
afectado <- rbinom(
n_lotes * n_simulaciones,
size = 1,
prob = p
)
# Generar pérdidas únicamente para los lotes afectados
perdidas <- numeric(n_lotes * n_simulaciones)
perdidas[afectado == 1] <- rexp(
sum(afectado == 1),
rate = lambda
)
# Organizar los resultados por escenario
matriz_perdidas <- matrix(
perdidas,
nrow = n_lotes,
ncol = n_simulaciones
)
matriz_afectados <- matrix(
afectado,
nrow = n_lotes,
ncol = n_simulaciones
)
# Pérdida total de cada escenario
perdida_total <- colSums(matriz_perdidas)
# Número de lotes afectados por escenario
lotes_afectados <- colSums(matriz_afectados)
# Pérdidas individuales de los lotes afectados
perdidas_afectados <- perdidas[afectado == 1]
cat("Probabilidad de no conformidad:", p, "\n")
## Probabilidad de no conformidad: 0.05
cat("Número de lotes por escenario:", n_lotes, "\n")
## Número de lotes por escenario: 100
cat("Número de simulaciones:", n_simulaciones, "\n")
## Número de simulaciones: 5000
cat("Total de lotes afectados simulados:",
length(perdidas_afectados), "\n")
## Total de lotes afectados simulados: 25150
La pérdida media por lote afectado es diferente de la pérdida total promedio por escenario. La primera considera exclusivamente los lotes no conformes; la segunda incluye los 100 lotes, asignando pérdida cero a los lotes no afectados.
# Media de las pérdidas por lote afectado
media_simulada <- mean(perdidas_afectados)
# Pérdida total promedio por escenario
total_promedio <- mean(perdida_total)
# Número promedio de lotes afectados por escenario
afectados_promedio <- mean(lotes_afectados)
# Pérdida total teórica por escenario
total_teorico <- n_lotes * p * media_teorica
cat("Pérdida media teórica por lote afectado:",
media_teorica, "miles de COP\n")
## Pérdida media teórica por lote afectado: 40 miles de COP
cat("Pérdida media simulada por lote afectado:",
round(media_simulada, 4), "miles de COP\n")
## Pérdida media simulada por lote afectado: 40.275 miles de COP
cat("Pérdida media simulada en COP:",
round(media_simulada * 1000, 2), "COP\n")
## Pérdida media simulada en COP: 40274.96 COP
cat("Lotes afectados promedio por escenario:",
round(afectados_promedio, 4), "\n")
## Lotes afectados promedio por escenario: 5.03
cat("Pérdida total promedio por escenario:",
round(total_promedio, 4), "miles de COP\n")
## Pérdida total promedio por escenario: 202.5831 miles de COP
cat("Pérdida total promedio en COP:",
round(total_promedio * 1000, 2), "COP\n")
## Pérdida total promedio en COP: 202583.1 COP
cat("Pérdida total teórica por escenario:",
total_teorico, "miles de COP\n")
## Pérdida total teórica por escenario: 200 miles de COP
La pérdida media teórica de un lote afectado es de 40 miles de COP, equivalentes a $40.000 COP. Sin embargo, no todos los lotes presentan no conformidades.
Por cada 100 lotes, se esperan \(100 \times 0.05 = 5\) lotes afectados. Por tanto, la pérdida total esperada por escenario es:
\[ E(T)=100(0.05)(40)=200 \]
Esto equivale a una pérdida total esperada de $200.000 COP por escenario de 100 lotes.
Los valores simulados pueden diferir de los valores teóricos debido a la variabilidad aleatoria.
Se construye un intervalo de confianza para la pérdida media por lote afectado utilizando los valores simulados de las pérdidas positivas.
resultado_ic <- t.test(
perdidas_afectados,
conf.level = 0.95
)
limite_inferior <- resultado_ic$conf.int[1]
limite_superior <- resultado_ic$conf.int[2]
cat("Media estimada:",
round(media_simulada, 4), "miles de COP\n")
## Media estimada: 40.275 miles de COP
cat("Límite inferior del IC del 95 %:",
round(limite_inferior, 4), "miles de COP\n")
## Límite inferior del IC del 95 %: 39.7834 miles de COP
cat("Límite superior del IC del 95 %:",
round(limite_superior, 4), "miles de COP\n")
## Límite superior del IC del 95 %: 40.7665 miles de COP
cat("Intervalo en COP: desde",
round(limite_inferior * 1000, 2),
"hasta",
round(limite_superior * 1000, 2),
"COP\n")
## Intervalo en COP: desde 39783.42 hasta 40766.51 COP
El intervalo de confianza del 95 % proporciona un rango de valores plausibles para la media poblacional de las pérdidas por lote afectado, bajo los supuestos del modelo.
Cuanto menor sea la amplitud del intervalo, mayor será la precisión de la estimación. El intervalo calculado depende de las pérdidas generadas en la simulación y del número de lotes afectados.
La Ley de los Grandes Números establece que la media acumulada de observaciones independientes tiende a aproximarse a su esperanza matemática cuando aumenta el número de observaciones.
# Media acumulada de las pérdidas de los lotes afectados
media_acumulada <- cumsum(perdidas_afectados) /
seq_along(perdidas_afectados)
plot(
media_acumulada,
type = "l",
col = "blue",
lwd = 1.5,
main = "Convergencia de la pérdida media",
xlab = "Número acumulado de lotes afectados",
ylab = "Pérdida media (miles de COP)"
)
abline(
h = media_teorica,
col = "red",
lwd = 2,
lty = 2
)
legend(
"topright",
legend = c("Media acumulada", "Media teórica = 40"),
col = c("blue", "red"),
lty = c(1, 2),
lwd = c(1.5, 2),
bty = "n"
)
La línea azul representa la media acumulada de las pérdidas por lote afectado, mientras que la línea roja discontinua indica el valor esperado teórico de 40 miles de COP.
Al principio, la media acumulada puede presentar fluctuaciones pronunciadas. A medida que se incorporan más observaciones, las variaciones tienden a moderarse y la media se aproxima al valor teórico.
La estabilización es gradual y no implica que la media simulada deba coincidir exactamente con 40.
El siguiente panel doble representa la función de densidad de probabilidad (FDP) y la función de distribución acumulada (FDA) de la pérdida por lote afectado. Se utiliza la distribución exponencial con tasa \(\lambda=0.025\).
par(mfrow = c(1, 2))
# Rango de pérdidas en miles de COP
x <- seq(0, 200, length.out = 1000)
# FDP: función de densidad
plot(
x,
dexp(x, rate = lambda),
type = "l",
col = "blue",
lwd = 2,
main = "FDP: Densidad de las pérdidas",
xlab = "Pérdida (miles de COP)",
ylab = "Densidad"
)
# FDA: función acumulada
plot(
x,
pexp(x, rate = lambda),
type = "l",
col = "darkgreen",
lwd = 2,
main = "FDA: Probabilidad acumulada",
xlab = "Pérdida (miles de COP)",
ylab = "Probabilidad acumulada",
ylim = c(0, 1)
)
par(mfrow = c(1, 1))
La FDP muestra que las pérdidas relativamente pequeñas son más frecuentes que las pérdidas elevadas. La distribución presenta asimetría positiva y una cola hacia la derecha, lo que indica que ocasionalmente pueden producirse pérdidas considerablemente mayores.
La FDA muestra la probabilidad acumulada de que la pérdida de un lote afectado sea menor o igual a un valor determinado. A medida que aumenta la pérdida considerada, la probabilidad acumulada se aproxima a uno.
La empresa opera en tres regiones: R1, R2 y R3. Para comparar sus pérdidas económicas se requieren datos reales o estimaciones específicas sobre el volumen de producción, la proporción de lotes no conformes y la pérdida media por lote afectado en cada región.
La pérdida total esperada para cada región puede estimarse mediante:
\[ E(T_r)=N_r p_r \mu_r \]
Donde:
Sin datos regionales, no es posible establecer de manera fundamentada qué región necesita más recursos de contingencia. Se recomienda priorizar la recopilación de datos de calidad, devoluciones, desperdicio y costos para asignar los recursos de forma proporcional al riesgo económico.
La simulación Monte Carlo permite analizar las pérdidas económicas potenciales de una empresa láctea ante la presencia de productos no conformes. Con una probabilidad de afectación del 5 % y una pérdida media de 40 miles de COP por lote afectado, la pérdida total teórica esperada para un escenario de 100 lotes es de 200 miles de COP.
La simulación de 5.000 escenarios permite observar la variabilidad de las pérdidas, estimar la pérdida media por lote afectado y construir un intervalo de confianza del 95 %. La gráfica de convergencia permite evaluar visualmente cómo la media acumulada se aproxima al valor esperado teórico.
Desde la perspectiva empresarial, los resultados pueden apoyar decisiones orientadas a fortalecer la inspección de materias primas, el control de temperaturas, el mantenimiento de equipos y la conservación durante el almacenamiento y la distribución. Para asignar presupuestos regionales, será necesario incorporar datos específicos de R1, R2 y R3.