Uma introdução ao tema de Importância de Variáveis

Matheus Nascimento
13 min readJul 29, 2021

Olá pessoal, meu nome é Matheus, sou formado em Estatística pela Universidade Federal de Uberlândia e atuo como Cientista de Dados no Mercado Pago/Mercado Livre. Hoje em dia, dentro de uma grande companhia que toma suas decisões a partir de resultados de times de modelagem, o tema Importância de variáveis surge em dois principais cenários: o técnico e o de negócio.

Cenário técnico

Seu papel como cientista é entender o problema que lhe foi proposto. Esse entendimento é gerado através das variáveis disponíveis para a resolução do problema.

Saber quais features mais influenciam um determinado score de um modelo supervisionado, quais são altamente correlacionadas e podem causar sérios problemas de multicolinearidade em uma regressão linear múltipla, entender quais podem ser úteis em um feature engineering devem ser tarefas rotineiras e obrigatórias na vida de um analista que busca mais do que apenas “vomitar” um score ao final de um estudo.

Quando digo “vomitar” me refiro ao hábito comum que existe em nosso meio de simplesmente gerar um modelo com ótimas métricas, mas não saber explicar o que o modelo quer dizer e, consequentemente, não conseguir gerar acionáveis para o negócio. Seja um Cientista de Dados curioso e integrado com as outras áreas, porque é isso que vai te fazer evoluir. Saber aplicar um modelo em Python qualquer um faz depois de ler um tutorial de 10 minutos. Entender um modelo e conseguir explicá-lo para um time de marketing por exemplo é o que vai te diferenciar.

Cenário de negócios

É fundamental em nossa profissão a habilidade de se conectar com uma área operacional que, na enorme maioria das vezes, não conhece a parte técnica desenvolvida por um cientista de dados. Um modelo não é nada sem acionáveis que consigam transformar boas métricas matemáticas (AUC, ACC, Recall, Precision, etc…) em boas métricas de negócio (clientes ativos por mês, renda gerada, número de vendas, etc…).

Sendo assim, tenha certeza que seu/sua chefe responsável por decidir os acionáveis irá te perguntar quais as variáveis mais importantes no modelo criado.

Ah, e se você não sabe o que é um acionável, nada mais é que transformar os seus insights como cientista em ações práticas. Por exemplo, você faz um gráfico simples e levanta uma hipótese de que pessoas mais velhas compram mais lenços em um supermercado. Um acionável para isso seria, por exemplo, colocar algum produto destinado ao público idoso do lado dos lenços para tentar aumentar a conversão deste outro produto também.

O que é importância de variáveis?

Como estatístico, sinto que a expressão importância de variáveis tem uma intersecção com a expressão seleção de variáveis. Por exemplo, quando eu realizo um teste de hipótese para determinar se um parâmetro X é igual a 0 ou não dentro de um algoritmo de seleção de variáveis (um Forward/Backward por exemplo) é como se a estatística do teste fosse um score me indicando o quão longe/perto aquela feature está de ser estatisticamente (com alguma significância alfa) igual a 0.

Ora, se meu teste concluir que eu tenho um parâmetro de alguma variável igual a 0, além de não selecionar ela para o ajuste do modelo, de alguma maneira estou dizendo que ela não é importante para explicar meu target.

Portanto, trouxe aqui um desenho de como eu enxergo o tema de uma maneira geral.

Como podem ver, dei a minha definição do que entendo por importância de variáveis e separei em 4 formas que costumo utilizar para realizar meus estudos, dando alguns exemplos de cada categoria. Reparem que na definição criada, falo em valor predito, o que pressupõe a existência de um modelo para a medição da importância de uma determinada variável. Isso acontece para todos os exemplos que dei, menos para estatística descritiva, porém decidi colocá-la aqui pois é incrível como podemos ter insights muito fortes sobre variáveis com simples gráficos.

Parâmetros de modelos clássicos

Para explicar como verificar a importância de variáveis através de parâmetros de modelos clássicos de regressão, vamos montar um exemplo prático com a linguagem R. Suponha que queremos determinar o percentual de gordura corporal de uma pessoa baseado em três variáveis explicativas: diâmetro do tríceps (cm), diâmetro da coxa (cm), diâmetro do antebraço (cm). Segue o código para modelagem de uma regressão linear múltipla utilizando dados de 20 pessoas.

