Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 

Repository files navigation

Análise Exploratória e Pré-Processamento — Predição de AVC

MVP da disciplina Análise de Dados e Boas Práticas — Pós-graduação em Ciência de Dados e Analytics, PUC-Rio.

Análise exploratória e preparação de uma base clínica de 5.110 pacientes para modelagem de risco de Acidente Vascular Cerebral. O objetivo não é treinar um classificador, e sim responder se os dados sustentam essa modelagem — e deixar o conjunto pronto, sem vazamento, para a etapa seguinte.

Abrir no Google Colab


O problema

AVC é a interrupção do fluxo sanguíneo cerebral, e identificação precoce de risco depende de saber quais variáveis clínicas carregam sinal. Formulei três hipóteses antes de olhar os dados:

  1. Idade avançada está associada a maior ocorrência de AVC?
  2. Níveis médios de glicose mais altos indicam maior risco?
  3. Hipertensão e doença cardíaca se correlacionam com o evento?

Problema de aprendizado supervisionado, classificação binária, com alvo stroke.

Dados

Stroke Prediction Dataset — 5.110 registros anonimizados, 11 atributos clínicos e demográficos mais o alvo.

Característica Valor
Registros 5.110
Casos positivos 249 (4,87%)
Nulos em bmi 201 (3,9%)
smoking_status marcado como "Unknown" 1.544 (30,2%)

O desbalanceamento severo é inerente ao fenômeno: AVC é evento raro na população geral. Isso não é defeito da base — é a condição real do problema, e qualquer métrica futura precisa levar em conta (acurácia de 95% se obtém prevendo "não" para todo mundo).

O que a análise mostrou

As três hipóteses se confirmaram, com pesos bem diferentes.

age é de longe o fator numérico mais forte: correlação de 0,245 com o alvo. A separação aparece com clareza no boxplot — a mediana de idade é de 71 anos entre quem teve AVC contra 43 anos entre quem não teve.

As demais correlações são positivas mas modestas: heart_disease 0,135, avg_glucose_level 0,132, hypertension 0,128. bmi praticamente não carrega sinal linear (0,042).

Nenhuma variável isolada é preditor suficiente — o que era esperado, e é justamente o que justifica a modelagem multivariada. A multicolinearidade entre as features é baixa, o que favorece os algoritmos da etapa seguinte.

Tratamento aplicado

  • id removido — identificador não carrega informação preditiva.
  • Registro único com gender = "Other" removido, por não permitir generalização estatística.
  • Nulos de bmi imputados pela mediana, resistente aos outliers presentes na variável.
  • "Unknown" em smoking_status convertido em nulo e imputado pela moda.

Pré-processamento sem vazamento

A divisão treino/teste vem antes de qualquer transformação de escala:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y)

scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train_num)   # fit só no treino
X_test_std  = scaler.transform(X_test_num)        # transform no teste

O fit acontece exclusivamente no treino; o teste recebe apenas transform. Ajustar o scaler no conjunto completo faria a média e o desvio padrão do teste vazarem para o treino — erro silencioso, que não quebra nada e infla a métrica final.

A estratificação (stratify=y) preserva a proporção de 4,87% de positivos nas duas partições. Sem ela, uma divisão aleatória poderia concentrar casos raros de um lado só.

Foram testadas normalização (MinMaxScaler, escala 0–1) e padronização (StandardScaler, z-score), com verificação visual de que a forma da distribuição se manteve após a transformação. Variáveis categóricas receberam One-Hot Encoding.

Limitações reconhecidas

A imputação ocorreu antes da divisão. A mediana de bmi e a moda de smoking_status foram calculadas sobre a base completa, incluindo as linhas que depois formariam o teste. É vazamento de menor gravidade que o de escala, mas é vazamento: o correto seria dividir primeiro e imputar usando apenas estatísticas do treino. Fica registrado como correção pendente.

A imputação de smoking_status pela moda é uma decisão forte. São 30,2% dos registros marcados como "Unknown", todos atribuídos a "never smoked" — o que praticamente dobra essa categoria, de 1.892 para 3.436. A alternativa mais defensável seria tratar "Unknown" como categoria própria, já que o padrão de ausência pode ser informativo por si só.

Correlação de Pearson captura apenas relação linear. Os coeficientes reportados não descartam relações não lineares ou interações entre variáveis, que só a modelagem revelaria.

Stack

Python pandas NumPy scikit-learn Matplotlib Seaborn Jupyter

Estrutura

MVP_Joao_Victor_4052025002212.ipynb   # notebook completo, com saídas

Autor

João Victor de Assis Natividade — github.com/ntd17

Pós-graduação em Ciência de Dados e Analytics, PUC-Rio.

About

Análise exploratória e pré-processamento de base clínica de 5.110 pacientes para predição de AVC — MVP da PUC-Rio.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages