Introducción

La búsqueda de certidumbre constituye un imperativo prioritario en la sociedad contemporánea. La inherente incertidumbre del futuro condiciona significativamente la toma de decisiones tanto individuales como corporativas, ámbito en el cual la industria aseguradora desempeña un rol fundamental mediante la transferencia de riesgos. Este mecanismo opera mediante la cesión del riesgo por parte del asegurado a una entidad aseguradora, la cual recibe una prima a cambio de asumir la contingencia asociada a eventos imprevistos (accidentes, incendios, enfermedades, entre otros) y garantizar una indemnización en caso de materialización del siniestro.

Para honrar dichos compromisos, las aseguradoras requieren estimar sus obligaciones futuras, cumpliendo con las normativas de la Comisión Nacional de Seguros y Fianzas (CNSF) y estándares internacionales que salvaguardan la solvencia financiera. Dentro de este marco, las reservas técnicas representan un pilar crítico, constituyendo fondos destinados a cubrir compromisos futuros derivados de operaciones subscritas. Entre estas, destacan las reservas para siniestros ocurridos pero no reportados (IBNR), cuya estimación implica procesos complejos sustentados en modelización matemática y estadística predictiva.

Existen diversas técnicas y modelos matemáticos que auxilian en la tarea de estimar las obligaciones futuras; en este trabajo conoceremos tres de ellas, con la intención de saber cuál es el mejor modelo para el conjunto de datos que estamos analizando, los siniestros de incendios de 2015 a 2023 proporcionados por la CNSF

La ejecución del estudio se estructura en tres fases metodológicas:

1. Preprocesamiento de datos: Limpieza y normalización de la base de datos para garantizar integridad y compatibilidad con los algoritmos en R.

2. Análisis Exploratorio (EDA): Caracterización del conjunto de datos para identificar patrones, anomalías y contexto actuarial relevante.

3. Implementación y evaluación comparativa: Aplicación de los métodos seleccionados, análisis de resultados y determinación de la técnica óptima según criterios de precisión y robustez en el contexto analizado.

Objetivo

Comparar tres metodologías de estimación de reservas IBNR aplicadas a siniestros por incendio de 2015 a 2023, registrados en bases de datos de la CNSF:

  • Método determinístico: Chain Ladder

  • Métodos estocásticos: Bootstrap y Mack Chain Ladder

Revisión de Teoría

En el paper “Comparison of Stochastic Claims Reserving Models in Insurance” de Martinek, Arató y Mályusz se comparan diversos modelos estocásticos utilizados en la estimación de reservas. Los modelos analizados incluyen:

  • Chain Ladder tradicional: Basado en patrones históricos de desarrollo.

  • Modelo de Mack: Extensión estocástica del Chain Ladder, que incorpora varianzas por año de desarrollo.

  • Bootstrap Chain Ladder: Método de remuestreo para cuantificar incertidumbre.

  • Modelos Lineales Generalizados (GLM): Permiten integrar variables explicativas adicionales.

  • Enfoques bayesianos: Utilizan información previa y actualizable estadísticamente.

Metodología:

Los autores combinan un análisis teórico de las propiedades de cada modelo con pruebas empíricas utilizando datos reales de siniestros. Evalúan precisión, capacidad predictiva, manejo de incertidumbre y complejidad computacional.

Hallazgos clave:

  • Modelo de Mack: Confiable cuando los datos siguen supuestos del Chain Ladder, pero menos flexible ante desviaciones.

  • Bootstrap Chain Ladder: Destaca en cuantificar incertidumbre (intervalos de predicción) y adaptarse a variaciones.

  • GLMs: Ventajosos al incorporar covariables externas, ofreciendo mayor adaptabilidad.

  • Bayesianos: Potentes para datos complejos y contextos con información previa, aunque requieren recursos computacionales intensivos.

Conclusiones:

La elección del modelo depende de la naturaleza de los datos y los objetivos (ej., precisión vs. coste computacional). Los autores subrayan la importancia de:

  • Validar modelos con técnicas como validación cruzada.

  • Combinar enfoques (ej., Bootstrap con GLMs) para mejorar robustez.

  • Considerar el equilibrio entre complejidad y recursos disponibles, especialmente en modelos bayesianos.


Existe otro estudio de Jack Li, “Comparison of Stochastic Reserving Methods”

Se utilizaron los siguientes criterios de comparación:

  • Precisión predictiva: Error en la estimación de reservas.

  • Estabilidad: Sensibilidad a outliers o cambios en los datos.

  • Transparencia: Interpretabilidad de los resultados.

  • Cumplimiento regulatorio: Adecuación a estándares como Solvencia II o IFRS 17.

  • Costo computacional: Recursos requeridos para implementación.

Hallazgos clave:

  • Chain Ladder estocástico (Mack): Sólido en datos con patrones consistentes, pero subestima la incertidumbre si hay heterocedasticidad.

  • Bornhuetter-Ferguson: Superior en ramos con siniestralidad emergente lenta (ej., responsabilidad civil), al reducir dependencia de datos incompletos.

  • GLMs: Alta flexibilidad para modelar efectos de calendario o inflación, pero requieren ajuste cuidadoso para evitar sobreparametrización.

  • Métodos bayesianos: Ideales para integrar juicio experto o datos externos, aunque su complejidad limita su adopción en la práctica diaria.

Conclusiones:

  • Elección del método: Depende del tipo de seguro, calidad de los datos y requisitos regulatorios.

  • Híbridos: Combinar métodos (ej., GLM + bootstrap) puede equilibrar precisión y robustez.

  • Transparencia vs. complejidad: Métodos más sofisticados (bayesianos) ofrecen ventajas analíticas, pero deben justificarse ante reguladores.

  • Enfoque práctico: Li enfatiza la importancia de validación retrospectiva (backtesting) y escenarios de estrés para asegurar la confiabilidad de las reservas.

Limpieza y normalización de la base

En el análisis de datos, una de las primeras tareas que se deben de realizar es conocer la estructura de los datos, esto es, saber qué significan las variables, el tipo de dato que son, la cantidad de registros, y las medidas descriptivas de las variables. Para poder realizar esta exploración, se debe de cargar la base de datos y verificar que haya normalización, es decir que no haya valores nulos, que los datos estén en el formato correcto y que no haya errores en la captura de los datos. Vamos a realizar esta tarea con la base de datos de siniestros de incendio de la CNSF.

¿Qué variables contiene la base de datos?

Hemos recopilado la información de los catálogos de la CNSF para poder entender el significado de las variables. Nos servirá para hacer la limpieza de la base y poder realizar el Análisis Exploratorio de Datos

  • AÑO: Indica el año en que ocurrió el siniestro
  • MONEDA: Moneda con la cual se emitió la póliza.
Clave Moneda
10 Nacional
20 Extranjera
30 Indizada
  • FORMA DE VENTA: Indica la manera que se vendió la póliza
Clave Forma de Venta Definición
01 Agentes Persona Física La distribución de los productos de seguros se realiza a través de una persona física que, mediante la celebración de un contrato con una aseguradora, actúa como intermediaria en la suscripción y administración de contratos de seguros.
02 Agentes Persona Moral La distribución de los productos de seguros se realiza a través de una persona moral que, mediante la celebración de un contrato con una aseguradora, actúa como intermediaria en la suscripción y administración de contratos de seguros.
05 Red de Sucursales Bancarias Suscripción de contratos de seguros mediante su oferta a través de ejecutivos o ventanillas bancarias.
06 Fuerza de Venta Interna o Casa Matriz La distribución de los productos de seguros se realiza a través de los propios empleados de las empresas, sin que intervengan intermediarios, el teléfono o internet.
07 Módulos de Venta Suscripción de contratos de seguros mediante su oferta por medio de lugares físicos de venta, pertenecientes a la aseguradora.
08 Telemercadeo Suscripción de contratos de seguros mediante su oferta a través comunicación telefónica.
10 Empresas Comerciales Suscripción de contratos de seguros mediante su oferta por medio de la estructura comercial de un tercero. Incluye seguros ofrecidos a través de facturas de servicios públicos y privados, u ofertados en supermercados, tiendas departamentales tiendas de autoservicio y electrodomésticos.
11 Concesionarios Automotrices Suscripción de contratos de seguros mediante su oferta por medio de la agencia o intermediario con la que se realizó la venta del automóvil.
12 Internet Suscripción de contratos de seguros directamente por los interesados a través de una página web, sin contar con un intermediario. Esta modalidad puede requerir que se concrete la compra por teléfono, pero el realizador de la llamada no promueve el producto.
13 Descuento por Nómina Suscripción de contratos de seguros mediante su oferta a los empleados de una empresa, independientemente del medio electrónico o canal utilizado.
14 Microcréditos Suscripción de contratos de seguros a microfinancieras cuyo fin principal es cubrir el microcrédito y/o el fallecimiento del acreditado y en su caso a sus beneficiarios.
15 Otros Canales de Venta Masiva Considera canales masivos que no se encuentran incluidos en las categorías anteriores (08 a 14). Asimismo, incluye la suscripción de contratos de seguros directamente por los interesados a través de insertos, tarjetas de regalo o cajeros automáticos (ATM´s). Esta modalidad puede requerir que concrete la compra por teléfono, pero el realizador de la llamada no promueve el producto.
99 Otra Forma de Venta Cualquier otra forma de venta que se considere ajena a las opciones anteriores. En caso de que se reporte en esta opción más del 1% de la Prima Emitida o del número de pólizas o asegurados/certificados/incisos/ubicaciones, se deberá aclarar por escrito cual es la forma de venta de estos seguros, para agregar las opciones que sean necesarias en este catálogo.
  • GIRO: Tipo de empresa Puede consultar el cátalogo en el siguiente link: Cátalogo 4, Giros

  • NUMERO DE NIVELES: Número total de niveles del edificio, incluyendo sótanos

  • ENTIDAD: la entidad federativa-municipio en donde se encuentra el bien o inmueble asegurado: Catálogo 16.2

  • SUBTIPO DE SEGURO: Subtipo de seguro que corresponda al negocio asegurado