### Definição das variáveis explicativas
triceps<-c(22.5, 20.1, 18.4, 22.8, 21.4, 21.4, 19.9, 22.2, 20.1, 19.3, 20.6, 18.7, 21.6, 19.8, 21.3, 21.3, 20.8, 19.5, 20.1, 20.7)
coxa<-c(26.8, 24, 22.1, 27.2, 25.2, 25.7, 23.9, 26.5, 23.9, 23, 24.5, 22.1, 25.7, 23.6, 25.6, 25.4, 24.8, 23, 23.9, 24.7)antebraco<-c(8.7, 7.6, 7.5, 8.8, 8.5, 8.4, 8, 8.8, 8.3, 7.7, 8, 7.5, 8.3, 8, 8.6, 8.1, 7.7, 7.7, 8.2, 8.2)### Definição da variável resposta
gordura<-c(22.9, 19.8, 8, 28.6, 19.2, 20.6, 18.3, 30.1, 16.9, 12.7, 21.8, 13.9, 22.6, 18.1, 22.7, 20.8, 25.4, 11.5, 11.7, 15.3)
### Ajuste modelo
ajuste<-lm(formula=gordura~triceps+coxa+antebraco)
summary(ajuste)

O modelo resultante do ajuste possui um coeficiente de determinação R² = 0.73 com os seguintes coeficientes:

Preste bastante atenção aos sinais de cada coeficiente estimado para realizar a interpretação. Sinal positivo indica uma relação diretamente proporcional com o target, enquanto sinal negativo indica uma relação inversamente proporcional.

Vamos tentar interpretar os coeficientes obtidos através de uma situação fictícia entre um gestor e um analista de uma companhia especializada em técnicas de redução de gordura corporal.

Observe que a afirmação do Analista no último balãozinho foi baseada nos sinais dos coeficientes estimados, porém não faz o menor sentido prático, ou seja, espera-se que regiões com maiores diâmetros também possuam maiores percentuais de gordura naturalmente.

Para tentar entender o que aconteceu com esse modelo completamente contra intuitivo, vamos testar a significância ("importância") dos parâmetros estimados. O comando summary(ajuste) apresentado anteriormente nos traz isso automaticamente no formato de um teste T. Seguem as hipóteses testadas e o respectivo resultado:

Hipóteses testadas para i = 0, 1, 2, 3.

Adotando um nível de significância de 5%, rejeitamos a hipótese nula para p-valores (Pr(>|t|)) menores que 0,05. Assim, concluiríamos que apenas para o Intercepto rejeitamos a hipótese nula e portanto o parâmetro é diferente de 0 (em outras palavras importante para o modelo).

Teríamos então o seguinte modelo:

Estamos dizendo então que para qualquer pessoa, o percentual de gordura do corpo é o mesmo e, ainda por cima, negativo??? Mais uma vez chegamos a um resultado absurdo mesmo testando os parâmetros com um teste estatístico adequado. O que está acontecendo aqui se chama MULTICOLINEARIDADE.

Multicolinearidade nada mais é que a existência de variáveis altamente correlacionadas dentro de um modelo. Vamos entender de maneira prática como isso provoca um efeito de confusão na interpretação dos parâmetros estimados.

Observe que no exemplo acima, ambas as funções fictícias possuem coeficientes (na Opção 1, temos 40.000 e 20.000, enquanto na Opção 2 temos 60.000 e -20.000) que chegam ao resultado correto do valor do imóvel, porém na Opção 2, temos um coeficiente negativo para a variável banheiro. Faz sentido que a cada banheiro adicionado a um imóvel seu valor seja decrescido em 20 mil reais? Não.

Apesar de ser uma situação completamente ilustrativa e não um ajuste real de um modelo, é provável que as variáveis quantidade de quartos e quantidade de banheiros sejam altamente correlacionados positivamente, uma vez que conforme mais quartos uma casa tem, espera-se que o número de banheiros também aumente.

Para resolver o problema da multicolinearidade, temos basicamente duas maneiras, uma eu chamo de informal e outra de formal.

Código em R para cálculo do VIF.

Informalmente, podemos simplesmente checar as correlações entre as variáveis explicativas e ir testando retirar uma a uma aquelas que possuem alta correlação com outra variável.

Formalmente, temos o VIF (Variance Inflation Factor). Com o VIF calculado, basta retirar do modelo as variáveis com VIF > 10. Fazendo isto no nosso problema e retirando o intercepto, chegamos a um modelo que faz sentido prático em termos de interpretabilidade de parâmetros, sem multicolinearidade e com alto valor de R².

Precisamos apenas do antebraço para explicar 94% da gordura corporal das pessoas. Além disso, fica claro que a cada 1 cm de diâmetro, espera-se que a gordura corporal aumente em 2,36 pontos percentuais.

Algoritmo

Backward é um algoritmo de seleção de variáveis muito ensinado nas faculdades de Estatística. Como todo algoritmo nada mais é que uma receita, vou explicá-lo através de 3 passos simples:

Passo 1: Ajuste do modelo.

