Conteúdo

Funções em Python para cálculo de Weight of Evidence (WoE) e Information Value (IV)

   17 Abr, 2023     14 min leitura

Aprenda a calcular Weight of Evidence (WoE) e Information Value (IV) em Python para seleção de variáveis em regressão logística, utilizando exemplos práticos com o dataset Titanic.

O Weight of Evidence (WoE) e o Information Value (IV) são métricas amplamente utilizadas em problemas de classificação binária, especialmente em modelos de regressão logística, análise de risco de crédito e scorecards.

Essas métricas auxiliam na avaliação:

  • do poder preditivo de uma variável;
  • da relação entre categorias e o evento de interesse;
  • da qualidade das transformações aplicadas às variáveis.

Durante alguns projetos em Python, senti falta de funções simples e reutilizáveis para calcular WoE e IV de maneira prática. Por isso, decidi desenvolver minhas próprias funções para:

  • variáveis categóricas;
  • variáveis contínuas;
  • geração de tabelas consolidadas com WoE e IV.

Neste post, apresento essas funções utilizando o clássico conjunto de dados Titanic.

O que é WoE?

O Weight of Evidence (WoE) mede a relação entre a distribuição de eventos e não eventos em uma categoria específica.

\[WoE = \ln\left(\frac{\%\,\text{não evento}}{\%\,\text{evento}}\right)\]

Valores positivos indicam maior concentração de não eventos, enquanto valores negativos indicam maior concentração de eventos.

O que é IV?

O Information Value (IV) mede o poder preditivo de uma variável.

\[IV = \sum (\%\,\text{não evento} - \%\,\text{evento}) \times WoE\]

Uma interpretação comum do IV é:

IVInterpretação
< 0.02Sem poder preditivo
0.02 – 0.1Fraco
0.1 – 0.3Médio
0.3 – 0.5Forte
> 0.5Muito forte

WoE e IV para variáveis discretas

Comecei desenvolvendo uma função para variáveis discretas e, a partir dela, fui refinando a abordagem. Talvez isso também te incentive a criar suas próprias funções e aprofundar suas análises de dados.

Em seguida, utilizei dados da competição Titanic - Machine Learning from Disaster para aplicar a função de WoE e IV em Python. Os resultados foram bastante interessantes:

Survived01DistrWoEIVIV_total
female0.1475410.6812870.216562-1.5298770.8165651.341681
male0.8524590.3187132.6746880.9838330.5251161.341681
C0.1366120.2735290.499442-0.6942640.0950570.122728
Q0.0856100.0882350.970249-0.0302030.0000790.122728
S0.7777780.6382351.2186380.1977340.0275920.122728

A função gerou uma tabela que evidencia claramente os valores de WoE e IV para cada categoria, permitindo compreender melhor quais variáveis têm maior capacidade de discriminar o evento de interesse.

Se você estiver trabalhando com esse mesmo conjunto de dados (ou qualquer outro), recomendo fortemente testar essa abordagem. Trata-se de uma ferramenta bastante útil para exploração de dados e melhoria de modelos preditivos.

WoE e IV para variáveis contínuas

No caso de variáveis contínuas, o processo se torna um pouco mais desafiador, principalmente na definição da melhor estratégia de discretização. Isso porque diferentes problemas podem exigir diferentes formas de binning.

Após algumas tentativas e rascunhos, optei por utilizar a divisão em decis, o que permite uma análise mais estável da distribuição e, caso necessário, a agregação posterior em quartis ou outros agrupamentos.

Essa escolha resultou em uma abordagem mais interpretável e consistente para o cálculo de WoE e IV em variáveis contínuas.

A função final passou a gerar tabelas mais estruturadas, facilitando a análise do poder preditivo de cada faixa das variáveis:

variávelfaixa01distrWoEIV
Age<=[14.]0.0582880.1315790.442987-0.8142140.06
Age[14.] a [19.]0.0965390.0994150.971070-0.0293560.00
Age[19.] a [22.]0.0874320.0555561.5737700.4534740.01
Age[22.] a [25.]0.0801460.0760231.0542240.0528050.00
Age[25.] a [28.]0.0673950.0701750.960383-0.0404240.00
Age[28.] a [31.8]0.0728600.0760230.958386-0.0425050.00
Age[31.8] a [36.]0.0856100.1286550.665425-0.4073300.02
Age[36.] a [41.]0.0619310.0555561.1147540.1086340.00
Age[41.] a [50.]0.0856100.0906430.944474-0.0571270.00
Agetotal1.0000001.0000001.0000000.0000000.09
Fare<=[7.55]0.1438980.0380123.7856241.3312110.14
Fare[7.55] a [7.8542]0.1111110.0760231.4615380.3794900.01
Fare[7.8542] a [8.05]0.1584700.0555562.8524591.0481810.11
Fare[8.05] a [10.5]0.1092900.0526322.0765030.7306850.04
Fare[10.5] a [14.4542]0.0874320.1052630.830601-0.1856060.00
Fare[14.4542] a [21.6792]0.0928960.1081870.858662-0.1523800.00
Fare[21.6792] a [27.]0.0783240.1345030.582324-0.5407290.03
Fare[27.] a [39.6875]0.1038250.0994151.0443590.0434030.00
Fare[39.6875] a [77.9583]0.0765030.1374270.556679-0.5857660.04
Faretotal1.0000001.0000001.0000000.0000000.37

