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.
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:
- Idade avançada está associada a maior ocorrência de AVC?
- Níveis médios de glicose mais altos indicam maior risco?
- Hipertensão e doença cardíaca se correlacionam com o evento?
Problema de aprendizado supervisionado, classificação binária, com alvo stroke.
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).
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.
idremovido — identificador não carrega informação preditiva.- Registro único com
gender = "Other"removido, por não permitir generalização estatística. - Nulos de
bmiimputados pela mediana, resistente aos outliers presentes na variável. "Unknown"emsmoking_statusconvertido em nulo e imputado pela moda.
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 testeO 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.
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.
Python pandas NumPy scikit-learn Matplotlib Seaborn Jupyter
MVP_Joao_Victor_4052025002212.ipynb # notebook completo, com saídas
João Victor de Assis Natividade — github.com/ntd17
Pós-graduação em Ciência de Dados e Analytics, PUC-Rio.