Projeto de Machine Learning sobre o dataset Bank Marketing (UCI): um banco português realizou campanhas para oferecer depósito a prazo. O objetivo é identificar clientes com maior probabilidade de aceitar a oferta, reduzindo custo de ligações e priorizando quem mais converte.
O fluxo completo está no notebook BancoMarketing.ipynb (EDA, pré-processamento, balanceamento, modelagem com LightGBM e exportação do modelo). A interface web em Streamlit (app.py) consome dados e artefatos pelo Amazon S3.
Projeto Integrador do Nível 1 da formação em Data Science da Alura, com foco em análise de dados, machine learning e computação em nuvem.
| Arquivo / pasta | Descrição |
|---|---|
BancoMarketing.ipynb |
Pipeline completo: EDA, feature engineering, balanceamento, LazyPredict, LightGBM, upload S3 |
app.py |
App Streamlit (EDA, simulador de campanha, inferência por cliente) |
requirements.txt |
Dependências Python |
novos_clientes_simulacao.csv |
Exemplos de clientes para testar inferência (mesmo schema do dataset) |
imagens_ilustrativas/ |
Diagramas usados no notebook (balanceamento, LightGBM, threshold) |
dados/ |
Dados disponíveis da página UCI |
| Ferramenta | Uso |
|---|---|
| Python 3.10+ (recomendado) | Ambiente de execução |
| AWS CLI | Configurar credenciais e acesso ao S3 |
| Conta AWS | Bucket S3 com os dados e modelos |
- macOS (Homebrew):
brew install awscli - Windows: Instalador oficial ou Chocolatey
- Linux: siga a documentação da AWS
- No console AWS: IAM → usuário → Security credentials → Create access key (guarde Access Key e Secret com segurança).
- No terminal:
aws configureInforme:
- AWS Access Key ID e Secret Access Key
- Default region name (ex.:
us-east-1ou a região do seu bucket) - Default output format (pode deixar
json)
O boto3 usado no notebook e no app.py utiliza essas credenciais (ou variáveis de ambiente equivalentes).
O código assume o bucket bank-marketing-alura com esta estrutura:
| Caminho no bucket | Conteúdo |
|---|---|
raw/bank-full.csv |
Dataset bruto (sep=';') |
modelos/modelo_lightgbm.pkl |
Modelo LightGBM treinado |
modelos/X_test_pre.pkl |
Features de teste pré-processadas |
modelos/y_test.pkl |
Rótulos do conjunto de teste |
modelos/ohe.pkl |
One-Hot Encoder (categóricas) |
modelos/oe.pkl |
Ordinal Encoder (education) |
modelos/scaler_age.pkl |
StandardScaler da idade |
modelos/scaler_balance.pkl |
StandardScaler do saldo (após log) |
Se usar outro nome de bucket ou prefixos, ajuste a constante bucket em app.py (e no notebook, onde houver upload/leitura do S3).
Na pasta do projeto:
cd /caminho/para/BankMarketing
python3 -m venv .venvAtivar o ambiente:
- macOS / Linux:
source .venv/bin/activate - Windows (cmd):
.venv\Scripts\activate.bat - Windows (PowerShell):
.venv\Scripts\Activate.ps1
Instalar dependências:
pip install --upgrade pip
pip install -r requirements.txtboto3, pandas, numpy, scikit-learn, lightgbm, joblib, streamlit, plotly, imbalanced-learn, lazypredict, matplotlib, seaborn, ipykernel.
Resumo do que o notebook cobre:
- Setup e EDA — Problema de negócio, AWS/S3, carregamento do CSV, exploração das variáveis e desbalanceamento de classes (~88%
no/ ~12%yes). - Preparação para ML —
train_test_split, engenharia de features (One-Hot, Ordinal, StandardScaler, bins decampaign, tratamento debalance), balanceamento com RandomOverSampler + RandomUnderSampler (imblearn). - Modelagem — LazyPredict para varredura inicial; comparação manual (LightGBM, XGBoost, regressão logística); escolha do LightGBM; validação cruzada e matriz de confusão; persistência com
joblibe upload para o S3. - Streamlit — Ideia e implementação do app: EDA + simulador de campanha com threshold e impacto em ligações/lucro + inferência individual.
Execute o notebook no Jupyter, VS Code ou Cursor com o kernel apontando para o mesmo ambiente onde instalou o requirements.txt.
Nota: a variável
duration(duração da ligação) é removida no pipeline de inferência do app porque só é conhecida depois do contato — usá-la na predição causaria data leakage.
Com o venv ativado e o aws configure válido para uma conta que tenha leitura no bucket:
streamlit run app.pyAbra o endereço que o Streamlit mostrar no navegador (geralmente http://localhost:8501).
| Página | O que faz |
|---|---|
| Análise exploratória | Métricas resumidas, amostra dos dados, histograma de idade por conversão, taxa por profissão e série mensal |
| Simulador de campanha | Threshold sobre probabilidades, métricas de ligações/conversões, simulação financeira (receita/custo/lucro), curva de lucro por threshold, comparação com “ligar para todos”, matriz de confusão |
| Inferência cliente | Formulário com features do cliente; predict_proba + decisão “Ligar” / “Não ligar” conforme o threshold |
Diagramas no repositório: imagens_ilustrativas/ (LightGBM, threshold, balanceamento, pipeline de modelagem).
| Tema | Links |
|---|---|
| LightGBM | Documentação · GeeksForGeeks |
| LazyPredict | GitHub · Documentação |
| Threshold e métricas | Threhsold and confusion matrix · Classification Thresholds in ML · Otimização de threshold - exemplo prático |
| Balanceamento de classes | imbalanced-learn — guia · Combining Oversampling and Undersampling |
| Data leakage | Encoding Before vs After Train_Test_Split? |
O projeto é um ponto de partida sólido para decisão baseada em dados. Caminhos sugeridos para aumentar eficácia, interpretabilidade e impacto operacional:
Hoje perfil do cliente e estratégia de campanha entram na mesma predição. Evolução natural: dois modelos.
- Modelo 1 — Perfil do cliente: probabilidade de conversão
- Modelo 2 — Estratégia de campanha: como, quando e com qual abordagem contatar
Benefícios esperados: maior interpretabilidade, controle das decisões de negócio e otimização independente de cada etapa.
O LightGBM foi treinado com parâmetros padrão. Próximo passo: GridSearchCV, Random Search ou Optuna (recomendado para produção), ajustando por exemplo learning_rate, num_leaves e max_depth.
- Busca sistemática com validação cruzada (foco em ROC AUC ou F1 da classe positiva)
- Comparar modelo tunado vs baseline atual
Resultado esperado: melhor capacidade preditiva e maior estabilidade.
Explorar melhor day e month:
- Agrupar dias em faixas (início, meio e final do mês)
- Identificar sazonalidade (meses com maior conversão, períodos de maior engajamento)
- Validação temporal (split por
month/year) para evitar vazamento entre campanhas
O threshold não é só decisão técnica — depende de valor médio por conversão, custo por ligação e capacidade do time.
- Aprofundar simulação de cenários no app (já há base no Simulador de campanha)
- Documentar política de corte como decisão estratégica, não fixa em 0,50
- Aplicar clusterização (ex.: K-Means) para perfis distintos (engajados, alto saldo, resistentes à conversão)
- Campanhas personalizadas por segmento
- Mapear fluxo atual: distribuição de leads, registro de resultados das ligações
- Priorização automática a partir do score do modelo
- API REST (FastAPI) ou endpoint para o CRM consumir predições
A variável duration foi removida do pipeline de inferência (evita leakage), mas pode ser estudada offline:
- Custo real por interação e ROI com duração média
- Relação entre tempo de ligação e conversão
Evoluir o simulador atual com visão financeira completa:
- Receita estimada, custo total da campanha e lucro por threshold
- Comparar políticas: menos clientes com alta chance vs muitos com chance moderada
- Diagrama do fluxo para stakeholders: base → score → threshold → lista priorizada → campanha → resultado financeiro
- Streamlit na AWS, GCP ou Azure
- APIs para CRM; monitoramento de performance e drift do modelo
- Pipeline sklearn único (pré-processamento + modelo) para alinhar notebook e app
- Permissões S3 mínimas (IAM só leitura nos prefixos necessários)
Objetivo: disponibilidade, escalabilidade e uso contínuo pelo time operacional.
Úteis para generalizar o pipeline (telemarketing, crédito, churn, marketing direto):
| Dataset | Fonte | Por que usar |
|---|---|---|
| Bank Marketing (este) | UCI | Baseline do projeto; telemarketing bancário |
| Telco Customer Churn | Kaggle / IBM | Churn em telecom; forte desbalanceamento; bom para threshold e custo de retenção |
| Credit Card Fraud Detection | Kaggle | Extremo desbalanceamento; métricas de raro evento |
| Give Me Some Credit | Kaggle | Default de crédito; probabilidade de inadimplência |
| Online Shoppers Purchasing Intention | UCI | Conversão em e-commerce; sessões como observações |