Clave Subtipo de Seguro Definición
0 Otro
1 Microseguro Microseguros, pólizas que corresponden a productos registrados de acuerdo con la normativa vigente.
2 Negocio gubernamental Es el seguro que es contratado por el gobierno federal, estatal, municipal y sus empresas paraestatales para cubrir bienes propios.
3 Seguro obligatorio Seguros que deben ser comprados al ser dictados por una ley, reglamento u otro tipo de normativa.
4 Pymes Seguros contratados por PyMEs para la protección de sus bienes.
  • TIPO DE BIEN: La clave del bien que se está asegurando
Clave Tipo de bien
1 Edificio
2 Contenidos
3 Pérdidas Consecuenciales
4 Existencias / Bienes Bajo Convenio Expreso
5 Contenidos y Edificio
6 Contenidos, Existencias / Bienes Bajo Convenio Expreso
7 Contenidos y Pérdidas Consecuenciales
8 Edificio y Pérdidas Consecuenciales
9 Otra combinación / Otros
  • COBERTURA: Cada una de las coberturas de la póliza, afectadas por el siniestro
Clave Cobertura
01 Bienes en cuartos o aparatos refrigerados o en incubadoras
02 Combustión Espontánea
03 Derrame de Material Fundido
04 Derrame de Protecciones contra Incendio
05 Extensión de cubierta (sin inundación)
06 Ganancias Brutas
07 Gastos Extraordinarios
08 Gastos Extras para Casa Habitación
09 Huelgas o Alborotos Populares
10 Incendio, rayo y explosión
11 Interdependencia
12 Interrupción de Actividades Comerciales
13 Naves Aéreas, Vehículos y Humo
14 Pérdida de Rentas
15 Pérdida de Utilidades, Gastos Fijos y Salarios
16 Remoción de Escombros
17 Seguro Contingente
18 Todo Riesgo
19 Cancelación de viaje, pérdida de maleta
20 Cobertura automática para incisos nuevos o no conocidos
21 Endoso Inflacionario
22 Gastos funerarios
23 Seguro Flotante
24 Terrorismo
25 Explosión
99 Otra cobertura
  • CAUSA DEL SINIESTRO: Causa que originó el siniestro.
Clave Causa de siniestro
01 Acción del Agua que no Provenga de las Condiciones Atmosféricas
02 Actos de Personas Mal Intencionadas
03 Auto Ignición
04 Caída de Antenas
05 Caída de Arboles
06 Caída de Avión
07 Caída de Maquinaria o sus Partes por Rotura de Cables
08 Caída de Nave Aérea y Objetos Caídos de Ellos
09 Cerillos y Cigarros
10 Corto circuito / Electricidad
11 Derrame de Equipo Contra Incendio
12 Derrame de Material Fundido
13 Desechos orgánicos
14 Durante la soldadura y corte
15 Explosión
16 Fallas en el Sistema de Refrigeración
17 Falta de Suministro de Energía Eléctrica
18 Fricción
19 Guerra
20 Huelgas, Alborotos Populares
21 Humo o Tizne
22 Impacto de Vehículos
23 Material sobrecalentado
24 Conmoción Civil
25 Contenidos e Interior de los edificios por deficiencias en construcción
26 Desbordamiento o Desviación de Corrientes o Depósitos Artificiales
27 Descargas accidentales de agua o vapor
28 Escape de Materias Inflamables o explosivas
29 Falta de Mantenimiento
30 Gastos Extraordinarios
31 Falta o insuficiencia de drenaje
32 Incendio por Lluvia
33 Rayo
34 Roturas de tuberías o sistemas de agua
35 Remoción de Escombros
36 Combustión Espontánea
37 Corrosión en tubería
38 Daños en coladeras
39 Daños causados por impericia de trabajo
40 Daños por derrame de sustancias químicas
41 Fenómenos de la naturaleza
42 Fermentación
43 Pérdida de equpaje durante viaje
44 Plaga de termitas
45 Rotura de techos, vidrios, paredes
46 Vientos Tempestuosos
99 Otra causa
  • MONTO DE SINIESTRO: Monto del siniestro, neto de deducible y coaseguro, de los movimientos registrados durante el periodo de reporte, independientemente de la fecha de ocurrencia del siniestro. Este considera los importes de las reservas iniciales estimadas más/menos los ajustes a las reservas.
  • MONTO PAGADO: total de los montos pagados al asegurado por concepto de siniestro, neto de coaseguro y deducible, durante el periodo de reporte.
  • MONTO DEL DEDUCIBLE: Importe total a cargo del asegurado por deducible correspondiente a su participación en los siniestros pagados dentro del periodo del reporte
  • MONTO DE COASEGURO: Importe total a cargo del asegurado por coaseguro correspondiente a su participación en los siniestros pagados dentro del periodo del reporte.
  • SALVAMENTO: Monto obtenido por la Institución por concepto de salvamentos del siniestro ocurrido

Normalizando la base

library(pacman)
p_load(tidyverse, extraDistr, ChainLadder, stringi, knitr, DT, ggplot2, plotly, htmlwidgets)

Ahora que conocemos las variables vamos a normalizar y verificar tipos de datos o valores NA

# Importando los datos y usando encoding latin por los acentos
siniestros <- read.csv('Incendio_Siniestros.csv',fileEncoding = "latin1", stringsAsFactors = FALSE)
primeros_cinco <- head(siniestros, 5)
kable(primeros_cinco)
AÑO MONEDA FORMA.DE.VENTA GIRO NUMERO.DE.NIVELES TIPO.PRIMER.RIESGO ENTIDAD SUBTIPO.DE.SEGURO TIPO.DE.BIEN COBERTURA CAUSA.DEL.SINIESTRO NUMERO.DE.SINIESTROS MONTO.DE.SINIESTRO GASTO.DE.AJUSTE SALVAMENTO MONTO.PAGADO MONTO.DE.DEDUCIBLE MONTO.COASEGURO RECUPERACION.DE.TERCEROS RECUPERACION.DE.REASEGURO
2015 Extranjera Agentes Persona Fisica Alquiler de maquinaria y equipo industrial, comercial y de servic 2 NINGUNO Baja California Otro Contenidos Incendio, rayo y explosion Falta de Mantenimiento 1 49946 0 0 50306 15300 0 NA NA
2015 Extranjera Agentes Persona Fisica Autotransporte de carga general 1 RELATIVO Guanajuato Otro Edificio Incendio, rayo y explosion Rayo 2 85736 2969 0 0 0 0 NA NA
2015 Extranjera Agentes Persona Fisica Banca multiple 1 NINGUNO Estado de Mexico Microseguro Contenidos Extension de cubierta (sin inundacion) Impacto De Vehiculos 1 0 3626 0 0 0 0 NA NA
2015 Extranjera Agentes Persona Fisica Banca multiple 1 NINGUNO Nuevo Leon Microseguro Contenidos Extension de cubierta (sin inundacion) Rotura de techos, vidrios, paredes 1 -278 1813 0 0 0 0 NA NA
2015 Extranjera Agentes Persona Fisica Banca multiple 1 NINGUNO Distrito Federal Microseguro Contenidos Extension de cubierta (sin inundacion) Roturas de tuberias o sistemas de agua 1 -1188 3626 0 0 0 0 NA NA
sapply(siniestros, class)
##                       AÑO                    MONEDA            FORMA.DE.VENTA 
##                 "integer"               "character"               "character" 
##                      GIRO         NUMERO.DE.NIVELES        TIPO.PRIMER.RIESGO 
##               "character"               "character"               "character" 
##                   ENTIDAD         SUBTIPO.DE.SEGURO              TIPO.DE.BIEN 
##               "character"               "character"               "character" 
##                 COBERTURA       CAUSA.DEL.SINIESTRO      NUMERO.DE.SINIESTROS 
##               "character"               "character"                 "integer" 
##        MONTO.DE.SINIESTRO           GASTO.DE.AJUSTE                SALVAMENTO 
##                 "numeric"                 "integer"                 "integer" 
##              MONTO.PAGADO        MONTO.DE.DEDUCIBLE           MONTO.COASEGURO 
##                 "numeric"                 "integer"                 "integer" 
##  RECUPERACION.DE.TERCEROS RECUPERACION.DE.REASEGURO 
##                 "integer"                 "integer"

Tipos de datos correctos, ahora valores nulos

colSums(is.na(siniestros))
##                       AÑO                    MONEDA            FORMA.DE.VENTA 
##                         0                         0                         0 
##                      GIRO         NUMERO.DE.NIVELES        TIPO.PRIMER.RIESGO 
##                         0                         0                         0 
##                   ENTIDAD         SUBTIPO.DE.SEGURO              TIPO.DE.BIEN 
##                         0                         0                         0 
##                 COBERTURA       CAUSA.DEL.SINIESTRO      NUMERO.DE.SINIESTROS 
##                         0                         0                         0 
##        MONTO.DE.SINIESTRO           GASTO.DE.AJUSTE                SALVAMENTO 
##                         0                         0                         0 
##              MONTO.PAGADO        MONTO.DE.DEDUCIBLE           MONTO.COASEGURO 
##                         0                         0                         0 
##  RECUPERACION.DE.TERCEROS RECUPERACION.DE.REASEGURO 
##                     98893                     98893

