1. Árvore de Decisão
O projeto tem como objetivo aplicar árvores de decisão para classificar clientes em faixas de pontuação de crédito. A base contém informações bancárias e dados relacionados ao histórico financeiro, permitindo treinar e avaliar um modelo de classificação que auxilie na análise de risco.
Para o desenvolvimento, foram utilizadas bibliotecas do ecossistema Python, como pandas e numpy para manipulação e análise de dados, matplotlib para visualizações, e scikit-learn para construção, treinamento e avaliação do modelo de aprendizado de máquina.
Exploração dos Dados
Análise inicial do conjunto de dados - com explicação sobre a natureza dos dados -, incluindo visualizações e estatísticas descritivas.
Nesta etapa foi realizada uma análise inicial do conjunto de dados para compreender sua estrutura e as características das variáveis disponíveis.
Estrutura do Conjunto de Dados
O dataset é composto por 28 colunas, com diferentes tipos de dados:
- Object(20):
ID
,Customer_ID
,Month
,Name
,Age
,SSN
,Occupation
,Annual_Income
,Num_of_Loan
,Type_of_Loan
,Num_of_Delayed_Payment
,Changed_Credit_Limit
,Outstanding_Debt
,Credit_History_Age
,Payment_of_Min_Amount
,Amount_invested_monthly
,Monthly_Balance
,Payment_Behaviour
,Credit_Score
,Credit_Mix
. - Float64(4):
Monthly_Inhand_Salary
,Num_Credit_Inquiries
,Credit_Utilization_Ratio
,Total_EMI_per_month
. - Int64(4):
Num_Bank_Accounts
,Num_Credit_Card
,Interest_Rate
,Delay_from_due_date
.
Variável Alvo
O modelo tem como variável alvo (target) a coluna Credit_Score
, que representa a classificação de crédito dos clientes.
Essa variável é categórica, indicando a faixa de risco associada a cada cliente, e será utilizada para treinar e avaliar o desempenho das árvores de decisão.
Amostra dos Dados
A seguir, um exemplo com 3 linhas de um total de 100.000 registros:
ID | Customer_ID | Month | Name | Age | SSN | Occupation | Annual_Income | Monthly_Inhand_Salary | Num_Bank_Accounts | Num_Credit_Card | Interest_Rate | Num_of_Loan | Type_of_Loan | Delay_from_due_date | Num_of_Delayed_Payment | Changed_Credit_Limit | Num_Credit_Inquiries | Credit_Mix | Outstanding_Debt | Credit_Utilization_Ratio | Credit_History_Age | Payment_of_Min_Amount | Total_EMI_per_month | Amount_invested_monthly | Payment_Behaviour | Monthly_Balance | Credit_Score |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x474c | CUS_0xadc8 | July | Soyoungk | 30 | 810-29-3531 | Mechanic | 84374.1 | 6605.37 | 8 | 7 | 9 | 3 | Not Specified, Debt Consolidation Loan, and Not Specified | 3 | 12 | 10.17 | 2 | Standard | 1000.76 | 34.4112 | nan | Yes | 744.037 | 625.907 | Low_spent_Small_value_payments | 239.279 | Standard |
0x474d | CUS_0xadc8 | August | Soyoungk | 30 | 810-29-3531 | Mechanic | 1.88848e+07 | 6605.37 | 8 | 7 | 9 | 3 | Not Specified, Debt Consolidation Loan, and Not Specified | 8 | 14 | 10.17 | 2 | _ | 1000.76 | 31.4243 | 22 Years and 5 Months | Yes | 744.037 | 124.429 | High_spent_Large_value_payments | 690.757 | Good |
0x4752 | CUS_0x6b50 | January | Janq | 53 | 185-98-1380 | Scientist | 103049 | 8408.45 | 4 | 6 | 6 | 3 | Not Specified, Credit-Builder Loan, and Home Equity Loan | 23 | 6 | 9.46 | 0 | Good | 849.98 | 33.1978 | 17 Years and 10 Months | No | 255.208 | 102.972 | High_spent_Large_value_payments | 722.666 | Poor |
Estatísticas Descritivas
A tabela abaixo resume as estatísticas descritivas calculadas para as variáveis numéricas do dataset:
Monthly_Inhand_Salary | Num_Bank_Accounts | Num_Credit_Card | Interest_Rate | Delay_from_due_date | Num_Credit_Inquiries | Credit_Utilization_Ratio | Total_EMI_per_month | |
---|---|---|---|---|---|---|---|---|
count | 84998 | 100000 | 100000 | 100000 | 100000 | 98035 | 100000 | 100000 |
mean | 4194.17 | 17.0913 | 22.4744 | 72.466 | 21.0688 | 27.7543 | 32.2852 | 1403.12 |
std | 3183.69 | 117.405 | 129.057 | 466.423 | 14.8601 | 193.177 | 5.11688 | 8306.04 |
min | 303.645 | -1 | 0 | 1 | -5 | 0 | 20 | 0 |
25% | 1625.57 | 3 | 4 | 8 | 10 | 3 | 28.0526 | 30.3067 |
50% | 3093.75 | 6 | 5 | 13 | 18 | 6 | 32.3058 | 69.2495 |
75% | 5957.45 | 7 | 7 | 20 | 28 | 9 | 36.4967 | 161.224 |
max | 15204.6 | 1798 | 1499 | 5797 | 67 | 2597 | 50 | 82331 |
Essas medidas incluem contagem de valores (count), média (mean), desvio padrão (std), mínimo (min), percentis (25%, 50%, 75%) e máximo (max).
É importante destacar que algumas colunas aparecem como object
no dataset, o que impede que sejam incluídas nessa análise estatística automaticamente.
Visualizações
Pré-processamento
Nesta etapa foi realizada a limpeza dos dados e o tratamento de valores ausentes, além da alteração de tipagem das colunas para adequação ao modelo. Esse processo é essencial para garantir consistência e qualidade antes do treinamento da árvore de decisão.
Alteração de Tipagem dos Dados
Como destacado anteriormente, grande parte das colunas do dataset estavam no formato object
.
O primeiro passo foi padronizar essas tipagens, ajustando-as para float64
, int64
e category
, de acordo com a natureza de cada variável.
As 20 colunas originalmente do tipo object
foram tratadas em dois grupos:
-
Apenas alteração de tipo:
ID
,Customer_ID
,Month
,Name
,SSN
,Occupation
,Type_of_Loan
,Payment_Behaviour
,Payment_of_Min_Amount
eCredit_Score
. Essas variáveis puderam ser convertidas diretamente utilizando a funçãoastype()
do Pandas. -
Necessidade de alterações antes da conversão:
Age
,Annual_Income
,Num_of_Loan
,Outstanding_Debt
,Amount_invested_monthly
,Monthly_Balance
,Num_of_Delayed_Payment
,Changed_Credit_Limit
,Credit_Mix
eCredit_History_Age
. Muitas dessas colunas apresentavam valores com o caractere'_'
, impossibilitando a conversão imediata. Nesses casos, o caractere foi substituído por nulos lógicos e, em seguida, a tipagem correta foi aplicada.
Colunas Retiradas do Modelo
Algumas variáveis foram consideradas irrelevantes para a análise de risco e, portanto, removidas do modelo:
ID
,Customer_ID
,Month
,Name
,SSN
,Type_of_Loan
eCredit_History_Age
.
Com isso, restaram 21 colunas efetivamente utilizadas no processo de modelagem.
- Float64(9):
Monthly_Inhand_Salary
,Num_Credit_Inquiries
,Credit_Utilization_Ratio
,Total_EMI_per_month
,Annual_Income
,Changed_Credit_Limit
,Outstanding_Debt
,Amount_invested_monthly
,Monthly_Balance
. - Int64(7):
Num_Bank_Accounts
,Num_Credit_Card
,Interest_Rate
,Delay_from_due_date
,Age
,Num_of_Loan
,Num_of_Delayed_Payment
. - Category(5):
Credit_Score
,Occupation
,Credit_Mix
,Payment_of_Min_Amount
,Payment_Behaviour
.
Linhas Retiradas do Modelo
Remoção das linhas nulas.
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/markdown_exec/_internal/formatters/python.py", line 71, in _run_python
exec_python(code, code_block_id, exec_globals)
File "/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/markdown_exec/_internal/formatters/_exec_python.py", line 8, in exec_python
exec(compiled, exec_globals) # noqa: S102
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<code block: n3>", line 17, in <module>
x = df[['Valor', 'Periodo']]
~~^^^^^^^^^^^^^^^^^^^^^^
File "/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pandas/core/frame.py", line 4113, in __getitem__
indexer = self.columns._get_indexer_strict(key, "columns")[1]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pandas/core/indexes/base.py", line 6212, in _get_indexer_strict
self._raise_if_missing(keyarr, indexer, axis_name)
File "/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pandas/core/indexes/base.py", line 6261, in _raise_if_missing
raise KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of [Index(['Valor', 'Periodo'], dtype='object')] are in the [columns]"
Divisão dos Dados
Separação do conjunto de dados em treino e teste.
Treinamento do Modelo
Implementação do modelo Decision Tree.
Avaliação do Modelo
Avaliação do desempenho do modelo utilizando métricas apropriadas.
Relatório Final
Documentação do processo, resultados obtidos e possíveis melhorias.