Este documento apresenta uma Análise Exploratória de Dados (EDA) do conjunto de dados “Porto Seguro`s Safe Driver Prediction”, fornecido pela concessionária de seguros Porto Seguro como projeto de Machine Learning e com base nos Notebooks do projeto do Kaggle, especialmente do autor Headsortails. O documento visa apresentar uma análise detalhada dos dados coletados pela empresa e suas relações com a variável-alvo: saber se o cliente irá acionar o seguro no ano seguinte.
Não obstante, o desenvolvimento conta com uma seção de Feature Engineering, onde avalia a importância conjunta de variáveis para a estimativa da probabilidade de acionamento do seguro e, por fim, preparação dos dados para modelagem de algoritmos preditivos que estimam a probabilidade de cada cliente acionar o seguro no ano seguinte.
Por fim, a anonimização dos dados foi uma questão que chamou a atenção para a escolha deste conjunto de dados e eu espero que o desenvolvimento do estudo possa exemplificar etapas e obstáculos para o tratamento e análise de dados codificados para auxiliar analistas neste tipo de projeto que está cada vez mais comum.
# DataViz
library('ggplot2') # visualização de dados
library('scales') # visualização de dados
library('grid') # visualização de dados
library('ggthemes') # visualização de dados
library('gridExtra') # visualização de dados
library('RColorBrewer') # visualização de dados
library('corrplot') # visualização de dados
library('alluvial') # visualização de dados
library('ggfortify') # visualização de dados
library('ggrepel') # visualização de dados
library('ggridges') # visualização de dados
library('VIM') # visualização de missing
library('plotly') # interatividade
library('ggforce') # visualização de dados
# manipulação
library('dplyr') # manipulaçãoo de dados
library('readr') # input/output
library('data.table') # manipulaçãoo de dados
library('tibble') # data wrangling
library('tidyr') # data wrangling
library('stringr') # manipulação de strings
library('forcats') # manipulação de fatores
library('rlang') # manipulaçãoo de dados
# modelagem
library('xgboost') # modelagem
library('caret') # modelagem
library('MLmetrics') # coeficientes de gini# Função para plotagem de várias visualizações, fornecida por R Cookbooks:
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
# Função para intervalos de confiança
get_binCI <- function(x,n) as.list(setNames(binom.test(x,n)$conf.int, c("lwr", "upr")))O conjunto de dados é fornecido já dividido entre treinamento e teste. Para a modelagem do algoritmo é utilizado somente o conjunto de treinamento, o conjunto de teste é utilizado para validar o funcionamento e a qualidade do algoritmo modelado. Pode ocorrer de empresas fornecerem o conjunto de teste sem os valores da variável-alvo (neste caso se o seguro foi aciondo ou não), logo é importante visualizar uma lista com todas as variáveis (colunas) presentes em cada arquivo .csv (treinamento e teste).
Inicialmente será plotado as listas (glimpse) das colunas dos dois conjuntos de dados (treinamento e teste), para conhecer os nomes e seus tipos (numérico, catégórico, binário, lógico, etc). Em seguida será plotado o resumo (summary), mostrando estatísticas básicas como mínimos, máximos, médias, medianas, primeiro e terceiro quartis. Esta visualização é importante para conhecer a ordem de grandeza das variáveis, bem como as quantidades de valores faltantes (missing ou NA) e para servir de consulta durante todo o desenvolvimento.
Para maiores detalhes sobre o funcionamento de conjuntos de dados e teste, sugiro pesquisar sobre: overfitting, underfitting, bias-variance tradeoff e validação cruzada.
Porteriormente serão realizadas as manipulações necessárias no tipo e combinadas em um único dataset para tratamento. E como as saídas destes códigos são extensas, foi dividido em duas abas para facilitar a visualização.
## Rows: 595,212
## Columns: 59
## $ id <int> 7, 9, 13, 16, 17, 19, 20, 22, 26, 28, 34, 35, 36, 43...
## $ target <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_01 <int> 2, 1, 5, 0, 0, 5, 2, 5, 5, 1, 5, 2, 2, 1, 5, 5, 1, 5...
## $ ps_ind_02_cat <int> 2, 1, 4, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1...
## $ ps_ind_03 <int> 5, 7, 9, 2, 0, 4, 3, 4, 3, 2, 2, 3, 1, 3, 11, 3, 1, ...
## $ ps_ind_04_cat <int> 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0...
## $ ps_ind_05_cat <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1...
## $ ps_ind_06_bin <int> 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1...
## $ ps_ind_07_bin <int> 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0...
## $ ps_ind_08_bin <int> 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0...
## $ ps_ind_09_bin <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0...
## $ ps_ind_10_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_11_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_12_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_13_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_14 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_15 <int> 11, 3, 12, 8, 9, 6, 8, 13, 6, 4, 3, 9, 10, 12, 10, 5...
## $ ps_ind_16_bin <int> 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1...
## $ ps_ind_17_bin <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_18_bin <int> 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0...
## $ ps_reg_01 <dbl> 0.7, 0.8, 0.0, 0.9, 0.7, 0.9, 0.6, 0.7, 0.9, 0.9, 0....
## $ ps_reg_02 <dbl> 0.2, 0.4, 0.0, 0.2, 0.6, 1.8, 0.1, 0.4, 0.7, 1.4, 0....
## $ ps_reg_03 <dbl> 0.7180703, 0.7660777, NA, 0.5809475, 0.8407586, 2.33...
## $ ps_car_01_cat <int> 10, 11, 7, 7, 11, 10, 6, 11, 10, 11, 11, 11, 6, 9, 1...
## $ ps_car_02_cat <int> 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1...
## $ ps_car_03_cat <int> NA, NA, NA, 0, NA, NA, NA, 0, NA, 0, NA, NA, NA, 0, ...
## $ ps_car_04_cat <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 9, 1, 0...
## $ ps_car_05_cat <int> 1, NA, NA, 1, NA, 0, 1, 0, 1, 0, NA, NA, NA, 1, NA, ...
## $ ps_car_06_cat <int> 4, 11, 14, 11, 14, 14, 11, 11, 14, 14, 13, 11, 11, 6...
## $ ps_car_07_cat <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ ps_car_08_cat <int> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0...
## $ ps_car_09_cat <int> 0, 2, 2, 3, 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2...
## $ ps_car_10_cat <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ ps_car_11_cat <int> 12, 19, 60, 104, 82, 104, 99, 30, 68, 104, 20, 36, 1...
## $ ps_car_11 <int> 2, 3, 1, 1, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, 1, 2, 3, 2...
## $ ps_car_12 <dbl> 0.4000000, 0.3162278, 0.3162278, 0.3741657, 0.316069...
## $ ps_car_13 <dbl> 0.8836789, 0.6188165, 0.6415857, 0.5429488, 0.565831...
## $ ps_car_14 <dbl> 0.3708099, 0.3887158, 0.3472751, 0.2949576, 0.365102...
## $ ps_car_15 <dbl> 3.605551, 2.449490, 3.316625, 2.000000, 2.000000, 3....
## $ ps_calc_01 <dbl> 0.6, 0.3, 0.5, 0.6, 0.4, 0.7, 0.2, 0.1, 0.9, 0.7, 0....
## $ ps_calc_02 <dbl> 0.5, 0.1, 0.7, 0.9, 0.6, 0.8, 0.6, 0.5, 0.8, 0.8, 0....
## $ ps_calc_03 <dbl> 0.2, 0.3, 0.1, 0.1, 0.0, 0.4, 0.5, 0.1, 0.6, 0.8, 0....
## $ ps_calc_04 <int> 3, 2, 2, 2, 2, 3, 2, 1, 3, 2, 2, 2, 4, 2, 3, 2, 2, 1...
## $ ps_calc_05 <int> 1, 1, 2, 4, 2, 1, 2, 2, 1, 2, 3, 2, 1, 1, 1, 1, 1, 3...
## $ ps_calc_06 <int> 10, 9, 9, 7, 6, 8, 8, 7, 7, 8, 8, 8, 8, 10, 8, 9, 10...
## $ ps_calc_07 <int> 1, 5, 1, 1, 3, 2, 1, 1, 3, 2, 2, 2, 4, 1, 2, 5, 6, 2...
## $ ps_calc_08 <int> 10, 8, 8, 8, 10, 11, 8, 6, 9, 9, 9, 10, 11, 8, 6, 10...
## $ ps_calc_09 <int> 1, 1, 2, 4, 2, 3, 3, 1, 4, 1, 4, 1, 1, 3, 3, 2, 3, 1...
## $ ps_calc_10 <int> 5, 7, 7, 2, 12, 8, 10, 13, 11, 11, 7, 8, 9, 8, 12, 1...
## $ ps_calc_11 <int> 9, 3, 4, 2, 3, 4, 3, 7, 4, 3, 6, 9, 6, 2, 4, 5, 3, 9...
## $ ps_calc_12 <int> 1, 1, 2, 2, 1, 2, 0, 1, 2, 5, 3, 2, 3, 0, 1, 2, 3, 1...
## $ ps_calc_13 <int> 5, 1, 7, 4, 1, 0, 0, 3, 1, 0, 3, 1, 3, 4, 3, 6, 1, 3...
## $ ps_calc_14 <int> 8, 9, 7, 9, 3, 9, 10, 6, 5, 6, 6, 10, 8, 3, 9, 7, 8,...
## $ ps_calc_15_bin <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_calc_16_bin <int> 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1...
## $ ps_calc_17_bin <int> 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1...
## $ ps_calc_18_bin <int> 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0...
## $ ps_calc_19_bin <int> 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0...
## $ ps_calc_20_bin <int> 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0...
## id target ps_ind_01 ps_ind_02_cat
## Min. : 7 Min. :0.00000 Min. :0.0 Min. :1.00
## 1st Qu.: 371992 1st Qu.:0.00000 1st Qu.:0.0 1st Qu.:1.00
## Median : 743548 Median :0.00000 Median :1.0 Median :1.00
## Mean : 743804 Mean :0.03645 Mean :1.9 Mean :1.36
## 3rd Qu.:1115549 3rd Qu.:0.00000 3rd Qu.:3.0 3rd Qu.:2.00
## Max. :1488027 Max. :1.00000 Max. :7.0 Max. :4.00
## NA's :216
## ps_ind_03 ps_ind_04_cat ps_ind_05_cat ps_ind_06_bin
## Min. : 0.000 Min. :0.000 Min. :0.000 Min. :0.0000
## 1st Qu.: 2.000 1st Qu.:0.000 1st Qu.:0.000 1st Qu.:0.0000
## Median : 4.000 Median :0.000 Median :0.000 Median :0.0000
## Mean : 4.423 Mean :0.417 Mean :0.419 Mean :0.3937
## 3rd Qu.: 6.000 3rd Qu.:1.000 3rd Qu.:0.000 3rd Qu.:1.0000
## Max. :11.000 Max. :1.000 Max. :6.000 Max. :1.0000
## NA's :83 NA's :5809
## ps_ind_07_bin ps_ind_08_bin ps_ind_09_bin ps_ind_10_bin
## Min. :0.000 Min. :0.0000 Min. :0.0000 Min. :0.000000
## 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000000
## Median :0.000 Median :0.0000 Median :0.0000 Median :0.000000
## Mean :0.257 Mean :0.1639 Mean :0.1853 Mean :0.000373
## 3rd Qu.:1.000 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.000000
## Max. :1.000 Max. :1.0000 Max. :1.0000 Max. :1.000000
##
## ps_ind_11_bin ps_ind_12_bin ps_ind_13_bin ps_ind_14
## Min. :0.000000 Min. :0.000000 Min. :0.0000000 Min. :0.00000
## 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.00000
## Median :0.000000 Median :0.000000 Median :0.0000000 Median :0.00000
## Mean :0.001692 Mean :0.009439 Mean :0.0009476 Mean :0.01245
## 3rd Qu.:0.000000 3rd Qu.:0.000000 3rd Qu.:0.0000000 3rd Qu.:0.00000
## Max. :1.000000 Max. :1.000000 Max. :1.0000000 Max. :4.00000
##
## ps_ind_15 ps_ind_16_bin ps_ind_17_bin ps_ind_18_bin
## Min. : 0.0 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.: 5.0 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 7.0 Median :1.0000 Median :0.0000 Median :0.0000
## Mean : 7.3 Mean :0.6608 Mean :0.1211 Mean :0.1534
## 3rd Qu.:10.0 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :13.0 Max. :1.0000 Max. :1.0000 Max. :1.0000
##
## ps_reg_01 ps_reg_02 ps_reg_03 ps_car_01_cat
## Min. :0.000 Min. :0.0000 Min. :0.06 Min. : 0.000
## 1st Qu.:0.400 1st Qu.:0.2000 1st Qu.:0.63 1st Qu.: 7.000
## Median :0.700 Median :0.3000 Median :0.80 Median : 7.000
## Mean :0.611 Mean :0.4392 Mean :0.89 Mean : 8.298
## 3rd Qu.:0.900 3rd Qu.:0.6000 3rd Qu.:1.08 3rd Qu.:11.000
## Max. :0.900 Max. :1.8000 Max. :4.04 Max. :11.000
## NA's :107772 NA's :107
## ps_car_02_cat ps_car_03_cat ps_car_04_cat ps_car_05_cat
## Min. :0.0000 Min. :0.0 Min. :0.0000 Min. :0.00
## 1st Qu.:1.0000 1st Qu.:0.0 1st Qu.:0.0000 1st Qu.:0.00
## Median :1.0000 Median :1.0 Median :0.0000 Median :1.00
## Mean :0.8299 Mean :0.6 Mean :0.7252 Mean :0.53
## 3rd Qu.:1.0000 3rd Qu.:1.0 3rd Qu.:0.0000 3rd Qu.:1.00
## Max. :1.0000 Max. :1.0 Max. :9.0000 Max. :1.00
## NA's :5 NA's :411231 NA's :266551
## ps_car_06_cat ps_car_07_cat ps_car_08_cat ps_car_09_cat
## Min. : 0.000 Min. :0.000 Min. :0.0000 Min. :0.000
## 1st Qu.: 1.000 1st Qu.:1.000 1st Qu.:1.0000 1st Qu.:0.000
## Median : 7.000 Median :1.000 Median :1.0000 Median :2.000
## Mean : 6.555 Mean :0.948 Mean :0.8321 Mean :1.331
## 3rd Qu.:11.000 3rd Qu.:1.000 3rd Qu.:1.0000 3rd Qu.:2.000
## Max. :17.000 Max. :1.000 Max. :1.0000 Max. :4.000
## NA's :11489 NA's :569
## ps_car_10_cat ps_car_11_cat ps_car_11 ps_car_12
## Min. :0.0000 Min. : 1.00 Min. :0.000 Min. :0.1000
## 1st Qu.:1.0000 1st Qu.: 32.00 1st Qu.:2.000 1st Qu.:0.3162
## Median :1.0000 Median : 65.00 Median :3.000 Median :0.3742
## Mean :0.9921 Mean : 62.22 Mean :2.346 Mean :0.3799
## 3rd Qu.:1.0000 3rd Qu.: 93.00 3rd Qu.:3.000 3rd Qu.:0.4000
## Max. :2.0000 Max. :104.00 Max. :3.000 Max. :1.2649
## NA's :5 NA's :1
## ps_car_13 ps_car_14 ps_car_15 ps_calc_01
## Min. :0.2506 Min. :0.11 Min. :0.000 Min. :0.0000
## 1st Qu.:0.6709 1st Qu.:0.35 1st Qu.:2.828 1st Qu.:0.2000
## Median :0.7658 Median :0.37 Median :3.317 Median :0.5000
## Mean :0.8133 Mean :0.37 Mean :3.066 Mean :0.4498
## 3rd Qu.:0.9062 3rd Qu.:0.40 3rd Qu.:3.606 3rd Qu.:0.7000
## Max. :3.7206 Max. :0.64 Max. :3.742 Max. :0.9000
## NA's :42620
## ps_calc_02 ps_calc_03 ps_calc_04 ps_calc_05
## Min. :0.0000 Min. :0.0000 Min. :0.000 Min. :0.000
## 1st Qu.:0.2000 1st Qu.:0.2000 1st Qu.:2.000 1st Qu.:1.000
## Median :0.4000 Median :0.5000 Median :2.000 Median :2.000
## Mean :0.4496 Mean :0.4498 Mean :2.372 Mean :1.886
## 3rd Qu.:0.7000 3rd Qu.:0.7000 3rd Qu.:3.000 3rd Qu.:3.000
## Max. :0.9000 Max. :0.9000 Max. :5.000 Max. :6.000
##
## ps_calc_06 ps_calc_07 ps_calc_08 ps_calc_09
## Min. : 0.000 Min. :0.000 Min. : 2.000 Min. :0.000
## 1st Qu.: 7.000 1st Qu.:2.000 1st Qu.: 8.000 1st Qu.:1.000
## Median : 8.000 Median :3.000 Median : 9.000 Median :2.000
## Mean : 7.689 Mean :3.006 Mean : 9.226 Mean :2.339
## 3rd Qu.: 9.000 3rd Qu.:4.000 3rd Qu.:10.000 3rd Qu.:3.000
## Max. :10.000 Max. :9.000 Max. :12.000 Max. :7.000
##
## ps_calc_10 ps_calc_11 ps_calc_12 ps_calc_13
## Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 6.000 1st Qu.: 4.000 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 8.000 Median : 5.000 Median : 1.000 Median : 3.000
## Mean : 8.434 Mean : 5.441 Mean : 1.442 Mean : 2.872
## 3rd Qu.:10.000 3rd Qu.: 7.000 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :25.000 Max. :19.000 Max. :10.000 Max. :13.000
##
## ps_calc_14 ps_calc_15_bin ps_calc_16_bin ps_calc_17_bin
## Min. : 0.000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.: 6.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 7.000 Median :0.0000 Median :1.0000 Median :1.0000
## Mean : 7.539 Mean :0.1224 Mean :0.6278 Mean :0.5542
## 3rd Qu.: 9.000 3rd Qu.:0.0000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :23.000 Max. :1.0000 Max. :1.0000 Max. :1.0000
##
## ps_calc_18_bin ps_calc_19_bin ps_calc_20_bin
## Min. :0.0000 Min. :0.000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.0000 Median :0.000 Median :0.0000
## Mean :0.2872 Mean :0.349 Mean :0.1533
## 3rd Qu.:1.0000 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.000 Max. :1.0000
##
## Rows: 892,816
## Columns: 58
## $ id <int> 0, 1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 14, 15, 18, 21, ...
## $ ps_ind_01 <int> 0, 4, 5, 0, 5, 0, 0, 0, 0, 1, 0, 1, 1, 3, 0, 2, 2, 0...
## $ ps_ind_02_cat <int> 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2...
## $ ps_ind_03 <int> 8, 5, 3, 6, 7, 6, 3, 0, 7, 6, 5, 4, 2, 3, 1, 2, 3, 0...
## $ ps_ind_04_cat <int> 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1...
## $ ps_ind_05_cat <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, N...
## $ ps_ind_06_bin <int> 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1...
## $ ps_ind_07_bin <int> 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0...
## $ ps_ind_08_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0...
## $ ps_ind_09_bin <int> 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_10_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_11_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_12_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_13_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_14 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_15 <int> 12, 5, 10, 4, 4, 10, 11, 7, 6, 7, 3, 9, 8, 0, 8, 9, ...
## $ ps_ind_16_bin <int> 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1...
## $ ps_ind_17_bin <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_18_bin <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0...
## $ ps_reg_01 <dbl> 0.5, 0.9, 0.4, 0.1, 0.9, 0.9, 0.1, 0.9, 0.4, 0.9, 0....
## $ ps_reg_02 <dbl> 0.3, 0.5, 0.0, 0.2, 0.4, 0.5, 0.1, 1.1, 0.0, 1.0, 0....
## $ ps_reg_03 <dbl> 0.6103278, 0.7713624, 0.9161741, NA, 0.8177714, 0.75...
## $ ps_car_01_cat <int> 7, 4, 11, 7, 11, 9, 6, 7, 11, 11, 11, 11, 11, 11, 6,...
## $ ps_car_02_cat <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1...
## $ ps_car_03_cat <int> NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 1, NA...
## $ ps_car_04_cat <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2, 0, 0...
## $ ps_car_05_cat <int> NA, 0, NA, NA, NA, NA, 0, NA, 0, NA, NA, NA, 1, NA, ...
## $ ps_car_06_cat <int> 1, 11, 14, 1, 11, 11, 1, 11, 2, 4, 11, 7, 6, 1, 11, ...
## $ ps_car_07_cat <int> 1, 1, 1, 1, 1, 0, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, ...
## $ ps_car_08_cat <int> 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1...
## $ ps_car_09_cat <int> 2, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 1, 0, 2, 2, 2...
## $ ps_car_10_cat <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ ps_car_11_cat <int> 65, 103, 29, 40, 101, 11, 10, 103, 104, 104, 103, 10...
## $ ps_car_11 <int> 1, 1, 3, 2, 3, 2, 2, 3, 2, 2, 3, 3, 2, 1, 2, 0, 1, 3...
## $ ps_car_12 <dbl> 0.3162278, 0.3162278, 0.4000000, 0.3741657, 0.374165...
## $ ps_car_13 <dbl> 0.6695564, 0.6063200, 0.8962387, 0.6521104, 0.812914...
## $ ps_car_14 <dbl> 0.3521363, 0.3583295, 0.3984972, 0.3814446, 0.385097...
## $ ps_car_15 <dbl> 3.464102, 2.828427, 3.316625, 2.449490, 3.316625, 3....
## $ ps_calc_01 <dbl> 0.1, 0.4, 0.6, 0.1, 0.9, 0.7, 0.9, 0.8, 0.9, 0.0, 0....
## $ ps_calc_02 <dbl> 0.8, 0.5, 0.6, 0.5, 0.6, 0.9, 0.8, 0.9, 0.3, 0.9, 0....
## $ ps_calc_03 <dbl> 0.6, 0.4, 0.6, 0.5, 0.8, 0.4, 0.8, 0.5, 0.0, 0.7, 0....
## $ ps_calc_04 <int> 1, 3, 2, 2, 3, 2, 1, 2, 2, 2, 2, 2, 3, 2, 2, 1, 4, 3...
## $ ps_calc_05 <int> 1, 3, 3, 1, 4, 1, 1, 2, 2, 1, 2, 2, 1, 2, 3, 4, 0, 2...
## $ ps_calc_06 <int> 6, 8, 7, 7, 7, 9, 7, 8, 9, 7, 5, 9, 8, 7, 7, 8, 9, 8...
## $ ps_calc_07 <int> 3, 4, 4, 3, 1, 5, 3, 4, 7, 1, 5, 3, 0, 1, 3, 3, 1, 5...
## $ ps_calc_08 <int> 6, 10, 6, 12, 10, 9, 9, 11, 9, 9, 7, 10, 9, 9, 9, 9,...
## $ ps_calc_09 <int> 2, 2, 3, 1, 4, 4, 5, 2, 0, 1, 2, 1, 4, 1, 4, 3, 3, 1...
## $ ps_calc_10 <int> 9, 7, 12, 13, 12, 12, 6, 8, 10, 11, 10, 4, 7, 13, 7,...
## $ ps_calc_11 <int> 1, 2, 4, 5, 4, 8, 2, 3, 5, 6, 2, 4, 3, 7, 6, 9, 3, 5...
## $ ps_calc_12 <int> 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 2, 4, 0, 3, 0, 1, 2...
## $ ps_calc_13 <int> 1, 3, 2, 0, 0, 4, 4, 4, 4, 6, 1, 7, 0, 5, 5, 2, 2, 3...
## $ ps_calc_14 <int> 12, 10, 4, 5, 4, 9, 6, 9, 6, 10, 8, 8, 12, 9, 6, 11,...
## $ ps_calc_15_bin <int> 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1...
## $ ps_calc_16_bin <int> 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1...
## $ ps_calc_17_bin <int> 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1...
## $ ps_calc_18_bin <int> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0...
## $ ps_calc_19_bin <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1...
## $ ps_calc_20_bin <int> 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## id ps_ind_01 ps_ind_02_cat ps_ind_03
## Min. : 0 Min. :0.000 Min. :1.000 Min. : 0.000
## 1st Qu.: 372022 1st Qu.:0.000 1st Qu.:1.000 1st Qu.: 2.000
## Median : 744307 Median :1.000 Median :1.000 Median : 4.000
## Mean : 744154 Mean :1.902 Mean :1.359 Mean : 4.414
## 3rd Qu.:1116309 3rd Qu.:3.000 3rd Qu.:2.000 3rd Qu.: 6.000
## Max. :1488026 Max. :7.000 Max. :4.000 Max. :11.000
## NA's :307
## ps_ind_04_cat ps_ind_05_cat ps_ind_06_bin ps_ind_07_bin
## Min. :0.0000 Min. :0.000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.000 Median :0.0000 Median :0.0000
## Mean :0.4176 Mean :0.422 Mean :0.3932 Mean :0.2572
## 3rd Qu.:1.0000 3rd Qu.:0.000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :6.000 Max. :1.0000 Max. :1.0000
## NA's :145 NA's :8710
## ps_ind_08_bin ps_ind_09_bin ps_ind_10_bin ps_ind_11_bin
## Min. :0.0000 Min. :0.0000 Min. :0.000000 Min. :0.000000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000000 1st Qu.:0.000000
## Median :0.0000 Median :0.0000 Median :0.000000 Median :0.000000
## Mean :0.1637 Mean :0.1859 Mean :0.000373 Mean :0.001595
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.000000 3rd Qu.:0.000000
## Max. :1.0000 Max. :1.0000 Max. :1.000000 Max. :1.000000
##
## ps_ind_12_bin ps_ind_13_bin ps_ind_14 ps_ind_15
## Min. :0.000000 Min. :0.000000 Min. :0.00000 Min. : 0.000
## 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.: 5.000
## Median :0.000000 Median :0.000000 Median :0.00000 Median : 7.000
## Mean :0.009376 Mean :0.001039 Mean :0.01238 Mean : 7.297
## 3rd Qu.:0.000000 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:10.000
## Max. :1.000000 Max. :1.000000 Max. :4.00000 Max. :13.000
##
## ps_ind_16_bin ps_ind_17_bin ps_ind_18_bin ps_reg_01
## Min. :0.0000 Min. :0.0000 Min. :0.000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000 1st Qu.:0.4000
## Median :1.0000 Median :0.0000 Median :0.000 Median :0.7000
## Mean :0.6606 Mean :0.1204 Mean :0.155 Mean :0.6111
## 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.000 3rd Qu.:0.9000
## Max. :1.0000 Max. :1.0000 Max. :1.000 Max. :0.9000
##
## ps_reg_02 ps_reg_03 ps_car_01_cat ps_car_02_cat
## Min. :0.0000 Min. :0.06 Min. : 0.000 Min. :0.00
## 1st Qu.:0.2000 1st Qu.:0.63 1st Qu.: 7.000 1st Qu.:1.00
## Median :0.3000 Median :0.80 Median : 7.000 Median :1.00
## Mean :0.4399 Mean :0.89 Mean : 8.294 Mean :0.83
## 3rd Qu.:0.6000 3rd Qu.:1.09 3rd Qu.:11.000 3rd Qu.:1.00
## Max. :1.8000 Max. :4.42 Max. :11.000 Max. :1.00
## NA's :161684 NA's :160 NA's :5
## ps_car_03_cat ps_car_04_cat ps_car_05_cat ps_car_06_cat
## Min. :0.0 Min. :0.0000 Min. :0.0 Min. : 0.000
## 1st Qu.:0.0 1st Qu.:0.0000 1st Qu.:0.0 1st Qu.: 1.000
## Median :1.0 Median :0.0000 Median :1.0 Median : 7.000
## Mean :0.6 Mean :0.7258 Mean :0.5 Mean : 6.564
## 3rd Qu.:1.0 3rd Qu.:0.0000 3rd Qu.:1.0 3rd Qu.:11.000
## Max. :1.0 Max. :9.0000 Max. :1.0 Max. :17.000
## NA's :616911 NA's :400359
## ps_car_07_cat ps_car_08_cat ps_car_09_cat ps_car_10_cat
## Min. :0.000 Min. :0.0000 Min. :0.00 Min. :0.0000
## 1st Qu.:1.000 1st Qu.:1.0000 1st Qu.:0.00 1st Qu.:1.0000
## Median :1.000 Median :1.0000 Median :2.00 Median :1.0000
## Mean :0.948 Mean :0.8323 Mean :1.33 Mean :0.9921
## 3rd Qu.:1.000 3rd Qu.:1.0000 3rd Qu.:2.00 3rd Qu.:1.0000
## Max. :1.000 Max. :1.0000 Max. :4.00 Max. :2.0000
## NA's :17331 NA's :877
## ps_car_11_cat ps_car_11 ps_car_12 ps_car_13
## Min. : 1.00 Min. :0.000 Min. :0.1414 Min. :0.2758
## 1st Qu.: 32.00 1st Qu.:2.000 1st Qu.:0.3162 1st Qu.:0.6712
## Median : 65.00 Median :3.000 Median :0.3742 Median :0.7661
## Mean : 62.28 Mean :2.347 Mean :0.3800 Mean :0.8136
## 3rd Qu.: 94.00 3rd Qu.:3.000 3rd Qu.:0.4000 3rd Qu.:0.9061
## Max. :104.00 Max. :3.000 Max. :1.2649 Max. :4.0313
## NA's :1
## ps_car_14 ps_car_15 ps_calc_01 ps_calc_02
## Min. :0.11 Min. :0.000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.35 1st Qu.:2.828 1st Qu.:0.2000 1st Qu.:0.2000
## Median :0.37 Median :3.317 Median :0.4000 Median :0.5000
## Mean :0.37 Mean :3.068 Mean :0.4496 Mean :0.4505
## 3rd Qu.:0.40 3rd Qu.:3.606 3rd Qu.:0.7000 3rd Qu.:0.7000
## Max. :0.64 Max. :3.742 Max. :0.9000 Max. :0.9000
## NA's :63805
## ps_calc_03 ps_calc_04 ps_calc_05 ps_calc_06
## Min. :0.0000 Min. :0.000 Min. :0.000 Min. : 1.000
## 1st Qu.:0.2000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.: 7.000
## Median :0.4000 Median :2.000 Median :2.000 Median : 8.000
## Mean :0.4501 Mean :2.371 Mean :1.885 Mean : 7.688
## 3rd Qu.:0.7000 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.: 9.000
## Max. :0.9000 Max. :5.000 Max. :6.000 Max. :10.000
##
## ps_calc_07 ps_calc_08 ps_calc_09 ps_calc_10
## Min. :0.00 Min. : 1.000 Min. :0.000 Min. : 0.000
## 1st Qu.:2.00 1st Qu.: 8.000 1st Qu.:1.000 1st Qu.: 6.000
## Median :3.00 Median : 9.000 Median :2.000 Median : 8.000
## Mean :3.01 Mean : 9.226 Mean :2.339 Mean : 8.443
## 3rd Qu.:4.00 3rd Qu.:10.000 3rd Qu.:3.000 3rd Qu.:10.000
## Max. :9.00 Max. :12.000 Max. :7.000 Max. :25.000
##
## ps_calc_11 ps_calc_12 ps_calc_13 ps_calc_14
## Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00
## 1st Qu.: 4.000 1st Qu.: 1.00 1st Qu.: 2.000 1st Qu.: 6.00
## Median : 5.000 Median : 1.00 Median : 3.000 Median : 7.00
## Mean : 5.438 Mean : 1.44 Mean : 2.875 Mean : 7.54
## 3rd Qu.: 7.000 3rd Qu.: 2.00 3rd Qu.: 4.000 3rd Qu.: 9.00
## Max. :20.000 Max. :11.00 Max. :15.000 Max. :28.00
##
## ps_calc_15_bin ps_calc_16_bin ps_calc_17_bin ps_calc_18_bin
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :1.0000 Median :1.0000 Median :0.0000
## Mean :0.1237 Mean :0.6278 Mean :0.5547 Mean :0.2878
## 3rd Qu.:0.0000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
##
## ps_calc_19_bin ps_calc_20_bin
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000
## Mean :0.3493 Mean :0.1524
## 3rd Qu.:1.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000
##
## Existem 846458 valores missing no conjunto de teinamento
## Existem 1270295 valores missing no conjunto de teste
A partir de agora será adotado para a coluna a nomenclatura de variável, sendo cada linha uma observação ou indivíduo (neste caso, cada linha um cliente). Portanto:
-coluna == variável -linha == observação / indivíduo / cliente
A seção acima permitiu identificar que existem 2 tipos de variáveis: números inteiros (integer / int) e valores decimais (double / dbl). Em contrapartida, o resumo estatístico nos mostra qua algumas variáveis possuem exclusivamente valores 0 e 1, muito comum em colunas anomizadas (como é o caso) e isso é comprovado pelos nomes que a empresa deu as colunas. Algumas teminam com _bin.
Para conhecer mais sobre conversão de dados em binários, sugir pesquisar por One Hot Encoding, servem para anomização e são extremamente úteis especialmente para algoritmos de regressão ou modelos que necessitam que os dados sejam numéricos.
De forma semelhante, percebe-se que algumas variáveis terminam com _cat, indicando que aquela variável é categórica e que para cada categoria foi atribuido um valor inteiro como forma de codificar os dados, como por exemplo:
-carro de passeio == 1 -moto == 2 -caminhonete == 3
Esta técnica é conhecida como label encoding ou integer encoding, tem função similar ao ‘one hot encoding’, é mais organizada porém com um desempenho um pouco pior.
Em resumo, estes dados precisam ter seus tipos transformados. Na linguagem R, o tipo de dados utilizado para representar categorias é o tipo fator/factor.
Transformando variáveis categóricas em fatores e binárias em valores lógicos.
train <- train %>%
mutate_at(vars(ends_with("cat")), as.factor) %>%
mutate_at(vars(ends_with("bin")), as.logical) %>%
mutate(target = as.factor(target))
test <- test %>%
mutate_at(vars(ends_with("cat")), as.factor) %>%
mutate_at(vars(ends_with("bin")), as.logical)combine <- bind_rows(train %>% mutate(dset = "train"),
test %>% mutate(dset = "test",
target = NA))
combine <- combine %>% mutate(dset = factor(dset))
glimpse(combine)## Rows: 1,488,028
## Columns: 60
## $ id <int> 7, 9, 13, 16, 17, 19, 20, 22, 26, 28, 34, 35, 36, 43...
## $ target <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_01 <int> 2, 1, 5, 0, 0, 5, 2, 5, 5, 1, 5, 2, 2, 1, 5, 5, 1, 5...
## $ ps_ind_02_cat <fct> 2, 1, 4, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1...
## $ ps_ind_03 <int> 5, 7, 9, 2, 0, 4, 3, 4, 3, 2, 2, 3, 1, 3, 11, 3, 1, ...
## $ ps_ind_04_cat <fct> 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0...
## $ ps_ind_05_cat <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1...
## $ ps_ind_06_bin <lgl> FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE,...
## $ ps_ind_07_bin <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE...
## $ ps_ind_08_bin <lgl> FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE...
## $ ps_ind_09_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALS...
## $ ps_ind_10_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
## $ ps_ind_11_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
## $ ps_ind_12_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
## $ ps_ind_13_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
## $ ps_ind_14 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ ps_ind_15 <int> 11, 3, 12, 8, 9, 6, 8, 13, 6, 4, 3, 9, 10, 12, 10, 5...
## $ ps_ind_16_bin <lgl> FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TR...
## $ ps_ind_17_bin <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS...
## $ ps_ind_18_bin <lgl> FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS...
## $ ps_reg_01 <dbl> 0.7, 0.8, 0.0, 0.9, 0.7, 0.9, 0.6, 0.7, 0.9, 0.9, 0....
## $ ps_reg_02 <dbl> 0.2, 0.4, 0.0, 0.2, 0.6, 1.8, 0.1, 0.4, 0.7, 1.4, 0....
## $ ps_reg_03 <dbl> 0.7180703, 0.7660777, NA, 0.5809475, 0.8407586, 2.33...
## $ ps_car_01_cat <fct> 10, 11, 7, 7, 11, 10, 6, 11, 10, 11, 11, 11, 6, 9, 1...
## $ ps_car_02_cat <fct> 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1...
## $ ps_car_03_cat <fct> NA, NA, NA, 0, NA, NA, NA, 0, NA, 0, NA, NA, NA, 0, ...
## $ ps_car_04_cat <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 9, 1, 0...
## $ ps_car_05_cat <fct> 1, NA, NA, 1, NA, 0, 1, 0, 1, 0, NA, NA, NA, 1, NA, ...
## $ ps_car_06_cat <fct> 4, 11, 14, 11, 14, 14, 11, 11, 14, 14, 13, 11, 11, 6...
## $ ps_car_07_cat <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ ps_car_08_cat <fct> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0...
## $ ps_car_09_cat <fct> 0, 2, 2, 3, 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2...
## $ ps_car_10_cat <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ ps_car_11_cat <fct> 12, 19, 60, 104, 82, 104, 99, 30, 68, 104, 20, 36, 1...
## $ ps_car_11 <int> 2, 3, 1, 1, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, 1, 2, 3, 2...
## $ ps_car_12 <dbl> 0.4000000, 0.3162278, 0.3162278, 0.3741657, 0.316069...
## $ ps_car_13 <dbl> 0.8836789, 0.6188165, 0.6415857, 0.5429488, 0.565831...
## $ ps_car_14 <dbl> 0.3708099, 0.3887158, 0.3472751, 0.2949576, 0.365102...
## $ ps_car_15 <dbl> 3.605551, 2.449490, 3.316625, 2.000000, 2.000000, 3....
## $ ps_calc_01 <dbl> 0.6, 0.3, 0.5, 0.6, 0.4, 0.7, 0.2, 0.1, 0.9, 0.7, 0....
## $ ps_calc_02 <dbl> 0.5, 0.1, 0.7, 0.9, 0.6, 0.8, 0.6, 0.5, 0.8, 0.8, 0....
## $ ps_calc_03 <dbl> 0.2, 0.3, 0.1, 0.1, 0.0, 0.4, 0.5, 0.1, 0.6, 0.8, 0....
## $ ps_calc_04 <int> 3, 2, 2, 2, 2, 3, 2, 1, 3, 2, 2, 2, 4, 2, 3, 2, 2, 1...
## $ ps_calc_05 <int> 1, 1, 2, 4, 2, 1, 2, 2, 1, 2, 3, 2, 1, 1, 1, 1, 1, 3...
## $ ps_calc_06 <int> 10, 9, 9, 7, 6, 8, 8, 7, 7, 8, 8, 8, 8, 10, 8, 9, 10...
## $ ps_calc_07 <int> 1, 5, 1, 1, 3, 2, 1, 1, 3, 2, 2, 2, 4, 1, 2, 5, 6, 2...
## $ ps_calc_08 <int> 10, 8, 8, 8, 10, 11, 8, 6, 9, 9, 9, 10, 11, 8, 6, 10...
## $ ps_calc_09 <int> 1, 1, 2, 4, 2, 3, 3, 1, 4, 1, 4, 1, 1, 3, 3, 2, 3, 1...
## $ ps_calc_10 <int> 5, 7, 7, 2, 12, 8, 10, 13, 11, 11, 7, 8, 9, 8, 12, 1...
## $ ps_calc_11 <int> 9, 3, 4, 2, 3, 4, 3, 7, 4, 3, 6, 9, 6, 2, 4, 5, 3, 9...
## $ ps_calc_12 <int> 1, 1, 2, 2, 1, 2, 0, 1, 2, 5, 3, 2, 3, 0, 1, 2, 3, 1...
## $ ps_calc_13 <int> 5, 1, 7, 4, 1, 0, 0, 3, 1, 0, 3, 1, 3, 4, 3, 6, 1, 3...
## $ ps_calc_14 <int> 8, 9, 7, 9, 3, 9, 10, 6, 5, 6, 6, 10, 8, 3, 9, 7, 8,...
## $ ps_calc_15_bin <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRU...
## $ ps_calc_16_bin <lgl> TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, T...
## $ ps_calc_17_bin <lgl> TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ...
## $ ps_calc_18_bin <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE...
## $ ps_calc_19_bin <lgl> FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FA...
## $ ps_calc_20_bin <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE...
## $ dset <fct> train, train, train, train, train, train, train, tra...
1.488.028 observações e 60 variáveis, divididas em:
Como as variáveis estão codificadas e não se sabe seus significados e relações entre si, o estudo irá dividir por tipo: binário, categórico, variáveis numéricas inteiras e contínuas. Estas plotagens serão utilizadas para visualização completa da distribuição das variáveis no conjunto de dados.
Especialmente em conjunto de dados relacionados a seguros, fraudes, etc, é importante ter ferramentas de visualização de distribuição sempre em mãos, uma vez que não são raras variáveis com taxas-base desequilibradas.
Observa-se claramente a existencia de variáveis desequilibradas, especialmente a ind_10, ind_11, ind_12 e ind_13.
A visualização ficou comprometida devido a presença de categorias com contagem desequilibrada. Este problema de leitura pode ser evitado com a utilização de escala em log10 no eixo Y, mas deve-se ter em mente que as diferenças de alturas das barras em níveis mais altos do eixo Y não são proporcionais em termos absolutos.
Percebe-se que alguns atributos possuem apenas 2 categorias e NA. Caso os metadados estivessem disponíveis e com isso o significado dos valores NA, tais categorias poderiam ser convertidas em binários ou receberem tratamento específico.
Aparentemente existe um assimetria maior que zero (cauda direita) para algumas variáveis, como calc_10, calc_11 e calc_14 e cauda a esquerda para outras, como calc_08 e calc_06.
Variáveis com maior nível de distorção, especialmente calc_01, calc_02 e calc_03.
## # A tibble: 2 x 2
## target percentage
## <fct> <dbl>
## 1 0 96.4
## 2 1 3.64
Como esperado, o problema a ser solucionado possui taxas-base altamente desequilibradas, e precisa ser considerado na análise de desempenho do algoritmo.
Uma análise combinatória dos valores NA possibilita avaliar a ocorrência simultânea de NAs em diferentes variáveis. Os traços vermelhos significam que o NA ocorre concomitantemente com outra variável. Vale ressaltar que maior concomitância não equivale a maior frequência de NA, como observado na análise:
As barras vermelhas representam a quantidade de NAs em cada variável.
Sem os metadados não é possível avaliar o significado destes NAs. Caso soubéssemos que para uma determinada variável numérica o NA significa zero ou que para uma categoria o NA representa "Não existe" poderia ser substituído. Em um segundo cenário um pouco mais delicado, onde tem-se conhecimento de que o NA em uma determinada coluna é simplesmente um valor não preenchide que deveria constar, poderiam ser traçadas estratégias como: substituição pela mediana, pela moda da categoria, pela moda da categoria em um determinado grupo, entre outras opções.
## 2.410359 % dos valores no conjunto de treinamento são missing
## 2.453096 % dos valore no conjunto de teste são missing
Será classificado a porcentagem de acionamentos para cada variável a fim de determinar a relevância das categorias com a variável alvo. De forma complementar, será plotado margens de erro com base na confiança binomial de 95%, a partir da taxa de acionamentos e não acionamentos.
Observa-se que, com exceção dos atributos ind_10, ind_11 e ind_13, o restante aparentemente possui uma relação direta de uma das suas categorias com o acionamento do seguro.
p1 <- train %>%
group_by(ps_ind_16_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_16_bin, frac_claim, fill = ps_ind_16_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p2 <- train %>%
group_by(ps_ind_17_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_17_bin, frac_claim, fill = ps_ind_17_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p3 <- train %>%
group_by(ps_ind_18_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_18_bin, frac_claim, fill = ps_ind_18_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p4 <- train %>%
group_by(ps_calc_15_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_15_bin, frac_claim, fill = ps_calc_15_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p5 <- train %>%
group_by(ps_calc_16_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_16_bin, frac_claim, fill = ps_calc_16_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p6 <- train %>%
group_by(ps_calc_17_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_17_bin, frac_claim, fill = ps_calc_17_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p7 <- train %>%
group_by(ps_calc_18_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_18_bin, frac_claim, fill = ps_calc_18_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p8 <- train %>%
group_by(ps_calc_19_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_19_bin, frac_claim, fill = ps_calc_19_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
p9 <- train %>%
group_by(ps_calc_20_bin, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_20_bin, frac_claim, fill = ps_calc_20_bin)) +
geom_col() +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "gray30") +
theme(legend.position = "none") +
labs(y = "Acionamentos [%]")
layout <- matrix(c(1,2,3,4,5,6,7,8,9,9),2,5,byrow=TRUE)
multiplot(p1, p2, p3, p4, p5, p6, p7, p8, p9, layout=layout)Nesta segunda metade das variáveis binárias, somente a ind_16 e a ind_17 possuem relações sigfinativas com o acionamento do seguro.
Nesta análise, observa-se um fato interessante: a alta quantidade de acionamentos nos NA.
Tal fato pode significar uma possível correlação entre a INEXISTÊNCIA das categorias ind_02, ind_04 e car_01 com o acionamento do seguro.
Poucas relações observáveis, possíveis correlações somente em car_06 e car_11
p1 <- train %>%
group_by(ps_ind_01, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_01, frac_claim)) +
geom_point(color = "chartreuse3") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "navy") +
theme(legend.position = "none") +
labs(x = "ps_ind_01", y = "Acionam. [%]")
p2 <- train %>%
group_by(ps_ind_03, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_03, frac_claim)) +
geom_point(color = "chartreuse3") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "navy") +
theme(legend.position = "none") +
labs(x = "ps_ind_03", y = "Acionam. [%]")
p3 <- train %>%
group_by(ps_ind_14, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_14, frac_claim)) +
geom_point(color = "chartreuse3") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "navy") +
theme(legend.position = "none") +
labs(x = "ps_ind_14", y = "Acionam. [%]")
p4 <- train %>%
group_by(ps_ind_15, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_ind_15, frac_claim)) +
geom_point(color = "chartreuse3") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "navy") +
theme(legend.position = "none") +
labs(x = "ps_ind_15", y = "Acionam. [%]")
p5 <- train %>%
filter(!is.na(ps_car_11)) %>%
group_by(ps_car_11, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_car_11, frac_claim)) +
geom_point(color = "chartreuse3") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "navy") +
theme(legend.position = "none") +
labs(x = "ps_car_11", y = "Acionam. [%]")
layout <- matrix(c(1,1,2,2,3,4,4,5),2,4,byrow=TRUE)
multiplot(p1, p2, p3, p4, p5, layout=layout)Percebe-se que ind_03 e car_11 quando diferente de 0 possuem uma taxa de acionamento consideravelmente menor. Já ind_01 aparente uma tendência crescente, enquanto ind_15 uma tendência decrescente.
p1 <- train %>%
group_by(ps_calc_04, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_04, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_04", y = "Acionam. [%]")
p2 <- train %>%
filter(ps_calc_05 < 6) %>%
group_by(ps_calc_05, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_05, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_05", y = "Acionam. [%]")
p3 <- train %>%
filter(ps_calc_06 > 2) %>%
group_by(ps_calc_06, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_06, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_06", y = "Acionam. [%]")
p4 <- train %>%
filter(ps_calc_07 < 8) %>%
group_by(ps_calc_07, target) %>%
count() %>%
spread(target, n) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_07, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_07", y = "Acionam. [%]")
p5 <- train %>%
filter(ps_calc_08 > 2) %>%
group_by(ps_calc_08, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_08, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_08", y = "Acionam. [%]")
p6 <- train %>%
group_by(ps_calc_09, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_09, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_09", y = "Acionam. [%]")
p7 <- train %>%
ggplot(aes(ps_calc_10, fill = target)) +
geom_density(alpha = 0.5, bw = 0.4) +
theme(legend.position = "none")
p8 <- train %>%
ggplot(aes(ps_calc_11, fill = target)) +
geom_density(alpha = 0.5, bw = 0.4) +
theme(legend.position = "none")
p9 <- train %>%
filter(ps_calc_12 < 9) %>%
group_by(ps_calc_12, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_12, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_12", y = "Acionam. [%]")
p10 <- train %>%
filter(ps_calc_13 < 12) %>%
group_by(ps_calc_13, target) %>%
count() %>%
spread(target, n, fill = 0) %>%
mutate(frac_claim = `1`/(`1`+`0`)*100,
lwr = get_binCI(`1`,(`1`+`0`))[[1]]*100,
upr = get_binCI(`1`,(`1`+`0`))[[2]]*100
) %>%
ggplot(aes(ps_calc_13, frac_claim)) +
geom_point(color = "navyblue") +
geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.5, size = 0.7, color = "chartreuse3") +
theme(legend.position = "none") +
labs(x = "ps_calc_13", y = "Acionam. [%]")
p11 <- train %>%
ggplot(aes(ps_calc_14, fill = target)) +
geom_density(alpha = 0.5, bw = 0.4)
layout <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,11),3,4,byrow=TRUE)
multiplot(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, layout=layout)Nenhuma relação significativa. As distribuições de acionamento para calc_10, calc_11, calc_14 estão quase que perfeitamente sobrepostas. Como observado pelas margens de erro, para as demais variáveis, as diferenças entre as taxas podem ser atribuidas a variações aleatórias.
Poucas diferenças. Especialemnte nas variáveis reg_01, reg_02 e reg_03, percebe-se que valores mais baixos tem taxas menores de acionamento de seguro (cor rosa acima), enquanto valores mais altos apresentam taxas menores (cor azul acima).
Poucas diferenças nas taxas.
Variáveis binárias possuem diferença significativa nas taxas, por volta de 1 a 2% (que para a taxa-base é considerável). No entando, as variáveis calc binárias não mostraram impacto direto no acionamento, tais quais as variavels calc numéricas.
As maiores variações se encotram nas variáveis categóricas e numéricas, especialmente no que tange a existência ou não de algumas categorias, como observado no aumento das taxas de acionamentos em dados NA categóricos e na diminuição da taxa quando algumas variáveis numéricas são diferentes de zero.
As variáveis float possuem uam diferença pouco significativa nas taxas. Contudo, esta diferença pequena pode ser utilizada na modelagem e com os rótulos reais, isso um pode ter um significado pertinente.
De início, as variáveis calc são candidatas fortes ao descarte.
Nesta etapa serão avaliadas as variáveis em conjunto e suas correlações entre si. A anonimização dos dados é, definitivamente, um obstáculo para as conclusões a respeito destas correlações e atrasa consideravelmente o processo. Entretanto, esta etapa é fundamental para a modelagem pois poderão ser evidenciados casos de multicolinearidade.
A princípio, será utilizada a matriz de correlação de todas as variáveis como ponto de partida pava investigações mais específicas. A matriz indica quais variáveis possuem maior correlação entre si (positiva ou negativa). Quanto mais forte a cor e o tamanho do círculo, mais forte a correlação.
Para cálculo das correlações, as variáveis binárias foram (re)transformadas em inteiros (1 e 0), bem como as categóricas. As variáveis calc, ind_10, ind_11 e car_10 foram removidas da análise uma vez que não possuem relação direta com a diferenças na taxa de acionamento do seguro.
Vale lembrar que devido ao alto nível de desequilíbrio da variável alvo e probabilidade a priori de acionamento muito baixa (quantidade de acionamentos / quantidade de não acionamentos), as correlações entre a variável alvo e outras não são sequer visíveis na matriz.
O método utilizado é a correlação de Spearman e a intensidade da cor representa a força da correlação (de 0 a 1 positivo ou negativo), sendo 1 uma correlação perfeita.
Existe uma alta correlação entre as variáveis _car, possívelmente especificações técnicas dos veículos.
As variáveis selecionadas para investigação mais aprofundada foram: ind_12, ind_14, ind_16, ind_17, ind_18, reg_02, reg_03, car_12, car_13, car_14, car_15,car_02 e car_04.
Observa-se uma correlação quase perfeita entre ind_12 e ind_14 (0,94), que é entre uma variável binária e uma variável numérica inteira de 0 a 5, com grande maioria dos indivíduos como 0 (observar plots individuais);
As correlações entre _reg e _car se mostram interessantes, especialmente por serem variáveis contínuas;
As maiores correlações negativas (inversamente proporcionais) estão entre ind_16, ind_17 e ind_18;
Para não poluir muito o diagrama, será feito com as variáveis binárias e car_02 e car_04 com as principais categorias.
Este modelo de diagrama representa a proporção das conexões entre as variáveis, pode ser trabalhado com diferentes combinações. A combinação apresentada foi a melhor em questões visuais, e percebe-be a quantidade de acionamentos é maior quando as variáveis ind_17 e ind_18 são FALSAS, bem como a car_02 == 1 e car_04 == 0.
A priori, serão analisadas os pares de variáveis com correlação maior que 0,5.
Observa-se claramente uma relação entre as variáveis ind_12 e ind_14, sendo uma correlação perfeita quando ind_14 == 0 e ind_12 == FALSO, tal quando ind_14 == 4 e ind_12 == VERDADEIRO. Os valores intermediários de ind_14 (1, 2 e 3) também são diretamente proporcionais à taxa de VERDADEIRO em ind_12.
As duas correlações binárias se mostram similares, com altas taxas quando: -ind_16 = VERDADEIRO e ind_18 = FALSO -ind_16 = VERDADEIRO e ind_17 = FALSO
e nenhuma observação de -ind_16 = TRUE e ind_18 = TRUE -ind_16 = TRUE e ind_17 = TRUE
Este é um exemplo de análise que pode facilmente ser explicada com dados não anonimizados.
Entre as variáveis _reg, existe uma tendência linear positiva, contudo a grande variação de valores em reg_03 não deixa isso perfeitamente claro.
As correlações entre car_12 e car_13 e car_14 são, como esperado a partir das correlações, bastante claras. O que chama a atenção são outliers evidentes que podem, inclusive, estar puxando para baixo o indicador de correlação da matriz que ja é bastante alto.
A partir de agora, serão analisadas correlações entre variáveis categóricas e divididas em um grid entre uma variável binária (ind_14) e a variável alvo (acionamento 0-não e 1-sim)
Este plot é um pouco confuso e de início pode parecer que demanda muita análise pra pouco significado. Contudo, assim como os outros plots apresentados, tendo a posse dos dados com seus devidos significados, estas ligeiras diferenças são, provavelmente, insights não-obvios e com alto valor agregado.
No grid acima observa-se que a medida que ind_16 se torna VERDADEIRO, bem como a medida que o acionamento se torna 1 - SIM, diminuem a quantidade de categorias de ind_14. Observa-se que pra ind_16 = VERDADEIRO, só existe ind_14 0, 1 e 2, já para ind_16 = VERDADEIRO && acionamento = 1, só existe ind_14 0 e 1.
Uma segunda observação é que ind_14 = 0 possui distribuições diferentes dos demais níveis (1,2,3 e 4), estando deslocado para valores mais altos de car_14.
A distribuição de car_14 é bastante diferente entre os 4 quadrantes do grid, o que deve ser observado seu significado.
Devido a esta diferenciação da variável car_14 não observada nos plots individuais, será plotada esta variável em relação às variáveis numérias mais relacionadas ao acionamento do seguro (ind_01, ind_03, ind_05 e car_11, que apesar de categória, sua alta quantidade de categorias chamou a atenção)
Neste plot, as variações na variável car_14 são mais presentes quando alteramos os valores das classes car_11, mudando significativamente sua distribuição, bem como da variável ind_01, formando novos picos.
As variáveis ind_03 e ind_15 não modificam tanto o formato da distribuição da variável car_14, apenas intensificando alguns picos, mas sem movimentações a se alertar.
Referências e leituras sugeridas
https://www.kaggle.com/c/porto-seguro-safe-driver-prediction
https://medium.com/@arthurlambletvaz/one-hot-encoding-o-que-%C3%A9-cd2e8d302ae0