🛡️ SciAudit
"Seu paper/produção está pronto para o peer-review? O SciAudit diz sim ou não em 1 minuto."
O SciAudit é o primeiro linter do mundo focado não na qualidade do código, mas na integridade da ciência. Ele escaneia seus scripts Python e Jupyter Notebooks em busca de violações metodológicas comuns que invalidam resultados de Data Science e Machine Learning.
🚀 Por que SciAudit?
A maioria dos linters (como Pylint ou Flake8) verifica se seu código é bonito. O SciAudit verifica se seu código é honesto.
- Detecta Data Leakage: Identifica se você "vazou" o futuro para o passado (ex: normalizar dados antes do split).
- Garante Reprodutibilidade: Exige sementes determinísticas (
random_state) em funções estocásticas. - Evita o "Multicollinearity Trap": Alerta sobre interpretações de importância de features sem análise de correlação prévia.
- Zero Dependências: Funciona "out of the box" usando apenas a biblioteca padrão do Python.
- Suporte a Notebooks: Audita arquivos
.ipynbdiretamente.
📦 Instalação
Como o SciAudit não possui dependências, a instalação é instantânea:
pip install sciaudit
🛠️ Como Usar
No Terminal
Audite um arquivo ou diretório inteiro:
# Rodar auditoria no diretório atual
sciaudit .
# Rodar em um script específico e gerar um laudo em Markdown
sciaudit meu_experimento.py --report
O Laudo de Integridade
Ao usar a flag --report, o SciAudit gera um arquivo SCIAUDIT_REPORT.md contendo:
- Score Global (A+ a F).
- Tabela de Violações.
- Sugestões de Remediação teóricas e práticas.
- Badge de Integridade para você colar no seu README.
🏭 Uso em Produção (CI/CD)
O SciAudit foi projetado para ser integrado ao seu fluxo de trabalho de desenvolvimento.
⚓ Pre-commit Hooks
Adicione isto ao seu .pre-commit-config.yaml:
repos:
- repo: local
hooks:
- id: sciaudit
name: SciAudit
entry: sciaudit
language: system
types: [python]
files: \.(py|ipynb)$
🤖 GitHub Actions
Exemplo de workflow para .github/workflows/sciaudit.yml:
name: SciAudit CI
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.10' }
- run: pip install sciaudit
- run: sciaudit . --exit-code-strategy any-error
⚙️ Configuração (.sciaudit.yml)
Você pode personalizar o comportamento do SciAudit criando um arquivo .sciaudit.yml na raiz do seu projeto:
rules:
SCI-002: warning # Forçar para warning
SCI-003: off # Desativar regra
SCI-006: error # Forçar para erro
paths:
ignore:
- "venv/"
- "legacy_tests/"
- "notebooks/backup/"
Sugestões Detalhadas
Use a flag --suggest-fix para receber dicas acionáveis sobre como resolver cada violação:
sciaudit meu_script.py --suggest-fix
🎮 Perfis de Rigor (--profile)
Nem todo projeto exige o mesmo nível de rigor. O SciAudit oferece três perfis pré-definidos:
| Perfil | Descrição | Uso Ideal |
|---|---|---|
balanced (Padrão) |
Severidades padrão das regras. | Uso geral em Data Science. |
strict |
Eleva quase todas as regras para ERROR. |
Projetos médicos, financeiros ou teses. |
relaxed |
Diminui o rigor de regras controversas. | Protipagem rápida e exploração. |
🧱 Modo Baseline (Adoção em código legado)
Se você está adotando o SciAudit em um projeto antigo com centenas de alertas, use o modo baseline. Ele permite ignorar violações antigas e focar apenas no que foi introduzido de novo:
- Crie o baseline inicial:
sciaudit . --create-baseline sciaudit-baseline.json
- Use o baseline no CI:
sciaudit . --baseline sciaudit-baseline.json
Nota: O exit code retornará 0 se houver apenas violações presentes no baseline. Violações novas quebrarão o build.
⚙️ Configuração (.sciaudit.yml)
Você pode personalizar o comportamento do SciAudit criando um arquivo .sciaudit.yml na raiz do seu projeto. A configuração no arquivo tem precedência total sobre os perfis.
rules:
SCI-002: warning # Forçar para warning
SCI-003: off # Desativar regra
SCI-006: error # Forçar para erro
paths:
ignore:
- "venv/"
- "legacy_tests/"
Estratégias de Exit Code
--exit-code-strategy any-error(Padrão): Falha no build se houver qualquer violaçãoERRORouWARNING(não presente no baseline).--exit-code-strategy errors-only: Falha no build apenas em caso de violaçõesERROR.--exit-code-strategy always-zero: Nunca falha o build.
🎨 Exemplos Reais
❌ Exemplo de Código Ruim (leakage.py)
import pandas as pd
from sklearn.preprocessing import StandardScaler
df = pd.read_csv("data.csv")
# VIOLAÇÃO SCI-001: Fit antes do split!
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
train, test = train_test_split(df_scaled)
🖥️ Saída do SciAudit
● SCI-001 [error] Data Leakage
A função 'fit_transform' foi chamada antes de um split de dados ser detectado.
➔ Sugestão: Aplique o split (train_test_split) ANTES de qualquer fit/transform.
Linha 7: df_scaled = scaler.fit_transform(df)
⚠️ Limitações e Isenção de Responsabilidade
- Análise Estática: O SciAudit usa AST (Abstract Syntax Tree). Ele não executa o código. Se você usar métodos altamente dinâmicos (
exec,getattrcomplexos), a detecção pode ser limitada. - Falsos Positivos: Algumas regras (especialmente SCI-008 e SCI-013) usam heurísticas textuais e de nomenclatura. Elas servem como alertas para revisão humana, não como verdades absolutas.
- Não Substitui o Peer-Review: Esta ferramenta é um assistente, não um juiz final. A integridade científica final é responsabilidade dos autores.
📜 Leis Científicas Implementadas (12+)
O SciAudit organiza suas regras em categorias críticas, cada uma com uma severidade padrão:
🔴 Leakage (Vazamento) - Severidade: ERROR
| ID | Nome | Descrição |
|---|---|---|
| SCI-001 | Data Leakage | Transformações (fit/transform) ocorrendo antes do split. |
| SCI-006 | Contaminação | Uso de X_test ou y_test dentro do método fit(). |
| SCI-007 | Time Leakage | Reordenação (sort_values) de dados temporais após o split. |
| SCI-008 | Label Leakage | Criação de features derivadas diretamente da variável alvo. |
| SCI-017 | Time Shuffle | Embaralhamento de dados temporais em splits cronológicos. |
🟡 Estatística & Rigor - Severidade: WARNING
| ID | Nome | Descrição |
|---|---|---|
| SCI-002 | Random Seed | Falta de random_state em funções estocásticas. |
| SCI-004 | P-Value Hacking | Múltiplas comparações estatísticas sem correção de Bonferroni/FDR. |
| SCI-005 | Overfitting Cego | Uso de métricas (accuracy, r2) sem Cross-Validation detectável. |
| SCI-009 | Imbalance Ignored | Uso de acurácia em datasets desbalanceados sem checagem prévia. |
| SCI-014 | Silent NaN Drop | Remoção de dados faltantes (dropna) sem log/print do impacto. |
🔵 Metodologia & Causalidade - Severidade: INFO
| ID | Nome | Descrição |
|---|---|---|
| SCI-003 | Multicolinearidade | Interpretação de importância de features sem análise de correlação. |
| SCI-013 | Causal Hubris | Afirmações de causalidade em comentários sem evidência de rigor. |
💡 Manifesto
O SciAudit nasceu para combater a crise de reprodutibilidade na ciência de dados. Acreditamos que a integridade deve ser automatizada e que todo modelo de alta performance deve ser, antes de tudo, um modelo de alta honestidade.
Desenvolvido com ❤️ por Lucas Hoffnung Bernardo (@lbhoffnung) para a comunidade científica.
Metadata
Release files for sciaudit 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sciaudit-0.1.0.tar.gz | 27.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sciaudit-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.6 kB
Release files / sciaudit-0.1.0.tar.gz
| Download URL | sciaudit-0.1.0.tar.gz |
|---|---|
| Size | 27.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e3f7295d93218cacf567cc8db9926cb23227231f580c85fb39d90e10bb0b40f8
|
|
BLAKE2b-256 checksum How to use checksums |
a4967376bc37bc9f4257584ace602a0acebf10fe6b74ec4c7383238669da8f4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / sciaudit-0.1.0-py3-none-any.whl
| Download URL | sciaudit-0.1.0-py3-none-any.whl |
|---|---|
| Size | 27.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e03c99d289214b995aedd8d7ac005a50f4118f5866f2099b34fdae4690c0d107
|
|
BLAKE2b-256 checksum How to use checksums |
1be74cbcada2296b03500e9e9022cbff796938ecafab1899b2ecade28d0498e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|