Vemos que las columnas RECUPERACION.DE.SINIESTROS Y RECUPERACION.DE.REASEGURO contienen NA, pero por el objetivo del proyecto esas columnas no nos serán de utilidad por lo que no requerirán de alguna técnica de reemplazamiento

Vamos a extraer un subconjunto de las variables que nos interesan, a el igual que solo nos enfocaremos en las observaciones que tengan un monto de pago mayor a 0

siniestros <- siniestros %>% select(-c(RECUPERACION.DE.REASEGURO, RECUPERACION.DE.TERCEROS, GASTO.DE.AJUSTE, MONTO.DE.DEDUCIBLE, MONTO.COASEGURO, MONTO.DE.SINIESTRO))

siniestros <- siniestros %>% filter(MONTO.PAGADO > 0)

Ahora vamos a normalizar las variables: MONEDA, FORMA.DE.VENTA, GIRO, NUMERO.DE.NIVELES, ENTIDAD, SUBTIPO.DE.SEGURO, TIPO.DE.BIEN, COBERTURA, CAUSA.DE.SINIESTRO de acuerdo con el catálogo de RR-8 de la CNSF

rango_valores <- lapply(siniestros, unique)

Algunos valores son los mismos, pero no hay consistencia en el regirstro de los datos. Necesitamos homogenizar los datos para poder realizar el análisis exploratorio de datos

Hemos acordado eliminar acentos y pasar a minúsculas para evitar errores en la búsqueda de los valores o posible incompatibilidad de los datos en las funciones

# MONEDA

siniestros$MONEDA <- tolower(siniestros$MONEDA)

# FORMA.DE.VENTA

siniestros$FORMA.DE.VENTA <- stri_trans_general(siniestros$FORMA.DE.VENTA, "Latin-ASCII")  # Remover los acentos
  
siniestros$FORMA.DE.VENTA <- tolower(siniestros$FORMA.DE.VENTA)  # Pasar a minúsculas

siniestros$FORMA.DE.VENTA <- ifelse(siniestros$FORMA.DE.VENTA == "fuerza venta interna o matriz", "fuerza de venta interna o casa matriz", siniestros$FORMA.DE.VENTA)

siniestros$FORMA.DE.VENTA <- ifelse(siniestros$FORMA.DE.VENTA == "venta masiva", "otros canales de venta masiva", siniestros$FORMA.DE.VENTA)


# GIRO

siniestros$GIRO <- stri_trans_general(siniestros$GIRO, "Latin-ASCII")  # Remover los acentos
  
siniestros$GIRO <- tolower(siniestros$GIRO)  # Pasar a minúsculas
  
siniestros$GIRO <- trimws(siniestros$GIRO, which = 'right')  # Remover espacios en blanco
  
  # Completando strings

sectores <- c("agricultura, ganaderia, aprovechamiento forestal, pesca y caza",
              "mineria",
              "comercio al por mayor", 
              "comercio al por menor", 
              "construccion", 
              "electricidad, agua y suministro de gas por ductos al consumidor final",
              "industrias manufactureras", 
              "informacion en medios masivos", 
              "otros servicios excepto actividades del gobierno", 
              "servicios de alojamiento temporal y de preparacion de alimentos y bebidas", 
              "servicios de apoyo secretarial, fotocopiado, cobranza, investigacion",
              "servicios educativos",
              "servicios financieros y de seguros",
              "servicios inmobiliarios y de alquiler de bienes muebles e intangibles",
              "servicios profesionales, cientificos y tecnicos",
              "direccion de corporativos y empresas",
              "servicios de apoyo a los negocios y manejo de desechos y servicios de remediacion",
              "servicios educativos",
              "servicios de salud y de asistencia social",
              "servicios de esparcimiento culturales y deportivos, y otros servicios recreativos",
              "servicios de alojamoento temporal y de preparacion de alimentos y bebidas",
              "otros servicios excepto actividades del gobierno",
              "actividades del gobierno y de organismos internacionales y extraterritoriales",
              "transportes, correos y almacenamiento", 
              "vivienda", "oficina")
    
for (i in sectores) {
  
  pattern <- paste0("^", i, "\\s*\\s?\\((.*?)\\).*")
  
  siniestros$GIRO <- gsub(
  pattern = pattern,
  replacement = "\\1",
  x = siniestros$GIRO
)
}

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de maquinaria y equipo para la industria metalmecani" , "fabricacion de maquinaria y equipo para la industria metalmecanica" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de herramientas de mano sin motor y utensilios de coc" , "fabricacion de herramientas de mano sin motor y utensilios de cocina metalicos " , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "alquiler de maquinaria y equipo industrial, comercial y de servic", "alquiler de maquinaria y equipo industrial, comercial y de servicios", siniestros$GIRO)
  
siniestros$GIRO <- ifelse(siniestros$GIRO == "comercio al por menor de articulos de papeleria, libros y perio", "comercio al por menor de articulos de papeleria, libros y periodicos", siniestros$GIRO)
  
siniestros$GIRO <- ifelse(siniestros$GIRO == "transmision de programas de radio y television, excepto a traves" , "transmision de programas de radio y television, excepto a traves de internet " , siniestros$GIRO)
  
siniestros$GIRO <- ifelse(siniestros$GIRO == "telefonia tradicional, telegrafia y otras  telecomunicaciones ala" , "telefonia tradicional, telegrafia y otras  telecomunicaciones alambricas" , siniestros$GIRO)
  
siniestros$GIRO <- ifelse(siniestros$GIRO == "vivienda (casa habitacion (credito hipotecario))", "casa habitacion (credito hipotecario)", siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "servicios de apoyo secretarial, fotocopiado, cobranza, investiga" , "servicios de apoyo secretarial, fotocopiado, cobranza, investigacion" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "alquiler de maquinaria y equipo industrial, comercial y de servic" , "alquiler de maquinaria y equipo industrial, comercial y de servicios" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "comercio al por mayor de electrodomesticos menores y aparatos d" , "comercio al por mayor de electrodomesticos menores y aparatos de linea blanca" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "comercio al por menor de articulos de ferreteria, tlapaleria y vi" , "comercio al por menor de articulos de ferreteria, tlapaleria y vidrios" , siniestros$GIRO)


siniestros$GIRO <- ifelse(siniestros$GIRO == "comercio al por menor de partes y refacciones para automoviles," , "comercio al por menor de partes y refacciones para automoviles, camionetas y camiones" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de equipo y material para uso medico, dental y para" , "fabricacion de equipo y material para uso medico, dental y para laboratorio" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de maquinaria y equipo para el comercio y los servi" , "fabricacion de maquinaria y equipo para el comercio y los servicios" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de maquinaria y equipo para las actividades agropecua" , "fabricacion de maquinaria y equipo para las actividades agropecuarias, para la construccion y para la industria extractiva" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de maquinaria y equipo para las industrias manufactu" , "fabricacion de maquinaria y equipo para las industrias manufactureras, 
excepto la metalmecanica" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de otra maquinaria y equipo para la industria en gen" , "fabricacion de otra maquinaria y equipo para la industria en general" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "otra actividad o servicio relacionada con la agricultura, ganade" , "otra actividad o servicio relacionada con la agricultura, ganaderia, aprovechamiento forestal, pesca y caza" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "parques con instalaciones recreativas y casas de juegos electroni" , "parques con instalaciones recreativas y casas de juegos electronicos" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "pensiones y casas de huespedes, y departamentos y casas amuebla" , "pensiones y casas de huespedes, y departamentos y casas amueblados con servicios de hotelería " , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "construccion de obras para el abastecimiento de agua, petroleo," , "construccion de obras para el abastecimiento de agua, petroleo, gas, electricidad y 
telecomunicaciones " , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "edicion de periodicos, revistas, libros y similares, excepto a" , "edicion de periodicos, revistas, libros y similares, excepto a traves 
de internet" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de motores de combustion interna, turbinas y transmi" , "fabricacion de motores de combustion interna, turbinas y transmisiones" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de otros productos de cuero, piel y materiales suceda" , "fabricacion de otros productos de cuero, piel y materiales sucedaneos" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de productos a base de arcillas y minerales refracta" , "fabricacion de productos a base de arcillas y minerales refractarios" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "reparacion y mantenimiento de equipo electr¢nico y de equipo de" , "reparacion y mantenimiento de equipo electronico y de equipo de precision " , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "servicios de arquitectura, ingenieria y actividades relacionada" , "servicios de arquitectura, ingenieria y actividades relacionadas" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "asilos y otras residencias para el cuidado de ancianos y discapa" , "asilos y otras residencias para el cuidado de ancianos y discapacitados" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "comercio al por menor de articulos para la decoracion de interio" , "comercio al por menor de articulos para la decoracion de interiores" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "escuelas comerciales, de computacion y de capacitacion para ejecu" , "escuelas comerciales, de computacion y de capacitacion para ejecutivos" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de equipo de generacion y distribucion de energia ele" , "fabricacion de equipo de generacion y distribucion de energia electrica" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de instrumentos de navegacion, medicion, medicos y" , "fabricacion de instrumentos de navegacion, medicion, medicos y de control" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "fabricacion de sistemas de aire acondicionado, calefaccion y de" , "fabricacion de sistemas de aire acondicionado, calefaccion y de refrigeracion industrial y comercial" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "otras instituciones de intermediacion crediticia y financiera no" , "otras instituciones de intermediacion crediticia y financiera no bursatil" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "reparacion y mantenimiento de maquinaria y equipo agropecuario," , "reparacion y mantenimiento de maquinaria y equipo agropecuario, industrial, comercial y de servicios" , siniestros$GIRO)

siniestros$GIRO <- ifelse(siniestros$GIRO == "telefonia celular y otras telecomunicaciones inalambricas, exce" , "telefonia celular y otras telecomunicaciones inalambricas, excepto los servicios de satelites" , siniestros$GIRO)