No primeiro passo, realizaremos o ajuste do modelo mais complexo, isto é, com todas as variáveis presentes dentro do dele. No caso da imagem acima, temos 3 variáveis explicativas.

Passo 2: Cálculo da Estatística F para cada parâmetro estimado.

No segundo passo, para cada um dos 3 parâmetros estimados, calcularemos uma estatística F parcial, que pode ser interpretada como uma divisão de variâncias, ou seja, o quanto cada variável tem de papel na variância total do modelo ou ainda o quanto cada uma é importante.

SQREG_c se refere à Soma dos Quadrados da Regressão do Modelo Completo, enquanto SQREG_r é a mesma coisa porém para o Modelo Reduzido, isto é, o modelo sem a variável a qual estamos tentando ver a importância.

Com os três F parciais (cada um correspondente a uma das 3 variáveis do modelo), vamos para o terceiro passo.

Teste F.

No Passo 3, selecionamos o menor valor de F parcial calculado, isto é, o F correspondente à variável menos “importante”. Basta agora utilizar este valor para efetuar um teste de hipótese baseado em uma distribuição F. Caso não tenhamos evidências estatísticas suficientes para retirar a variável do modelo, nosso algoritmo acabou e nenhuma variável deve ser considerada “não importante” (se a menos importante já é importante, todas as outras também são). Caso contrário, voltamos ao passo 1 sem a variável retirada e repetimos os 3 passos até que sobrem apenas variáveis estatisticamente significantes segundo nosso teste.

Scores de Modelos de Machine Learning

No mundo da internet, Feature Importance é um termo muito associado ao algoritmo nativo da famosa biblioteca de Python scikit-learn. De fato, entender que diferentes variáveis impactam em intensidades diferentes a predição de um modelo pode ser considerado o filé mignon da ciência de dados, justamente por permitir que um resultado multivariado complexo possa ser explicado à áreas de negócios com pouca ou nenhuma expertise em dados.

Com a crescente utilização do feature importance nativo dos algoritmos de árvore do scikit-learn, vários estudos foram feitos para entender de fato o seu poder.

De maneira geral, esse algoritmo é baseado no decrescimento médio do grau de impureza da árvore. Alguns problemas foram detectados e comprovados, tanto que na documentação oficial já vemos referências a eles assim como uma possível solução.

Documentação oficial do feature importance de árvores do scikit-learn.

Como podemos ver na imagem acima, o algoritmo pode levar a conclusões erradas para variáveis de alta cardinalidade, seja ela numérica contínua ou categórica com muitos grupos. A própria documentação já sugere uma outra implementação chamada de Permutation feature importance, a qual vale a pena saber mais sobre.

Porém, meu objetivo aqui é mostrar como alternativa o SHAP Value, que também ficou bem famosinho em redes sociais como o Linkedin.

De maneira simples o SHAP Value poder ser definido como:

Vamos tentar entender o SHAP de maneira intuitiva. Imagine que temos um problema de regressão em que estamos tentando prever o preço de residências de uma determinada cidade. Para isso, temos 3 variáveis: Nº quartos, Nº infiltrações, Bairro.

Com essas 3 variáveis, conseguimos montar 2³ = 8 combinações de modelo, incluindo um apenas com o intercepto. Aqui nos deparamos com o principal problema do SHAP Value na minha opinião. Para o cálculo do SHAP, todas as combinações de modelo devem ser ajustadas, ou seja, a complexidade cresce exponencialmente e ainda pode ser agravada pela complexidade do modelo (Ex.: É menos custoso computacionalmente ajustar uma Regressão Linear Múltipla do que uma Rede Neural Profunda).

8 possíveis combinações de modelos.

Com os 8 modelos ajustados por algum método qualquer (Regressão Linear, XGBoost, Redes Neurais, etc…), podemos calcular o valor predito Y para cada observação da base de dados. Supondo que para Nº de quartos = 3, Nº de infiltrações = 10 e Bairro = Santa Edwirges, temos os seguintes valores preditos de preço em cada modelo:

Predições de cada modelo.

Vamos tentar entender o impacto da variável Nº de quartos comparando a diferença das previsões entre os modelos que possuem essa variável e os modelos que não possuem essa variável:

Impacto nas predições da variável Nº de Quartos.

Observando a variação nas predições descrita nas setas vermelhas, seria razoável dizer que a contribuição geral da variável Nº de quartos ou seu SHAP é a média das contribuições, ou seja, (30.000 + 55.000 + 25.000 + 27.000)/4 = R$ 34.250.

