Neste projeto, foram usados classificadores para identificar quais são os fatores de risco para o acidente vascular cerebral (AVC). Um AVC (stroke) é um dano cerebral causado pela interrupção de seu fluxo sanguíneo.
- Certifique-se de ter o python instalado em seu computador;
- Clone esse repositório para algum lugar de sua máquina, utilizando o comando
https://github.com/insper-classroom/241-alglin-aps6-ribollarafa.git
; - Instale as bibliotecas necessárias contidas no arquivo
requirements.txt
, através do comando:pip install -r requirements.txt
.
- Criação do arquivo
demo.py
para demonstração; - Adição de comentários de explicação ao decorrer do código;
- Criação do
requirements.txt
para instalação de bibliotecas; - Arquivo
.gitignore
com pasta "archive" incluída.
- Rode o arquivo
demo.py
; - O arquivo gerará o resultado da acurácia.
Os dados para treinamento do nosso sistema foram baixados do site Kaggle - The Movies Dataset e armazenados no arquivo archive/healthcare-dataset-stroke-data.csv
, arquivo que foi incluído no .gitignore
e consequentemente não está nesse repositório dado seu tamanho.
Os dados recebidos eram descritos em linguagem natural, por exemplo, o dataframe possuia a coluna "gender" que podia ter como resposta "male", "female" e "other". Esse tipo de descrição facilita o entendimento dos dados por pessoas, mas para o computador isso não é facilmente interpretado. Asssim utilizamos a função get_dummies
da biblioteca pandas para reorganizar os dados de forma que facilitaria a interpretação pelo computador. Além disso, na coluna onde o "bmi" era representando para alguns o dado não existia assim prenchemos estas linhas com a média do bmi do dataframe.
Após esse tratamento incial separamos o dataframe original em dois, o primeiro o df_features
que não contém as colunas de "id" e "stroke", ou seja, possuiem os atributos que afetam a predição de saber se a pessoa tem chance de ter um AVC ou não, o segundo dataframe df_target
possuí somente a coluna de stroke, sendo que 1 representa uma pessoa que teve um AVC e -1 uma que não teve.
O primeiro método utilizado foi o da regressão linear. Para isso primeiramente transformamos nossos dois dataframes df_features
e
df_target
em numpy arrays, e então usamos a função train_test_split
da biblioteca sklearn para divir nossos arrays em um conjuto de teste e um de treino.
Então criamos a função loss
que contém a função que será usado pelo gradiente. Ela recebe um array com o pesos das features, o vies, as features de treino e o alvo de treino. Apartir desta função calculamos o seu gradiente, multiplicamos por alpha e atualizamos a o vies e os pesoss e calculamos novamente. Fazemos esse processo 10000, com um alpha de
Por último depois de chegarmos no valor ideal para nossos pesos e viés, podemos fazer nossa predição de se uma pessoa teria um AVC ou não usando o conjunto teste.
Para fazer a predição utilizando a Árvore de Decisão, primeiro separamos nossos dados em dois conjuntos um de treino e um de teste. Então utilizando a função DecisionTreeClassifier
da biblioteca sklearn uma árvore de decisão é gerado. Esta árvore é baseada em que features do nosso conjunto de treino possuem um valor de entropia maior, ou seja, quais features são mais decisivas na predição de se uma pessoa terá AVC ou não.
Para calcular a acurácia de ambas as técnicas de predição foi utilizado a função accuracy(y_test, y_est)
nela comparamos o sinal do resultado da predição e da informação correta se estes forem iguais então o modelo acertou. E então retornamos a média dos acertos.
Nossa acurácia para o modelo que utilizava a regressão linear obteve entorno de 0.75 na média, já para a árvore de decisão a média da nossa acurácia foi de entorno de 0.88.
Apesar das acurácias aparentarem serem boas em uma primeira análise, elas não são melhores que a hipótese nula, ou seja, se nosso modelo simplesmente dissesse que todos não teram AVC, teriamos uma acurácia mais alta dado que somente aproximadamente 0.04 das pessoas do banco de dados tiveram AVC. Isso demonstra que nosso modelo poderia ser melhorado.
Para analisarmos os fatores ligados ao Acidente Vascular Cerebral (AVC) escolhemos três formas para encontrarmos: Correlação, Regressão Linear e Árvore de Decisão. Para a correlação calculamos através do .corr()
, para a regressão linear utilizamos a transposta da nossa matriz de coeficientes de peso e para a árvore de decisão, usamos o método feature_importances_
, abaixo estão representados os 10 mais relevantes de cada um:
Ordem | Correlação | Regressão Linear | Árvore de Decisão |
---|---|---|---|
1 | Idade | Gênero Outro | Criança |
2 | Doença do Coração | Doença do Coração | Nível de Glicose |
3 | Nível de Glicose | Nunca Fumou | Idade |
4 | Hipertensão | Já Casado | Índice de Massa Corporal |
5 | Já Casado | Ex Fumante | Fumante |
6 | Status Fumante | Residente Urbano | Trabalhador Privado |
7 | Índice de Massa Corporal | Fumante | Doença do Coração |
8 | Residente Urbano | Residente Rural | Não Fumante |
9 | Trabalhador Privado | Nível de Glicose | Status de Fumante Desconhecido |
10 | Gênero Masculino | Gênero Masculino | Trabalhador do Governo |
Dentre os resultados gerados, percebemos que: idade, doença do coração, hipertensão, status de fumante, nível de glicose e tipo de residência foram os mais relevantes e após encontramos estudos que citam essas características:
1- Idade:
- Influence of Age and Health Behaviors on Stroke Risk: Lessons from Longitudinal Studies
- Age and Sex Are Critical Factors in Ischemic Stroke Pathology
2- Doença do Coração:
3- Hipertensão:
4- Status de Fumante:
- Smoking and Risk of Stroke
- Cigarette Smoking and Risk of Stroke in Middle-Aged Women
- Meta-analysis of relation between cigarette smoking and stroke
5- Nível de Glicose:
6- Tipo de Residência:
- Código desenvolvido com o auxílio do Notebook realizado pelo professor Marcio Fernando Stabile Junior;
- Auxílio do ChatGPT para saciar dúvidas relacionadas ao projeto.
Projeto desenvolvido por Gustavo Colombi Ribolla e Rafaela Afférri de Oliveira.