# NUMERO.DE.NIVELES

siniestros$NUMERO.DE.NIVELES <- ifelse(siniestros$NUMERO.DE.NIVELES == "No disponible", "No Disponible", siniestros$NUMERO.DE.NIVELES)

# ENTIDAD

  # Minisculas
siniestros$ENTIDAD <- tolower(siniestros$ENTIDAD)

  # Remover acentos
siniestros$ENTIDAD <- stri_trans_general(siniestros$ENTIDAD, "Latin-ASCII")

  # cambiando strings

siniestros$ENTIDAD <- ifelse(siniestros$ENTIDAD == "distrito federal", "ciudad de mexico", siniestros$ENTIDAD)

siniestros$ENTIDAD <- ifelse(siniestros$ENTIDAD == "extranjero", "en el extranjero", siniestros$ENTIDAD)

siniestros$ENTIDAD <- ifelse(siniestros$ENTIDAD == "mexico", "estado de mexico", siniestros$ENTIDAD)

# SUBTIPO.DE.SEGURO

siniestros$SUBTIPO.DE.SEGURO <- tolower(siniestros$SUBTIPO.DE.SEGURO)


# TIPO.DE.BIEN

siniestros$TIPO.DE.BIEN <- tolower(siniestros$TIPO.DE.BIEN)

siniestros$TIPO.DE.BIEN <- stri_trans_general(siniestros$TIPO.DE.BIEN, "Latin-ASCII")


siniestros$TIPO.DE.BIEN <- ifelse(siniestros$TIPO.DE.BIEN == "existencias / bienes bajo conv", "existencias / bienes bajo convenio expreso", siniestros$TIPO.DE.BIEN)


siniestros$TIPO.DE.BIEN <- ifelse(siniestros$TIPO.DE.BIEN == "edificio y perdidas consecuenc", "edificio y perdidas consecuenciales", siniestros$TIPO.DE.BIEN)


# COBERTURA
siniestros$COBERTURA <- tolower(siniestros$COBERTURA)

siniestros$COBERTURA <- stri_trans_general(siniestros$COBERTURA, "Latin-ASCII")

# Tnemos valores con espacios en blanco al final
siniestros$COBERTURA <- trimws(siniestros$COBERTURA, which = 'right') 
    
    # reemplazando "Bienes en cuartos o aparatos refrigerados o en inc" por "Bienes en cuartos o aparatos refrigerados o en incubadoras"
    
    siniestros$COBERTURA <- ifelse(siniestros$COBERTURA == "bienes en cuartos o aparatos refrigerados o en inc", "bienes en cuartos o aparatos refrigerados o en incubadoras", siniestros$COBERTURA)
    
    # reemplazando "Cobertura automàtica para incisos nuevos o no cono" por "Cobertura automatica para incisos nuevos o no conocidos" 
    siniestros$COBERTURA <- ifelse(siniestros$COBERTURA == "cobertura automatica para incisos nuevos o no cono", "cobertura automatica para incisos nuevos o no conocidos", siniestros$COBERTURA)
    
# CAUSA.DE.SINIESTRO
    
# Convertir a minúsculas
siniestros$CAUSA.DEL.SINIESTRO <- tolower(siniestros$CAUSA.DEL.SINIESTRO)

# Remover acentos
siniestros$CAUSA.DEL.SINIESTRO <- stri_trans_general(siniestros$CAUSA.DEL.SINIESTRO, "Latin-ASCII")
    
# Completando strings
siniestros$CAUSA.DEL.SINIESTRO <- ifelse(siniestros$CAUSA.DEL.SINIESTRO == "accion del agua que no provenga de las condiciones", "accion del agua que no provenga de las condiciones atmosfericas", siniestros$CAUSA.DEL.SINIESTRO)
    
siniestros$CAUSA.DEL.SINIESTRO <- ifelse(siniestros$CAUSA.DEL.SINIESTRO == "caida de maquinaria o sus partes por rotura de cab", "caida de maquinaria o sus partes por rotura de cables", siniestros$CAUSA.DEL.SINIESTRO)
    
siniestros$CAUSA.DEL.SINIESTRO <- ifelse(siniestros$CAUSA.DEL.SINIESTRO == "perdida de equpaje durante viaje", "perdida de equipaje durante el viaje", siniestros$CAUSA.DEL.SINIESTRO)

siniestros$CAUSA.DEL.SINIESTRO <- ifelse(siniestros$CAUSA.DEL.SINIESTRO == "desbordamiento o desviacion de corrientes o deposi", "desbordamiento o desviacion de corrientes o depositos artificiales", siniestros$CAUSA.DEL.SINIESTRO)

siniestros$CAUSA.DEL.SINIESTRO <- ifelse(siniestros$CAUSA.DEL.SINIESTRO == "contenidos e interior de los edificios por deficie", "contenidos e interior de los edificios por deficiencias en construccion", siniestros$CAUSA.DEL.SINIESTRO)


# TIPO.PRIMER,RIESGO
siniestros$TIPO.PRIMER.RIESGO <- tolower(siniestros$TIPO.PRIMER.RIESGO)

Veamos como queda la base de datos

datatable(head(siniestros, 100))

Corroborando tipos de datos

lapply(siniestros, class)
## $AÑO
## [1] "integer"
## 
## $MONEDA
## [1] "character"
## 
## $FORMA.DE.VENTA
## [1] "character"
## 
## $GIRO
## [1] "character"
## 
## $NUMERO.DE.NIVELES
## [1] "character"
## 
## $TIPO.PRIMER.RIESGO
## [1] "character"
## 
## $ENTIDAD
## [1] "character"
## 
## $SUBTIPO.DE.SEGURO
## [1] "character"
## 
## $TIPO.DE.BIEN
## [1] "character"
## 
## $COBERTURA
## [1] "character"
## 
## $CAUSA.DEL.SINIESTRO
## [1] "character"
## 
## $NUMERO.DE.SINIESTROS
## [1] "integer"
## 
## $SALVAMENTO
## [1] "integer"
## 
## $MONTO.PAGADO
## [1] "numeric"
# convirtiendo numero de niveles
siniestros$NUMERO.DE.NIVELES <- as.integer(siniestros$NUMERO.DE.NIVELES) # "no disponible" se convierte en NA

Ya tenemos lista la base, procedemos con el EDA

Analisis Exploratorio de Datos

Teniendo la base funcional, procederemos con el Análisis Exploratorio

Las variables de interés son sólo dos, el monto de reclamo y el año, sin embargo para tener contexto de nuestra base vamos a explorar las demás, realizando ciertas preguntas

Estadisticas descriptivas

siniestros_num <- siniestros %>% select_if(is.numeric)

kable(summary(siniestros_num))
AÑO NUMERO.DE.NIVELES NUMERO.DE.SINIESTROS SALVAMENTO MONTO.PAGADO
Min. :2015 Min. : 1.000 Min. : 1.000 Min. :-2792911 Min. : 1
1st Qu.:2017 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 0 1st Qu.: 8174
Median :2019 Median : 1.000 Median : 1.000 Median : 0 Median : 31194
Mean :2019 Mean : 2.602 Mean : 2.937 Mean : 9261 Mean : 1653452
3rd Qu.:2022 3rd Qu.: 2.000 3rd Qu.: 2.000 3rd Qu.: 0 3rd Qu.: 142754
Max. :2023 Max. :99.000 Max. :1701.000 Max. :91424211 Max. :13550851556
NA NA’s :599 NA NA NA

La media de siniestros es muy baja, prácticamente dos, donde de hecho se encuentra el tercer cuartil, esto indica que tenemos muy poca frecuencia de siniestralidad. Sin embargo, notemos que el monto pagado es muy grande, siendo la media de 1,653,452

Pronto veremos por qué la media del monto pagado es grande

Preguntas de exploración

Dispersión de los montos pagados por año

ggplot(siniestros, aes(x=AÑO, y=MONTO.PAGADO)) +
  geom_point(bins = 30, fill = "blue", color = "black") +
  labs(title = "Distribución de los montos pagados por año",
       x = "Año",
       y = "Monto pagado") +
  theme(plot.title = element_text(face = "bold", size = 14, hjust = 0.5))

Observamos que hay valores atípicos en los años 2017 y 2018. ¿Cuáles son?

outliers <- siniestros %>% filter(MONTO.PAGADO > 3e+09)
kable(outliers)
AÑO MONEDA FORMA.DE.VENTA GIRO NUMERO.DE.NIVELES TIPO.PRIMER.RIESGO ENTIDAD SUBTIPO.DE.SEGURO TIPO.DE.BIEN COBERTURA CAUSA.DEL.SINIESTRO NUMERO.DE.SINIESTROS SALVAMENTO MONTO.PAGADO
2017 extranjera fuerza de venta interna o casa matriz extraccion de petroleo y gas 1 relativo campeche negocio gubernamental contenidos y edificio todo riesgo corto circuito / electricidad 1 0 13550851556
2018 extranjera agentes persona moral fabricacion de productos derivados del petroleo y del carbon 1 ninguno veracruz otro contenidos incendio, rayo y explosion escape de materias inflamables o explosivas 2 1104678 3900822996

Se trata de un siniestro ocurrido a una plataforma petrolera debido a un corto circuito.

El otro siniestro igualmente a un inmueble relacionado con la fabricación de productos relacionados a el petróleo

Estos son los únicos dos valores que tiene un monto de pago significativamente mayor a los demás. Esto podría ser la causa de una media muy grande en el pago

Posteriormente veremos cuál podría ser el impacto en los modelos

¿Cúales son 10 los giros con más incendios?

group_giros <- siniestros %>% 
  group_by(GIRO) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>% 
  head(10)