De fato, intuitivamente esse seria um possível valor SHAP para esta variável. Porém, em cada uma das linhas do diagrama acima, temos modelos com diferentes números de variáveis. Na primeira linha, um modelo com 0 variáveis, na segunda linha, três modelos com 1 variável, na terceira linha, três modelos com 2 variáveis e, por fim, na quarta linha, um modelo com 3 variáveis. Dessa maneira, a contribuição dada em cada linha vermelha tem que ser ponderada pela quantidade de variáveis em cada modelo.

Cada seta do diagrama representa uma interação. Setas na mesma linha devem possuir o mesmo peso, isto é, em uma mesma linha, a soma dos pesos deve valer 1. Na prática temos:

Diagrama com os pesos para o cálculo do SHAP.

Portanto, o SHAP ou a importância ou o impacto da variável Nº de quartos é:

Gráficos

Gráficos são provavelmente as ferramentas que mais utilizo no meu dia a dia, muito porque são um instrumento muito intuitivo para qualquer área de negócio.

É claro que na hora de colocar um gráfico em uma apresentação executiva, devemos deixá-lo completo, ou seja, colocar legenda, título, nome nos eixos, enfeitá-lo com cores da sua empresa, etc. Porém, como cientista, meu objetivo aqui é mostrar que plots simples podem te ajudar muito no entendimento da sua modelagem.

Coloquei dois tipos de gráficos que utilizo como exemplo:

1 — Gráficos de estatística descritiva: Qualquer tipo de gráfico simples descritivo. Apesar de aqui não ter nenhum modelo/predição envolvida, gráficos descritivos nos apresentam sim fortes indícios do que esperar nas predições e, por isso, os coloquei aqui como uma maneira de verificar importância de variáveis. É muito raro uma variável ser importante na predição de um modelo e não existir indícios prévios em gráficos descritivos dessa importância.

O gráfico ao lado, por exemplo. Ele é super simples, mas nos indica uma variável com bom poder de discriminação para algum modelo.

Suponha que no eixo X seja a quantidade de meses desde que um cliente se cadastrou em um banco, enquanto no eixo Y temos a porcentagem de clientes de cada grupo que continua sendo cliente no mês seguinte. Por exemplo, clientes com 2 meses de casa formam um grupo em que quase 60% retornam no próximo mês.

Repare que a diferença entre clientes novos (0 meses) e clientes mais antigos (6 meses) é de 40% contra 90%, isto é, esta variável mostra indícios de que consegue separar grupos muito distintos e, por isso deverá ser importante em um modelo linear por exemplo.

O tamanho de cada bolinha também nos trás uma informação de como os clientes estão distribuídos segundo a variável do eixo X.

Assim, com um plot super simples, já entendemos um pouco da distribuição dos dados e do possível poder preditivo da variável.

2 — Gráfico dos valores preditos: Esse gráfico nada mais é do que um gráfico de valores preditos contra valores observados. Minha sugestão aqui são 3 linhas: uma de score predito para o modelo sem a variável que desejamos analisar, uma de score predito para o modelo com a variável e outra com o valor observado. Vejamos na prática:

Seguindo o exemplo do cliente de banco, imagine que no gráfico ao lado estamos analisando se o cliente ativou a função crédito do seu cartão (1) ou não (0) (eixo X). Em preto temos a média de clientes que retornou de fato, em vermelho o score médio do modelo em uma base de validação quando o treinamos sem essa variável, enquanto em azul é o score médio nessa mesma base de validação quando a variável é incluída no treinamento.

O objetivo é chegar em um modelo que chegue o mais próximo possível da bolinha preta. Perceba que para o grupo que NÃO ativou a função crédito (0), a bolinha vermelha, preta e azul se sobrepõem, ou seja, essa variável não nos trás ganho nenhum na previsão deste grupo.

Já para o grupo que ativa a função crédito (1), observe que o modelo treinado com a variável realmente se aproxima mais do que de fato aconteceu, ou seja, a variável trouxe um ganho de previsão neste grupo. Porém, este ganho é mínimo, já que a bolinha vermelha já estava bem próxima do valor real.

Portanto, eu não acrescentaria esta variável ao modelo, pois ela não parece trazer ganhos significativos de previsão, o que é equivalente a dizer que ela não parece ser importante.

Observe agora, outra variável binária qualquer. Para o grupo 0, as previsões já acertam os valores reais, mas vamos analisar o grupo 1. Colocar a variável no modelo traz a bolinha azul pra bem perto da bolinha preta, enquanto a bolinha vermelha está distante. Esta variável eu colocaria no modelo para melhorar a minha previsão, por exemplo.

Conclusão

Bom pessoal, era isso que eu queria mostrar pra vocês como uma introdução ao tema de importância de variáveis. Os conceitos que eu mostrei aqui representam a minha visão sobre o assunto como Estatístico e Cientista de Dados.

Qualquer dúvida, perguntem nos comentários. Espero que tenham gostado e até a próxima!

--

--