Detecção de Fraude em Cartões de Crédito
Como as instituições financeiras utilizam Machine Learning para evitar prejuízos
Neste projeto, iremos abordar o problema das fraudes em cartões de crédito, uma das principais preocupações das instituições financeiras como bancos e fintechs. Apenas no Brasil, cerca de 12,1 milhões de pessoas já foram vítimas de algum tipo de fraude financeira no último ano. Traduzindo em valores, os golpes financeiros ultrapassaram a cifra de R$ 1,8 bilhão de prejuízo por ano para os últimos 12 meses.

Dentre essas fraudes, aquelas envolvendo cartões de crédito são de grande relevância uma vez que a sua não-detecção acarretará em prejuízos consideráveis, tanto para o consumidor quanto para a instituição financeira.
Outro fator a ser considerado é a quantidade de falsos positivos, ou seja, aquelas vezes em que você tentou fazer uma compra e teve seu cartão bloqueado preventivamente, o que provavelmente gerou estresse e constrangimento.
Por todos esses motivos, o investimento na área de detecção de fraudes por meio de Inteligência Artificial vem crescendo a cada ano, representando uma grande oportunidade em Data Science.
Dispondo de grandes volumes de dados como base histórica, um algoritmo de Machine Learning apenas um pouco melhor que os anteriores já representa uma economia de milhões de Reais. E esse é o desafio, aprimorar cada vez mais o uso de algoritmos visando inibir ou evitar transações fraudulentas.
Entendendo os Dados
O conjunto de dados foi coletado e analisado durante uma colaboração de pesquisa da Worldline e do Machine Learning Group da ULB (Université Libre de Bruxelles) sobre mineração de big data e detecção de fraude. O dataset representa as operações financeiras que aconteceram no período de dois dias, onde foram classificadas 492 fraudes em meio a quase 290 mil transações.
Outro detalhe interessante é que as features são todas numéricas, e foram descaracterizadas (por problemas ligados à privacidade e segurança). Assim, os nomes das colunas são representados por [V1,V2,V3…,V28]

Na página original dos dados, é informado que o conjunto de dados é extremamente desbalanceado, onde as fraudes representam apenas 0,17% do total. Também é importante informar, que as variáveis passaram por uma transformação conhecida como Análise de Componentes Principais (Principal Component Analysis — PCA).
A PCA permite a redução da dimensionalidade enquanto mantém o maior número possível de informações. Para conseguir isso, o algoritmo encontra um conjunto novo de recursos — os chamados componentes.
Esses componentes são em número menor ou igual às variáveis originais. No caso deste projeto, os componentes achados pela transformação da PCA são as próprias colunas [V1,V2,V3…,V28].
Somente duas variáveis não foram modificadas, Time
e Amount
. Time
contém os segundos decorridos entre cada transação e a primeira transação no conjunto de dados. Amount
é a quantia realizada na transação.
Por fim, temos a coluna Class
, de forma binária, onde o valor “1” representa fraude cometida na operação realizada.

Com os dados importados para dentro de uma estrutura Dataframe— e não havendo a necessidade de mais nenhum ajuste ou configuração nesta etapa, pode-se iniciar uma análise exploratória dos dados a fim de preparar um modelo de Machine Learning.
Análise Exploratória
Objetivos da Análise:
- Ver o resumo estatístico do dataframe
- Verificar se há valores ausentes
- Verificar se há valores duplicados
- Plotar um gráfico de barras (ou countplot) para ver o balanceamento do dataset
- Verificar distribuição dos dados não padronizados (
Time
eAmount
)
Análise inicial dos dados:
Abaixo, podemos verificar que foram 284.807 lançamentos, dos quais nenhum era nulo e nem duplicado. É possível observar também, que temos 31 colunas, todas do tipo float, com exceção de Class
que é do tipo int.

Distribuição da variável Class:
Na distribuição de Class
, confirmamos a informação inicial do desequilíbrio dos dados, sendo 0,17% das transações representadas como casos de fraude.

Distribuição de Amount e Time:
Da distribuição de Amount
foi verificada uma concentração de transações abaixo de 500, porém nenhum valor será considerado outlier para preservar o dataset. Assim será feito também com Time
.

Depois de realizado uma breve análise exploratória, verificamos que o dataset não possuía valores duplicados e nem faltantes e o número de fraudes representa uma proporção muito baixa.
Para um resultado relevante o nosso modelo precisa de um equilíbrio dos dados. Neste caso a acurácia não terá um valor expressivo, sendo necessárias as análises da Precisão, Recall e F1-score.
Preparação dos Dados
Nesta fase serão realizadas as seguintes etapas:
- Padronização dos dados que ainda não haviam sido pré-processados (
Time
eAmount
) - Balancear o conjunto de dados (técnica escolhida: subsample)
- Verificar se houve mudança na correlação das features
Dados após serem padronizados:
Foram feitas as padronizações de Amount
e Time
, para que o nosso modelo de Machine learning trabalhe todos os dados na mesma escala.

