Configuração e Primeira Exploração
Objetivos de Aprendizagem
Ao final deste notebook, você será capaz de:
- ✅ Configurar ambiente Python para análise de risco de crédito
- ✅ Importar bibliotecas essenciais (pandas, numpy, matplotlib, sklearn)
- ✅ Carregar e examinar dataset de risco de crédito
- ✅ Identificar tipos de variáveis e estrutura do dataset
- ✅ Fazer verificação inicial de qualidade dos dados
Pré-requisitos
- Notebook 00: Introdução aos conceitos de risco de crédito
- Python 3.8+ instalado
- Noções básicas de pandas e DataFrames
Nota: Este notebook carrega o dataset do zero. Execute todas as células em ordem.
🎯 O que vamos fazer?
Neste notebook, vamos:
- Configurar o ambiente - Importar bibliotecas necessárias
- Carregar os dados - Dataset de risco de crédito
- Explorar a estrutura - Entender dimensões, colunas e tipos
- Verificar qualidade básica - Primeira análise dos dados
❓ Por que fazemos isso?
Antes de qualquer análise ou modelagem, precisamos:
- ✅ Preparar ferramentas - Ter todas as bibliotecas disponíveis
- ✅ Conhecer os dados - Entender o que temos disponível
- ✅ Identificar problemas iniciais - Valores ausentes, tipos incorretos
Esta é a primeira etapa obrigatória de qualquer projeto de ciência de dados!
# Ambiente: Python 3.8+, libs: pandas, numpy, matplotlib, seaborn, scikit-learn
# Configuração do ambiente para análise de risco de crédito
# Importar bibliotecas para manipulação de dados
import pandas as pd # Trabalhar com DataFrames e séries
import numpy as np # Operações matemáticas e arrays
import os
# Importar bibliotecas para visualização
import matplotlib.pyplot as plt # Gráficos básicos
import seaborn as sns # Gráficos estatísticos avançados
# Importar bibliotecas de machine learning
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Configurar estilo de visualizações
plt.style.use('default')
sns.set_palette("husl")
# Suprimir warnings não críticos
import warnings
warnings.filterwarnings('ignore', category=UserWarning, module='matplotlib')
warnings.filterwarnings('ignore', category=UserWarning, module='sklearn')
# Configurar pandas para melhor visualização
pd.set_option('display.max_columns', None)
pd.set_option('display.precision', 2)
print("✅ Bibliotecas importadas com sucesso!")
print("📚 Ambiente configurado para análise de risco de crédito")
✅ Bibliotecas importadas com sucesso! 📚 Ambiente configurado para análise de risco de crédito
📊 Carregamento do Dataset
Vamos carregar o dataset de risco de crédito. Certifique-se de que o arquivo credit_risk_full_1_200_000.csv está no mesmo diretório deste notebook.
# Carregar o dataset de risco de crédito
print("📂 Carregando dados de risco de crédito...")
df = pd.read_csv('credit_risk_full_1_200_000.csv')
# Verificar se os dados foram carregados corretamente
print(f"\n✅ Dados carregados com sucesso!")
print(f"📊 Dimensões do dataset: {df.shape[0]:,} linhas × {df.shape[1]} colunas")
print(f"💾 Memória utilizada: {df.memory_usage(deep=True).sum() / 1024**2:.1f} MB")
📂 Carregando dados de risco de crédito... ✅ Dados carregados com sucesso! 📊 Dimensões do dataset: 1,200,000 linhas × 14 colunas 💾 Memória utilizada: 526.0 MB
📋 Explorando a Estrutura dos Dados
Vamos examinar as colunas disponíveis e seus tipos de dados.
# Listar todas as colunas disponíveis
print("📋 Colunas disponíveis no dataset:")
print("=" * 60)
for i, col in enumerate(df.columns, 1):
print(f"{i:2}. {col}")
# Examinar tipos de dados de cada coluna
print(f"\n📊 Tipos de dados por coluna:")
print("=" * 60)
for col, dtype in df.dtypes.items():
print(f"{col:25} → {dtype}")
📋 Colunas disponíveis no dataset: ============================================================ 1. idade 2. genero 3. estado_civil 4. renda 5. valor_emprestimo 6. prazo_emprestimo 7. score_credito 8. historico_inadimplencia 9. tempo_emprego 10. tipo_emprego 11. regiao 12. data_emprestimo 13. prob_default 14. default 📊 Tipos de dados por coluna: ============================================================ idade → float64 genero → object estado_civil → object renda → object valor_emprestimo → object prazo_emprestimo → int64 score_credito → float64 historico_inadimplencia → int64 tempo_emprego → float64 tipo_emprego → object regiao → object data_emprestimo → object prob_default → float64 default → int64
👀 Primeiras Linhas do Dataset
Vamos visualizar as primeiras linhas para ter uma ideia dos dados.
# Mostrar primeiras linhas
print("👀 Primeiras 5 linhas do dataset:")
print("=" * 60)
display(df.head())
# Mostrar informações básicas
print("\n📊 Informações básicas do dataset:")
print("=" * 60)
df.info()
👀 Primeiras 5 linhas do dataset: ============================================================
| idade | genero | estado_civil | renda | valor_emprestimo | prazo_emprestimo | score_credito | historico_inadimplencia | tempo_emprego | tipo_emprego | regiao | data_emprestimo | prob_default | default | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 38.66 | M | divorciado | 3546.0902855483905 | 5860.251362574305 | 12 | 880.90 | 2 | 47.47 | autonomo | sudeste | 2022-08-25 | 5.61e-03 | 0 |
| 1 | 22.52 | F | divorciado | 1999.1507983385166 | 1076.3851406682254 | 48 | 852.73 | 3 | 25.00 | autonomo | centro-oeste | 2023-05-18 | 2.41e-03 | 0 |
| 2 | 44.01 | M | solteiro | 2506.1863772417305 | 1938.8563208086252 | 24 | 877.59 | 2 | 1.57 | publico | sul | 2022-11-12 | 8.67e-04 | 0 |
| 3 | 46.29 | F | casado | 1328.8703061001956 | 1126.4846393323485 | 24 | 702.93 | 0 | NaN | clt | norte | 2022-03-15 | 3.09e-03 | 0 |
| 4 | 18.00 | F | solteiro | 1580.0621142790865 | 1653.0156500639625 | 12 | 785.22 | 2 | 18.34 | autonomo | nordeste | 2022-12-23 | 8.08e-03 | 0 |
📊 Informações básicas do dataset: ============================================================ <class 'pandas.core.frame.DataFrame'> RangeIndex: 1200000 entries, 0 to 1199999 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 idade 1200000 non-null float64 1 genero 1194152 non-null object 2 estado_civil 1188062 non-null object 3 renda 1062535 non-null object 4 valor_emprestimo 1200000 non-null object 5 prazo_emprestimo 1200000 non-null int64 6 score_credito 1170109 non-null float64 7 historico_inadimplencia 1200000 non-null int64 8 tempo_emprego 1079490 non-null float64 9 tipo_emprego 1200000 non-null object 10 regiao 1200000 non-null object 11 data_emprestimo 1200000 non-null object 12 prob_default 1200000 non-null float64 13 default 1200000 non-null int64 dtypes: float64(4), int64(3), object(7) memory usage: 128.2+ MB
🔍 Dataset Quick-Check
Vamos fazer uma verificação rápida de qualidade: verificar se as colunas esperadas existem e examinar o balanceamento do target.
# Verificação rápida: colunas esperadas e target
print("🔍 Verificação Rápida do Dataset")
print("=" * 60)
# Colunas esperadas (principais)
colunas_esperadas = [
'idade', 'genero', 'estado_civil', 'renda',
'valor_emprestimo', 'prazo_emprestimo', 'score_credito',
'historico_inadimplencia', 'tempo_emprego', 'tipo_emprego',
'regiao', 'data_emprestimo', 'prob_default', 'default'
]
print("\n✅ Verificando colunas esperadas:")
for col in colunas_esperadas:
if col in df.columns:
print(f" ✓ {col}")
else:
print(f" ✗ {col} - NÃO ENCONTRADA!")
# Verificar variável target
print(f"\n📊 Análise da Variável Target (default):")
print("-" * 60)
if 'default' in df.columns:
target_dist = df['default'].value_counts()
target_percent = df['default'].value_counts(normalize=True) * 100
print(f"Total de registros: {len(df):,}")
for value in sorted(target_dist.index):
label = "Não Default (Bom)" if value == 0 else "Default (Mau)"
print(f"{label:20} → {target_dist[value]:>10,} registros ({target_percent[value]:>5.1f}%)")
# Verificar balanceamento
default_rate = df['default'].mean()
print(f"\nTaxa de default: {default_rate:.2%}")
if default_rate < 0.05:
print("⚠️ Classes muito desbalanceadas! (Normal em risco de crédito)")
else:
print("⚠️ Variável target 'default' não encontrada!")
🔍 Verificação Rápida do Dataset ============================================================ ✅ Verificando colunas esperadas: ✓ idade ✓ genero ✓ estado_civil ✓ renda ✓ valor_emprestimo ✓ prazo_emprestimo ✓ score_credito ✓ historico_inadimplencia ✓ tempo_emprego ✓ tipo_emprego ✓ regiao ✓ data_emprestimo ✓ prob_default ✓ default 📊 Análise da Variável Target (default): ------------------------------------------------------------ Total de registros: 1,200,000 Não Default (Bom) → 1,164,501 registros ( 97.0%) Default (Mau) → 35,499 registros ( 3.0%) Taxa de default: 2.96% ⚠️ Classes muito desbalanceadas! (Normal em risco de crédito)
🔧 Correção Básica de Tipos
Algumas colunas podem estar como string quando deveriam ser numéricas. Vamos fazer uma conversão básica.
# Correção mínima: converter colunas que estão como string para numérico
# (tratamento detalhado será feito no notebook de pré-processamento)
print("🔧 Convertendo tipos de dados básicos...")
df['renda'] = pd.to_numeric(df['renda'], errors='coerce')
df['valor_emprestimo'] = pd.to_numeric(df['valor_emprestimo'], errors='coerce')
print("✅ Conversões básicas concluídas")
print(f"\nTipos após conversão:")
print(f" renda: {df['renda'].dtype}")
print(f" valor_emprestimo: {df['valor_emprestimo'].dtype}")
🔧 Convertendo tipos de dados básicos... ✅ Conversões básicas concluídas Tipos após conversão: renda: float64 valor_emprestimo: float64
💡 O que isso significa?
Interpretação dos Resultados:
Tamanho do Dataset:
- Temos mais de 1 milhão de registros (dados de tamanho real!)
- 14 colunas com diferentes tipos de informação
Variáveis Disponíveis:
- Demográficas: idade, gênero, estado civil, região
- Financeiras: renda, score_credito, tempo_emprego
- Empréstimo: valor_emprestimo, prazo_emprestimo
- Histórico: historico_inadimplencia
- Target: default (0 = não default, 1 = default)
Descoberta Importante:
- ⚠️ Classes muito desbalanceadas (97% vs 3% aproximadamente)
- Isso é normal em risco de crédito!
- Precisaremos de métricas e técnicas especiais
💼 Implicações de Negócio
O carregamento e exploração inicial dos dados são fundamentais porque:
Base para Decisões: Entender a estrutura dos dados é o primeiro passo para qualquer modelagem. Sem uma compreensão clara do que temos disponível, não podemos tomar decisões informadas sobre features e modelos.
Qualidade dos Dados: A verificação inicial revela problemas que precisam ser tratados antes da modelagem. Identificar esses problemas cedo economiza tempo e evita erros posteriores.
Escalabilidade: O tamanho do dataset (1.2M registros) permite treinar modelos robustos que generalizam bem. Em produção, isso significa maior confiança nas predições.
Lição Chave: Nunca pule a etapa de exploração inicial. Problemas encontrados aqui são muito mais fáceis de resolver do que depois de semanas de modelagem.