ggplot(group_giros, aes(x = n, y = reorder(GIRO, n))) +
  geom_bar(stat = "identity", fill = "#1f77b4") +
  geom_text(aes(label = n), hjust = -0.3, size = 3.5) +
  labs(
    title = "Top 10 giros con más siniestros",
    x = "Número de siniestros",
    y = "Giro"
  ) +
  theme_minimal() +
  theme(
    panel.grid.major.y = element_blank(),  # quitar lineas horizontales
    axis.text.y = element_text(size = 7.5),
    plot.title = element_text(face = "bold", size = 14)
  ) +
  expand_limits(x = max(group_giros$n) * 1.1)  # Space for labels

Como era de esperarse, la casa habitación se encuentra en el inmueble donde más ocurren los siniestros de incendio. En general en lugares donde operan personas en la vida cotidiana, como hogar o lugares de trabajo.

¿Cúal es la entidad con más siniestros?

group_entidad <- siniestros %>% 
  group_by(ENTIDAD) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n))


ggplot(group_entidad, aes(x = reorder(ENTIDAD, n), y = n)) +
  geom_bar(stat = "identity", fill='blue') +
  labs(title = "Siniestros por entidad",
       x = "Entidad",
       y = "Número de siniestros") +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

En la Ciudad de México se concentra la mayoria de los incendios registrados en esta base. La cantidad de siniestros puede ver con qué tan poblado es la entidad. También esto habla de la cuantía del monto de pago, las tres entidades con mayor siniestros suelen ser donde habitan personas con alto poder adquisitivo y por ende construcciones y edificios con más valor

¿Cúales son las 10 coberturas más contratadas?

group_cobertura <- siniestros %>% 
  group_by(COBERTURA) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>% 
  head(10)

ggplot(group_cobertura, aes(x =n,y= reorder(COBERTURA, n))) +
  geom_bar(stat = "identity",  fill="#1f77b4") +
  geom_text(aes(label = n), hjust = -0.3, size = 3.5) +
  labs(title = "Top 10 coberturas contratadas",
       x = "Frecuencia de la cobertura",
       y = "Cobertura") +
  theme(
    panel.grid.major.y = element_blank(),  # quitar lineas horizontales
    axis.text.y = element_text(size = 7.5),
    plot.title = element_text(face = "bold", size = 14, hjust = 0.5)
  )

Es interesante ver que por encima de la cobertura todo riesgo, se situa la de incendio, rayo y explosión ya que está es la cobertura ‘basica’ que las aseguradoras ofrecen de entrada

¿Cuántos siniestros ocurrieron cada año?

siniestros_por_año <- siniestros %>%
  group_by(AÑO) %>%
  summarise(n = n())
ggplot(siniestros_por_año, aes(x = AÑO, y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Frecuencia de Siniestros por Año",
       x = "Año",
       y = "Número de Siniestros")+
  theme(plot.title = element_text(face = "bold", size = 14, hjust = 0.5))

Se aprecia claramente que existe una tendencia a la alza de la frecuencia de los sinietros, siendo el año con más siniestros el 2021

Esto puede ayudarnos a entender, más adelante el comportamiento de los modelos

¿Cuáles son las 10 formas de ventas más frecuentes de las pólizas?

forma_venta_frecuente <- siniestros %>%
  group_by(FORMA.DE.VENTA) %>%
  summarise(n = n()) %>%
  arrange(desc(n)) %>%
  head(10)

ggplot(forma_venta_frecuente, aes(x = reorder(FORMA.DE.VENTA, n), y = n, fill = FORMA.DE.VENTA)) +
  geom_bar(stat = "identity", color = "black", show.legend = FALSE) +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 4) +
  labs(title = "Forma de Venta más Frecuente ",
       x = "Forma de Venta",
       y = "Número de Pólizas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8),
        plot.title = element_text(hjust = 0.5),
        axis.title = element_text(size = 12))

A través de un agente de seguros, ha sido la forma “tradicional” de contratación de cualquier seguro

¿Cuál es el monto promedio pagado por tipo de bien asegurado?

monto_promedio_pagado_por_bien <- siniestros %>%
  group_by(TIPO.DE.BIEN) %>%
  summarise(promedio_monto = mean(MONTO.PAGADO, na.rm = TRUE))

ggplot(monto_promedio_pagado_por_bien, aes(x = promedio_monto, y=reorder(TIPO.DE.BIEN, promedio_monto))) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = promedio_monto), hjust = -0.4, color = "black", size = 4) +
  labs(title = "Monto Promedio Pagado por Tipo de Bien",
       x = "", 
       y = "Monto Promedio Pagado") +
  theme_minimal() +
  theme(axis.text.x = element_blank(), 
        plot.title = element_text(hjust = 0.5),
        legend.title = element_text(size = 12),
        legend.text = element_text(size = 10))

El tipo de bien que más se paga son los contenidos y edificios, nuevamente porque es la cobertura “basica” que la mayoria de las aseguradoras ofrecen

Conocimos el comportamiento del monto promedio del pago total, y qué años tiene más frecuencia de siniestros, veremos que esto puede influir significativamente en los supuestos de cada modelo

Metodología

Construcción del triángulo de pérdidas acumuladas

Para el próposito del proyecto vamos a trabajar con las variables AÑO y MONTO.PAGADO. Sin embargo, necesitamos de el periodo de pago para realizar el triángulo de pérdidas acumuladas y poder estimar las reservas IBNR

A falta de información vamos a simular el periodo de pago.

Tenemos siniestros ocurridos de 2015 a 2023, es decir 8 años de información.

Ocuparemos una distribución propia pero no informativa, en este caso una distribición uniforme para simular el factor de desarrollo D donde: \[ D \sim Unif(0,8) \]

# Selección variables de interés
fechas_montos <- siniestros %>% select(AÑO, MONTO.PAGADO)

# montos mayor a cero

fechas_montos <- filter(fechas_montos, fechas_montos$MONTO.PAGADO > 0)

# Añadiendo la columna D, para el año de desarrollo (fecha de pago)

fechas_montos <- add_column(fechas_montos, D = as.integer(rdunif(nrow(fechas_montos), 0, 8)), .after = 1)

# columna año de pago simulado AÑO + D
fechas_montos <- fechas_montos %>% mutate(AÑO.PAGO = as.integer(rowSums((across(c(AÑO, D))))), .after = 2)

Hemos creado la simulación de fecha de pagos, pero existe un problema. Cada año debe tener un factor de desarrollo máximo. Por ejemplo, el año \(2015\) puede tener como máximo \(8\) porque \(2015 + 8 = 2023\) la fecha donde tenemos información. De forma general \(\max D = 2023 - \text{AÑO}\). Vamos a arreglar ese problema

fechas_montos <- fechas_montos %>%
  mutate(
    max_D = 2023 - AÑO,  # Max D permitido por cada AÑO
    D = if_else(D <= max_D, D, NA_real_),
    .after = 3
  )

Ya hemos restringido los factores de desarrollo para cada año ahora vamos a realizar la suma de cada año y factor de desarrollo

fechas_montos_agregados <- fechas_montos %>%
  group_by(AÑO, D) %>%
  summarise(MONTO.TOTAL = sum(MONTO.PAGADO, na.rm = TRUE))

Tenemos lista toda la información, haremos uso de la paqueteria ChainLadder para construir el triangulo de montos

# triangulo de forma incremental
triangulo <- as.triangle(
  fechas_montos_agregados,
  origin = "AÑO",
  dev = "D",
  value = "MONTO.TOTAL"
)
triangulo
##       D
## AÑO            0          1          2          3          4          5
##   2015  751988599  779752605 1504524169  699573247  319876540  237020773
##   2016  863131455  483476484  854776377  714963568  425795881  563435758
##   2017  590919405  563340460  553586846 1021455470 2488213352  692238396
##   2018 1207983304  761785046 4517278772  433983658 1007348508 1200876459
##   2019  794185672  529250269  459182308  906817815  492846232         NA
##   2020 1539590964 1328068205  652234354 1958673647         NA         NA
##   2021  531409956 1731572516  466121805         NA         NA         NA
##   2022  991472653 1081115862         NA         NA         NA         NA
##   2023  507353781         NA         NA         NA         NA         NA
##       D
## AÑO            6          7         8
##   2015  589360743  667929539 505593779
##   2016 1369044436 1217713737        NA
##   2017 2356358951         NA        NA
##   2018         NA         NA        NA
##   2019         NA         NA        NA
##   2020         NA         NA        NA
##   2021         NA         NA        NA
##   2022         NA         NA        NA
##   2023         NA         NA        NA

Necesitamos el triángulo de forma acumulada

triangulo <- incr2cum(triangulo)
triangulo
##       D
## AÑO            0          1          2          3          4          5
##   2015  751988599 1531741204 3036265373 3735838620 4055715160 4292735933
##   2016  863131455 1346607939 2201384316 2916347884 3342143765 3905579523
##   2017  590919405 1154259865 1707846711 2729302181 5217515533 5909753929
##   2018 1207983304 1969768350 6487047122 6921030780 7928379288 9129255747
##   2019  794185672 1323435941 1782618249 2689436064 3182282296         NA
##   2020 1539590964 2867659169 3519893523 5478567170         NA         NA
##   2021  531409956 2262982472 2729104277         NA         NA         NA
##   2022  991472653 2072588515         NA         NA         NA         NA
##   2023  507353781         NA         NA         NA         NA         NA
##       D
## AÑO            6          7          8
##   2015 4882096676 5550026215 6055619994
##   2016 5274623959 6492337696         NA
##   2017 8266112880         NA         NA
##   2018         NA         NA         NA
##   2019         NA         NA         NA
##   2020         NA         NA         NA
##   2021         NA         NA         NA
##   2022         NA         NA         NA
##   2023         NA         NA         NA
plot(triangulo)

