Actuaría de Seguros generales (Tarea 4)
Punto 1
Distribución lognormal
Usando los datos de seguros de automotor para privados de la data set CASdatasets y tomando el número de cédula del compañero Ronald Palencia, calculamos una muestra de la base de datos y de la función.
| IDpol | OccurDate | Payment | IDclaim | Guarantee | |
|---|---|---|---|---|---|
| 1776 | 90134280.101a | 2003-05-11 | 222 | 12817 | Windscreen |
| 1496 | 90166830.100a | 2003-04-22 | 422 | 11306 | Windscreen |
| 8377 | 90180336.100a | 2004-10-30 | 27 | 1204685 | TPL |
| 5243 | 90180487.100a | 2004-03-04 | 234 | 1206263 | TPL |
Ajuste distribucional
Lo primero que se debe hacer es identificar el tipo de distribución que tiene la variable, para esto usaremos paquetes existentes en R como :
univariateML: estimación de máxima verosimilitud para densidades univariadas.
fitdistrplus: ayuda para ajustar una distribución paramétrica a datos censurados o no censurados.
gamlss: modelos aditivos generalizados para ubicación, escala y forma.
Estos paquetes nos ayudaran a ajustar las distrubuciones.
Ahora ajustando la variable IDclaim como una variable númerica obtenemos una tabla resumen de los datos.
# Ajuste variable numerica
data$IDclaim <- data$IDclaim %>% as.numeric()
summary(data) %>%
kbl() %>%
kable_paper("hover",
full_width = F)| IDpol | OccurDate | Payment | IDclaim | Guarantee | |
|---|---|---|---|---|---|
| Length:150 | Min. :2003-01-07 | Min. : 0.0 | Min. : 284 | Damage :14 | |
| Class :character | 1st Qu.:2003-07-08 | 1st Qu.: 197.5 | 1st Qu.: 4936 | Fire : 2 | |
| Mode :character | Median :2004-01-19 | Median : 412.5 | Median : 9952 | Other : 1 | |
| NA | Mean :2004-01-16 | Mean : 1026.2 | Mean :10345 | Theft : 7 | |
| NA | 3rd Qu.:2004-07-28 | 3rd Qu.: 915.0 | 3rd Qu.:16448 | TPL :66 | |
| NA | Max. :2004-12-13 | Max. :16531.0 | Max. :21083 | Windscreen:60 |
Ahora filtramos los valores de la variable payment mayores a cero para hacer un mejor manejo de la data.
data <- data %>% dplyr::filter(Payment > 0)summary(data) %>%
kbl() %>%
kable_paper("hover",
full_width = F)| IDpol | OccurDate | Payment | IDclaim | Guarantee | |
|---|---|---|---|---|---|
| Length:147 | Min. :2003-01-07 | Min. : 15 | Min. : 284 | Damage :13 | |
| Class :character | 1st Qu.:2003-07-10 | 1st Qu.: 205 | 1st Qu.: 4914 | Fire : 2 | |
| Mode :character | Median :2004-01-31 | Median : 422 | Median : 9908 | Other : 1 | |
| NA | Mean :2004-01-19 | Mean : 1047 | Mean :10360 | Theft : 7 | |
| NA | 3rd Qu.:2004-08-05 | 3rd Qu.: 915 | 3rd Qu.:16537 | TPL :64 | |
| NA | Max. :2004-12-13 | Max. :16531 | Max. :21083 | Windscreen:60 |
p1 <- ggplot(data = data, aes(x = data$Payment)) +
geom_histogram(fill = "steelblue") +
labs(title = "Distribución del precio de Payment",
x = "Precio") +
theme_bw() +
theme(plot.title = element_text(face = "bold"))
p2 <- ggplot(data = data, aes(x = data$Payment)) +
stat_ecdf(geom = "step", color = "steelblue", size = 1) +
labs(title = "Función de distribución empírica",
x = "Precio",
y = "CDF") +
theme_bw() +
theme(plot.title = element_text(face = "bold"))
ggpubr::ggarrange(plotlist = list(p1, p2), ncol = 2)## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Metricas de ajuste
Para este ejercicio usaremos las metricas AIC y BIC que nos permite cuantificar como se ajusta una distrución a los datos.
Amabas metricas cuentan con la función de verosimilitud y añaden una penalización proporcional al número de parámetros de la distribución.
Comparando las distribuciones con dominio entre \([0, + \infty)\)
AIC Criterio de información de Akaike
# Se comparan únicamente las distribuciones con un dominio [0, +inf)
comparacion_aic <- AIC(
mlbetapr(data$Payment),
mlexp(data$Payment),
mlinvgamma(data$Payment),
mlgamma(data$Payment),
mllnorm(data$Payment),
mlrayleigh(data$Payment),
mlinvgauss(data$Payment),
mlweibull(data$Payment),
mlinvweibull(data$Payment),
mllgamma(data$Payment)
)
comparacion_aic %>% rownames_to_column(var = "distribucion") %>% arrange(AIC) ## distribucion df AIC
## 1 mllnorm(data$Payment) 2 2286.346
## 2 mllgamma(data$Payment) 2 2289.562
## 3 mlinvgauss(data$Payment) 2 2298.129
## 4 mlinvweibull(data$Payment) 2 2306.168
## 5 mlbetapr(data$Payment) 2 2313.264
## 6 mlinvgamma(data$Payment) 2 2313.994
## 7 mlweibull(data$Payment) 2 2315.688
## 8 mlgamma(data$Payment) 2 2329.234
## 9 mlexp(data$Payment) 1 2340.433
## 10 mlrayleigh(data$Payment) 1 2865.163
BIC Bayesian information criterion
# Se comparan únicamente las distribuciones con un dominio [0, +inf)
comparacion_bic <- BIC(
mlbetapr(data$Payment),
mlexp(data$Payment),
mlinvgamma(data$Payment),
mlgamma(data$Payment),
mllnorm(data$Payment),
mlrayleigh(data$Payment),
mlinvgauss(data$Payment),
mlweibull(data$Payment),
mlinvweibull(data$Payment),
mllgamma(data$Payment)
)
comparacion_bic %>% rownames_to_column(var = "distribucion") %>% arrange(BIC) ## distribucion df BIC
## 1 mllnorm(data$Payment) 2 2292.327
## 2 mllgamma(data$Payment) 2 2295.543
## 3 mlinvgauss(data$Payment) 2 2304.109
## 4 mlinvweibull(data$Payment) 2 2312.149
## 5 mlbetapr(data$Payment) 2 2319.245
## 6 mlinvgamma(data$Payment) 2 2319.975
## 7 mlweibull(data$Payment) 2 2321.669
## 8 mlgamma(data$Payment) 2 2335.215
## 9 mlexp(data$Payment) 1 2343.423
## 10 mlrayleigh(data$Payment) 1 2868.153
De lo anterior podemos notar que la mejor distribucción se puede ajustar es una log-normal, por lo cual realizaremos dicho ajuste.
Ajuste de la distribución log-normal
# Ajuste de una distribución log-normal
distribucion1 <- mllnorm(x = data$Payment)
distribucion <- fitdist(data$Payment, distr = "lnorm")
summary(distribucion)## Fitting of the distribution ' lnorm ' by maximum likelihood
## Parameters :
## estimate Std. Error
## meanlog 6.102583 0.10501440
## sdlog 1.273232 0.07425619
## Loglikelihood: -1141.173 AIC: 2286.346 BIC: 2292.327
## Correlation matrix:
## meanlog sdlog
## meanlog 1 0
## sdlog 0 1
Por lo tanto, tenemos que la media estimada para la lognormal usando maxima verosimilitud es de \(6.10\) con una desviacón estadar de \(1.2\), también podemos ver que lo errores de estimación son relativamente bajos.
Gráfica de la distribución lognormal y su distribución base
plot(distribucion)hist(data$Payment,
main = "Distribución precio Payment",
freq = FALSE,
ylim = c(0, 0.002))
lines(mllnorm(data$Payment), lwd = 2, lty = 1, col = "blue")
lines(mlinvgauss(data$Payment), lwd = 2, lty = 2, col = "red")
legend(x = 15000, y = 0.001, legend = c("lnorm", "invgauss"),
col = c("blue", "red"), lty = 1:2)
rug(data$Payment)ggplot(data = data) +
geom_histogram(aes(x = Payment, y = after_stat(density)),
bins = 40,
alpha = 0.3, color = "black") +
geom_rug(aes(x = Payment)) +
stat_function(fun = function(.x){dml(x = .x, obj = mllnorm(data$Payment))},
aes(color = "log-normal"),
size = 1) +
stat_function(fun = function(.x){dml(x = .x, obj = mlinvgauss(data$Payment))},
aes(color = "inverse-normal"),
size = 1) +
scale_color_manual(breaks = c("log-normal", "inverse-normal"),
values = c("log-normal" = "red", "inverse-normal" = "blue")) +
labs(title = "Distribución precio Payment",
color = "Distribución") +
theme_bw() +
theme(legend.position = "bottom")Conclusiones
De lo anterior se puede concluir que el ajuste de la distribución a los datos es buena, ya que el ajuste que tiene en comparación con la distribución base no se evidencia mayor discrepancia, por otro lado lo podemos notar que en las primeras tablas donde se muestra el ACI y el BIC para diferentes distribuciones que se pueden ajustar a la los datos siempre gano la lognormal.
Punto 2
Valor en riesgo VaR
Calculamos VaR(\(\alpha\)) con \(\alpha = 0.05\)
VaR <- qlnorm(0.95,meanlog=distribucion$estimate['meanlog'],sdlog =distribucion$estimate['sdlog'])Por tanto tenemos que \[ VaR = 3629.5487 \]
Deficit esperado ES
Calculamos ES(\(\alpha\)) con \(\alpha = 0.05\)
ES <- mean(data$Payment[data$Payment>=VaR])Por tanto tenemos que \[ES = 8777\]
Reservas necesarias al inicio de un periodo UV
Con un portafolio de \(20\) pólizas, una tasa de reclamos por poliza de \(0.015\) y un cargo de seguridad \(\lambda = 0.05\) en la prima, entonces para que la aseguradora pueda honrar los contratos con una confianza del \(95\%\) el número de reservas debe ser de:
n <- 20*0.015
m <- mean(data$Payment)
lambda <- 0.05
(UV <- VaR-(1+lambda)*n*m)## [1] 3299.688
Es decir las reservas tiene un valor de \[U_V = 3299.69 \]
Reservas más confiables de una forma sensible UE
Ahora calculemos las reservas más confiables de forma más sensible
(UE <- ES-(1+lambda)*n*m)## [1] 8447.139
Por lo tanto, el valor de las reservas necesarias más confiables de forma más sensible para que la aseguradora pueda honrar los contratos con una confianza del \(95\%\) es de:
\[U_E = 8447.139\]
Punto 3
Ajuste una distribución de Pareto
Para la solución de este punto primero verificamos que tennga solución el sistema de ecuaciones, que se definen de la siguiente manera:
\[\gamma = \frac{-e^{\mu + \frac{\sigma^2}{2}}}{\beta - -e^{\mu + \frac{\sigma^2}{2}}}\\ \beta = exp(\mu + z_{1-\alpha}\sigma)\alpha^{\frac{1}{\gamma}}\]
La ecuaciones anteriores se muestran en el siguiente gráfico
modelo_LN = distribucion
mu_<-modelo_LN$estimate[1]/sqrt(1+(modelo_LN$estimate[2]/modelo_LN$estimate[1])^2)
sigma_<-sqrt(log(1+modelo_LN$estimate[2]^2/modelo_LN$estimate[1]^2 ))
significancia<-0.05
ecu_1<-exp(mu_+sigma_^2/2)
ecu_2<-exp(mu_+qnorm(1-significancia)*sigma_)
gamma_beta<-function(beta_){
-ecu_1/(beta_-ecu_1)
}
beta_gamma<-function(gamma_){
ecu_2*significancia^(1/gamma_)
}
beta_1<-seq(0.01,ecu_1*0.9,length.out=1000)
gamma_1<-gamma_beta(beta_1)
gamma_2<-seq(0.01,max(gamma_1), length.out=1000)
beta_2<-beta_gamma(gamma_2)
#plot(beta_1,gamma_1,type="l",col="red")
#points(beta_2,gamma_2,type="l",col="blue")
datos<-data.frame(gamma=c(gamma_1,gamma_2), beta=c(beta_1,beta_2),ecuacion=c(rep("1",1000),rep("2",1000)) )
fig <- plot_ly(data=datos, x = ~beta, y = ~gamma, type = 'scatter', mode = 'lines',color = ~ecuacion)
figDel gráfico anterio podemos notar que el sistema si tiene solución, ademas logramos ver que no solo tiene una, sino que presenta dos puntos de corte, dichos puntos son \((36.18, 1.099)\) y \((334.17, 5.97)\)
beta1.1 = 36.18
beta1.2 = 334.17
gamma2.1 = 1.099
gamma2.2=5.977par(mfrow = c(1,2))
u <-rpareto(1000, gamma2.1, beta1.1)
hist(u, freq = FALSE, breaks = 100,
main = "Histograma de aleatorios de paretou(5.97, 334.17)", ylab = "Densidad", col = "blue")
u1 <-rpareto(1000, gamma2.2, beta1.2)
hist(u1, freq = FALSE, breaks = 100,
main = "Histograma de aleatorios de paretou(1.099,36.18)", ylab = "Densidad",col="blue")
Haciendo la comparación de los dos gráficos anteriores y el siguiente
notamos que la mejor distribución pareto se da con los siguientes
parametros:
\[\beta = 334.17\]
\[\gamma = 5.97\]
Ya que es la que toma mas información de las colas de la log normal y ademas tiene un mejor ajuste.
ggplot(data = data) +
geom_histogram(aes(x = Payment, y = after_stat(density)),
bins = 40,
alpha = 0.3, color = "black") +
geom_rug(aes(x = Payment)) +
stat_function(fun = function(.x){dml(x = .x, obj = mllnorm(data$Payment))},
aes(color = "log-normal"),
size = 1) +
stat_function(fun = function(.x){dml(x = .x, obj = mlinvgauss(data$Payment))},
aes(color = "inverse-normal"),
size = 1) +
scale_color_manual(breaks = c("log-normal", "inverse-normal"),
values = c("log-normal" = "red", "inverse-normal" = "blue")) +
labs(title = "Distribución precio Payment",
color = "Distribución") +
theme_bw() +
theme(legend.position = "bottom")Con base en la gráfica cual cree Ud que sería la utilidad de la distribución de Pareto para una aseguradora o Reaseguradora?.
La importancia de la distribución pareto para la las aseguradoras es que se dan cuenta de los precios que ellos estaria asumiedo, ya que muestra las colas con más valores elevados, por lo que le seria de mucha ayda para identificar cuales serian esas polizas de las que no se haría carga la aseguradora y si la reaseguradora.