{"id":31649279,"url":"https://github.com/erycastro/safelimit","last_synced_at":"2026-04-29T20:34:17.659Z","repository":{"id":316913151,"uuid":"1063621234","full_name":"erycastro/SafeLimit","owner":"erycastro","description":"Credit limit increases via deposits + PD (logistic + calibration) · Streamlit demo","archived":false,"fork":false,"pushed_at":"2025-09-27T14:33:33.000Z","size":386,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-27T15:27:37.375Z","etag":null,"topics":["acessibility","credit-risk","dashboard","data-science","fintech","python","sklearn","streamlit"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erycastro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-24T22:12:31.000Z","updated_at":"2025-09-27T14:33:36.000Z","dependencies_parsed_at":"2025-09-27T15:27:40.127Z","dependency_job_id":"8d8dc81c-b301-4123-8456-eed9da663935","html_url":"https://github.com/erycastro/SafeLimit","commit_stats":null,"previous_names":["erycastro/safelimit"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/erycastro/SafeLimit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erycastro%2FSafeLimit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erycastro%2FSafeLimit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erycastro%2FSafeLimit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erycastro%2FSafeLimit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erycastro","download_url":"https://codeload.github.com/erycastro/SafeLimit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erycastro%2FSafeLimit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278740831,"owners_count":26037480,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acessibility","credit-risk","dashboard","data-science","fintech","python","sklearn","streamlit"],"created_at":"2025-10-07T07:41:54.954Z","updated_at":"2026-04-29T20:34:17.652Z","avatar_url":"https://github.com/erycastro.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SafeLimit: aumento de limite responsável via depósitos\n\n[![Streamlit](https://img.shields.io/badge/Streamlit-app-FF4B4B)]()\n[![scikit-learn](https://img.shields.io/badge/scikit--learn-logistic%20%2B%20calibration-F7931E)]()\n\nDemo online: [Abrir o app no Streamlit](https://safelimit.streamlit.app/)\n\nO SafeLimit recomenda aumento de limite de cartão para clientes que poupam de forma recorrente, controlando risco com um modelo de PD (probabilidade de default) e regras de política com travas (“caps”). É um projeto didático com dados **sintéticos**.\n\n\u003cimg src=\"./assets/safelimit-interface.png\" alt=\"Interface do aplicativo com simulação para 1 cliente\" width=\"420\"\u003e\n\n---\n### Como rodar localmente\n\n```bash\n# 1) instalar dependências (no seu ambiente ativado)\npip install -r requirements.txt\n\n# 2) (opcional) treinar e salvar o modelo calibrado via notebook\n#    -\u003e notebooks/02_modelo_pd.ipynb  (salva em models/safelimit_pd_calibrated_sigmoid.joblib)\n\n# 3) iniciar o app (raiz do projeto)\nstreamlit run app/app.py\n```\n\n## Como funciona (em 2 passos)\n\n1) **Modelo (PD)** → estima a chance (%) de inadimplência em 12 meses a partir de:\n   - comportamento de depósitos (consistência e ticket),\n   - uso do cartão (utilização, atrasos),\n   - renda e contexto simples.\n\n2) **Política (regras)** → decide **se aumenta** e **quanto aumenta** o limite usando:\n   - **elegibilidade mínima:** consistência ≥ **4 de 6** meses e ticket ≥ **5% da renda**,\n   - **buckets de risco (A/B/C/D)** conforme a PD,\n   - **caps** por renda (≤50% renda) e por multiplicador (≤2× limite atual),\n   - **fator de risco** por bucket (A=1.0; B=0.6; C=0.3; D=0.0).\n\n---\n\n## “Contrato” do projeto (v1.0)\n\n### Objetivo\nRecomendar **aumento de limite** condicionado a **depósitos recorrentes**, **sem elevar demais o risco**.\n\n### Métricas de sucesso\n- **Modelo:** AUC **≥ 0,70** e **calibração** ok (PD prevista ≈ PD observada por faixas).\n- **Negócio:** conceder aumento apenas se **PD \u003c 6%** **e** **consistência ≥ 4/6 meses**, respeitando caps.\n\n### Buckets de risco (faixas de PD)\n- **A:** PD \u003c 3%\n- **B:** 3–6%\n- **C:** 6–10%\n- **D:** ≥10% → **sem aumento**\n\n### Elegibilidade mínima\n- `consistencia_6m ≥ 0,66` (≥ 4 de 6 meses com depósito)\n- `ticket_medio_deposito ≥ 5% da renda_mensal`\n\n### Política de aumento\n    base = α × ticket_medio_deposito        (padrão α = 5)\n    cap_renda = 50% da renda_mensal\n    cap_mult  = 2 × limite_atual\n    fator_risco = {A:1.0, B:0.6, C:0.3, D:0.0}\n\n    aumento_bruto = min(base, cap_renda)\n    aumento_final = aumento_bruto × fator_risco\n    aumento_final limitado para não ultrapassar (cap_mult − limite_atual)\n\n    novo_limite_sugerido = limite_atual + aumento_final (se elegível)\n\n**Exemplo rápido (aplicando a política acima):**  \nRenda = R$ 3.000 | Limite atual = R$ 1.200 | Ticket = R$ 300 | Consistência = 6/6 | PD = 2,8% (Bucket A)  \n→ base = 5×300 = 1.500 | cap_renda = 1.500 | cap_mult = 2×1.200 = 2.400 | fator A = 1.0  \n→ aumento_bruto = min(1.500, 1.500) = 1.500  \n→ aumento_final = 1.500 × 1.0 = 1.500, mas **cap_mult** limita o novo limite a **R$ 2.400** (aumento máx. = 1.200).  \n→ **novo_limite_sugerido = R$ 2.400**.\n\n### Saídas por cliente\n- `novo_limite_sugerido` (R$)\n- `PD` (0–100%)\n- `bucket` (A/B/C/D)\n- `elegível` (sim/não)\n- `justificativa` (resumo das regras/variáveis/caps que influenciaram)\n\n---\n\n## Dados e dicionário (sintéticos)\n\n**Arquivo esperado:** `data/base_sintetica.csv`\n\n**Colunas mínimas:**\n- `cliente_id` (int)\n- `renda_mensal` (float, R$)\n- `limite_atual` (float, R$)\n- `utilizacao` (0–1)\n- `consistencia_6m` (0–1) — fração (ex.: 4/6 = 0,66)\n- `ticket_medio_deposito` (float, R$)\n- `atraso30d` (0/1)\n- `default_12m` (0/1) — rótulo para treinar/avaliar PD\n\n**Sanidade sugerida:** `default_12m` entre 4% e 10%; variedade em `limite_atual/renda_mensal`, `utilizacao` e `consistencia_6m`.\n\n---\n\n\n## Resultados\n\n- **Modelo (baseline):** AUC **0,747** no conjunto de teste.\n- **Calibração:** comparação por quantis (**q = 8**) com **erro médio ≈ 2,3 p.p.** (PD prevista ≈ observada).\n- **Cortes finais da política:** PD \u003c **6%**, consistência ≥ **4/6**, ticket ≥ **5%** da renda; caps **50% da renda** e **2×** o limite; fatores A/B/C = **1.0 / 0.6 / 0.3**; **D = 0%** elegível.\n- **Impacto (sintético):**\n  - **41,5%** elegíveis  \n  - **Aumento médio** (entre elegíveis): **R$ 609,31**\n  - **Buckets** no portfólio: **A 15,6% / B 33,7% / C 24,4% / D 26,3%**\n  - **Elegibilidade por bucket:** **A 96% / B 62% / C 22,9% / D 0%**\n\n---\n\n## App \u0026 Dashboard\n\n- **App (simulação 1 cliente / CSV):** `streamlit run app/app.py`  \n  - Entrada: renda, limite atual, ticket, utilização, consistência (0–6), atraso 30d.  \n  - Saída: **PD, bucket, elegível, novo limite**, **justificativa** e download do CSV.  \n\n- **Dashboard (monitoramento/“what-if”):** aparece como **Pages → Dashboard** no app.  \n  - **KPIs**: % elegíveis, aumento médio; **guardrail** de risco (ΔEL ≤ **10%**).  \n  - **Gráficos acessíveis**: distribuição por bucket e elegibilidade por bucket com rótulos numéricos.  \n  - **Parâmetros ajustáveis**: α, corte do bucket D (PD), caps por renda e multiplicador.\n\n  ---\n\n## Estrutura do repositório\n    .\n    ├─ .streamlit/\n    │  └─ config.toml\n    ├─ app/\n    │  ├─ app.py\n    │  └─ pages/\n    │     └─ 01_dashboard.py\n    ├─ data/\n    │  └─ base_sintetica.csv\n    ├─ models/\n    │  └─ safelimit_pd_calibrated_sigmoid.joblib\n    ├─ notebooks/\n    │  ├─ 01_eda.ipynb\n    │  └─ 02_modelo_pd.ipynb\n    ├─ reports/\n    │  ├─ metrics.md\n    │  └─ policy_tradeoffs.md\n    ├─ env/\n    └─ README.md\n\n\n---\n\n## Glossário (linguagem simples)\n- **PD (Probabilidade de Default):** chance do cliente **não pagar** (ex.: PD=5% → ~5 em 100).\n- **AUC:** mede o quão bem o modelo **separa bons de ruins** (≥0,70 já é ok no baseline).\n- **Calibração:** verifica se a **PD prevista** bate com a **PD observada** nos grupos.\n- **Consistência 6m:** fração de meses (nos últimos 6) em que houve depósito (ex.: 4/6=0,66).\n- **Ticket médio:** valor médio depositado por mês (últimos 6).\n- **Buckets A/B/C/D:** faixas de risco pela PD para facilitar regras.\n- **Caps:** travas que limitam aumento (por renda e por multiplicador do limite atual).\n- **Elegível:** passou nas regras mínimas e não está no bucket D.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferycastro%2Fsafelimit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferycastro%2Fsafelimit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferycastro%2Fsafelimit/lists"}