Una compañia asegurada Francesa ha recolectado la información estadistica de 30.000 pólizas correspondientes a lineas personales de automóvil durante el año 2004. La necesidad de la compañia con los datos es poder analizar los factores de riesgo que aumentan la probalidad de ocurrencia de un siniestro y a su vez, desarrollar un modelo de aprendizaje supervisado (clasificación) que pueda predecir si un vehículo tendrá un siniestro.
Los datos se extrajeron de la libreria CASdatasets de la asociación CAS, la cual alberga todos los conjuntos de datos utilizados en el libro Computational Actuarial Science with R. Para el procesamiento de los datos se hará uso pricipalmente del conjunto de librerias Tidyverse y para el desarrollo de modelos se utilizara el ecosistema de paquetes que ofrece Tidymodels.
En total hay 19 columnas en los datos, las cuáles se describen a continuación:
Visión general del dataset:
| Name | select(.data = freMPL1, -… |
| Number of rows | 30595 |
| Number of columns | 19 |
| _______________________ | |
| Column type frequency: | |
| factor | 12 |
| numeric | 7 |
| ________________________ | |
| Group variables | None |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| VehAge | 0 | 1 | FALSE | 9 | 2: 4902, 1: 4723, 0: 4722, 3: 3856 |
| Gender | 0 | 1 | FALSE | 2 | Mal: 19025, Fem: 11570 |
| MariStat | 0 | 1 | FALSE | 2 | Oth: 23171, Alo: 7424 |
| SocioCateg | 0 | 1 | FALSE | 37 | CSP: 17608, CSP: 3882, CSP: 2661, CSP: 1827 |
| VehUsage | 0 | 1 | FALSE | 4 | Pri: 13522, Pri: 9956, Pro: 6523, Pro: 594 |
| VehBody | 0 | 1 | FALSE | 9 | sed: 20140, spo: 1858, oth: 1679, sta: 1629 |
| VehPrice | 0 | 1 | FALSE | 26 | K: 2976, J: 2829, L: 2529, F: 2417 |
| VehEngine | 0 | 1 | FALSE | 6 | inj: 20821, dir: 7037, inj: 2213, car: 516 |
| VehEnergy | 0 | 1 | FALSE | 4 | reg: 21149, die: 9438, ele: 6, GPL: 2 |
| VehMaxSpeed | 0 | 1 | FALSE | 10 | 160: 5297, 170: 4830, 180: 4677, 150: 3863 |
| VehClass | 0 | 1 | FALSE | 6 | B: 9567, M1: 7745, H: 4894, M2: 4639 |
| Garage | 0 | 1 | FALSE | 3 | Non: 20011, Col: 6623, Pri: 3961 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 |
|---|---|---|---|---|---|---|---|---|---|
| Exposure | 0 | 1 | 0.45 | 0.29 | 0 | 0.19 | 0.42 | 0.67 | 1 |
| LicAge | 0 | 1 | 300.97 | 162.86 | 0 | 163.00 | 282.00 | 425.00 | 940 |
| DrivAge | 0 | 1 | 46.25 | 14.92 | 18 | 34.00 | 45.00 | 57.00 | 97 |
| HasKmLimit | 0 | 1 | 0.11 | 0.31 | 0 | 0.00 | 0.00 | 0.00 | 1 |
| BonusMalus | 0 | 1 | 64.27 | 18.34 | 50 | 50.00 | 54.00 | 76.00 | 272 |
| RiskVar | 0 | 1 | 13.19 | 4.69 | 1 | 10.00 | 15.00 | 16.00 | 20 |
| ClaimInd | 0 | 1 | 0.11 | 0.31 | 0 | 0.00 | 0.00 | 0.00 | 1 |
No existen valores faltantes en el dataset y se puede observar que las variables HasKmLimit y BonusMalus son del tipo numérico, sin embargo, por su descripción conviene convertirlas a variables de tipo factor o categóricas. A continuación, se procede a arreglar dichas variables:
Se puede observar que las variables SocioCateg y VehPrice tienen una considerable cantidad de valores únicos, por lo que visualizarlas y analizarlas será un desafío.
Se realiza el análisis exploratorio en dos partes, una enfocada en visualizar la distribución porcentual de las pólizas que han tenido siniestro y las que no, a través de las distintas variables categóricas. La otra parte se enfocará en analizar las variables numéricas, realizando un análisis de correlación y distribución de las variables, segmentando por la variable respuesta (ocurrencia o no de un siniestro).
Se excluyen las variables SocioCateg y VehPrice.
Para este conjunto de datos en particular, es evidente que las características del vehículo y su uso son más relevantes que la información del conductor. Variables como la edad del vehículo, su velocidad máxima, el uso del vehículo y su clase son indicativas para determinar si un vehículo tiene una mayor probabilidad de presentar un reclamo o no. Además, se observa que los vehículos que no son guardados en un garaje público o privado tienden a tener más siniestros. Estos hallazgos sugieren la importancia de considerar tanto las características del vehículo como las condiciones de almacenamiento al evaluar el riesgo de siniestros.
Las variables SocioCateg y VehPrice presentan una amplia gama de opciones posibles. Para analizarlas de manera más eficiente, se puede utilizar un método de agrupación conocido como k-medias. Este método de clustering es especialmente útil cuando se desea determinar grupos relacionados en los datos. El algoritmo de k-medias asigna cada observación a un cluster basado en su similitud con los centroides de los clusters existentes. Esta técnica permite identificar patrones y relaciones entre las variables de manera sistemática y automatizada. Otra opción más sencilla sería agrupar las categorías menos frecuentes en los datos bajo una categoría llamada otros. A continuación se procede con la segunda opción:
Se observa que algunas categorías sociales tienen una tendencia a presentar más reclamos que otras. Del mismo modo, parece haber un patrón en el precio del vehículo. Esto sugiere que tanto el estatus social como el costo del vehículo pueden ser factores determinantes en la probabilidad de presentar un reclamo.
Se visualizan las distribuciones de probabilidad de las variables numéricas segmentadas por la ocurrencia de un siniestro o no, con el fin de determinar alguna diferencia o patrón. Esta técnica de análisis permite examinar la forma en que las variables numéricas se distribuyen en relación con la presencia o ausencia de siniestros. Al observar las distribuciones de probabilidad, es posible identificar posibles relaciones o disparidades entre los grupos de datos. Además, se pueden utilizar medidas de resumen estadístico, como la media, mediana y desviación estándar, para obtener una comprensión más completa de cómo varían las variables numéricas en función de la ocurrencia de siniestros.
Es obvio que existe un patrón con respecto a la exposición del vehículo y la ocurrencia de un siniestro. Sin embargo, con el resto de las variables no se observa a primera vista un patrón o relación. Para indagar un poco más, se puede visualizar las variables utilizando gráficas de cajas o de violín. Estos tipos de gráficos son herramientas visuales útiles que permiten examinar la distribución de los datos y detectar posibles diferencias entre los grupos. En una gráfica de cajas, se pueden observar las medianas, cuartiles y valores atípicos de las variables, lo que proporciona una idea de la dispersión y la tendencia central de los datos. Por otro lado, las gráficas de violín muestran la densidad de los datos y permiten comparar la distribución entre diferentes grupos de manera más precisa.
Por último, se visualiza la correlación entre las variables:
Normalmente en problemas de clasificación es común encontrarse con datos desbalanceados, esto sucede cuando la mayoría de los datos se concentran en una sola de las dos clases que se desean estudiar. A continuación, se verifica la proporción de pólizas que si presentaron reclamos y las que no:
| Indicador de Siniestro | N | Proporcion |
|---|---|---|
| Yes | 3.265 | 10.67% |
| No | 27.330 | 89.33% |
Alrededor del 10% de las pólizas presentaron siniestros, se puede considerar este porcentaje como un desbalanceo medio.
Verificar el desbalanceo es importante porque un desequilibrio significativo en la distribución de las clases puede afectar la capacidad del modelo para aprender y predecir correctamente. Para abordar este problema, existen técnicas como el submuestreo, donde se reduce aleatoriamente la cantidad de instancias de la clase mayoritaria, o el sobremuestreo, donde se aumenta la cantidad de instancias de la clase minoritaria. Estas técnicas buscan equilibrar la distribución de las clases y mejorar el rendimiento del modelo de clasificación.
Realizar modelos de aprendizaje supervisado haciendo uso de todos los datos disponibles no suele ser una buena opción debido a que esto suele causar problemas de “sobre ajuste”. Es mejor particionar los datos en dos conjuntos, una para entrenar los modelos y otro para probar o testear los modelos, esto nos permitirá saber el desempeño de los modelos en datos nuevos.
La partición se realizó mediante un muestreo estratificado debido a que los datos están medianamente desbalanceados y presentan mayor cantidad de pólizas que no presentaron siniestro.
set.seed(1234)
split <- initial_split(data = dat, prop = 0.80, strata = claim_ind)
train_set <- training(split)
test_set <- testing(split)
| Indicador de Siniestro | N | Proporcion |
|---|---|---|
| Yes | 2.612 | 10.67% |
| No | 21.864 | 89.33% |
| Indicador de Siniestro | N | Proporcion |
|---|---|---|
| Yes | 653 | 10.67% |
| No | 5.466 | 89.33% |
Aparte de particionar los datos en conjuntos de entrenamiento y prueba se particionara el conjunto de entrenamiento en 5 subconjuntos de datos, esto permite tener un mejor entendimiento del comportamiento de los modelos.
El proceso es ajustar los modelos en uno de los subconjuntos y utilizar los otros cuatros para computar métricas de rendimiento, este proceso se repite hasta que todos los subconjuntos sean utilizados para ajustar los modelos. Por lo general, luego se toma la media de las métricas de rendimiento de este proceso.
set.seed(234)
folds <- vfold_cv(train_set, v = 5, strata = claim_ind)
folds
## # 5-fold cross-validation using stratification
## # A tibble: 5 × 2
## splits id
## <list> <chr>
## 1 <split [19580/4896]> Fold1
## 2 <split [19580/4896]> Fold2
## 3 <split [19581/4895]> Fold3
## 4 <split [19581/4895]> Fold4
## 5 <split [19582/4894]> Fold5
En base a lo observado en el análisis exploratorio se creará un récipe con el pre procesamiento haciendo uso de ingeniería de variables para mejorar el desempeño de los algoritmos de Machine Learning.
Debido a que los datos en estudios se encuentran desbalanceados se realizan tres récipes con distintos enfoques: - Básico: No contempla ningun tratamiento para el desbalanceo de clases. - Sobremuestro: Este enfoque aumenta las observaciones de la clase minoritaria hasta que tanto la clase minoritaria como la mayoritaria se distribuyan porcentualmente igual en los datos. - Submuestro: Este enfoque elimina las observaciones de la clase mayoritaria hasta que tanto la clase minoritaria como la mayoritaria se distribuyan porcentualmente igual en los datos.
recipe <-
recipe(claim_ind ~ ., data = train_set) %>%
step_other(socio_categ, veh_price, threshold = 0.01) %>%
step_dummy(all_nominal_predictors()) %>%
step_nzv(all_predictors())
recipe_down <-
recipe %>%
step_downsample(claim_ind, seed = 1234)
recipe_up <-
recipe %>%
step_upsample(claim_ind, seed = 12345)
recipe_knn <-
recipe(claim_ind ~ ., data = train_set) %>%
step_other(socio_categ, veh_price, threshold = 0.01) %>%
step_dummy(all_nominal_predictors()) %>%
step_nzv(all_predictors()) %>%
step_normalize(all_numeric_predictors())
recipe_down_knn <-
recipe_knn %>%
step_downsample(claim_ind, seed = 1234)
recipe_up_knn <-
recipe_knn %>%
step_upsample(claim_ind, seed = 12345)
Usando las funciones juice y prep se puede apreciar el resultado del pre procesamiento de los datos de entrenamiento.
## Rows: 24,476
## Columns: 54
## $ exposure <dbl> 0.583, 0.200, 0.083, 0.750, 0.…
## $ lic_age <int> 366, 187, 169, 232, 241, 298, …
## $ driv_age <int> 55, 34, 33, 38, 39, 43, 54, 55…
## $ bonus_malus <int> 72, 80, 63, 57, 54, 76, 50, 50…
## $ risk_var <int> 15, 20, 17, 19, 19, 10, 16, 16…
## $ claim_ind <fct> No, No, No, No, No, No, No, No…
## $ veh_age_X1 <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_age_X10. <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_age_X2 <dbl> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, …
## $ veh_age_X3 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_age_X4 <dbl> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, …
## $ veh_age_X5 <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, …
## $ veh_age_X6.7 <dbl> 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, …
## $ veh_age_X8.9 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ gender_Male <dbl> 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, …
## $ mari_stat_Other <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ socio_categ_CSP50 <dbl> 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, …
## $ socio_categ_CSP55 <dbl> 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, …
## $ socio_categ_CSP60 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, …
## $ veh_usage_Private.trip.to.office <dbl> 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, …
## $ veh_usage_Professional <dbl> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ has_km_limit_No <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ veh_body_other.microvan <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, …
## $ veh_body_sedan <dbl> 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, …
## $ veh_body_sport.utility.vehicle <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_body_station.wagon <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_D <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_E <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_F <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_G <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_H <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, …
## $ veh_price_I <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_J <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_K <dbl> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_price_L <dbl> 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, …
## $ veh_price_M <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, …
## $ veh_engine_direct.injection.overpowered <dbl> 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, …
## $ veh_engine_injection <dbl> 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, …
## $ veh_engine_injection.overpowered <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, …
## $ veh_energy_regular <dbl> 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, …
## $ veh_max_speed_X150.160.km.h <dbl> 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, …
## $ veh_max_speed_X160.170.km.h <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_max_speed_X170.180.km.h <dbl> 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, …
## $ veh_max_speed_X180.190.km.h <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, …
## $ veh_max_speed_X190.200.km.h <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, …
## $ veh_max_speed_X200.220.km.h <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, …
## $ veh_max_speed_X220..km.h <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ veh_class_A <dbl> 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, …
## $ veh_class_B <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, …
## $ veh_class_H <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, …
## $ veh_class_M1 <dbl> 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, …
## $ veh_class_M2 <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, …
## $ garage_None <dbl> 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, …
## $ garage_Private.garage <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, …
A continuación, se procede a realizar el entrenamiento de los modelos en la validación cruzada.
Modelos a utilizar:
# Bosque Aleatorio
rf_spec <- rand_forest(trees = 500) %>%
set_engine("ranger",
num.threads = 7,
importance = "impurity") %>%
set_mode("classification")
# Regresión logística
glm_spec <- logistic_reg() %>%
set_engine("glm")
# XGboost
xg_spec <- boost_tree(trees = 500) %>%
set_engine("xgboost") %>%
set_mode("classification")
# KNN
knn_spec <- nearest_neighbor() %>%
set_engine("kknn") %>%
set_mode("classification")
Se crea un objeto de tipo “workflow_set” para establecer todos los récipes y modelos a utilizar para evaluar cual otorga un mejor rendimiento. Para medir el rendimiento de los modelos se computarán varias métricas como lo son la Tasa de Verdaderos Positivos, Tasa de Verdaderos Negativos, Métrica F1 (promedio armónico entre la TVP y TVN) y la Curva ROC AUC.
Para datos desbalanceados es recomendable usar la puntuación F1, la cual se define como:
\(F1_{score} = \frac{(1 + \beta^{2}) * precision * recall}{((\beta^{2}*precision) + recall)}\)
Se visualiza resultado de modelos en la validación cruzada.
Al analizar los resultados obtenidos durante la validación cruzada, se destaca que el modelo más efectivo en términos de las métricas F1 y la curva ROC es el Bosque Aleatorio. Estas métricas son indicadores importantes para evaluar el rendimiento y la precisión de un modelo de clasificación. Sin embargo, el gráfico proporcionado no revela claramente cuál fue el enfoque de preprocesamiento de los datos que generó el modelo más preciso.
| recipe | Bosque Aleatorio | Regresion Logistica | XGBoost | k Vecinos |
|---|---|---|---|---|
| simple | 0.118 | 0.000 | 0.566 | 0.488 |
| up | 0.567 | 0.272 | 0.535 | 0.489 |
| down | 0.325 | 0.271 | 0.311 | 0.269 |
| recipe | Bosque Aleatorio | Regresion Logistica | XGBoost | k Vecinos |
|---|---|---|---|---|
| simple | 0.831 | 0.686 | 0.794 | 0.712 |
| up | 0.844 | 0.686 | 0.790 | 0.714 |
| down | 0.785 | 0.683 | 0.764 | 0.644 |
En ambas métricas (ROC y F1), el modelo de Bosque Aleatorio con el recipe de procesamiento que contempla un sobremuestreo otorga los resultados más satisfactorios. Por consiguiente, se procede con este modelo y recipe para realizar un ajuste de hiperparámetros.
Ya se tiene de pasos previos la receta con el preprocesamiento de los datos, solo falta establecer el flujo de trabajo del modelo de Bosque Aleatorio y la grilla con todas las combinaciones posibles de hiperparámetros a ajustar.
Los dos principales hiperparámetros a ajustar son los siguientes:
# Bosque Aleatorio con hiperparámetros
rf_spec_tune <-
rand_forest(
mtry = tune(), trees = 500, min_n = tune()) %>%
set_engine("ranger") %>%
set_mode("classification")
# Workflow
tune_rf_wf <-
workflow() %>%
add_recipe(recipe_up) %>%
add_model(rf_spec_tune)
Se utilizará un método de llenado de espacios para establecer la cuadrícula de posibles valores para los hiperparámetros. Para más información consultar.
mtry_train <-
prep(recipe) %>%
juice()
rf_grid <-
tune_rf_wf %>%
extract_parameter_set_dials() %>%
finalize(mtry_train) %>%
grid_latin_hypercube(size = 30)
Se puede observar un patrón decreciente en min_n, lo cual sugiere que al aumentar el número de predictores que se muestrearán aleatoriamente en cada división, se obtienen mejores resultados. Por otro lado, en el caso de mtry, se observa lo contrario, es decir, que un menor número de puntos mínimos para crear un nodo proporciona resultados óptimos.
Usando la función show_best se puede extraer las mejores combinaciones:
| mtry | min_n | .metric | .estimator | mean | n | std_err | .config |
|---|---|---|---|---|---|---|---|
| 15 | 4 | roc_auc | binary | 0.8537395 | 5 | 0.007552994 | Preprocessor1_Model07 |
| 10 | 8 | roc_auc | binary | 0.8511952 | 5 | 0.008406467 | Preprocessor1_Model18 |
| 23 | 9 | roc_auc | binary | 0.8479848 | 5 | 0.007461503 | Preprocessor1_Model12 |
| 44 | 6 | roc_auc | binary | 0.8442320 | 5 | 0.006883260 | Preprocessor1_Model30 |
| 48 | 3 | roc_auc | binary | 0.8441325 | 5 | 0.007562566 | Preprocessor1_Model05 |
| mtry | min_n | .metric | .estimator | mean | n | std_err | .config |
|---|---|---|---|---|---|---|---|
| 10 | 8 | f_meas | binary | 0.5710321 | 5 | 0.008724102 | Preprocessor1_Model18 |
| 15 | 4 | f_meas | binary | 0.5701686 | 5 | 0.008953803 | Preprocessor1_Model07 |
| 32 | 17 | f_meas | binary | 0.5700284 | 5 | 0.010183994 | Preprocessor1_Model08 |
| 23 | 9 | f_meas | binary | 0.5700072 | 5 | 0.009028499 | Preprocessor1_Model12 |
| 29 | 13 | f_meas | binary | 0.5695125 | 5 | 0.009737099 | Preprocessor1_Model02 |
Por último, se procede a finalizar el modelo de Bosque Aleatorio seleccionando la combinación de hiperparámetros que ofreció los mejores resultados en el paso previo.
final_rf <-
finalize_model(
x = rf_spec_tune,
parameters = select_best(tune_rf, "f_meas")) %>%
set_engine("ranger", importance = "permutation")
final_wf <-
workflow() %>%
add_recipe(recipe_up) %>%
add_model(final_rf)
final_res <-
final_wf %>%
last_fit(split = split, metrics = metricas)
Se visualiza la matriz de confusión de las predicciones en el conjunto de prueba:
El modelo predijo correctamente que 360 pólizas presentarán siniestros, de un total de 653 pólizas que efectivamente tuvieron siniestros. Esto representa una Tasa Positiva Verdadera de aproximadamente 55%. Por otro lado, el Bosque Aleatorio predijo con precisión que 5439 pólizas no tendrán siniestros, lo que resulta en una Tasa Negativa Verdadera del 99%. Parece que el modelo tiene un buen desempeño al predecir qué pólizas no tendrán siniestros.
La Importancia de Variables se refiere a la medida de la contribución de cada variable en la predicción del modelo. Los Bosques Aleatorios generan de manera implícita medidas de importancia para las variables del modelo, lo que permite identificar cuáles variables tienen un mayor impacto en la precisión de las predicciones.
La importancia de variables se puede visualizar mediante una gráfica de importancia relativa, donde se presentan los predictores en orden de su efecto en la mejora del modelo. La variable con la puntuación de mejora más alta se considera la más importante, y las demás variables se ordenan en función de su importancia relativa. Esta medida de importancia se estandariza para facilitar la interpretación y se calcula dividiendo la puntuación de importancia de cada variable entre la mayor puntuación de importancia y multiplicándola por 100%.
Parece que entre los factores de riesgo más importantes para determinar si un vehículo tendrá siniestro son conocer si su uso es del tipo profesional, si la categoría social del conductor es CSP50, si es del tipo sedán y si su conductor es masculino. Igualmente, conocer la antigüedad de la licencia del conductor nos da indicios de su experiencia al volante y, por ende, de la no ocurrencia de siniestros.
Es importante mencionar que otro factor relevante para determinar si un vehículo tendrá siniestro es conocer si se guarda en un garaje o no. El hecho de tener un lugar seguro para estacionar el vehículo puede influir en la protección del mismo contra robos y/o daños accidentales.