Detecção de fraudes em cartões de crédito com machine learning

Matheus Buniotto
9 min readMar 30, 2021

--

No ano de 2020 foi um ano de repleto de transformações digitais. Devido à pandemia e o isolamento social, ocorreu uma explosão no consumo de serviços de streaming, delivery e também nas compras realizadas através da internet.

Esse aumento repentino nas compras e consumos de serviços online trouxeram algumas consequências indesejadas, uma delas foi o grande aumento no número de fraudes e golpes no ambiente digital.

Uma pesquisa realizada pela multinacional Visa aponta que o Brasil é o segundo pais da América Latina no ranking de fraudes no comércio virtual, perdendo apenas para o México.

Com o aumento do consumo em ambiente digital os criminosos também aumentaram os ataques na modalidade ‘phishing’, que cresceu cerca de 80% durante a pandemia. O Phishing é usado para roubar informações pessoais de usuários através de e-mails ou redes sociais fingindo ser uma empresa, ou serviço conhecido.

Uma das formas implementadas pelos Bancos e fintech’s para evitar que os clientes sejam vítimas de fraudes é a utilização de algoritmos que detectam comportamentos estranhos ou tentativa de fraude.

Nesse projeto, vamos utilizar algumas técnicas de classificação para detectar possíveis fraudes nos dados de cartão de crédito.

Obtenção dos dados

Os dados utilizados para esse projeto são de algumas empresas europeias de cartão de crédito. Apesar do grande volume de dados, representando um total de 284807 transações, as operações financeiras representam apenas um período de dois dias, no mês de setembro de 2013.

Dentre esse total de mais de 284 mil transações, apenas 492 foram transações fraudulentas. Nosso trabalho aqui, será utilizar as informações provenientes dessas 492 transações para que possamos criar um modelo de detecção de fraudes. Para isso, utilizaremos a variável Class, que representa se a transação foi fraudulenta ou não (1 para fraude e 0 caso não for).

Por motivos de confidencialidade e privacidade, todas as variáveis passaram por um processo de descaracterização, tendo seus nomes alterados por: V1,V2,V3… Outro detalhe importante é que os dados passaram por um processo de PCA (Análise de Componentes Principais), exceto as variáveis ‘Time’ e ‘Amount’, que representando sucessivamente o tempo decorrido entre cada transação e o valor da transação.

A análise de componentes principais é uma técnica da estatística multivariada que consiste em transformar um conjunto de variáveis originais em outro conjunto de variáveis de mesma dimensão denominadas de componentes principais. (VARELLA, Carlos Alberto Alves. Disponível em: Análise de Componentes Principais)

Os dados podem ser obtidos através do link: Dataset Credit Card

Etapas para resolução do problema

Antes de mais nada, serão definidas as etapas que serão seguidas para solução do problema:

  1. Definição do problema
  2. Análise exploratória
  3. Preparação dos dados
  4. Modelagem do algoritmo
  5. Avaliação

1. Definição do problema

Como descrito acima, as fraudes em cartões de créditos estão aumentando vertiginosamente. Uma forma que as empresas de cartões de créditos encontram para combater essa categoria de crime, é a criação de algoritmos para detecção de fraudes e transações suspeitas.

2. Análise Exploratória

Nessa etapa iremos explorar a fundo o conjunto de dados, com o intuito de extrair informações e “insights” que possam guiar nossa análise e a construção do algoritmo para detectar as fraudes nas transações dos cartões.

Primeiramente vamos entender qual o tamanho do nosso conjunto de dados, quantas entradas e quantas colunas ele possui.

O conjunto de dados possui 284807 entradas.
O conjunto de dados possui 31 variáveis.

Usando a função “.head” conseguimos avaliar as 5 primeiras entradas dos conjunto de dados. Aqui já conseguimos ver que os dados passaram pelo processo de PCA e somente as variáveis Time e Amount não foram pré-processadas.

Sabemos que os maiores problemas presentes nos conjuntos de dados são em relação à qualidade dos dados. Nessa etapa vamos verificar a quantidade de valores ausentes e nulos em nosso dataset.

nulos = df.isnull().sum()
print(nulos[nulos > 0])
Series([], dtype: int64)

