Detecção de transações fraudulentas em cartões de crédito

Pandas Couple
8 min readApr 1, 2021
Photo by rupixen.com on Unsplash

O problema de fraudes em cartões de crédito não é novo, e infelizmente tem aumentado significativamente durante a pandemia da COVID-19.

Para as instituições financeiras é importante reconhecer as transações fraudulentas afim de evitarem prejuízos. Por outro lado é importante também que os clientes não tenham transações comuns bloqueadas, por erro de classificação, gerando constrangimento e stress.

O investimento na área de detecção de fraudes através da Inteligência Artificial vem crescendo ano após ano, já que o prejuízo é considerável.

O desafio é aprimorar cada vez mais os algoritmos de Machine Learning, tendo em vista o grande volume de dados com base histórica, uma vez que um pequeno aumento no desempenho do modelo anterior pode gerar uma economia de milhões de reais.

Esse é um projeto completo de Machine Learning, que vai englobar as seguintes etapas:

  • coleta de dados
  • limpeza dos dados
  • exploração dos dados
  • preparação dos dados
  • modelos de machine learning
  • avaliação do algoritmo

Então, vamos lá!

Obtenção dos Dados

Os dados utilizados nesse projeto foram obtidos do dataset Credit Card Fraud Detection disponível do Kaggle, que contém dados de transações feitas com cartão de crédito por usuários europeus num período de 2 dias em setembro de 2013.

O dataset é extremamente desbalanceado, apresentando 492 transações fraudulentas de 284.807 transações totais, o que representa apenas 0,17% do total.

Outro detalhe que é importante ressaltar é que devido a questões de segurança e confidencialidade, não são disponibilizados os nomes originais das colunas nem muitos detalhes sobre os dados. Por isto, todas as variáveis (colunas) receberam nomes de V1 a V28.

Por fim, as variáveis são todas numéricas, e essas citadas acima foram transformadas pela Análise de Componentes Principais (Principal Component Analysis — PCA), sendo as variáveis V1 a V28 os próprios componentes principais obtidos com a PCA.

Análise Exploratória dos Dados

O primeiro passo é realizarmos a análise exploratória dos dados, afim de obtermos mais informações e conhecermos melhor os dados a serem trabalhados.

Variáveis e entradas

Vamos verificar:

  • o tamanho do dataframe
Entradas:   284807 
Variáveis: 31
  • os nomes e tipos das variáveis (colunas)
Time      float64
V1 float64
V2 float64
V3 float64
V4 float64
V5 float64
V6 float64
V7 float64
V8 float64
V9 float64
V10 float64
V11 float64
V12 float64
V13 float64
V14 float64
V15 float64
V16 float64
V17 float64
V18 float64
V19 float64
V20 float64
V21 float64
V22 float64
V23 float64
V24 float64
V25 float64
V26 float64
V27 float64
V28 float64
Amount float64
Class int64
dtype: object
  • uma lista das variáveis e suas descrições

Time: tempo em segundos entre cada transação e a primeira transação no dataset.

V1 a V28: variáveis numéricas resultado da transformação pela PCA que por questões de privacidade não tem mais informações.

Amount: valor da transação na moeda local (euros)

Class: é a variável alvo, que recebe:

0 -> para transação não fraudulenta e

1 -> para transação fraudulenta.

  • as primeiras entradas do dataframe
5 primeiras linhas do dataframe

Valores ausentes

Um dos passos mais importantes na fase de análise exploratória é obter a proporção de valores ausentes do dataset, uma vez que isso indica a qualidade do mesmo.

Para isso, vamos imprimir a proporção de valores ausentes em cada coluna, em ordem decrescente:

Class     0.0
V14 0.0
V1 0.0
V2 0.0
V3 0.0
V4 0.0
V5 0.0
V6 0.0
V7 0.0
V8 0.0
V9 0.0
V10 0.0
V11 0.0
V12 0.0
V13 0.0
V15 0.0
Amount 0.0
V16 0.0
V17 0.0
V18 0.0
V19 0.0
V20 0.0
V21 0.0
V22 0.0
V23 0.0
V24 0.0
V25 0.0
V26 0.0
V27 0.0
V28 0.0
Time 0.0
dtype: float64

