capa artigo

Regressão Logística Simples: Aplicação no Python (Caso 2)

Veja como a regressão logística pode prever sintomas cognitivos em idosos com base em escores de exames psicológicos.
Artigo escrito por Paula Gouveia

No primeiro artigo sobre regressão logística simples, apresentamos o Caso 1, no qual exploramos a construção de um modelo para prever a ocorrência de doenças coronárias (CHD) com base na idade dos pacientes. Analisamos como preparar os dados, ajustar o modelo e interpretar os coeficientes estimados. Agora, daremos continuidade à nossa abordagem de regressão logística, aplicando-a a um novo contexto: a previsão da presença de um sintoma cognitivo em idosos com base no escore obtido em um exame psicológico.

Neste estudo, ajustaremos um modelo para compreender a relação entre o escore do exame e a probabilidade de ocorrência do sintoma de caduquice. Além disso, exploraremos a interpretação dos coeficientes, calcularemos a razão de chances e avaliaremos a precisão das estimativas por meio do intervalo de confiança. Essa análise nos ajudará a entender melhor como variáveis explicativas podem influenciar resultados binários e como a regressão logística pode ser aplicada a diferentes cenários.

O objetivo deste estudo é ajustar um modelo de regressão logística simples para prever a ocorrência do sintoma com base no escore do exame. Vamos realizar a análise dos dados, interpretar os resultados do modelo e tirar algumas conclusões relevantes.

1. Instalação e Importação das Bibliotecas

Para realizar essa análise, utilizamos as bibliotecas pandas, numpy, matplotlib, seaborn para visualizações de dados e manipulação e statsmodels para regressão. Caso alguma dessas não esteja instalada, utilize o seguinte comando para instalar o statsmodels:

pip install statsmodels

Agora, vamos importar as bibliotecas necessárias:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.formula.api as smf

2. Conjunto de Dados

Para cada indivíduo, temos um escore de um exame psicológico, que será nossa variável explicativa/independente, denominada escore, representando o resultado do exame. Além disso, temos a variável resposta/dependente, denominada resp_sintoma, que indica a presença ou ausência do sintoma de caduquice.

  • escore: escore obtido no exame psicológico;
  • resp_sintoma: variável binária indicando presença (1) ou ausência (0) do sintoma.

Utilizamos o Python para estruturar nossos dados, criando um DataFrame que captura essas informações:

# Dados
# Variável explicativa/independente

escore = [9, 13, 6, 8, 10, 4, 14,
          8, 11, 7, 9, 7, 5, 14,
          13, 16, 10, 12, 11, 14, 15,
          18, 7, 16, 9, 9, 11, 13,
          15, 13, 10, 11, 6, 17, 14,
          19, 9, 11, 14, 10, 16, 10,
          16, 14, 13, 13, 9, 15, 10,
          11, 12, 4, 14, 20]
# Variável resposta/dependente
# 1 = presença de sintoma & 0 = ausência de sintoma

resp_sintoma = [1] * 14 + [0] * 40

Criaremos um DataFrame com essas duas variáveis, que iremos atribuir o nome de caduquice. Esse DataFrame, então, será composto pela variável escore e pela variável resp_sintoma:

# Criar o DataFrame

caduquice = pd.DataFrame({'escore': escore, 'resp_sintoma': resp_sintoma})

Assim, temos um conjunto de dados composto por 54 indivíduos idosos e duas variáveis de interesse: o escore e a variável binária resp_sintoma.

3. Análise Exploratória

Antes de ajustar o modelo, é fundamental analisarmos o comportamento geral dos dados. Para isso, primeiramente, calculamos algumas medidas de resumo:

# Medidas resumo
print("Resumo do DataFrame:")
print(caduquice.describe())
print("\nFrequência da variável resposta:")
print(caduquice['resp_sintoma'].value_counts())

A função describe fornece um resumo estatístico das variáveis, exibindo informações essenciais, como média, desvio padrão, valores mínimos e máximos. Além disso, a função value_counts nos permite visualizar a distribuição dos valores da variável resp_sintoma, que representa a presença ou ausência do sintoma.

Resumo do DataFrame:
           escore    resp_sintoma
count   54.000000    54.000000
mean    11.574074    0.259259
std      3.709253    0.442343
min      4.000000    0.000000
25%      9.000000    0.000000
50%      9.000000    0.000000
75%     14.000000    0.750000
max     20.000000    1.000000