Este es el comportamiento de los montos acumulados desde su año de origen a través de los años de desarrollo, como es acumulado, es natural ver las líneas de forma creciente y la más pronunciada las líneas 3 y 4, debido a el outlier

Propuesta del modelo

Las reservas IBNR (Incurred But Not Reported) representan una estimación de las obligaciones (pagos) de los siniestros que han ocurrido, pero que aún no han sido reportados a la aseguradora.

Es de vital importancia para las aseguradoras tener los fondos suficientes (reservas) para esos pagos futuros. Sobreestimar las reservas podrían causar riesgo de insolvencia, caso contrario podría causar problemas de capital

La experiencia de la aseguradora se basa en el conjunto de datos sobre los siniestros, en este caso de los montos pagados, fechas de siniestros y pagos, para usarlas y crear estimaciones siguiendo modelos matemáticos. Dichos datos se acomodan en un triángulo

Ya hemos construido el triángulo inicial con los datos de la CNSF, ahora falta elegir un método para la zona de estimación (Training data)

Aquí es donde aplicamos los modelos. Primero veamos de qué trata cada uno

Chain Ladder

Este método determinístico se basa en la suposición de que los patrones de desarrollo histórico continuarán en el futuro.

Tenemos el conjunto de datos de la siguiente forma

$$ \[\begin{gathered} C_{1,1}, C_{1,2}, \ldots, C_{1,n} \\ C_{2,1}, \ldots \ldots, C_{2,n-1} \\ \vdots \\ C_{n,1} \end{gathered}\]

$$

Donde \(n\) es el número de periodos de siniestros. \(C_{ij}\) es usado para denotar cantidades incrementales y \(D_{ij}\) para cantidades acumulados, definido por:

\[D_{ij} = \sum_{k=1}^{j}C_{ij}\]

Se estiman los reclamos acumulados recursivamente usando

\[\hat{D}_{i, n-i+2} = D_{i, n-i+1} \hat{\lambda}_{n-i+2}\]

y \(\hat{D}_{i,j}= \hat{D}_{i,j-1} \hat{\lambda}_j\), para \(j=n-i+3, n-i+4, \ldots n\)

Los factores de desarrollo estimados \(\hat{\lambda}_j\) se dan con

\[ \hat{\lambda}_j = \frac{\sum_{i=1}^{n-j+1} D_{ij}}{\sum_{i=1}^{n-j+1} D_{i,j-1}} \]

Se asume:

  • Estabilidad de los patrones de desarrollo: La forma en que los siniestros se desarrollan (pagan) a lo largo del tiempo se mantiene constante o sigue un patrón predecible. Es decir, los factores de desarrollo calculados a partir de los datos históricos se aplicarán de manera consistente a los años de origen no completados.

  • Homogeneidad de los datos: Se asume que los datos utilizados en el triángulo de desarrollo provienen de un conjunto homogéneo de siniestros

  • Independencia de los períodos de desarrollo: el método opera bajo la premisa implícita de que el desarrollo de un año de ocurrencia es independiente del desarrollo de otros años de ocurrencia.

  • Extrapolación lineal: El método asume que el patrón de desarrollo observado en el pasado puede ser extrapolado linealmente para estimar los pagos futuros. Esto se refleja en el uso de factores de desarrollo promedio para proyectar las celdas futuras del triángulo.

El uso de este modelo, está implementado en la función chainladder

Bootstrap Chain-Ladder

El método Chain Ladder anterior puede ser mejorado con bootstraping, es decir, con un remuestreo de los residuales de los siniestros conocidos

Los factores de desarrollo que se calculan desde el método básico anterior son usados para proyectar los montos acumulados del último periodo. Este cálculo produce una media para los reclamos pasados y los residuales son calculados como la diferencia entre su media y el reclamo pasado. Estos residuales son usados para realizar un remuestreo de los montos acumulados y obtener nuevos datos para realizar el proceso nuevamente. Esto se repite cuantas veces lo indiquemos necesario para obtener la distribución empírica de los montos acumulados de los siniestros

Los pasos son:

  1. Aplicar Chain Ladder Clásico: se calculan los factores de desarrollo y las estimaciones de siniestros acumulados

  2. Calcular Residuos de Pearson: Los residuos miden la discrepancia entre los datos observados y los estimados por el modelo. Para siniestros incrementales

\[ residual_{i,j} = \frac{X_{i,j}- \hat{X}_{i,j}}{\hat{\sigma}_j} \] donde

\[ \hat{\sigma_{j}} = \sqrt{\frac{\sum_{r=1}^{n+1-j}(X_{r,j}-\hat{X}_{r,j})}{n-j}} \]

  1. Remuestreo de los residuos (Bootstrap) Remuestreo con reemplazo los residuales para generar nuevos residuales. Se reconstruyen los siniestros incrementales con

\[ X_{i,j}^{\text{pseudo pasado}} = residual_{i,j}^{\text{remuestreo}}\hat{\sigma_j} + \hat{X}_{i,j} \]

  1. Se reconstruye el nuevo triángulo con los nuevos siniestros

  2. Calcular los factores de desarrollo

  3. Repetir y construir la distribución

Se asume que:

  • Los factores de desarrollo son estables, esto significa que el promedio de los factores de desarrollo derivados de datos del pasado continuarán siendo los mismos para periodos futuros

  • Homogeneidad en los datos, no hay cambios en los montos de pago acordados, o que eventos externos cambien los factores de desarrollo a través del tiempo

  • Independencia de los años de accidente: mientras los reclamos dentro de un año de accidente están correlacionados con los años de desarrollo, el método asume independencia entre diferentes años de accidente

  • Independencia y distribución idéntica entre los residuales

  • Media cero en los residuales

  • Varianza constante (Homocedasticidad)

El uso de este modelo, está implementado en la función BootChainLadder

Dentro de esta función hay un parametro process.distr el cual puede tomar dos valores: “gamma” y “od.pois”

  • od.poiss refiere a una distribución Poisson con sobredispersión que modela la frecuencia

  • La ditribución gamma modela la severidad o los pagos incrementales que son típicamente sesgados a la derecha (esto es, muy pocos reclamos de cantidad grande)

En este proyecto haremos uso de la opción “gamma” y el número de replicación R por defecto (999)

Modelo de Mack

A diferencia del Bootstrap, Mack no asume distribuciones específicas para los datos y se basa en propiedades estadísticas analíticas. Extiende el Chain Ladder determinístico incorporando estimaciones de error de predicción (MSE - Mean Squared Error)

Se asume que:

  • Existe independencia entre los años de ocurrencia
  • Hay proporcionalidad entre el valor esperado de las pérdidas incrementales (relación lineal)
  • Factores de desarrollo constantes a través de los periodos de desarollo

El uso de este modelo, está implementado en la función MackChainLadder

Es importante mencionar que la paquetería chainladder, nos ayudará en los cálculos (tanto estimación como proyección), no daremos detalle de todos los pasos, ya que no es el alcance de este proyecto

Ahora que hemos visto teóricamente cada uno de los modelos, procedemos a implementarlos con la base de datos

Los modelos en acción (Resultados)

Chain Ladder

Comencemos con el modelo más simple

resultado_cl <- ChainLadder::chainladder(triangulo)

La función no calcula por sí sola el triángulo proyectado, vamos a realizarlo para poder calcular la reserva IBNR

# número de periodos
n <- 9

# Obteniendo los factores de desarrollo

f <-sapply(1:(n-1), function(i){
  sum(triangulo[c(1:(n-i)), i+1])/sum(triangulo[c(1:(n-i)),i])
})

# Ahora extrapolamos los factores

dev_period <- 1:(n-1)
tail_model <- lm(log(f-1)~dev_period)
co <- coef(tail_model)
tail <- exp(co[1]+c(n:(n))*co[2]) + 1

f_tail  <- prod(tail)


f <- c(f, f_tail)
triangulo_proyectado <- cbind(triangulo, Ult = rep(0, 9))
for(k in 1:n){
  triangulo_proyectado[(n-k+1):n, k+1] <- triangulo_proyectado[(n-k+1):n,k]*f[k]
}

Los montos proyectados son

round(triangulo_proyectado)
##               0          1          2          3          4          5
## 2015  751988599 1531741204 3036265373 3735838620 4055715160 4292735933
## 2016  863131455 1346607939 2201384316 2916347884 3342143765 3905579523
## 2017  590919405 1154259865 1707846711 2729302181 5217515533 5909753929
## 2018 1207983304 1969768350 6487047122 6921030780 7928379288 9129255747
## 2019  794185672 1323435941 1782618249 2689436064 3182282296 3599523694
## 2020 1539590964 2867659169 3519893523 5478567170 6844196846 7741566091
## 2021  531409956 2262982472 2729104277 3564580254 4453114870 5036980066
## 2022  991472653 2072588515 3571350824 4664668453 5827419492 6591475107
## 2023  507353781 1013847824 1746997165 2281815192 2850597949 3224350924
##                6           7           8         Ult
## 2015  4882096676  5550026215  6055619994  6518653802
## 2016  5274623959  6492337696  7083773740  7625423767
## 2017  8266112880  9800755875 10693580702 11511249150
## 2018 11921316387 14134565219 15422189451 16601423802
## 2019  4700389822  5573039448  6080729676  6545683459
## 2020 10109220429 11986045067 13077944381 14077929585
## 2021  6577472979  7798611981  8509046409  9159677751
## 2022  8607389516 10205392134 11135078333 11986505227
## 2023  4210475483  4992170192  5446944656  5863437026

El total estimado de reserva IBNR bajo este método es

