Skip to main content

🛡️ SciAudit

License: MIT Python: 3.10+ Zero Dependencies

"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 .ipynb diretamente.

📦 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:

  1. Crie o baseline inicial:
    sciaudit . --create-baseline sciaudit-baseline.json
    
  2. 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ção ERROR ou WARNING (não presente no baseline).
  • --exit-code-strategy errors-only: Falha no build apenas em caso de violações ERROR.
  • --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, getattr complexos), 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)

Source distribution for sciaudit 0.1.0
File Size Uploaded
sciaudit-0.1.0.tar.gz 27.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sciaudit 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page