Distribuição de Class após equalização dos dados:
Para equalizar os dados, reduzimos a quantidade de casos não-fraude para a mesma quantidade de casos de fraude. Assim evitamos viés de que a possibilidade de fraude seja quase remota. Essa redução foi de forma aleatória, falaremos mais dessa aleatoriedade na análise final.

Diferença da matriz de correlação do dataset original e do dataset padronizado e equilibrado:

Do pré-processamento foi feito a padronização das variáveis Time
e Amount
. Além disso, foi utilizada a técnica de subsample para balancear os dados, diminuindo a quantidade de transações não fraudadas.
Como resultado, percebesse nitidamente a diferença da correlação entre as features após a padronização e balanceamento do dataset.
Modelo de Machine Learning
Sabendo que o resultado desejado é binário, “1” para fraude e “0” para não-fraude, o objetivo dessa fase foi construir um modelo para Classificação, utilizando Regressão Logística através da biblioteca Scikit-Learn.

A Scikit-Learn é uma biblioteca de aprendizado de máquina de código aberto para a linguagem de programação Python.
Com essa biblioteca, já estão implementados diversos métodos, algoritmos e técnicas para criação de modelos de classificação e entre outros.
Basicamente, para a criação desse modelo, foi dividido o dataset em dados para treinamento e dados para teste. A proporção utilizada foi 80% dos dados para treinamento da Regressão Logística e 20% para o teste.
Segue abaixo o resultado.
Avaliando o desempenho do modelo
Como havia sido dito, a métrica acurácia não é tão relevante porque os dados estavam desbalanceados. O foco será na Precisão, Recall, F1-Score e AUC.
Para verificar o desempenho do modelo foi criado um Relatório de Classificação e uma matriz de confusão.


Mais preciso numa avaliação final
Como foi utilizado um balanceamento dos dados, a ordem das transações foi alterada aleatoriamente, esse mesmo processo foi repetido diversas vezes para identificar se o modelo apresentou um resultado positivo por pura sorte, ou se aplicado com diferentes ordens de dados, o resultado seria diferente.
Para isso foram criados 4 boxplots, cada um com a quantidade de vezes que o mesmo processo foi repetido. O objetivo é descobrir se houve alteração na distribuição de falsos negativos (Casos de fraude não detectados).

Como pode ser observado, a média se manteve próxima de 2,52%, a mediana também não demonstrou alteração, ou seja, apesar da aleatoriedade da escolha dos dados para balancear o dataset, os resultados para falso negativo se mantiveram quase idênticos.
Como o objetivo é ser conservador, verificamos que o maior valor para falsos negativos foi de 10,53%, após o mesmo processo ter sido repetido 11110 vezes.
Conclusão
Por fim, utilizamos um modelo de Classificação através da Regressão Logística, foram evitadas exclusões de features e outliers devido o sigilo dos dados, que no final apresentou bons resultados. Foram eles:
- Precisão: 99%
- Recall: 92%
- F1-Score: 95%
- Acurácia: 96%
- AUC: 96%
A precisão representa que entre todas as classificações de classe positivo que o modelo fez, 99% delas estavam corretas.
Do Recall, dentre todas as situações de classe positivo como valor esperado, 92% estão corretas e o F1-Score seria a média harmônica entre precisão e recall.
Todos essas formas de avaliação apresentaram bons resultados, sendo resumida pela acurácia de 96%, lembrando que como os dados foram balanceados, vamos focar nas outras medidas.
Por último a AUC (Area Under the ROC Curve) de 96%, que mede a qualidade das previsões do modelo.
Dessas medidas, considero a mais importe o Recall, pois ele é usado em situações em que os falsos negativos são considerados mais prejudiciais que os falsos positivos. Neste caso, um falso negativo representa o prejuízo das instituições financeiras.
Como o nosso modelo prevê um falso negativo máximo de aproximadamente 10,53%, considerando a hipótese, conforme o estudo deste caso, de que ocorram aproximadamente 492 casos em dois dias, seriam evitados aproximadamente 80.141 casos de fraude de cartão de crédito no período de um ano.
Considerações Finais
Existem diversas formas de analisar esse dataset, assim como diversos modelos de Machine learning que podem ser apresentados.
O objetivo é demonstrar como o aprendizado de máquinas pode ser importante como ferramenta para a resolução de problemas.
Segue o link do Linkedin para demais interações ou dúvidas do assunto e, o Github para quem desejar visualizar os códigos utilizados na construção do modelo.
Linkedin: https://www.linkedin.com/in/bruno-brasil-8a34101b6/
Github: https://github.com/brunobf09