O conjunto de dados não possui nenhum valor ausente ou nulo, resultado de um possível tratamento realizado anteriormente.

Utilizamos a função “ describe()”, que nos traz um “resumo estatístico” do conjunto de dados.

As informações estatísticas, como media, mediana, valores máximos, mínimos e quartis, que vão nos fornecer insighs importantes sobre o tema analisado. Além disso, podemos ter uma primeira ideia se existem alguns dados discrepantes que necessitem um tratamento mais apurado para que não tornem nossos resultados enviesados.

2.2 Visualização dos dados

Agora, vamos partir para a visualização dos dados do dataset. A visualização dos dados:

  • Ajuda identificar padrões
  • Facilita o tratamento da informação
  • Permite descobrir e visualizar as correlações
  • Nos permite interpretar e comunicar as informações de forma melhor

Como é a nossa distribuição de Classes?

In [10]:

print(df.Class.value_counts())
print("\nFraudes representam {:.2f}% do dataset.\n".format((df[df.Class == 1].shape[0] / df.shape[0]) * 100))
0 284315
1 492
Name: Class, dtype: int64
Fraudes representam 0.17% do dataset.

O conjunto de dados possui 492 entradas classificadas como Fraudes (Classe = 1), esse número representa apenas 0,17% dos dados do conjunto, que possui um total de 284807 entradas. Vamos gerar um gráfico para vermos essa distribuição.

Através desse gráfico e da análise preliminar vemos que o conjunto de dados é extremamente desbalanceado.

Agora, vamos analisar a distribuição das fraudes em relação ao tempo decorrido e ao valor da transação.

Podemos ver que a distribuição das transações não fraudulentas seguem uma ordem, com picos e baixas, seguindo a distribuição de consumo diário das pessoas. Já as distribuições fraudulentas, são mais constantes, não sofrendo variações com o tempo.

Analisando o gráfico vemos que a grande maioria das fraudes possui um valor menor que $500,00. Vamos analisar melhor a variável “Amount”, que representa o valor da transação.

Estatística para as transações de todo o conjunto de dados.

Estatística para as transações de todo o conjunto de dados.count    284807.000000
mean 88.349619
std 250.120109
min 0.000000
25% 5.600000
50% 22.000000
75% 77.165000
max 25691.160000
Estatística para as transações de todos as transações não fraudulentas.count 284315.000000
mean 88.291022
std 250.105092
min 0.000000
25% 5.650000
50% 22.000000
75% 77.050000
max 25691.160000
Estatística para as transações de todos as transações fraudulentas.count 492.000000
mean 122.211321
std 256.683288
min 0.000000
25% 1.000000
50% 9.250000
75% 105.890000
max 2125.870000

Vemos que os valores da transações fraudulentas x não fraudulentas:

  • As fraudes possuem um valor médio de 122,00 e as transações não fraudulentas possuem uma média de 250,00
  • A mediana das fraudes é de 9,25 versus uma mediana de 22,00 das transações consideradas não fraudulentas
  • Valor máximo de uma fraude foi de 2125,87 enquanto o valor máximo registrado para uma transação normal foi de 25691,16

Essas informações nos fornecem uma pista de sobre uma das características das fraudes em comparação a transações regulares.

Vamos investigar se nosso conjunto de dados possui alguma correlação entre as variáveis e a classe “fraude”.

Até o momento, não é possível detectar nenhuma correlação aparente, após um processamento e tratamento dos dados, vamos retorna à esse gráfico de correlação para analisar se houve algum avanço nessa investigação de correlações.

3. Preparação dos Dados

Nessa etapa trataremos nossos dados para que possamos treinar nosso Algoritmo e obter os melhores resultados possíveis. Anteriormente descobrimos que o conjunto de dados é desbalanceado e passou por um pré-processamento e normalização. Vamos adequar os dados para nossa análise.

  • Normalizar os dados que ainda não haviam sido pré-processados (Time e Amount)
  • Dividir o conjunto de dados entre treino e teste
  • Balancear o conjunto de dados

Dividiremos nosso conjunto de dados para treinamento do modelo e para o teste futuro.

Dados para Treino

Dados de treino são os dados utilizados pelo algoritmo de machine learning para criação do modelo de previsão/classificação.

