El reaseguro constituye un mecanismo esencial para la estabilidad y solvencia del sector asegurador, al permitir que las compañías de seguros transfieran una parte de los riesgos asumidos a entidades especializadas, generalmente ubicadas en el extranjero, a cambio de una prima. Esta práctica, mejor conocida como reaseguro cedido, posibilita a las aseguradoras locales el poder diversificar su exposición, poder proteger su capital frente a siniestros catastróficos y poder cumplir con los requerimientos regulatorios de solvencia.
Bajo el contexto mexicano, la Comisión Nacional de Seguros y Fianzas (CNSF) reporta que el reaseguro cedido al extranjero representa un flujo financiero significativo, concentrado principalmente en países como Alemania, Estados Unidos, Suiza, Reino Unido y diversos centros de reaseguro extraterritoriales.
Para ello, la transferencia de riesgos no solo elimina la exposición subyacente; sino, la desplaza hacia los reaseguradores internacionales, los cuales deben gestionar carteras agregadas de siniestros provenientes de múltiples cedentes y jurisdicciones. Es por eso que la evaluación de la exposición al riesgo de estas carteras de reaseguro cedido constituye un problema de gran relevancia tanto para las entidades cedentes como para los propios reaseguradores y los organismos supervisores.
Desde la perspectiva actuarial, la Teoría del Riesgo proporciona el marco matemático idóneo para modelar el comportamiento estocástico de los flujos de primas y siniestros que caracterizan la operación de una entidad aseguradora.
En particular, mediante el modelo clásico de Cramér-Lundberg, propuesto inicialmente por Filip Lundberg en 1903 y formalizado posteriormente por Harald Cramér en 1930, este modelo describe “la evolución del superávit (o capital) de una compañía de seguros como un proceso estocástico en tiempo continuo, en el que las primas se recaudan a una tasa constante y las reclamaciones ocurren de acuerdo con un proceso de Poisson compuesto”.
Este modelo nos permite poder estimar indicadores fundamentales como el coeficiente de ajuste de Lundberg y la probabilidad de ruina, la cual esta definida como la probabilidad de que el superávit de la aseguradora alcance valores negativos en un horizonte temporal finito o infinito.
El presente proyecto aplica el modelo de Cramér-Lundberg al análisis del reaseguro cedido al extranjero por país, utilizando una base de datos que comprende las operaciones de reaseguro cedido del total de las operaciones por países durante el período 2015-2024, desagregada por ramo de seguro.
La estructura del documento es la siguiente: en la Sección 3 se presenta una revisión de la literatura relevante sobre Teoría del Riesgo, modelos de ruina y análisis de reaseguro cedido. La Sección 4 contiene el análisis exploratorio de datos (EDA), incluyendo la descripción de variables, estadísticas descriptivas, visualizaciones y tratamiento de valores atípicos y datos faltantes. La Sección 5 describe la metodología y herramientas utilizadas. La Sección 6 detalla la propuesta del modelo, su justificación, supuestos, parámetros y plan de simulaciones. Las Secciones 7 a 9 presentan los resultados, discusión y conclusiones preliminares, respectivamente.
El presente proyecto tiene como objetivo el poder evaluar la exposición al riesgo de las operaciones de reaseguro cedido al extranjero por país, mediante la aplicación del modelo clásico de Cramér-Lundberg, a partir de los datos estadísticos oficiales del sector asegurador mexicano correspondientes al período 2015-2024.
Ademas podemos definir los siguientes objetivos especificos:
Realizar un análisis exploratorio de datos (EDA) que caracterice la estructura de primas, siniestros y siniestralidad por país y ramo de operación, identificando patrones, valores atípicos y datos faltantes.
Estimar los parámetros fundamentales del modelo de Cramér-Lundberg (tasa de prima, intensidad de reclamaciones y distribución de montos) para los principales países receptores de reaseguro cedido.
Calcular la probabilidad de ruina y el coeficiente de ajuste de Lundberg para cada cartera-país, como medida del riesgo de insolvencia del reasegurador.
Proponer un plan de simulaciones Monte Carlo que permita, en una segunda fase del proyecto, contrastar los resultados teóricos con escenarios estocásticos de siniestralidad
El estudio se limita al análisis de los datos disponibles en la base de datos de Reaseguro Cedido al Extranjero del Total de las Operaciones por Países, abarcando el decenio 2015-2024.
El análisis exploratorio que se presenta en esta sección se construye sobre una base de datos ampliada respecto a la que se considero inicialmente. Esto debido a que al realizar parte de las simulaciones iniciales, se identificó la necesidad de incorporar dos nuevas fuentes de información adicionales que su tarea es permitir superar las limitaciones de trabajar exclusivamente con las cifras de reaseguro cedido.
La primera de ellas es el archivo de Reaseguro Tomado del Extranjero (Reaseguro_tomado_extranjero_paises.csv), la cual registra las primas y siniestros que las instituciones mexicanas aceptan a su vez de otros mercados. La segunda corresponde a las Estadísticas de Frecuencia y Severidad del seguro directo mexicano contenidas en la base de la (Informacion_estadistica_FES.csv).
La inclusión de estas nuevas fuentes de datos responde a dos necesidades concretas del proyecto.
En primer lugar, la exposición real de que una cartera de reaseguro no está determinada únicamente por los riesgos que se ceden al extranjero, sino tambien por la diferencia entre lo cedido y lo tomado, es decir, por la posición neta.
El limitar el análisis unicamente a los flujos de salida sin considerar los de entrada conduciría a una sobreestimación del riesgo, ya que se ignorarían los ingresos y la capacidad de absorción de siniestros que provienen del reaseguro aceptado. Por ello, para cada país y año se construyen las variables netas:
\(Ingreso \; Neto = Ingreso \; Cedido − Ingreso \;Tomado\)
\(Egreso \; Neto = Egreso \; Cedido − Egreso \; Tomado\)
Este procedimiento permitira alinear el trabajo con las prácticas recomendadas por los estándares internacionales de medición de exposición neta (Solvencia II, IAIS, 2019) y permite que los estadísticos descriptivos, los gráficos y, posteriormente, los parámetros del modelo de ruina, reflejen la realidad económica de cada jurisdicción.
En segundo término, la estimación de la frecuencia anual de siniestros \((λ)\) el cual es el parámetro central del modelo exacto de Cramér‑Lundberg, que se obtenía originalmente contando los años con siniestros positivos en la base neta, esta presentaba una elevada incertidumbre debido al reducido número de observaciones temporales en el perido (2015‑2024).
Para mitigar esta limitación se recurrió a la base de la Estadísticas de Frecuencia y Severidad, la cual contiene las frecuencias de siniestralidad observadas directamente en los ramos del seguro directo mexicano. A partir de esta base podremos calcular una frecuencia esperada para cada país como una media ponderada de las frecuencias por operación - ramo, utilizando como ponderación las primas netas correspondientes:
\[ \lambda_{est} = \dfrac{\sum _{ramos}Frecuencia_{ramo} \cdot Primas_{pais,ramo}}{\sum _{ramos}Primas_{pais,ramo}} \]
Este nuevo enfoque tendra tres ventajas principales:
Estabilidad: Debido a que las frecuencias del FES se calculan sobre millones de pólizas y no sobre diez observaciones anuales.
Coherencia: Ya que vincula el riesgo de ruina con la siniestralidad real del mercado directo mexicano
Reducción de la incertidumbre: Esto para evitar que países con pocos siniestros históricos reciban una estimación de \(\lambda\) igual a cero, lo que anularía artificialmente su probabilidad de ruina.
Esta estrategia es congruente con las directrices de la Nota Técnica de Reaseguro emitida por la CNSF (2023), que recomienda sustentar los parámetros en información estadística del mercado cuando los datos propios son insuficientes.
Lo primero que tenemos que hacer es cargar los paquetes que vamos a utilizar para el análisis. En este caso vamos a usar:
## Cargando paquete requerido: pacman
pacman::p_load(
tidyverse, lubridate, skimr, corrplot, GGally, psych, moments, MASS,
FactoMineR, factoextra, broom, scales, plotly, treemapify, outliers,
gmodels, Hmisc, ggthemes, hexbin, ggpubr, ggridges, RColorBrewer,
ADGofTest, fitdistrplus, goftest, gridExtra, statmod, patchwork, gt,
patchwork, here
)
options(scipen = 999)los cuales mas adelante en el CAPITULO 5: Metodologia, explicaremos mejor que uso tiene cada libreria.
Asi mismo definimos la ruta donde se encuentran nuestras bases de datos y ademas una ruta donde se guardaran nuestras imagenes y algunas tablas importantes que estaremos generando
# Directorio de trabajo
data_path <- here("Base de datos")
# Guardar imagenes
ruta <- here("1. COMPUTO CIENTIFICO", "Graficas 4")
dir.create(ruta, recursive = TRUE, showWarnings = FALSE)De la pagina oficial de la COMISION NACIONAL DE SEGUROS Y FIANZAS (CNSF) descargamos las siguientes bases de datos, y realizamos su carga
base_RC <- read.csv(
file.path(data_path, "Reaseguro Cedido al Extranjero del Total de las Operaciones por Paises.csv"),
header = TRUE,
stringsAsFactors = FALSE,
fileEncoding = "UTF-8"
)base_RT <- read.csv(
file.path(data_path, "Reaseguro_tomado_extranjero_paises.csv"),
header = TRUE,
stringsAsFactors = FALSE
)base_FS <- read.csv(
file.path(data_path, "Informacion_estadistica.csv"),
header = TRUE,
stringsAsFactors = FALSE
)La base de datos de Reaseguro_Cedido_al_Extranjero_del_Total_de_las_Operaciones_por_Paises, tenemos
base1 <- base_RC %>%
mutate(
ANO = as.integer(ANO),
PAISES = as.factor(PAISES),
OPERACION_RAMO = as.factor(OPERACION_RAMO)
)
# Variables derivadas del cedido (se conservan para referencia)
base1 <- base1 %>%
mutate(
INGRESO_NETO_CED = PRIMAS - COMISIONES - PARTICIPACION_UTILIDADES -
COSTO_COBERTURA_REASEGURO_NO_PROPORCIONAL,
EGRESO_NETO_CED = SINIESTROS_VENCIMIENTOS + GASTOS_AJUSTE_RECUPERADOS -
SINIESTROS_RECUPERADOS_COBERTURA_REASEGURO_NO_PROPORCIONAL -
PARTICIPACION_SALVAMENTOS - INTERESES_RESERVAS_RETENIDAS,
GANANCIA_NETA_CED = INGRESO_NETO_CED - EGRESO_NETO_CED,
LOSS_RATIO = if_else(PRIMAS > 0, SINIESTROS_VENCIMIENTOS / PRIMAS, NA_real_)
)
glimpse(base1)## Rows: 3,866
## Columns: 16
## $ ANO <int> 2015, 2015,…
## $ PAISES <fct> Alemania, B…
## $ OPERACION_RAMO <fct> Accidentes …
## $ PRIMAS <dbl> 60274706, -…
## $ COMISIONES <dbl> 16084279, 2…
## $ PARTICIPACION_UTILIDADES <int> -421197, 0,…
## $ SINIESTROS_VENCIMIENTOS <dbl> 3073198, 10…
## $ GASTOS_AJUSTE_RECUPERADOS <int> 322, 125175…
## $ SINIESTROS_RECUPERADOS_COBERTURA_REASEGURO_NO_PROPORCIONAL <dbl> 0, 0, 0, 0,…
## $ PARTICIPACION_SALVAMENTOS <int> 0, -124, 0,…
## $ INTERESES_RESERVAS_RETENIDAS <int> 5961, 0, 0,…
## $ COSTO_COBERTURA_REASEGURO_NO_PROPORCIONAL <int> 4296318, 14…
## $ INGRESO_NETO_CED <dbl> 40315306, -…
## $ EGRESO_NETO_CED <dbl> 3067559, 11…
## $ GANANCIA_NETA_CED <dbl> 37247747, -…
## $ LOSS_RATIO <dbl> 0.05098653,…
Tenemos un total de 3 866 registros y 16 variables, donde tenemos un total de 14 variables numericas, donde 8 son tipo (dbl) y 6 tipo (int), mientras el resto de las variables son caracteres (fct).
Nuestra segunda base de datos Reaseguro_tomado_extranjero_paises, tenemos
base2 <- base_RT %>%
mutate(
ANO = as.integer(anio),
PAISES = as.factor(paises),
OPERACION_RAMO = as.factor(operacion_ramo)
) %>%
select(-anio, -paises, -operacion_ramo) %>%
mutate(
INGRESO_NETO_TOM = primas - comision_corretaje - participacion_utilidades,
EGRESO_NETO_TOM = siniestros_vencimientos + gastos_ajuste -
salvamentos - intereses_reserva_retenida
) %>%
rename(PRIMAS_TOM = primas,
SINIESTROS_TOM = siniestros_vencimientos)
# Agregado anual por país (tomado)
RT_ag <- base2 %>%
group_by(ANO, PAISES) %>%
summarise(
Ingreso_Tom = sum(INGRESO_NETO_TOM, na.rm = TRUE),
Egreso_Tom = sum(EGRESO_NETO_TOM, na.rm = TRUE),
.groups = "drop"
)
glimpse(base2)## Rows: 3,638
## Columns: 12
## $ PRIMAS_TOM <int> 764412, 87176, 264721, 30524, 102574, 40369…
## $ salvamentos <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ intereses_reserva_retenida <int> 0, 0, 0, 0, 0, 0, 0, 967, 0, 0, 663, 0, 0, …
## $ comision_corretaje <int> 321185, 28308, -26472, 3059, 32007, 518001,…
## $ participacion_utilidades <int> 0, 0, 0, 0, 0, 127867, 0, 0, 323651, 869, 2…
## $ SINIESTROS_TOM <dbl> 887000, 36956, 0, 0, 2941645, 204407, 0, 25…
## $ gastos_ajuste <int> 0, 0, -960466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ ANO <int> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2…
## $ PAISES <fct> Argentina, Bahamas, Bermudas, Bolivia, Core…
## $ OPERACION_RAMO <fct> Accidentes Personales, Accidentes Personale…
## $ INGRESO_NETO_TOM <int> 443227, 58868, 291193, 27465, 70567, 339111…
## $ EGRESO_NETO_TOM <dbl> 887000, 36956, -960466, 0, 2941645, 204407,…
Tenemos un total de 3 638 registros y 12 variables, donde tenemos un total de 10 variables numericas, donde 2 son tipo (dbl) y 8 tipo (int), mientras el resto de las variables son caracteres (fct).
Finalmente de nuestra base de Informacion_estadistica, tenemos las siguientes observaciones
base_FS <- base_FS %>%
mutate(across(
c(numero_polizas_vigor,
numero_certificados_vigor,
suma_asegurada,
prima_emitida,
numero_siniestros,
costo_siniestros),
~ as.numeric(str_remove_all(., ","))
))
base_FS_pol <- base_FS %>%
filter(tipo == "Polizas")
# Parámetros de frecuencia y severidad por ramo (con filtros de estabilidad)
base3 <- base_FS_pol %>%
mutate(
frecuencia = numero_siniestros / numero_polizas_vigor,
severidad_media = if_else(numero_siniestros > 50,
costo_siniestros / numero_siniestros,
NA_real_)
) %>%
filter(numero_polizas_vigor > 1000) %>%
select(ANO = anio, OPERACION_RAMO = ramo_tipo_riesgo,
frecuencia, severidad_media)
glimpse(base3)## Rows: 35
## Columns: 4
## $ ANO <int> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, …
## $ OPERACION_RAMO <chr> "Accidentes Personales", "Agricola y de Animales", "Au…
## $ frecuencia <dbl> 0.02034019, 1.39050597, 0.30748877, 0.04351241, 1.6911…
## $ severidad_media <dbl> 4992.034, 68135.668, 14002.652, 11739473.415, 361950.2…
Tenemos solo 35 filas correspondientes a frecuencias y severidades por ramo, filtradas con criterios de estabilidad (pólizas, $>$1 000 pólizas en vigor, $>$50 siniestros para severidad) y 4 variables, donde tenemos un total de 3 variables numericas, donde 2 son tipo (dbl) y 1 tipo (int), mientras el resto de las variables son caracteres (chr).
Ademas de la fuente de datos correspondiente al reaseguro cedido y tomado realizamos el calculo de posición neta, para creal nuestra fuente de datos final agregamos el reaseguro cedido y el reaseguro tomado tomando como variables madre a la variable pais y año.
A su vez las variables netas correspondientes a primas y siniestros, se calularon mediante \[ Prima=Ingreso_Ced - Ingreso_Tom Siniestro=Egreso_ced - Egreso_Tom \] Realizar estas incorporaciones de variables correspondientes a México y el resto del mundo nos permiten ver el efecto de la retrocesión
# Agregado del cedido por país y año
cedido_ag <- base1 %>%
group_by(ANO, PAISES) %>%
summarise(
Ingreso_Ced = sum(INGRESO_NETO_CED, na.rm = TRUE),
Egreso_Ced = sum(EGRESO_NETO_CED, na.rm = TRUE),
.groups = "drop"
)
# Unión con tomado → posición neta
base_neta <- cedido_ag %>%
left_join(RT_ag, by = c("ANO", "PAISES")) %>%
mutate(
Ingreso_Tom = replace_na(Ingreso_Tom, 0),
Egreso_Tom = replace_na(Egreso_Tom, 0),
INGRESO_NETO = Ingreso_Ced - Ingreso_Tom,
EGRESO_NETO = Egreso_Ced - Egreso_Tom,
GANANCIA_NETA = INGRESO_NETO - EGRESO_NETO
)
# Unir los valores netos a cada registro original
base_neta_detallada <- base1 %>%
left_join(base_neta %>% select(ANO,
PAISES, INGRESO_NETO,
EGRESO_NETO,
GANANCIA_NETA),
by = c("ANO", "PAISES"))
# A partir de aquí 'base' y 'base_valida' usan las variables netas
base1 <- base_neta_detalladaEn esta parte realizamos filtros de datos donde se requerian que fueran mayores a 0 y no existieran valores negativos, debido a que en base_neta_detallada, tenemos valores igual a 0 o negativos, esto podemos decir que son debido a posibles ajustes contables o financieros de quien realizo el levantamiento de datos.
base_valida <- base1 %>%
filter(PRIMAS > 0, SINIESTROS_VENCIMIENTOS >= 0,
INGRESO_NETO > 0,
EGRESO_NETO >= 0,
is.finite(GANANCIA_NETA))
cat("\n========== VALORES FALTANTES ==========\n")##
## ========== VALORES FALTANTES ==========
faltantes <- colSums(is.na(base1))
tabla_falt <- data.frame(Variable = names(faltantes),
Faltantes = faltantes,
Porcentaje = round(100 * faltantes / nrow(base1), 2))
print(tabla_falt[order(-tabla_falt$Faltantes), ])## Variable
## LOSS_RATIO LOSS_RATIO
## ANO ANO
## PAISES PAISES
## OPERACION_RAMO OPERACION_RAMO
## PRIMAS PRIMAS
## COMISIONES COMISIONES
## PARTICIPACION_UTILIDADES PARTICIPACION_UTILIDADES
## SINIESTROS_VENCIMIENTOS SINIESTROS_VENCIMIENTOS
## GASTOS_AJUSTE_RECUPERADOS GASTOS_AJUSTE_RECUPERADOS
## SINIESTROS_RECUPERADOS_COBERTURA_REASEGURO_NO_PROPORCIONAL SINIESTROS_RECUPERADOS_COBERTURA_REASEGURO_NO_PROPORCIONAL
## PARTICIPACION_SALVAMENTOS PARTICIPACION_SALVAMENTOS
## INTERESES_RESERVAS_RETENIDAS INTERESES_RESERVAS_RETENIDAS
## COSTO_COBERTURA_REASEGURO_NO_PROPORCIONAL COSTO_COBERTURA_REASEGURO_NO_PROPORCIONAL
## INGRESO_NETO_CED INGRESO_NETO_CED
## EGRESO_NETO_CED EGRESO_NETO_CED
## GANANCIA_NETA_CED GANANCIA_NETA_CED
## INGRESO_NETO INGRESO_NETO
## EGRESO_NETO EGRESO_NETO
## GANANCIA_NETA GANANCIA_NETA
## Faltantes Porcentaje
## LOSS_RATIO 611 15.8
## ANO 0 0.0
## PAISES 0 0.0
## OPERACION_RAMO 0 0.0
## PRIMAS 0 0.0
## COMISIONES 0 0.0
## PARTICIPACION_UTILIDADES 0 0.0
## SINIESTROS_VENCIMIENTOS 0 0.0
## GASTOS_AJUSTE_RECUPERADOS 0 0.0
## SINIESTROS_RECUPERADOS_COBERTURA_REASEGURO_NO_PROPORCIONAL 0 0.0
## PARTICIPACION_SALVAMENTOS 0 0.0
## INTERESES_RESERVAS_RETENIDAS 0 0.0
## COSTO_COBERTURA_REASEGURO_NO_PROPORCIONAL 0 0.0
## INGRESO_NETO_CED 0 0.0
## EGRESO_NETO_CED 0 0.0
## GANANCIA_NETA_CED 0 0.0
## INGRESO_NETO 0 0.0
## EGRESO_NETO 0 0.0
## GANANCIA_NETA 0 0.0
Para esto aplicamos los siguientes criterios:
Primas > 0, Siniestros ≥ 0, Ingreso Neto > 0, Egreso Neto ≥ 0, Ganancia Neta finita.
La muestra se redujo de 3 866 a 2 124 observaciones (45% de reducción).
Se eliminaron registros con primas nulas/negativas, siniestros negativos (recuperaciones netas excesivas) y combinaciones que generaban ingreso neto no positivo.
Valores faltantes (principalmente LOSS_RATIO, 15.8% de los originales) se imputaron con 0 (práctica habitual en seguros para siniestralidad nula).
# Imputar NA restantes con 0 (práctica común en seguros)
base_valida[is.na(base_valida)] <- 0
# Variables en millones para visualización
base_valida <- base_valida %>%
mutate(
PRIMAS_M = PRIMAS / 1e6,
SINIESTROS_VENCIMIENTOS_M = SINIESTROS_VENCIMIENTOS / 1e6,
INGRESO_NETO_M = INGRESO_NETO / 1e6,
EGRESO_NETO_M = EGRESO_NETO / 1e6,
GANANCIA_NETA_M = GANANCIA_NETA / 1e6
)
cat("\n========== RESUMEN VARIABLES NUMÉRICAS ==========\n")##
## ========== RESUMEN VARIABLES NUMÉRICAS ==========
base_valida %>%
select(PRIMAS, COMISIONES, SINIESTROS_VENCIMIENTOS,
INGRESO_NETO, EGRESO_NETO, GANANCIA_NETA, LOSS_RATIO) %>%
skim()| Name | Piped data |
| Number of rows | 2124 |
| Number of columns | 7 |
| _______________________ | |
| Column type frequency: | |
| numeric | 7 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| PRIMAS | 0 | 1 | 386459922.38 | 819788802.74 | 10 | 3793127.50 | 49949523.50 | 339289566.75 | 6884061378.0 | ▇▁▁▁▁ |
| COMISIONES | 0 | 1 | 60798501.84 | 157340579.64 | -112262841 | 267886.75 | 6344854.00 | 58168566.50 | 2376609141.0 | ▇▁▁▁▁ |
| SINIESTROS_VENCIMIENTOS | 0 | 1 | 208852897.03 | 647332944.38 | 0 | 193972.00 | 15556951.00 | 155368061.25 | 13441795911.0 | ▇▁▁▁▁ |
| INGRESO_NETO | 0 | 1 | 4151486204.73 | 5900884339.13 | 180 | 154151215.00 | 909401179.00 | 6730780078.00 | 25271569474.0 | ▇▂▁▁▁ |
| EGRESO_NETO | 0 | 1 | 2432202751.53 | 3476856169.81 | 0 | 63037309.00 | 589109963.00 | 3865953485.00 | 17895890876.0 | ▇▂▁▁▁ |
| GANANCIA_NETA | 0 | 1 | 1719283453.20 | 3666093586.56 | -9053449242 | 2328533.00 | 203886715.00 | 2100725198.00 | 17215348906.0 | ▁▇▂▁▁ |
| LOSS_RATIO | 0 | 1 | 8.72 | 220.17 | 0 | 0.03 | 0.28 | 0.68 | 9459.4 | ▇▁▁▁▁ |
# Tabla numérica resumida
resumen_num <- base_valida %>%
select(PRIMAS, COMISIONES, SINIESTROS_VENCIMIENTOS,
INGRESO_NETO, EGRESO_NETO, GANANCIA_NETA, LOSS_RATIO) %>%
pivot_longer(everything(),
names_to = "Variable",
values_to = "Valor") %>%
group_by(Variable) %>%
summarise(
n = n(),
Media = mean(Valor, na.rm = TRUE),
Mediana = median(Valor, na.rm = TRUE),
Desv_Std = sd(Valor, na.rm = TRUE),
Min = min(Valor, na.rm = TRUE),
Max = max(Valor, na.rm = TRUE)
) %>%
mutate(across(where(is.numeric), ~ round(., 2)))
print(resumen_num)## # A tibble: 7 × 7
## Variable n Media Mediana Desv_Std Min Max
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 COMISIONES 2124 60798502. 6.34e+6 1.57e8 -1.12e8 2.38e 9
## 2 EGRESO_NETO 2124 2432202752. 5.89e+8 3.48e9 0 1.79e10
## 3 GANANCIA_NETA 2124 1719283453. 2.04e+8 3.67e9 -9.05e9 1.72e10
## 4 INGRESO_NETO 2124 4151486205. 9.09e+8 5.90e9 1.8 e2 2.53e10
## 5 LOSS_RATIO 2124 8.72 2.8 e-1 2.20e2 0 9.46e 3
## 6 PRIMAS 2124 386459922. 4.99e+7 8.20e8 1 e1 6.88e 9
## 7 SINIESTROS_VENCIMIENTOS 2124 208852897. 1.56e+7 6.47e8 0 1.34e10
Ademas, se crearon versiones escaladas para mejorar la legibilidad de gráficos y resúmenes, donde se trabajaron valores en millones de pesos en lugar de tomar los valores originales.
##
## Observaciones originales (cedido): 3866
##
## Observaciones después de neteo y filtro: 2124