Função consolidada para variáveis contínuas e categóricas

Após superar os desafios iniciais, decidi avançar na implementação e desenvolver uma função consolidada capaz de calcular WoE e IV tanto para variáveis categóricas quanto contínuas em uma única estrutura.

Essa abordagem simplifica o processo de análise, permitindo uma visão unificada do poder preditivo das variáveis.

A tabela final obtida é apresentada abaixo:

variávelfaixa01distrWoEIVIV_total
female 0.1475410.6812870.216562-1.5298770.8165651.341681
male 0.8524590.3187132.6746880.9838330.5251161.341681
C 0.1366120.2735290.499442-0.6942640.0950570.122728
Q 0.0856100.0882350.970249-0.0302030.0000790.122728
S 0.7777780.6382350.9702490.1977340.0275920.122728
Age<=[14.]0.0582880.1315790.442987-0.8142140.060000 
Age[14.] a [19.]0.0965390.0994150.971070-0.0293560.000000 
Age[19.] a [22.]0.0874320.0555561.5737700.4534740.010000 
Age[22.] a [25.]0.0801460.0760231.0542240.0528050.000000 
Age[25.] a [28.]0.0673950.0701750.960383-0.0404240.000000 
Age[28.] a [31.8]0.0728600.0760230.958386-0.0425050.000000 
Age[31.8] a [36.]0.0856100.1286550.665425-0.4073300.020000 
Age[36.] a [41.]0.0619310.0555561.1147540.1086340.000000 
Age[41.] a [50.]0.0856100.0906430.944474-0.0571270.000000 
Agetotal1.0000001.0000001.0000000.0000000.090000 
Fare<=[7.55]0.1438980.0380123.7856241.3312110.140000 
Fare[7.55] a [7.8542]0.1111110.0760231.4615380.3794900.010000 
Fare[7.8542] a [8.05]0.1584700.0555562.8524591.0481810.110000 
Fare[8.05] a [10.5]0.1092900.0526322.0765030.7306850.040000 
Fare[10.5] a [14.4542]0.0874320.1052630.830601-0.1856060.000000 
Fare[14.4542] a [21.6792]0.0928960.1081870.858662-0.1523800.000000 
Fare[21.6792] a [27.]0.0783240.1345030.582324-0.5407290.030000 
Fare[27.] a [39.6875]0.1038250.0994151.0443590.0434030.000000 
Fare[39.6875] a [77.9583]0.0765030.1374270.556679-0.5857660.040000 
Faretotal1.0000001.0000001.0000000.0000000.370000 

Interpretando os resultados

Observando os resultados obtidos no conjunto de dados Titanic, é possível extrair algumas conclusões importantes sobre o poder preditivo das variáveis:

  • A variável Sex apresentou IV superior a 1.3, indicando altíssimo poder preditivo.
  • A variável Fare apresentou IV próximo de 0.37, sugerindo forte capacidade de discriminação.
  • Já a variável Age apresentou IV mais baixo (0.09), indicando menor contribuição preditiva quando analisada isoladamente.

Essas métricas são amplamente utilizadas em tarefas de modelagem preditiva e podem apoiar decisões como:

  • seleção de variáveis;
  • construção de scorecards;
  • transformação de variáveis para regressão logística;
  • identificação de relações não lineares entre variáveis e o evento de interesse.

Conclusão

O uso de WoE e IV pode melhorar a interpretabilidade e a capacidade preditiva de modelos de regressão logística.

Além de auxiliar na seleção de variáveis, essas métricas permitem compreender como diferentes faixas ou categorias influenciam a probabilidade do evento de interesse.

As funções desenvolvidas neste post permitem:

  • calcular WoE e IV para variáveis categóricas;
  • discretizar variáveis contínuas automaticamente;
  • consolidar os resultados em uma única tabela para análise exploratória.

Código e materiais complementares

Os códigos utilizados neste post estão disponíveis no GitHub:

O repositório contém as funções desenvolvidas para o cálculo de WoE e IV, incluindo:

  • variáveis categóricas;
  • variáveis contínuas;
  • função consolidada;
  • exemplos de aplicação no dataset Titanic.

Referências:

  • Anderson, Raymond. The Credit Scoring Toolkit: Theory and Practice for Retail Credit Risk Management and Decision Automation. Oxford University Press, 2007.

  • Siddiqi, Naeem. Credit Risk Scorecards: Developing and Implementing Intelligent Credit Scoring. Wiley, 2006.

  • Sudarson Mothilal Thoppay (2015). woe: Computes Weight of Evidence and Information Values. R package version 0.2. https://CRAN.R-project.org/package=woe

  • Thilo Eichenberg (2018). woeBinning: Supervised Weight of Evidence Binning of Numeric Variables and Factors. R package version 0.1.6. https://CRAN.R-project.org/package=woeBinning