Dados para Teste

Serão informados ao modelo após seu treinamento, simulando previsões reais que o modelo realizará, permitindo assim que o desempenho mais real seja avaliado.

Após realizar a divisão dos dados entre teste e treino, vamos normalizar os valores que não foram pré-processados anteriormente: Amount e Time. Faremos isso separadamente nos modelos de teste e treino, para que não haja interferência no nosso modelo de teste.

Além disso, iremos balancear os dados, como vimos anteriormente, as fraudes representam apenas 0,17% das transações do conjunto de dados. Aqui, vamos balancear as fraudes e não fraudes em nosso conjunto de treino. Para isso usaremos under-sampling para igualar a quantidade de Fraudes e Não Fraudes.

Através do gráfico verificamos que os dados foram balanceados corretamente no nosos conjunto de treino. Agora, vamos verificar novamente a correlação entre as variáveis.

Após a normalização e balanceamento dos dados, finalmente conseguimos ver as correlações apresetadas no conjunto de dados.

4. Modelo Machine Learning

Vamos escolher o modelo de classificação, treinar com nossos dados e verificar sua acertividade no conjunto de testes.

Modelo de Regressão Logistica

A regressão logística é um recurso que nos permite estimar a probabilidade associada à ocorrência de determinado evento em face de um conjunto de variáveis explanatórias. Vamos treinar nosso modelo e avaliar seu desempenho utilizando uma matriz de confusão. Além disso, vamos utilizar acurácia, recall e AUC, para avaliar o desempenho do nosso modelo.

Após o treinamento e a previsão do modelo, vamos analisar os dados de desempenho.

Relatório de Classificação:Acurácia de : 0.967

Recall de: 0.956

ROC AUC Score: 0.961

Modelo Árvore de Decisão

Nosso modelo poderia ser melhor? AVamos criar um modelo baseado em Árvore de decisão e comparar com nosso modelo anterior.

Uma arvore de decisão divide os dados em varios pontos de decisão. Estes pontos são chamados de “nós” e a partir deles uma decisão será tomada, seguir para um outro “ramo”, ou por outro.

Figura: Árvore de Decisão, fonte

Novamente, vamos verificar o relatório de desempenho do nosso modelo:

Relatório de Classificação:Acurácia de : 0.914

Recall de: 0.956

ROC AUC Score: 0.935

O desempenho do modelo de árvore de decisão é muito parecido com o de regressão logística.

Modelo Naive Bayes

Agora, vamos para nosso último modelo, o Naive Bayes.

O tal do Naive Bayes,age como um classificador e baseando-se na probabilidade de cada evento ocorrer, desconsiderando a correlação entre variáveis do conjunto de dados. Aqui, iremos utilizar o Gaussian Naive Bayes.

Relatório de Classificação:

Acurácia de : 0.974

Recall de: 0.889

ROC AUC Score: 0.931

Tabela de Comparação entre os modelos

Vamos compara o desempenho dos modelos:

De acordo com as métricas de desempenho, o modelo que melhor previu as fraudes, portanto, foi o mais apropriádo para solucação do problema, foi o de Regressão Logística.

Consclusões

Utilizando o conjunto de dados disponibilizado por algumas empresas européias de cartões de créditos, criamos nosso modelo de previsão de fraudes. Para isso, foi necessário uma análise do problema, exploração dos dados, tratamento e balanceamento dos dados, para que enfim, podéssemos treinar e testar nosso modelo de Machine Learning.

É claro, nosso modelo não é perfeito, havendo espaço para aprimoramentos e otimizações do modelo escolhido, mas, o modelo obteve um ótimo desempenho com os dados de teste apresentados.

Nesse artigo, vimos um pequeno pedaço de todo o esforço desprendido para a criação de algorítmos capazes de classificar um fraude nas transações de cartão de crédito. Nas aplicações do mundo real, esse trabalho existe uma constate melhoria e aprimoramento dos parâmetros do modelo.

Obrigado pela leitura :)

https://linktr.ee/matheusbuniotto

--

--

Matheus Buniotto

Compartilho um pouco dos meus estudos e projetos com dados! Atualmente trabalho como analista de Dados e BI com foco em marketing e produto.