ibnr_cl <- sum(triangulo_proyectado[,9] - getLatestCumulative(triangulo))
ibnr_cl
## [1] 39591684987

Modelo Mack

mack <- MackChainLadder(triangulo, est.sigma = "Mack")

# Triangulo proyectado 
mack$FullTriangle
##       dev
## origin          0          1          2          3          4          5
##   2015  751988599 1531741204 3036265373 3735838620 4055715160 4292735933
##   2016  863131455 1346607939 2201384316 2916347884 3342143765 3905579523
##   2017  590919405 1154259865 1707846711 2729302181 5217515533 5909753929
##   2018 1207983304 1969768350 6487047122 6921030780 7928379288 9129255747
##   2019  794185672 1323435941 1782618249 2689436064 3182282296 3599523694
##   2020 1539590964 2867659169 3519893523 5478567170 6844196846 7741566091
##   2021  531409956 2262982472 2729104277 3564580254 4453114870 5036980066
##   2022  991472653 2072588515 3571350824 4664668453 5827419492 6591475107
##   2023  507353781 1013847824 1746997165 2281815192 2850597949 3224350924
##       dev
## origin           6           7           8
##   2015  4882096676  5550026215  6055619994
##   2016  5274623959  6492337696  7083773740
##   2017  8266112880  9800755875 10693580702
##   2018 11921316387 14134565219 15422189451
##   2019  4700389822  5573039448  6080729676
##   2020 10109220429 11986045067 13077944381
##   2021  6577472979  7798611981  8509046409
##   2022  8607389516 10205392134 11135078333
##   2023  4210475483  4992170192  5446944656

Hemos creado el triángulo proyectado, y básicamente es igual a el realizado con el método anterior ya que el método Mack usa los mismos factores de desarrollo que el Chain Ladder tradicional.

La única diferencia radica en que Mack añade el error de estimación

Las propiedades adicionales de este método las podemos visualizar como sigue

plot(mack)

Mack Chain Ladder Results

Son los reclamos estimados para cada periodo de origen (año de accidente) del periodo que estamos analizando (2015 a 2023). Cada barra está compuesta de dos distintos segmentos: “latest” y “Forecast”, en dos respectivos colores

La categoría “Latest” representa los reclamos acumulados observados y reportados hasta la más reciente valuación para cada año de origen. Estos son conocidos, son los valores del triangulo superior que construimos

La categoría “Forecast”, representa los futuros reclamos proyectados para cada año de origen, estimados, obviamente con el modelo Mack. Esta porción de los reclamos últimos corresponden a la reserva IBNR

Las líneas verticales que se extienden en cada una de las barras representan el error estándar (Mack S.E) de cada estimación de los reclamos para el año de origen en específico. Esas barras de error miden la inherente incertidumbre asociada con cada proyección. Estas barras de error, son muy importantes ya que nos indican un posible rango en las que estarán dichos reclamos. Barras más grandes, indican mucha incertidumbre

Como era de esperarse, años mas actuales, menos información disponible que hace una estimación con errores más grandes a comparación de año más pasados. Por ejemplo, a partir del 2023, los errores tienden a incrementarse

Chain ladder developments by origin period

A través de distintas lineas de colores, que representan los años de origen; las lineas sólidas, muestran el desarrollo histórico de los montos acumulados, mientras que las lineas punteadas, la proyección en el futuro

Visualmente, hay un patrón consistente en el monto de reclamos

Residuales estandarizados vs valores estimados

Con este gráfico diagnosticamos qué tan bien los datos se ajustan al modelo, y que tan confiables son las proyecciones

En el eje x se encuentra los valores predichos (reclamos acumulados), mientras que en el eje y están los residuales estandarizados (que son las diferencia entre el valor observado y predicho, escalados por su desviación estandar). La línea roja representa la tendencia general de los residuales

Esto nos ayuda a validar dos suposiciones del modelo Mack:

  1. Se asume una relación lineal entre reclamos sucesivos

  2. La varianza de los residuales estandarizados deben ser aleatoriamente dispersos alrededor del cero

En el gráfico obtenido, la línea roja muestra una ligera tendencia, lo que sugiere una relación no lineal de los reclamos. Este patrón puede indicar un sesgo en las predicciones del modelo; la dispersión de los valores predichos tambien parecen estar muy dispersos, sobre todo para los valores grandes

La relación no lineal tambien sugiere que el modelo Mack está subestimando ciertos rangos de valores de reclamos y sobreestimando otros. Esto es una fuerte indicación de que asumir una simple relación lineal no es apropiado para este conjunto de datos

Residuales estandarizados vs periodo de origen

Esta gráfica nos es de utilidad para identificar los “efectos del año de accidente” o los “efectos del periodo de origen”. Especificamente, validamos la suposición de que los factores de desarrollo son constantes a través de los diferentes años de origen. El patrón que tenemos podría indicar que los reclamos son consistentes a través de los años, aunque también existe una ligera tendencia a el inicio que se va estabilizando en años posteriores

Residuales estandarizados vs periodo del calendario

Este gráfico nos ayuda a identificar los efectos del pago en un año en especifico. Por ejemplo, cuando hay un incremento en la inflación, cambios regulatorios, entre otros eventos económicos. Se muestra nuevamente una ligera tendencia negativa que termina hasta el 2021.

Esto determinana que existen efectos dependiendo el año de pago

Residuales estandarizados vs Periodos de desarrollo

Este es el único gráfico que muestra que los factores de desarollo promedios son generalmente apropiados para las fases de desarrollo de los reclamos

Ahora que hemos validado los supuestos, pasemos a verificar la reserva IBNR total

tot_mack <- summary(mack)$Totals
kable(tot_mack)
Totals
Latest: 43913222356.0000000
Dev: 0.5258759
Ultimate: 83504907342.9573517
IBNR: 39591684986.9573441
Mack S.E.: 11469420468.3163853
CV(IBNR): 0.2896927
  • Latest: representa la suma de todos los reclamos acumulados observados y reportados en todos los años de desarrollo, hasta el más reciente año, es el monto total de los reclamos que son conocidos en el triángulo

  • Dev: Es el factor de desarollo ponderado. En promedio \(52.6\%\) del total de los reclamos han sido observados y reportados. Prácticamente la mitad de los reclamos aún no se han desarrollado

  • Ultimate: Este es el total estimado del último monto de reclamo para todos los periodos de origen combinados. Representa el mejor estimador para el costo de todos los reclamos, incluyendo montos ya observados (latest) y montos futuros (IBNR)

  • IBNR: Es el monto estimado de los reclamos que han ocurrido pero que no han sido reportados y que están aún por desarrollarse

  • Mack S.E: Es el error estándar total para el estimado IBNR. Cuantifica la variabilidad de la reserva IBNR

  • CV(IBNR): Es el coeficiente de variación del IBNR, es calculado como el error estándar (Mack S.E) divido por la reserva IBNR. Esto nos ayuda a expresar el error estándar como un porcentaje del la reserva IBNR estimada

Bootstrap Chain Ladder

Vamos a ocupar la función BootChainLadder que realiza los pasos necesarios para este metodo, como se explicó en la sección de la propuesta de modelos

bcl <- BootChainLadder(triangulo, process.distr = 'gamma')

Veamos más detalles del modelo

plot(bcl)

Histogram of total IBNR

Muestra la distribución de las frecuencias obtenidas por la simulación del IBNR, esto es, el número de simulaciones que resultaron del IBNR estimado encontrarse dentro de un rango específico.

Las pequeñas lineas verticales representan los valores exactos indivuduales de cada simulación del IBNR

ecdf(Total IBNR)

Representa la función de distribución acumulada empírica. Esto es, la proporción de simulaciones del IBNR que son menores o igual a algún valor dado en el eje x. Por ejemplo, si la curva intersecta 0.5 en el eje y, en un valor IBNR aproximado de 4.5e+10 implica que el \(50\%\) de las simulaciones bootstrap generaron un IBNR estimado de 4.5e+10 o menos

La forma en “S” es típica de las funciones acumuladas, es específico de las que son sesgadas. La gran parte de los valores están concentrados en una tendencia central y pocos valores en los extremos, un comportamiento ideal

Estas dos gráficas nos dan una pista de cuál es el intervalo adecuado donde la estimación de la reserva IBNR se puede encontrar

Simulated ultimate claims cost

Se emplean box plots para representar la distribución simulada de los costos de los reclamos para cada origen de periodo. Cada box plot resume la dispersión de este valor derivado de cada simulación. La línea central de cada box plot representa la mediana

Se presenta variabilidad en el transcurso de los años, debido a el cambio de tamaño de las cajas, además de tener valores que se alejan del rango intercuartil en cada periodo

Latest actual incremental claims against simulated values

Se hace una comparación de los valores de la diagonal del triángulo contra la distribución de esos mismos valores pero de las simualaciones. Cada box plot representa la dispersión de los valores de la simulación con los reales

Estas dos últimas gráficas sirven para validar el modelo; principalemente son un indicador de qué tan bien las simulaciones del modelo se asemejan con las más recientes observaciones.

Un modelo se ajustará con precisión cuando los puntos rosas (valores observados) se encuentren dentro del rango intercuartil (es decir, dentro del box plot)

Como observamos, se cumple en la mayoría de las gráficas, por lo tanto, las simulaciones bootstrap parecen ser consistentes con la experiencia real; los únicos casos distintos son el de 2020 y 2021

Posiblemente hay un sesgo en la estimación para esos años, si el punto rosa se posiciona significativamente por encima de la caja, es una notable desviación indicando que el incremento actual de los reclamos observados para esos periodos, fueron más altos que los de la simulación del modelo. Similar para el caso contrario

