Análise de Dados em Operadoras de Cartão de Créditos com a linguagem R

Neste artigo, vamos abordar um estudo de caso muito comum, que tem como objetivo demonstrar alguns aspectos pontuais e relevantes da análise de dados. Nesta análise veremos como trabalhar com variáveis categóricas e o tipo de transformação que devemos fazer nas variáveis para balanceá-las, finalizando com a construção de um modelo preditivo de Machine Learning ao longo do estudo.

o problema

Trabalharemos com um dataset que representa informações de uma operadora de cartão de crédito. No dataset são várias informações de clientes que adquiriram cartão com a operadora e, o intuito dessa análise, será identificar se esses clientes em algum momento do passado deram calote no pagamento da dívida do cartão.

calote na fatura — uma realidade comum

Portanto, com os dados em mãos, desejamos criar um modelo preditivo para prever se novos clientes poderão ou não dar o calote na operadora. Com isso, a operadora poderá decidir conceder ou não o cartão de crédito para o novo cliente. A aplicação da predição é feita tanto para o cliente novo na operadora, como para o cliente antigo que deseja um novo cartão.

1. definir o diretório de trabalho

Primeiramente, vamos definir o diretório de trabalho no R

2. instalar e carregar pacotes

Devemos instalar os respectivos pacotes que fornecem ferramentas para Machine Learning com a linguagem R e na sequência carregá-los. Uma vez instalados, só é necessário carregar ao início da sessão no RStudio.

3. carregar o dataset

Através dessa view podemos ver o LIMIT_BAL, que é basicamente o saldo da conta bancária dos clientes, sendo cada linha um cliente do passado. Vale ressaltar que por se tratar de Machine Learning, olhamos para o passado, no caso o que já aconteceu para prevermos o futuro.

Portanto, os clientes que já deram calote vão nos ajudar a definir se a operadora deverá ou não conceder cartão para novos clientes.

Voltando para View, temos o cliente n° 1, que possui um limite de 50.000, sexo, educação, estado civil, idade e várias idades referentes aos pagamentos, que são as informações da operadora. Ou seja, se foi feito o pagamento no 1°, 2°, 3° mês e assim por diante. Avançando a View podemos ver o valor a ser pago em BILL_AMTx e o PAY_AMTx referente ao valor pago efetivamente da fatura.

Ao chegar no final da View, temos a última coluna chamada default.payment.next.month, o valor default que se configura em pagamento ou calote. Nesse caso, podemos interpretar que o cliente foi pagando a fatura ao longo dos meses, tendo como valor 0 ou 1 para esse atributo, sendo o calote (1) ou quitação da dívida (0). Relembrando, esses clientes são do passado.

4. verificar balanceamento dos dados

Vamos verificar o balanceamento de uma variável específica com a função estatística skewness (curtose), para verificar se a distribuição normal é assimétrica.

5. criar histograma

Vamos verificar a curtose skewness e esse desbalanceamento, visualizando a distribuição dos dados em um histograma. Veja que temos valores de saldo LIMIT_BALL que variam de 0 até 1.000.000. Perceba que a maioria dos registros estão concentrados em uma determinada quantida, ou seja, se apresentamos os dados nesse formato ao algoritmo de Machine Learning, acabamos gerando um problema. O modelo aprenderá que, quanto menor o saldo, mais propenso está ao valor default — dar calote.

Não podemos deixar o modelo tendencioso para fazer a previsão. Caso contrário, quando um novo cliente for analisado com saldo bancário baixo, ele automaticamente não passará no crivo. Portanto, precisamos tratar esses dados antes de prosseguirmos.

Esse tipo de análise exploratória nos ajuda não apenas a compreender os dados, mas a identificar problemas nos dados.

6. sumarizar os dados

Ao sumarizar os dados, temos basicamente informação sobre valores mínimos, máximos, média, mediana, métricas estatísticas básicas.

7. visualizar tipo de dado

Outra função muito útil para qualquer linguagem, é detectar o tipo de dado que estamos trabalhando. Essa função nos possibilita tomar consciência se as variáveis estão sendo representadas de forma correta.

Com o comando str já conseguimos coletar alguns insights a respeito do conjunto que estamos manipulando. Veja a variável SEX — int, sexo como gênero não é uma variável quantitativa, sexo representa uma categoria. Portanto, precisamos realizar algum ajuste para informar à linguagem R que sexo não é um número inteiro. Desejamos manipular categorias!