Frequência da variável resposta:
resp_sintoma
0    40
1    14
Name: count, dtype: int64

Com base nesses resultados, podemos tirar algumas conclusões importantes.

Em primeiro lugar, observamos que o escore varia entre 4 (mínimo) e 20 (máximo), com uma média de 11,57. Além disso, ao analisarmos os quartis, percebemos que 50% das observações apresentam um escore igual ou menor que 11, enquanto 75% das observações têm um escore igual ou menor que 14.

Outro ponto relevante é a distribuição da variável resposta. Notamos que 40 idosos não apresentaram sintoma (0), enquanto 14 apresentaram (1). Isso indica que a presença do sintoma ocorre em cerca de 26% da amostra, o que pode ser um fator importante para a análise futura.

3.1 Visualização da Relação entre Escore e Sintoma

Para compreender melhor essa relação, utilizamos um gráfico de dispersão. Dessa forma, podemos visualizar como os valores do escore estão distribuídos entre aqueles que apresentaram (1) e não apresentaram (0) sintomas.

# Gráfico
plt.scatter(caduquice['escore'], caduquice['resp_sintoma'], alpha=0.7)
plt.xlabel('Escore')
plt.ylabel('Resp Sintoma')
plt.title('Relação entre escore e sintoma')
plt.show()
Regressão Logística -gráfico de dispersão mostrando a relação entre escore e resposta do sintoma, com valores de escore no eixo X e respostas binárias (0 e 1) no eixo Y.

Esse gráfico nos permite identificar possíveis padrões entre o escore e a presença do sintoma. Se houver uma tendência clara, isso pode indicar uma possível relação entre essas variáveis, o que pode ser explorado em análises mais aprofundadas.

Dessa forma, com essa análise inicial, conseguimos obter uma visão geral dos dados, facilitando os próximos passos no processo de modelagem.

4. Ajuste do Modelo de Regressão Logística

Para explicar a ocorrência do sintoma em função do escore, utilizamos a regressão logística por meio da biblioteca statsmodels. Essa abordagem é ideal para lidar com variáveis binárias, como é o caso da variável que representa a presença ou ausência do sintoma. Além disso, a função summary() nos permite visualizar os resultados detalhados do modelo, incluindo coeficientes, erros padrões, valores p e outras estatísticas relevantes.

Dessa forma, ajustamos o modelo conforme o código abaixo:

# Ajuste do modelo logístico
modelo = smf.logit("resp_sintoma ~ escore", data=caduquice).fit()
print("\nResumo do modelo:")
print(modelo.summary())

O processo de otimização foi bem-sucedido após seis iterações, e os principais resultados do modelo são apresentados a seguir:

Optimization terminated successfully.
         Current function value: 0.472383  
         Iterations 6  

Resumo do modelo:  
---------------------------------------------------------------------------------  
                         Logit Regression Results  
---------------------------------------------------------------------------------  
Dep. Variable:          resp_sintoma   No. Observations:                 54
Model:                         Logit   Df Residuals:                     52
Method:                          MLE   Df Model:                          1  
Date:               Fri, 07 Feb 2025   Pseudo R-squ.:                0.1746
Time:                       14:25:26   Log-Likelihood:              -25.509 
converged:                      True   LL-Null:                     -30.903 
Covariance Type:           nonrobust   LLR p-value:                 0.00121  
---------------------------------------------------------------------------------  
             coef      std err       z      P>|z|      [0.025     0.975]
_________________________________________________________________________________
Intercept   2.4040      1.192      2.017    0.044       0.068     4.740  
escore     -0.3235      0.114     -2.838    0.005      -0.547    -0.100  
---------------------------------------------------------------------------------

Ao analisar o resumo do modelo, podemos destacar alguns pontos importantes:

  1. Intercepto: O coeficiente do intercepto é 2,40. Embora esse valor seja reportado, ele não tem um significado prático para este resultado.
  2. Coeficiente do escore: O coeficiente associado à variável escore é -0,32, o que significa que há uma relação inversa entre o escore e a ocorrência do sintoma. Além disso, o valor p associado a esse coeficiente é 0,005, o que indica que ele é estatisticamente significante dentro do modelo proposto.

Nesse sentido, para verificar a significância da variável, utilizamos o valor p. Como ele é menor que 0,05, podemos concluir que o escore tem um impacto relevante na explicação da ocorrência do sintoma.