Esto sugiere que los reclamos actuales fueron mayores, indicando una subestimación del modelo para el 2020. Caso contrario para el año 2021, el cual hay una sobreestimiación (mínima)

La reserva IBNR estimada bajo este modelo es

tot_bcl <- summary(bcl)$Totals
kable(tot_bcl)
Totals
Latest: 43913222356
Mean Ultimate: 85802704562
Mean IBNR: 41889482206
SD IBNR: 15377630770
Total IBNR 75%: 49643621917
Total IBNR 95%: 71785344851

Latest: Total acumulado de los reclamos observados (triangulo superior)

Mean ultimate: Promedio del total de los costos ultimos de todas las simulaciones realizadas (999). Este el el mejor estimador del costo final total de todos los reclamos, tanto pagados como por pagar

Mean ultimate: Este es el promedio de las reservas IBNR simuladas.

SD IBNR: Desviación estándar de las reservas IBNR. Cuantifica la variabilidad de la reserva IBNR estimada

Total IBNR 75%: Basado en las simulaciones, hay un 75% de probabilidad de que la reserva IBNR sea de menor o igual a \(49643621917\)

Total IBNR 95%: Basado en las simulaciones, hay un 95% de probabilidad de que la reserva sea menor o igual a \(71785344851\)

Análisis y comparación

Una vez creados los modelos, y obteniendo los resultados, vamos a realizar una tabla resumen para poder apreciar mejor las diferencias

resultados <- data.frame(Métrica = c('IBNR estimado', 'Error estándar', 'Coef de variación'),
                        "Chain Ladder" = c(number(ibnr_cl, big.mark = ",", accuracy = 0.01),'-','-'),
                        "Mack" = c(number(tot_mack$Totals[4], big.mark = ",", accuracy = 0.01), number(tot_mack$Totals[5], big.mark = ",", accuracy = 0.01),number(tot_mack$Totals[6]*100, big.mark = ",", accuracy = 0.01)),
                        "Bootstrap CL" = c(number(tot_bcl$Totals[3], big.mark = ",", accuracy = 0.01), number(tot_bcl$Totals[4], big.mark = ",", accuracy = 0.01), (tot_bcl$Totals[4]/tot_bcl$Totals[2])*100))

kable(resultados)
Métrica Chain.Ladder Mack Bootstrap.CL
IBNR estimado 39,591,684,986.96 39,591,684,986.96 41,889,482,205.53
Error estándar - 11,469,420,468.32 15,377,630,770.27
Coef de variación - 28.97 17.9220816509898

IBNR Estimado:

  • Chain Ladder y Mack: Los dos modelos nos proveen de la misma estimación, esto es normal ya que el modelo Mack usa los mismos factores de desarrollo para la proyección de los reclamos futuros, sólo agrega otras estadísticas, como el error estándar

  • Bootstrap: Este modelo nos da un estimado ligeramente más grande; esto es significante ya que nos podría sugerir que existen escenarios de gran variación que impacta en los reclamos futuros.

Error estándar:

  • Chain Ladder: No provee error estándar, debido a que es un método determinístico.

  • Mack y bootstrap: Cuantifica una incertidumbre ligeramente similar, siendo más alta la de bootstrap

Coeficiente de variación:

  • Chain Ladder: No aplicable.

  • Mack y Bootstrap: El modelo Mack tiene un coeficiente elevado, implicando que el modelo bootstrap da un estimado IBNR más preciso

Discusión

Respecto a Chain Ladder

Si bien, este modelo es el más simple; sólo nos ayuda a obtener una estimación como un punto, no como algún intervalo donde la reserva pudiera estar. Esto da camino a inexactitud y hasta problemas financieros (de solvencia) si se toma alguna decisión sólo usando este estimador.

Respecto a Mack

Thomas Mack notó que los requerimentos de su modelo son “raramente satisfechos”. Como analizamos en la sección anterior, las suposiciones fueron violadas

  • La relación lineal entre pagos acumulados sucesivos
  • Los factores de desarrollo son constantes a través de los periodos de origen.
  • Los efectos del calendario son existentes

Por otro lado, las gráficas de los residuales sugieren que este modelo podría estar equivocado en la estimación de la reserva para ciertos periodos de origen. De este modo, la ligera tendencia negativa a través de los años implica que el modelo está sobre estimando la reserva para años más recientes

Con esto, hay un impacto negativo en la confianza y exactitud de la reserva estimada por el modelo Mack (misma que la del modelo determinístico Chain Ladder). Además, queda comprobado con la desviación estandar, que existe una desviación grande; no tendríamos un umbral minimo ni máximo para la reserva, lo que podría afectar a la salud financiera de la empresa

Respecto a Bootstrap

Sin duda, este puede ser el modelo más robusto y confiable para el conjunto de datos, sin embargo aún puede mejorar.

Generalmente las simulaciones se comportaron dentro de los rangos de los datos reales, esto da camino a más exactitud y por ende, confianza en el modelo. Aunque existen dos periodos en las que hay una sobre estimación y después una subestimación, no impacta en mucho en la reserva final

Pareciera que el Bootstrap, a través de las simulaciones va “conociendo” el comportamiento de los pagos, y rescata todas esas desviaciones en una reserva ligeramente mayor, pero que es más precisa y menos volátil

Sobre el EDA

Si bien nuestros datos no son puramente reales, debido a la construcción de los periodos de desarrollo, agregando que existen dos outliers en los años 2017 y 2018; nos hace comprender por qué los supuestos del modelo (es especial Mack) fueron diferentes en el coeficiente de variación, pareciera que el modelo Bootstrap logra comprender los datos atípicos y no sesga totalmente los resultados

¿Por qué es importante tener cuidado con la subestimación o sobreestimición?

Si una compañía de seguros subestima sus reservas IBNR, significa que no ha apartado suficiente dinero para cubrir las reclamaciones futuras que eventualmente se reportarán. Esto puede tener consecuencias graves:

  • Pérdidas Financieras: La compañía tendrá que pagar las reclamaciones con fondos no previstos, lo que puede llevar a una disminución de las ganancias, reducción de la estabilidad financiera e incluso la insolvencia o bancarrota.

  • Multas y Sanciones Regulatorias: Los organismos reguladores exigen a las aseguradoras mantener reservas adecuadas para asegurar que puedan cumplir con sus obligaciones.

  • Estados Financieros Inexactos: Los estados financieros de la compañía no reflejarán su verdadera posición financiera, lo que puede inducir a error a inversores y otras partes interesadas.

Por otro lado, si una compañía de seguros sobreestima sus reservas IBNR, significa que ha apartado más dinero del necesario para cubrir los siniestros futuros. Aunque a primera vista podría parecer más conservador, también tiene implicaciones negativas:

  • Mayores Requisitos de Capital: La compañía podría estar obligada a mantener un capital más alto del necesario, lo que inmoviliza recursos que podrían ser invertidos de manera más productiva.

  • Primas Más Altas: Para justificar las reservas excesivas, la compañía podría establecer primas más elevadas para los asegurados. Esto puede hacer que sus productos sean menos atractivos y competitivos en el mercado.

  • Reducción de la Competitividad: Las primas más altas o los mayores requisitos de capital pueden poner a la compañía en desventaja competitiva frente a otras aseguradoras que estiman sus IBNR de manera más precisa.

  • Estados Financieros Inexactos: Al igual que con la subestimación, la sobreestimación distorsiona los estados financieros, inflando los pasivos y subestimando potencialmente las ganancias reales de la empresa.

  • Reconocimiento Prematuro de Ganancias/Dividendos: En algunos casos, una sobreestimación histórica puede llevar a una percepción de que la compañía tiene un mejor desempeño del que realmente tiene, lo que podría resultar en una declaración de dividendos que no reflejan la verdadera rentabilidad.

  • Impacto en la Negociación de Reaseguros: Una sobreestimación de reservas podría afectar los términos de los contratos de reaseguro, ya que la percepción del riesgo de la compañía podría ser diferente a la realidad.

Conclusiones

La principal diferencia entre los modelos de estimación de reservas IBNR radica en su tratamiento de la incertidumbre. El modelo Chain Ladder proporciona únicamente una estimación puntual de la reserva, lo que implica una falta de flexibilidad e invarianza en las estimaciones.

En contraste, los modelos de Mack y Bootstrap son estocásticos. Esto significa que ambos incorporan una medida de incertidumbre, cuantificada a través del error estándar y el coeficiente de variación, una ventaja crucial para la gestión de riesgos.

El modelo Bootstrap generalmente ofrece una medida de incertidumbre más completa y fiable, tal como hemos comprobado con nuestros datos. Este modelo aborda dos áreas críticas en la gestión de riesgos:

  • La incertidumbre en los factores de desarrollo.

  • Las fluctuaciones aleatorias de futuros reclamos.

En comparación, el modelo de Mack se limita a medir la posible incertidumbre derivada de los factores de desarrollo.

La métrica decisiva en nuestra elección de modelo fue el error estándar. El modelo Bootstrap presenta el error estándar más bajo, lo que indica una mayor estabilidad en la predicción. Aunque el Chain Ladder es útil para obtener estimaciones rápidas, su uso actual es inadecuado dadas las normativas vigentes que exigen una comprensión más profunda de la incertidumbre asociada a las reservas.

Es relevante mencionar que, al inicio de este proyecto, consultamos investigaciones clave sobre la comparación de estos métodos (principalmente de Martinek y Jack Li). Es sorprendente cómo las conclusiones de dichos trabajos se alinean con los principales hallazgos de nuestra propia investigación.

Finalmente, identificamos un área de mejora en nuestra base de datos. Si bien la creación de la variable “año de pago” fue necesaria para este proyecto, los modelos se comportaron adecuadamente, demostrando su robustez.

Referencias