Perceba que o “erro” vale para EDUCATION, MARRIAGE, AGE. São todas variáveis que, embora a linguagem R tenha detectado como valores numéricos, representam categorias. Não podemos esperar que ao receber o dataset ele virá limpo e belo à nossa disposição.

um problema de cada vez

  • Variáveis desbalanceadas
  • Variáveis categóricas que estão como numéricas

8. criar parâmetros de pré-processamento

O que queremos aqui é criar parâmetros para que possamos tirar esse desbalanceamento do conjunto de dados.

Esses foram os parâmetros usados para remover o desbalanceamento dos dados, ou seja, para reduzir o enviesamento dos dados — skewness.

9. transformar o dataset usando os parâmetros

Na sequência chamamos a função predict() para aplicarmos esses parâmetros preprocessParams ao conjunto de dados mydata.

10. sumarizar dados novamente

Agora vamos revisitar o dataset para visualizar a aplicação dos parâmetros. Ao rodar a função str( ), vejamos que os dados continuam com os mesmos tipos, ainda não foi feita essa alteração

11. rever skewness para verificar a distribuição

Veja só o skewness() agora, caímos de 0.99 de concentração para -0.02.

12. visualizar o ajuste dos parâmetros

Vamos reaplicar o histograma com o balanceamento feito.

Portanto, aplicamos uma técnica para que os dados ficassem numa escala adequada. ATENÇÃO — Não mudamos os dados, apenas mudamos a escala, a forma como os dados estão sendo apresentados.

Com isso feito, agora quando entregarmos esses dados ao modelo, vamos evitar que o modelo gere previsões tendenciosas.

um problema já foi resolvido

Agora nos resta transformar as variáveis que estão em numéricas, em categóricas. Se entregarmos ao modelo, as variáveis mencionadas anteriormente em formato numérico, ele vai processar como números e o resultado será insatisfatório. A ferramenta não pode advinhar de forma precisa o tipo dos dados.

13. transformar variáveis categóricas

Para transformar as variáveis em categóricas utilizamos a função factor(), o factor converte a variável especificada para fator desde que isso seja possível.

No nosso caso, temos algumas variáveis que são do tipo fator. A primeira variável default.payment.next.month é a nossa variável alvo, tendo apenas duas categorias 0|1, evidentemente é uma variável categórica. Ela ao tempo que é convertida, é gravada na própria variável e no dataset, ou seja, o formato antigo da variável é perdido.

Um detalhe, cabe a você investigar qual variável converter. Vá até a fonte de dados, até o usuário de negócio, pesquise e identifique se essas variáveis são categóricas. Você como Cientista deve saber os dados que têm em mãos.

Veja que agora temos a variável SEX factor com 2 categorias, EDUCATION factor com 3 categorias, MARRIAGE factor com 3 categorias e finalmeente default.payment.next.month factor com 2 categorias. Não perdemos nenhuma informação, apenas mudamos o a representação do tipo da variável.

2 problemas iniciais já resolvidos

Com os nossos dois problemas principais já resolvidos, podemos agora começar a construir o modelo preditivo.

14. verificar dimensões do dataset

Primeiramente vamos verificar quantas linhas temos no conjunto com a função row() e passar essa informação para a variável row.

15. definir seed

Vamos aplicar a função set.seed() para que possamos reproduzir os mesmos resultados ao simular esse estudo, já que trabalhamos com variáves randômicas.

16. dividir os dados

Com a função sample() dividiremos o conjunto de dados em treino e teste (validaçã). Treinamos o algoritmo e depois validamos o modelo, ou seja, ao treinar o algoritmo, criamos o modelo preditivo e na sequência o validamos com outro dataset.

Aqui multiplicamos o número de linhas por 70%, ou seja, desejamos que 70% dos dados de mydata sejam destinados ao conjunto de treino e os 30% restantes para teste/validação. Com a função sample() podemos fazer essa alocação de linhas de maneira aleatória.

Na sequência vamos coletar os índices para treino e para validação:

17. “train_test_split” na mão, separando as variáveis

Por último, dividiremos os dados de treino para X e y. E dados de validação X e y. Separando as variáveis:

Para orientar o que estamos fazendo, gostaria de voltar ao ponto do conjunto que estamos tratando. O que é o X? O que é o y? X — variáveis preditoras, todas as colunas do conjunto são de variáveis preditoras, com exceção da última, a variável y (default.payment.next.month) — alvo.