Outro ponto essencial é que os coeficientes da regressão logística são apresentados na forma logarítmica. Assim, o coeficiente de -0,32 indica que o logaritmo da razão de chances diminui com o aumento do escore. No entanto, essa interpretação pode ser pouco intuitiva. Por isso, é mais interessante calcular o odds ratio (razão de chances), que facilita a compreensão do impacto do escore na probabilidade de ocorrência do sintoma.

5. Cálculo da Razão de Chances (Odds Ratio)

Para transformar os coeficientes em razões de chance, utilizamos a função np.exp(), conforme demonstrado abaixo:

# Odds Ratio (Razão de Chances)

odds_ratio = np.exp(modelo.params)
print("\nOdds Ratios:")
print(odds_ratio)

Os resultados obtidos são os seguintes:

Odds Ratios:
Intercept     11.067837
escore:        0.723590
dtype: float64

Isso significa que, para cada unidade adicional no escore, a chance de apresentar o sintoma diminui em uma proporção correspondente a um odds ratio de 0,72. Ou seja, à medida que o escore aumenta, a probabilidade de ocorrência do sintoma reduz.

Além disso, podemos calcular a variação percentual dessa redução, o que torna a interpretação ainda mais clara:

# Cálculo da variação percentual
variacao_percentual = (1 - odds_ratio['escore']) * 100
print(f"Variação percentual: {variacao_percentual:.2f}%")

Com isso, encontramos que a cada aumento unitário no escore, a chance de apresentar o sintoma diminui em aproximadamente 27,64%.

6. Intervalo de Confiança

Por fim, para avaliar a precisão das estimativas, calculamos o intervalo de confiança de 95% para os coeficientes:

# Intervalo de Confiança (95%)
conf = modelo.conf_int()
conf['OR'] = odds_ratio
conf.columns = ['2.5%', '97.5%', 'OR']
conf[['OR', '2.5%', '97.5%']] = np.exp(conf[['OR', '2.5%', '97.5%']])
print("\nIntervalo de Confiança (95%):")
print(conf)

Os resultados obtidos são os seguintes:

Intervalo de Confiança (95%):
               2.5%       97.5%             OR
Intercept  1.070461  114.433901   64076.751025
escore     0.578726    0.904716       2.061822

Isso significa que, com 95% de confiança, a verdadeira razão de chances do escore está entre 0,56 e 0,88. Esse intervalo reforça a ideia de que o escore reduz significativamente a chance de ocorrência do sintoma, pois os limites do intervalo estão abaixo de 1.

Conclusão

Neste estudo, ajustamos um modelo de regressão logística simples para prever a ocorrência de caduquice em idosos com base no escore obtido em um exame psicológico. Ao analisar o coeficiente do escore, observamos que ele tem uma relação inversa com a probabilidade de ocorrência do sintoma. O cálculo da razão de chances revelou que, a cada aumento unitário no escore, a probabilidade de apresentação do sintoma diminui em aproximadamente 27,64%. Esse achado sugere que escores mais altos no exame psicológico estão associados a uma menor probabilidade de o indivíduo apresentar sinais de caduquice.

Além disso, a utilização do intervalo de confiança nos permitiu avaliar a precisão das estimativas, fornecendo uma visão mais robusta sobre os efeitos da variável explicativa.

A partir deste modelo, podemos fazer previsões mais informadas sobre a probabilidade de um idoso apresentar o sintoma, com base em seu escore no exame. Como próxima etapa, seria interessante explorar outras variáveis explicativas que possam aprimorar ainda mais a acurácia do modelo.

Você também pode aprender mais sobre esse tema pelo nosso canal no YouTube! Assista ao vídeo sobre Regressão Logística Simples em Python (Caso 2) no canal da Statplace.


Referências Bibliográficas

AGRESTI, A. An introduction to categorical data analysis. 2. ed. New York: J. Wiley & Sons, 2007. 394 p.
AGRESTI, A. Categorical data analysis. 3. ed. New York: J. Wiley & Sons, 2013. 714 p.
GIOLO, S. R. Introdução à análise de dados categóricos com aplicações. São Paulo: Blucher, 2017. 256 p.
HOSMER, D.; LEMESHOW, S.; STURDIVANT, R. Applied Logistic Regression. 3. ed. New York: J. Wiley & Sons, 2013. 528 p.

Share the Post:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Related Posts