Bioestatística II
A análise estatística é uma abordagem quantitativa que envolve a coleta, organização, interpretação e apresentação de dados para entender padrões, tendências e relações em um conjunto de informações.
Importando dados
Para fazer uma análise estatística é necessário um pouco dos conhecimentos dos conteúdos publicados anteriormente, como importação de dados, exploração manipulação e limpeza de dados.
Nesse módulo iremos trabalhar com 2 conjuntos de dados, um sobre diabetes e outro o titanic (que trabalhamos em módulos anteriores).
import pandas as pd
import seaborn as sns
import numpy as np
from scipy import statsfrom sklearn.datasets import load_diabetes
# Carregando o conjunto de dados
diabetes_data = load_diabetes()
# Convertendo para um DataFrame Pandas
diabetes = pd.DataFrame(data=diabetes_data.data, columns=diabetes_data.feature_names)
diabetes['target'] = diabetes_data.target
diabetes
# Importar o conjunto de dados Titanic
titanic = sns.load_dataset('titanic')
Processamento de dados
Antes de começar a trabalhar com nossos dados, precisamos estudar como estão organizado os dados e o que podemos fazer para facilitar nosso trabalho
A descrição do que é cada coluna:
- age: Idade do paciente com diabetes.
- sex: Sexo do paciente (0 para feminino, 1 para masculino).
- bmi: Índice de massa corporal (BMI) do paciente.
- bp: Pressão arterial média do paciente.
- s1: Soro de lipoproteína de baixa densidade (LDL) e colesterol.
- s2: Soro de lipoproteína de alta densidade (HDL) e colesterol.
- s3: Logaritmo natural da concentração de soro de lipoproteína total.
- s4: Logaritmo natural da relação entre soro de LDL e HDL.
- s5: Média de nível de açúcar no sangue em jejum.
- s6: Função de pedigree de diabetes.
# Renomeando colunas
diabetes = diabetes.rename(columns={'age': 'idade', 'sex': 'sexo', 'bmi': 'imc', 'bp': 'pressao_arterial', 's1': 'soro_LDL_colesterol', 's2': 'soro_HDL_colesterol', 's3': 'log_prot_total', 's4': 'log_LDL/HDL', 's5': 'madia_acucar_jejum', 's6': 'funcao_pedigree'})
diabetes.head()
# Resumo estatístico das variáveis numéricas
diabetes.describe()
Análise Descritiva
Como vimos no módulo anterior (Bioestatística I), podemos fazer uma análise com uma visão geral e resumida dos dados.
# Amplitude das variáveis numéricas
amplitude = diabetes.max() - diabetes.min()
print("Amplitude das variáveis numéricas:")
print(amplitude)
# Variância das variáveis numéricas
variancia = diabetes.var()
print("Variância das variáveis numéricas:")
print(variancia)
# Desvio padrão das variáveis numéricas
desvio_padrao = diabetes.std()
print("Desvio Padrão das variáveis numéricas:")
print(desvio_padrao)
# Coeficiente de Variação das variáveis numéricas
coeficiente_variacao = (desvio_padrao / diabetes.mean()) * 100
print("Coeficiente de Variação das variáveis numéricas:")
print(coeficiente_variacao)
Análise Estatística
Teste T
Desenvolvido por William Sealy Gosset, que usava o pseudônimo “Student”, o teste t de Student, é um teste estatístico utilizado para comparar as médias de duas amostras independentes ou para comparar a média de uma amostra com um valor de referência conhecido.
O teste é baseado na estatística t, que é calculada como a diferença entre as médias amostrais dividida pelo erro padrão dessa diferença. A estatística t segue uma distribuição t de Student, que é uma distribuição de probabilidade que leva em consideração o tamanho da amostra e a incerteza associada às estimativas das médias.
A ideia principal do teste t é determinar se a diferença entre as médias observadas é estatisticamente significativa ou simplesmente devida ao acaso.
O teste t calcula um valor-p (p-value), que é a probabilidade de obter uma diferença tão grande ou maior do que a observada, assumindo que as médias populacionais sejam iguais. Se o valor-p for menor que um nível de significância pré-determinado (geralmente 0,05), rejeitamos a hipótese nula de igualdade das médias e concluímos que existe uma diferença estatisticamente significativa entre as médias das amostras.
Para exemplificar como fazer um Teste T, criamos 2 grupos fictícios:
- Grupo 1, que contem os valores da variável ‘target’ para os casos onde as pessoas tenham idade menor que a média.
- Grupo 2, que contem os valores da variável ‘target’ para os casos onde as pessoas tenham idade igual ou acima da média.
Na linha 7 nós temos: ‘_, p_valor = ttest_ind(grupo1, grupo2)’: aqui o teste t é aplicado aos dois grupos criados. A função ttest_ind retorna dois valores (o valor-t e o valor-p (p-valor)) do teste.
Estamos interessados apenas no valor-p, que é atribuído à variável p_valor, enquanto o valor-t é ignorado e atribuído a um sublinhado _, indicando que não estamos interessados nele.
Então criamos uma estrutura condiconal que verifica se o p_valor é menor que 0,05, usando a função ‘if p_valor <0,05’, onde caso o valor seja menor que 0,05, queremos que imprima (print) uma frase e informe o valor de p, caso contrário (else), imprima (print) uma outra frase com o valor de p.
Já, na segunda parte, criamos, demos outro exemplo, com outros dois grupos:
- Grupo 3, que tem as idades das mulheres (sexo = 0), removendo quaisquer valores nulos que possam estar na coluna.
- Grupo 4, que tem as idades dos homensa (sexo = 1), removendo quaisquer valores nulos que possam estar na coluna.
from scipy.stats import ttest_ind
# Teste t para comparar a média da variável alvo ("target") entre dois grupos fictícios, por exemplo, grupos com idade acima e abaixo da média:
grupo1 = diabetes[diabetes['idade'] < diabetes['idade'].mean()]['target']
grupo2 = diabetes[diabetes['idade'] >= diabetes['idade'].mean()]['target']
_, p_valor = ttest_ind(grupo1, grupo2)
if p_valor < 0.05:
print(f'A diferença nas médias de "target" entre os grupos é estatisticamente significativa (p-valor = {p_valor})')
else:
print(f'Não há diferença estatisticamente significativa nas médias de "target" entre os grupos (p-valor = {p_valor})')
# Teste t para comparar as médias de idade entre os grupos de sexo (0 para feminino e 1 para masculino):
grupo3 = diabetes[diabetes['sexo'] == 0]['idade'].dropna()
grupo4 = diabetes[diabetes['sexo'] == 1]['idade'].dropna()
_, p_valor = ttest_ind(grupo3, grupo4)
if p_valor < 0.05:
print(f'Existe uma diferença significativa nas médias de idade entre os grupos de sexo (p-valor = {p_valor})')
else:
print(f'Não existe uma diferença significativa nas médias de idade entre os grupos de sexo (p-valor = {p_valor})')
A diferença nas médias de "target" entre os grupos é estatisticamente significativa (p-valor = 0.0001924684394904987)
Não existe uma diferença significativa nas médias de idade entre os grupos de sexo (p-valor = nan)
Análise de Variância (ANOVA)
O teste de análise de variância (ANOVA) é uma técnica estatística usada para comparar as médias de três ou mais grupos independentes. Ele determina se existe uma diferença estatisticamente significativa entre as médias dos grupos com base na variabilidade dos dados.
O ANOVA compara a variância entre grupos (variabilidade entre grupos) com a variância dentro dos grupos (variabilidade dentro dos grupos). Se a variabilidade entre grupos for significativamente maior do que a variabilidade dentro dos grupos, concluímos que há diferença nas médias entre os grupos.
O ANOVA utiliza a análise de decomposição da soma de quadrados para calcular a estatística F, que é a relação entre a variância entre grupos e a variância dentro dos grupos. A estatística F segue uma distribuição F de Snedecor, e um valor-p é calculado para determinar a significância estatística da diferença entre as médias dos grupos. Existem diferentes tipos de ANOVA, dependendo do design experimental e do número de fatores envolvidos: ANOVA de um fator (one-way ANOVA): É utilizado quando há apenas um fator sendo analisado. Por exemplo, podemos comparar as médias de vários grupos que foram submetidos a diferentes tratamentos ou exposições. ANOVA de dois fatores (two-way ANOVA): É usado quando há dois fatores de interesse. Por exemplo, podemos investigar a interação entre dois tratamentos diferentes em relação às médias dos grupos. ANOVA de fatores múltiplos (multi-way ANOVA): É aplicado quando há três ou mais fatores envolvidos na análise. Por exemplo, podemos examinar a interação entre vários tratamentos, variáveis independentes ou grupos. O ANOVA é uma técnica poderosa que permite comparar e analisar as diferenças entre múltiplos grupos simultaneamente. Ele é amplamente utilizado em diversas áreas, como ciências sociais, ciências biológicas, estudos clínicos, pesquisas de mercado e muitas outras disciplinas onde é necessário comparar as médias de grupos independentes.
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Criando o modelo ANOVA
modelo_anova = ols('idade ~ sexo', data=diabetes).fit()
# Realizando a análise de variância (ANOVA)
anova_resultado = sm.stats.anova_lm(modelo_anova, typ=2)
print("Resultado da ANOVA:")
print(anova_resultado)
Resultado da ANOVA:
sum_sq df F PR(>F)
sexo 0.030185 1.0 13.69458 0.000242
Residual 0.969815 440.0 NaN NaN
O resultado da ANOVA incluirá a estatística F e o valor-p associado. Um valor-p menor que 0.05 indicaria que existe uma diferença estatisticamente significativa nas médias de idade entre os grupos de sexo.
Correlação
Os testes estatísticos de correlação são usados para avaliar a relação entre duas variáveis e determinar se existe uma associação estatisticamente significativa entre elas. Esses testes ajudam a medir o grau e a direção da relação entre as variáveis e são amplamente utilizados em diversas áreas, incluindo pesquisa científica, negócios e ciências sociais. Duas das técnicas de correlação mais comuns são o teste de correlação de Pearson e o teste de correlação de Spearman.
- Correlação de Pearson: também conhecida como coeficiente de correlação de Pearson ou correlação linear, é usada para avaliar a relação linear entre duas variáveis contínuas. O coeficiente de correlação de Pearson, denotado como “r”, varia de -1 a +1 e possui as seguintes interpretações:
- r = +1: Correlação perfeita positiva.
- r = 0: Ausência de correlação (independência linear).
- r = -1: Correlação perfeita negativa.
O teste de correlação de Pearson assume que as variáveis têm uma relação linear e que os dados são normalmente distribuídos. Ele é sensível a outliers e pode ser influenciado por valores extremos.
- Correlação de Spearman: também chamada de coeficiente de correlação de postos de Spearman ou correlação de ordem de Spearman, é usada quando as variáveis não têm uma relação linear ou quando os dados não atendem aos pressupostos da distribuição normal. Em vez de trabalhar com os valores brutos das variáveis, a correlação de Spearman classifica os valores e calcula a correlação com base nas classificações. O coeficiente de correlação de Spearman, denotado como “ρ” ou “rs”, varia de -1 a +1, da mesma forma que o coeficiente de Pearson. Ele mede a força e a direção da relação monotônica entre as variáveis, o que significa que ele pode detectar associações que não são estritamente lineares. O teste de correlação de Spearman é menos sensível a outliers do que o teste de Pearson e é apropriado para dados ordinais ou não paramétricos.
from scipy.stats import pearsonr
from scipy.stats import spearmanr
# correlacao de Pearson
correlacao, p_valor = pearsonr(diabetes['idade'], diabetes['imc'])
print(f'Correlação de Pearson entre idade e imc: {correlacao:.2f} (p-valor = {p_valor})')
# Correlação de Spearman
correlacao, p_valor = spearmanr(diabetes['idade'], diabetes['imc'])
print(f'Correlação de Spearman entre idade e imc: {correlacao:.2f} (p-valor = {p_valor})')
Correlação de Pearson entre idade e imc: 0.19 (p-valor = 9.076791865417418e-05)
Correlação de Spearman entre idade e imc: 0.20 (p-valor = 2.1598700354555388e-05)
Uma matriz de correlação é uma tabela que mostra as correlações entre várias variáveis em um conjunto de dados. Ela é usada principalmente na análise estatística e fornece uma visão geral das relações entre as variáveis, destacando o grau e a direção dessas correlações.
As variáveis são listadas nas linhas e nas colunas, e os valores de correlação são preenchidos nas células correspondentes. Os valores de correlação geralmente variam de -1 a +1
correlacao = diabetes.corr()
print("Matriz de Correlação:")
print(correlacao)
# Você pode visualizar a matriz de correlação usando seaborn ou matplotlib
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(correlacao, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("Matriz de Correlação")
plt.show()
Matriz de Correlação:
idade sexo imc pressao_arterial \
idade 1.000000 0.173737 0.185085 0.335428
sexo 0.173737 1.000000 0.088161 0.241010
imc 0.185085 0.088161 1.000000 0.395411
pressao_arterial 0.335428 0.241010 0.395411 1.000000
soro_LDL_colesterol 0.260061 0.035277 0.249777 0.242464
soro_HDL_colesterol 0.219243 0.142637 0.261170 0.185548
log_prot_total -0.075181 -0.379090 -0.366811 -0.178762
log_LDL/HDL 0.203841 0.332115 0.413807 0.257650
madia_acucar_jejum 0.270774 0.149916 0.446157 0.393480
funcao_pedigree 0.301731 0.208133 0.388680 0.390430
target 0.187889 0.043062 0.586450 0.441482
soro_LDL_colesterol soro_HDL_colesterol log_prot_total \
idade 0.260061 0.219243 -0.075181
sexo 0.035277 0.142637 -0.379090
imc 0.249777 0.261170 -0.366811
pressao_arterial 0.242464 0.185548 -0.178762
soro_LDL_colesterol 1.000000 0.896663 0.051519
soro_HDL_colesterol 0.896663 1.000000 -0.196455
log_prot_total 0.051519 -0.196455 1.000000
log_LDL/HDL 0.542207 0.659817 -0.738493
madia_acucar_jejum 0.515503 0.318357 -0.398577
funcao_pedigree 0.325717 0.290600 -0.273697
target 0.212022 0.174054 -0.394789
log_LDL/HDL madia_acucar_jejum funcao_pedigree \
idade 0.203841 0.270774 0.301731
sexo 0.332115 0.149916 0.208133
imc 0.413807 0.446157 0.388680
pressao_arterial 0.257650 0.393480 0.390430
soro_LDL_colesterol 0.542207 0.515503 0.325717
soro_HDL_colesterol 0.659817 0.318357 0.290600
log_prot_total -0.738493 -0.398577 -0.273697
log_LDL/HDL 1.000000 0.617859 0.417212
madia_acucar_jejum 0.617859 1.000000 0.464669
funcao_pedigree 0.417212 0.464669 1.000000
target 0.430453 0.565883 0.382483
target
idade 0.187889
sexo 0.043062
imc 0.586450
pressao_arterial 0.441482
soro_LDL_colesterol 0.212022
soro_HDL_colesterol 0.174054
log_prot_total -0.394789
log_LDL/HDL 0.430453
madia_acucar_jejum 0.565883
funcao_pedigree 0.382483
target 1.000000
Regressão Linear
O teste estatístico de regressão linear é uma técnica amplamente utilizada na análise estatística que visa modelar a relação entre uma variável dependente (ou resposta) e uma ou mais variáveis independentes (ou preditoras) por meio de uma equação linear. Esse modelo permite fazer previsões ou estimativas com base nos valores das variáveis independentes.
Em um modelo de regressão linear simples, temos uma variável dependente (Y) e uma única variável independente (X).
Ainda, o coeficiente linear (intercepto) e o coeficiente angular (coeficiente de inclinação) são dois parâmetros essenciais que descrevem a relação linear entre uma variável dependente (Y) e uma variável independente (X).
- Coeficiente Linear (Intercepto): representado como “β0” na equação da regressão linear simples. Ele representa o ponto em que a reta de regressão cruza o eixo vertical (eixo Y) quando a variável independente (X) é igual a zero. O coeficiente linear determina onde a reta começa no gráfico de dispersão.
- Coeficiente Angular (Coeficiente de Inclinação): representado como “β1” na equação da regressão linear simples. Ele representa a taxa de mudança na variável dependente (Y) para uma unidade de mudança na variável independente (X), ou seja, indica quanto a variável dependente (Y) é esperada para aumentar ou diminuir quando a variável independente (X) aumenta em uma unidade. É responsável pela inclinação da reta de regressão no gráfico de dispersão. Se β1 for positivo, isso indica uma relação positiva entre X e Y, enquanto um valor negativo indica uma relação negativa.
A equação geral da regressão linear simples é dada por: Y = β0 + β1X + ε
- Y: Variável dependente.
- X: Variável independente.
- β0: Coeficiente linear (intercepto).
- β1: Coeficiente angular (coeficiente de inclinação).
- ε: Erro (resíduo), que representa a variação não explicada pelo modelo.
from sklearn.linear_model import LinearRegression
X = diabetes[['imc']]
y = diabetes['target']
modelo = LinearRegression()
modelo.fit(X, y)
coeficiente_linear = modelo.intercept_
coeficiente_angular = modelo.coef_[0]
print(f"Equação da Regressão Linear: y = {coeficiente_angular:.2f} * x + {coeficiente_linear:.2f}")
Equação da Regressão Linear: y = 949.44 * x + 152.13
Qui-Quadrado
O teste estatístico qui-quadrado (ou teste do qui-quadrado) é uma técnica utilizada para avaliar a associação entre duas variáveis categóricas em um conjunto de dados. Ele é amplamente utilizado em estatística e pesquisa, especialmente em áreas como epidemiologia, ciências sociais e psicologia, para determinar se existe uma relação significativa entre as variáveis categóricas.
O teste qui-quadrado é aplicado a variáveis categóricas, que podem ser de dois tipos:
- Variáveis categóricas nominais: Categorias sem uma ordem específica, como cores dos olhos, gênero ou estado civil.
- Variáveis categóricas ordinais: Categorias com uma ordem específica, como níveis de escolaridade (primário, secundário, superior).
Antes de realizar o teste qui-quadrado, é necessário criar uma tabela de contingência (tabela cruzada) que mostra a distribuição conjunta das duas variáveis categóricas. A tabela de contingência exibe o número de observações em cada combinação das categorias das duas variáveis.
Abaixo vamos usar novamente o df ‘titanic’.
import pandas as pd
from scipy.stats import chi2_contingency
# Tabela de contingência
tabela_contingencia = pd.crosstab(titanic['survived'], titanic['sex'])
# Realizando o teste Qui-Quadrado
chi2, p_valor, _, _ = chi2_contingency(tabela_contingencia)
if p_valor < 0.05:
print(f'As variáveis "survived" e "sex" não são independentes (p-valor = {p_valor})')
else:
print(f'As variáveis "survived" e "sex" são independentes (p-valor = {p_valor})')
As variáveis "survived" e "sex" não são independentes (p-valor = 1.1973570627755645e-58)
# Tabela de contingência
tabela_contingencia = pd.crosstab(titanic['survived'], titanic['class'])
# Realizando o teste de Qui-Quadrado de Pearson
chi2, p_valor, _, _ = chi2_contingency(tabela_contingencia)
if p_valor < 0.05:
print(f'As variáveis "survived" e "class" não são independentes (p-valor = {p_valor})')
else:
print(f'As variáveis "survived" e "class" são independentes (p-valor = {p_valor})')
As variáveis "survived" e "class" não são independentes (p-valor = 4.549251711298793e-23)