Conforme visto, o dataset não possui valores ausentes, o que indica ótima qualidade. Sendo assim, podemos dar continuidade a nossa análise exploratória sem a necessidade de passar por uma etapa de tratamento de dados ausentes.

Resumo estatístico

Vamos imprimir o resumo estatístico:

resumo estatístico

Conforme o resumo estatístico apresenta, a variável Amount apresenta valores baixos na maioria das transações, como era esperado.

No geral, as variáveis não apresentam nenhum valor discrepante que necessite atenção no momento.

Distribuição das variáveis

Vamos plotar um gráfico de barras para visualizar a distribuição das variáveis do dataset:

gráfico de barras da distribuição das classes (dataset desbalanceado)

O gráfico confirma o desbalanceamento do dataset, conforme apontado anteriormente, onde as transações fraudulentas representam apenas 0,17% do total.

Essa discrepância interfere no desempenho do modelo de machine learning e afim de evitar isto, será necessário balancear os dados. Mais adiante lidaremos com essa questão.

Vamos agora plotar histogramas para as duas variáveis Timee Amount:

  • histograma do tempo entre cada transação e a primeira transação (em segundos)
histogramas do tempo para fraude e não fraude

Os histogramas nos mostram mais uma vez que a distribuição está desbalanceada, uma vez que a escala das transações fraudulentas (máximo de 40) é bem menor comparada a escala das transações não fraudulentas (máximo de 12000).

  • histograma do valor da transação (em euros)
histograma do valor da transação para fraude e não fraude

Os histogramas nos mostram a diferença nos valores das transações:

  • O valor das transações fraudulentas, em sua maioria, não ultrapassam 250 euros.
  • Já o valor das transações não fraudulentas, em sua maioria, não ultrapassam 2500 euros.

Vamos visualizar agora a distribuição da variável Amount através de boxplots :

boxplot do valor das transações

É possível perceber que as duas classes tem distribuições diferentes.

Correlação entre variáveis

Neste momento procuramos avaliar a intensidade das relações entre duas variáveis, e isso é feito através do coeficiente de correlação.

Para isto, iremos criar uma matriz de correlação e gerar um heatmap a partir dessa matriz, para melhor visualização.

heatmap da correlação entre as variáveis (dados desbalanceados)

A partir desse heatmap podemos perceber algumas relações entre as variáveis:

  • As variáveis V1 a V28 não estão correlacionadas entre si, somente tem relação com as variáveis Time, Amount e Class;
  • As variáveis Time, Amount e Class não tem correlação entre si;
  • Das correlações positivas, podemos destacar as da variável Amount com V7 e V20;
  • Das correlações negativas, podemos destacar a da variável Amount com V2 e V5 e da variável Time com V3.

Porém a maioria das variáveis não possui relação com as outras, o que nos indica mais uma vez o desbalanceamento do dataset. Isso será tratado na etapa seguinte.

Preparação dos dados

Daremos início agora à preparação dos dados para que possam ser usados no modelo de machine learning.

Essa é uma etapa muito importante, visto que a falta ou má preparação dos dados pode nos guiar a caminhos de insucesso com os modelos construídos.

Faremos os seguintes pré-processamentos dos dados:

  • padronização das colunas Time e Amount

Conforme visto anteriormente, as variáveis V1 a V28 já são resultado de uma transformação PCA e as únicas variáveis que precisamos padronizar são a Time e Amount. Faremos isso com o StandardScaler.

  • separação dos dados entre feature matrix e target vector

Separamos os dados em coluna alvo (y) e o restante do dataset sem a coluna alvo (X).

  • divisão do dataset entre treino e teste

