Esta solución tiene un propósito estrictamente pedagógico: proporcionar una estructura analítica rigurosa y defendible para resolver proyectos de datos en el ámbito actuarial y de analítica de negocios. Se explica el trasfondo teórico y práctico detrás de cada decisión técnica, identificando los errores más frecuentes cometidos en entregas académicas y profesionales para evitarlos desde la fase de diseño.
En la práctica actuarial, los sesgos en los datos o la falta de reproducibilidad generan impactos financieros directos. La metodología “MY OWN” se justifica sintetizando estos marcos en 5 pilares:
assertr o pointblank).La actividad guía al estudiante en un recorrido progresivo:
Para garantizar un entorno de trabajo aislado y libre de conflictos
de dependencias (dependency hell), se emplea el paquete
renv:
# Inicializar el entorno aislado en el proyecto
renv::init()
# Carga de librerías esenciales según la guía de estilo Tidyverse
library(tidyverse)
library(janitor)
library(assertr)
library(pointblank)
# Guardar la fotografía exacta de las versiones empleadas
renv::snapshot()
Nota de estilo: se utiliza el operador de asignación
<-y nombres de variables ensnake_case, siguiendo la guía de estilo oficial.
Se plantea la estimación de la Frecuencia de Siniestros y la Prima Pura de Riesgo para una cartera de seguros de vehículos. El objetivo es predecir el número esperado de siniestros por unidad de tiempo expuesto al riesgo (\(\text{Exposición} \in (0, 1]\) años) según variables demográficas y del vehículo.
Las fuentes de información en analítica se clasifican según su nivel de estructuración:
.csv o
bases de datos relacionales (readr::read_csv() o
data.table::fread()).readxl::read_excel()) o respuestas JSON desde
APIs REST.Se automatiza la verificación de la calidad de los datos aplicando el
paquete assertr:
# Diagnóstico estricto de calidad de datos
datos_validados <- datos_cartera %>%
verify(nrow(.) > 0) %>% # Garantizar que la tabla no esté vacía
assert(in_set(0, 1), bandera_siniestro) %>% # Validar valores binarios
assert(within_bounds(18, 100), edad_conductor) %>% # Edades válidas
insist(within_n_sds(3), monto_siniestro) # Identificar atípicos a >3 DE
Si alguna condición falla, el script detiene su ejecución inmediatamente para evitar el procesamiento de datos corruptos.
Toda transformación debe registrarse de forma transparente:
janitor::clean_names().duplicated() o
janitor::remove_empty().Se estructura el proyecto de forma modular, dividiendo las etapas en
scripts independientes invocados desde un script principal
(main.R):
/proyecto_actuarial
│── main.R
│── R/
│ ├── 01_carga_datos.R
│ ├── 02_limpieza_validacion.R
│ └── 03_modelado_actuarial.R
└── reporte_final.qmd
En main.R:
source("R/01_carga_datos.R", local = TRUE)
source("R/02_limpieza_validacion.R", local = TRUE)
source("R/03_modelado_actuarial.R", local = TRUE)
Se valida la estética del código utilizando styler y
lintr para detectar errores estáticos y asegurar
consistencia.
Siguiendo los principios de Tidy Data, cada fila debe
representar una única observación y cada columna una variable. Las
operaciones sobre la cartera se vectorizan mediante dplyr o
la familia apply(), evitando bucles tradicionales
for o while, ineficientes en grandes
carteras.
Se definen formalmente los indicadores clave:
Tasa de Frecuencia (\(F\)):
\[\text{Frecuencia} = \frac{\sum \text{Número de Siniestros}}{\sum \text{Exposición}}\]
Severidad Promedio (\(S\)):
\[\text{Severidad} = \frac{\sum \text{Costo Total de Siniestros}}{\sum \text{Número de Siniestros}}\]
Prima Pura de Riesgo (\(P\)):
\[P = F \times S\]
La visualización se construye mediante la gramática de gráficos de
ggplot2, agregando capas estéticas y geométricas:
ggplot(datos_cartera, aes(x = edad_conductor, y = num_siniestros / exposicion)) +
geom_point(alpha = 0.3, color = "darkblue") +
geom_smooth(method = "glm", method.args = list(family = "poisson"), color = "red") +
labs(
title = "Frecuencia de Siniestros por Edad del Conductor",
x = "Edad del Conductor",
y = "Frecuencia Anualizada"
) +
theme_minimal()
ks.test()) o residuos de Pearson.El modelo desarrollado bajo la metodología “MY OWN” proporciona una estructura transparente y reproducible para la tarificación de riesgos. La automatización del diagnóstico de datos evita pérdidas por mala clasificación, garantizando que las primas puras calculadas cubran el riesgo esperado y cumplan con los estándares actuariales exigidos por la dirección.
Para la revisión conjunta con los compañeros, se expone la comparativa directa entre código deficiente y la corrección bajo la metodología.
# Mal uso de asignaciones, bucles ineficientes y conversión directa de factores
data = read.csv("datos.csv")
for (i in 1:nrow(data)) {
if (data$edad[i] < 25) { data$riesgo[i] = "Alto" }
}
data$monto = as.numeric(data$monto_factor) # Corrompe los valores numéricos
# Operaciones vectorizadas, asignación estándar y conversión segura
datos_limpios <- readr::read_csv("datos.csv") %>%
janitor::clean_names() %>%
mutate(
monto = as.numeric(as.character(monto_factor)), # Conversión segura a través de carácter
riesgo = if_else(edad < 25, "Alto", "Estándar")
)