Logo, usamos as variáveis que representam X para prever o valor de y. Como desejamos criar o modelo, apresentamos X e y do passado para o modelo, o modelo aprenderá as relações entre as várias, e quando apresentarmos um novo X, ele deverá ser capaz de prever um valor de y. Isso é Machine Learning.

feature engineering

Com os dados devidamente separados, não obrigatoriamente, mas sim uma boa prática, realizar o feature engineering — Verificar quais variáveis preditoras são mais relevantes para criar o modelo que prevê calote.

18. feature engineering com Random Forest

Vamos instalar o pacote Random Forest e criar um modelo randomForest(). Esse modelo de Árvores Aleatórias, é usado para verificar quais são as variáveis mais relevantes para prever a variável alvo default.payment.

Com esse modelo randomForest criamos uma série de decisões com base nas variáveis preditoras X.

principais variáveis preditoras

As variáveis plotadas mais ao canto direito, são as variáveis mais relevantes para o modelo. O PAY_0 significa o primeiro pagamento do cliente no período de 6 meses, o primeiro pagamento é a variável mais relevante para inferir se o novo cliente dará calote ou não. Em contrapartida, a variável SEX é a variável menos determinante para um cliente dar calote na fatura.

Imagine o cliente que acaba de receber seu cartão de crédito e já no mês seguinte recebe a sua primeira fatura. Se este cliente já atrasar no primeiro pagamento, é um sinal de alerta para que ele continue atrasando e nao pagando as próximas.

Esse modelo já nos permite selecionar as melhores variáveis para melhorarmos a acurácia da previsão do modelo final.

20. construir modelo kNN

Vamos construir o modelo preditivo com base no kNN — vizinhos mais próximos. É um dos modelos mais simples de Machine Learning.

Este é um dos muitos algoritmos de aprendizagem supervisionada, é um classificador onde o aprendizado é baseado “no quão similar” é um dado (um vetor) do outro. O treinamento é formado por vetores de n dimensões.

Agora temos o dataset X para treino e teste, apenas com as variáveis mais relevantes selecionadas com a ajuda do Random Forest. A seleção das variáveis foi passada dentro de um vetor. y continua sendo o mesmo conjunto, apenas a variável de saída a priori.

criar o modelo kNN

Para criar o modelo kNN, é simples. Apenas chamar os dados trainingx preditores, trainingy a variável preditora, especificar o método knn, o tipo de pré-processamento para centralizar e aplicar escala aos dados e otimizar o modelo com tuneLength. Esse processo pode levar alguns tantos minutos.

Agora que temos o modelo, vamos imprimir o modelo:

algoritmo aprende os relacionamentos

O modelo preditivo nada mais é, do que o conjunto de números que representa exatamente a fórmula matemática que foi encontrada durante o treinamento. o kNN é um algoritmo, apresentamos os dados ao algoritmo, ele aprende os relacionamentos e cria um modelo preditivo — fruto do treinamento.

20. verificar o relacionamento

Vamos criar um plot para verificar a acurácia e o número de vizinhos mais próximos. Ele pega um ponto de dado mais próximo e compara ao ponto de dado, se for mais próximo ou não, ele classifica com o posicionamento do dado. O algoritmo vai agrupando os dados conforme as posições.

Podemos definir o número de k vizinhos mais próximos (ponto de dado) que o algoritmo vai consultar, para ele então classificar a cada ponto de dado.

É possível visualizar com extrema facilidade que, quanto maior o valor de k, ou seja, quantos mais vizinhos mais próximos conseguirmos colocar no modelo, maior a acurácia (0% — 100%). Nesse caso, maior o valor de k, maior a precisão do modelo.

21. realizar previsões

Como já temos o modelo knn criado, agora podemos prever através de novas entradas. Para fazer a previsão agora, usamos os dadaos de validação de X — validationx, ou também chamados de dados de teste.

Veja que temos 2 níveis: 0 ou 1. Todas as previsões foram feitas e classificadas em usuário que dará calote (1) e usuário que não dará calote (0).

Esse modelo ja é capaz de fazer previsões, agora podemos pegar dados de novos clientes (X), apresentar a esse modelo (knnModel) e termos a saída (y)

Esse estudo tinha como objetivo mostrar alguns problemas inerentes à análise de dados, como o desbalanceamento e ajustes de variáveis, além do que, finalizamos com a criação de um modelo preditivo para identficar se seu novo cliente vai pagar o que é devido.

Obrigado.

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store