Dividimos o dataset em treino (X_train e y_train) e teste (X_test e y_test) com o train_test_split. Essa divisão nos permite treinar um conjunto de dados diferente dos que serão usados para testar o modelo. Por padrão, o conjunto de teste é igual a 25% do conjunto total, sendo o conjunto de treino 75%.

Utilizamos o shuffle para garantir que os dados serão "embaralhados" antes da divisão e o stratify para manter a proporção de valores categóricos y.

  • balanceamento dos dados

Conforme verificado anteriormente, precisamos balancear os dados para que o modelo seja realmente eficaz. Com os dados desbalanceados, o modelo pode ter uma alta acurácia porém não ser eficaz. Usamos o RandomUnderSampler e vamos plotar novo gráfico de barras para visualizar esse balanceamento.

gráfico de barras da distribuição das classes (dataset balanceado)

Por fim, vamos plotar uma nova matriz de correlação entre as variáveis.

heatmap da correlação entre as variáveis (dados balanceados)

A nova matriz de correlação mudou completamente após o balanceamento do dataset, fica claro que as variáveis tem fortes relações positivas e negativas entre si.

Agora nossos dados estão devidamente preparados para serem treinados no nosso modelo de Machine Learning.

Modelos de Machine Learning

Faremos dois modelos de machine learning do tipo classificação:

  • regressão logística e
  • árvore de decisão

Ambos os modelos irão classificar as transações em fraude ou não fraude.

Regressão Logística

Começaremos com o modelo de regressão logística.

Abaixo, faremos os seguintes passos:

  • escolher e importar o modelo
  • instanciar e definir os hiperparametros do modelo
  • treinar o modelo
  • fazer previsões com os dados de teste
  • avaliar o desempenho do modelo
desempenho do modelo de regressão linear

Obtivemos bons resultados no geral com o método de regressão logística:

  • Acurácia de 96%
  • Precisão, recall e f1-score com taxas interessantes
  • AUC de 0.949, uma boa métrica para modelos de classificação.

De toda forma, testaremos outro modelo de classificação para fins de comparação.

Árvore de Decisão

Vamos fazer agora o modelo de árvore de decisão (decision tree).

Abaixo, faremos os seguintes passos:

  • escolher e importar o modelo
  • instanciar e definir os hiperparametros do modelo
  • treinar o modelo
  • fazer previsões com os dados de teste
  • avaliar o desempenho do modelo
desempenho do modelo de árvore de decisão
  • plotar a árvore de decisão
árvore de decisão

Com o método de árvore de decisão, obtivemos resultados bem parecidos com o método anterior:

  • Acurácia de 98%
  • Precisão, recall e f1-score com taxas interessantes também
  • AUC de 0.945, uma boa métrica para modelos de classificação.

Conclusão

Após concluirmos todas as etapas de um projeto de Machine Learning , foi possível concluir que ambos os modelos de classificação testados nos mostraram desempenho global muito parecidos e satisfatórios.

Enquanto a acurácia de um é levemente superior, a AUC é levemente menor, e as métricas precisão e recall também sofreram pequenas alterações, fazendo dos dois modelos boas soluções para o problema em questão.

É claro que apesar do bom desempenho atingido, ainda há espaço para realizar uma validação cruzada (cross-validation) ou outro tipo de validação, que pode diminuir as chances de overfitting do modelo. Testar diferentes hiperparametros e até testar outros modelos de classificação, afim de aprimorar ainda mais o desempenho global são possibilidades também, com o objetivo final de aumentar a detecção de fraudes e assim evitá-las.

Obrigada !

Obrigada pelo seu tempo, espero que tenha gostado!

Se tiver qualquer dúvida, feedback ou sugestão vou adorar que você entre em contato comigo pelo LinkedIn.

Para ver esse e outros projetos completos, acesse meu portfólio completo no GitHub.

Valeu!

--

--

Pandas Couple

Casal de Cientistas de Dados, contribuindo para a comunidade de Data Science.