library(tidyverse) # Manipulação e visualização
library(readxl) # Leitura de Excel
library(janitor) # Limpeza de dados
library(gtsummary) # Tabelas descritivas
library(officer) # Exportação para Word
library(flextable) # Tabelas formatadas
library(ggpubr) # Gráficos de publicação
library(sjPlot) # Tabelas e gráficos
library(vcd) # Visualização de dados categóricos
# Remover notação científica
options(scipen = 999)3 Análise Exploratória de Dados
3.1 Introdução
A Análise Exploratória de Dados (EDA) é uma etapa fundamental em qualquer projeto de análise estatística. Consiste em investigar os dados usando estatísticas descritivas e visualizações para:
- Compreender a distribuição das variáveis
- Identificar padrões e tendências
- Detectar valores atípicos (outliers)
- Formular hipóteses para análises posteriores
- Verificar a qualidade dos dados
Neste capítulo, abordaremos dois componentes essenciais da AED:
- Estatística Descritiva: Resumir dados usando tabelas e medidas
- Visualização de Dados: Criar gráficos informativos com ggplot2
3.2 Preparação dos Dados
Antes de iniciar a análise exploratória, precisamos carregar os pacotes necessários e preparar os dados.
3.2.1 Carregando Pacotes
3.2.2 Importando e Limpando Dados
# Carregar banco de dados
dados <- read_excel("data/dados_internacoes_maringa_2024.xlsx")
# Pipeline de limpeza
dados_limpos <- dados |>
clean_names() |> # Padronizar nomes das colunas
filter(cod_idade == "Anos") |> # Filtrar apenas idades em anos
select(sexo, val_tot, raca_cor, idade, # Selecionar colunas relevantes
morte, dias_perm, mes_cmpt) |>
mutate( # Recodificar raça/cor
raca_cor = case_when(
raca_cor == '01' ~ "Branca",
raca_cor == "02" ~ "Preta",
raca_cor == "03" ~ "Parda",
raca_cor == "04" ~ "Amarela",
raca_cor == "05" ~ "Indígena"
)
) |>
mutate(across(c(val_tot, idade, dias_perm), as.numeric)) |> # Converter para numérico
mutate(across(c(sexo, raca_cor, morte, mes_cmpt), as.factor)) # Converter para fator3.3 Estatística Descritiva
A estatística descritiva resume e apresenta as características principais dos dados.
3.3.1 Medidas de Tendência Central
- Média: Valor médio dos dados
- Mediana: Valor central quando os dados estão ordenados
- Moda: Valor mais frequente
3.3.2 Medidas de Dispersão
- Desvio Padrão (DP): Variabilidade em torno da média
- Variância: Quadrado do desvio padrão
- Amplitude: Diferença entre máximo e mínimo
- Intervalo Interquartil (IQR): Diferença entre o 3º e 1º quartil
3.3.3 Criando Tabelas Descritivas com gtsummary
O pacote gtsummary facilita a criação de tabelas descritivas profissionais.
3.3.3.1 Tabela Básica
# Tabela descritiva simples
dados_limpos |>
tbl_summary()3.3.3.2 Tabela Estratificada
# Tabela estratificada por desfecho (morte)
tabela_1 <- dados_limpos |>
tbl_summary(
by = morte, # Estratificar por morte
statistic = list(all_continuous() ~ "{mean} ({sd})"), # Média (DP) para contínuas
label = list( # Renomear variáveis
idade ~ "Idade (anos)",
sexo ~ "Sexo",
val_tot ~ "Valor da internação (Reais)",
raca_cor ~ "Raça/Cor",
dias_perm ~ "Dias de permanência"
)
) |>
add_overall(col_label = "**Total**") |> # Adicionar coluna total
bold_labels() |> # Negrito nos rótulos
modify_header(label = "**Características avaliadas**") # Customizar cabeçalho
tabela_13.3.3.3 Personalizando Estatísticas
Você pode especificar diferentes estatísticas para diferentes tipos de variáveis:
dados_limpos |>
tbl_summary(
by = sexo,
statistic = list(
all_continuous() ~ "{mean} ({sd}) | {median} [{p25}, {p75}]",
all_categorical() ~ "{n} ({p}%)"
),
digits = all_continuous() ~ 2
) |>
add_p() |> # Adicionar p-valores
add_overall() |> # Adicionar coluna total
bold_p(t = 0.05) |> # Negrito em p < 0.05
bold_labels()3.3.4 Exportando Tabelas
3.3.4.1 Exportação para Word
# Converter para flextable
ft <- tabela_1 |>
as_flex_table()
# Criar documento Word
doc <- read_docx() |>
body_add_par(
"Tabela 1: Estatísticas descritivas das internações de Maringá em 2024",
style = "heading 1"
) |>
body_add_flextable(ft)
# Salvar arquivo
print(doc, target = "tabela_1.docx")3.3.4.2 Exportação para Excel
library(openxlsx)
# Criar workbook
wb <- createWorkbook()
addWorksheet(wb, "Tabela Descritiva")
# Adicionar tabela
writeData(wb, sheet = 1, x = tabela_1)
# Salvar
saveWorkbook(wb, "tabela_1.xlsx", overwrite = TRUE)3.4 Testes Estatísticos
Testes estatísticos nos permitem fazer inferências sobre a população a partir da amostra.
3.4.1 Teste de Correlação
A correlação mede a força e direção da associação entre duas variáveis contínuas.
3.4.1.1 Coeficiente de Correlação
- Pearson: Para relações lineares (dados normais)
- Spearman: Para relações monotônicas (dados não normais ou ordinais)
- Kendall: Alternativa robusta ao Spearman
Valores variam de -1 (correlação negativa perfeita) a +1 (correlação positiva perfeita).
# Correlação de Spearman entre valor total e idade
cor(x = dados_limpos$val_tot,
y = dados_limpos$idade,
method = "spearman")3.4.1.2 Visualizando Correlação
# Gráfico de dispersão com linha de regressão
correlation_plot <- ggscatter(
dados_limpos,
x = "val_tot",
y = "idade",
add = "reg.line", # Adicionar linha de regressão
add.params = list(color = "navyblue"), # Customizar linha
conf.int = TRUE, # Intervalo de confiança
cor.coef = TRUE, # Mostrar coeficiente
cor.method = "spearman" # Método de correlação
) +
labs(
title = "Correlação entre Valor Total e Idade",
x = "Valor total da internação (R$)",
y = "Idade (anos)"
) +
theme_minimal()
correlation_plot3.4.1.3 Matriz de Correlação
# Selecionar apenas variáveis numéricas
dados_numericos <- dados_limpos |>
select(where(is.numeric))
# Calcular matriz de correlação
matriz_cor <- cor(dados_numericos, method = "spearman", use = "complete.obs")
# Visualizar com corrplot
library(corrplot)
corrplot(matriz_cor,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
diag = FALSE)3.4.2 Teste do Qui-Quadrado
O teste qui-quadrado avalia a associação entre duas variáveis categóricas.
Hipóteses:
- H₀: As variáveis são independentes
- H₁: As variáveis são associadas
# Teste qui-quadrado: sexo vs. morte
resultado_chi <- chisq.test(dados_limpos$sexo, dados_limpos$morte)
resultado_chi3.4.2.1 Tabela de Contingência
# Tabela cruzada com percentuais
sjt.xtab(
var.row = dados_limpos$sexo,
var.col = dados_limpos$morte,
show.cell.prc = TRUE, # Mostrar percentuais
show.row.prc = TRUE, # Percentuais por linha
show.col.prc = TRUE # Percentuais por coluna
)3.4.2.2 Gráfico de Mosaico
Gráficos de mosaico visualizam a relação entre variáveis categóricas:
mosaic(~ sexo + morte,
data = dados_limpos,
shade = TRUE, # Colorir por resíduos
legend = TRUE, # Mostrar legenda
main = "Associação entre Sexo e Mortalidade")3.4.3 Teste t de Student
Compara médias entre dois grupos independentes.
# Comparar idade média entre sexos
t.test(idade ~ sexo, data = dados_limpos)
# Teste t pareado (para dados pareados)
# t.test(antes, depois, paired = TRUE)3.4.4 ANOVA (Análise de Variância)
Compara médias entre três ou mais grupos.
3.5 Visualização de Dados com ggplot2
O ggplot2 é o sistema de visualização mais popular do R, baseado na “Gramática de Gráficos”.
3.5.1 Estrutura Básica do ggplot2
Todos os gráficos ggplot2 seguem esta estrutura:
ggplot(data = <DATA>, mapping = aes(<MAPPINGS>)) +
<GEOM_FUNCTION>() +
<CUSTOMIZATIONS>3.5.2 Tipos de Gráficos
3.5.2.1 Gráfico de Barras
Ideal para variáveis categóricas:
# Gráfico de barras simples
ggplot(data = dados_limpos, mapping = aes(x = morte)) +
geom_bar() +
labs(
title = "Distribuição de Mortalidade",
x = "Óbito",
y = "Frequência"
) +
theme_minimal()3.5.2.2 Gráfico de Barras Agrupadas
ggplot(data = dados_limpos, mapping = aes(x = sexo, fill = morte)) +
geom_bar() +
labs(
x = "Sexo",
y = "Contagem",
title = "Mortalidade por Sexo em pacientes internados em Maringá",
subtitle = "Dados de 2024",
caption = "Fonte: SIH"
) +
scale_fill_manual(
name = "Óbito",
values = c("Sim" = "darkred", "Não" = "navy")
) +
theme_minimal()3.5.2.3 Gráfico de Barras Empilhadas (Proporções)
ggplot(data = dados_limpos, mapping = aes(x = sexo, fill = morte)) +
geom_bar(position = "fill") + # position = "fill" para proporções
labs(
x = "Sexo",
y = "Proporção",
title = "Percentual de Mortalidade por Sexo em pacientes internados em Maringá",
subtitle = "Dados de 2024",
caption = "Fonte: SIH"
) +
scale_fill_manual(
name = "Óbito",
values = c("Sim" = "darkred", "Não" = "navy")
) +
scale_y_continuous(labels = scales::percent) + # Formatar eixo Y como percentual
facet_grid(~ raca_cor) + # Separar por raça/cor
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotacionar rótulos3.5.2.4 Boxplot
Mostra a distribuição de variáveis contínuas:
ggplot(data = dados_limpos, mapping = aes(x = sexo, y = idade)) +
geom_boxplot(fill = "lightblue", outlier.color = "red") +
labs(
title = "Distribuição de Idade por Sexo",
x = "Sexo",
y = "Idade (anos)"
) +
theme_minimal()Interpretação do Boxplot:
- Linha central: Mediana
- Caixa: Intervalo interquartil (IQR) - contém 50% dos dados
- Linhas (whiskers): Extensão até 1.5 × IQR
- Pontos: Valores atípicos (outliers)
3.5.2.5 Histograma
Mostra a distribuição de frequências de uma variável contínua:
ggplot(data = dados_limpos, mapping = aes(x = idade)) +
geom_histogram(bins = 30, fill = "navy", color = "white") +
labs(
title = "Distribuição de Idade dos Pacientes",
x = "Idade (anos)",
y = "Frequência"
) +
theme_minimal()Você pode ajustar o número de bins ou especificar a largura:
# Com binwidth específica
ggplot(data = dados_limpos, mapping = aes(x = idade)) +
geom_histogram(binwidth = 5, fill = "navy", color = "white")3.5.2.6 Gráfico de Dispersão (Scatter Plot)
Mostra a relação entre duas variáveis contínuas:
ggplot(data = dados_limpos, mapping = aes(x = idade, y = dias_perm)) +
geom_point(alpha = 0.5, color = "navy") + # alpha para transparência
geom_smooth(method = "lm", color = "red") + # Linha de tendência
labs(
title = "Relação entre Idade e Dias de Permanência",
x = "Idade (anos)",
y = "Dias de permanência"
) +
theme_minimal()3.5.2.7 Gráfico Hexagonal (para muitos pontos)
ggplot(data = dados_limpos, mapping = aes(x = dias_perm, y = val_tot)) +
geom_hex() + # Hexágonos para densidade
geom_smooth(method = "glm", color = "red") +
labs(
x = "Dias de Permanência",
y = "Valor Total (R$)",
title = "Correlação entre Dias de Permanência e Valor Total",
subtitle = "Dados de 2024",
caption = "Fonte: SIH"
) +
scale_fill_viridis_c() + # Escala de cores viridis
theme_minimal()3.5.3 Gráficos de Tendência Temporal
Visualizando tendências ao longo do tempo:
ggplot(data = dados_limpos, aes(x = mes_cmpt, y = val_tot)) +
stat_summary(fun = mean, geom = "line", aes(group = 1), color = "navy", size = 1) +
stat_summary(fun = mean, geom = "point", color = "darkred", size = 3) +
labs(
title = "Valor Médio de Internações por Mês",
subtitle = "Maringá-PR, 2024",
x = "Mês",
y = "Valor médio (R$)",
caption = "Fonte: SIH"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))3.5.4 Faceting: Múltiplos Gráficos
O faceting permite criar múltiplos gráficos baseados em uma variável categórica:
3.5.4.1 facet_wrap()
ggplot(data = dados_limpos, aes(x = idade)) +
geom_histogram(bins = 30, fill = "navy") +
facet_wrap(~ raca_cor, ncol = 2) +
labs(
title = "Distribuição de Idade por Raça/Cor",
x = "Idade (anos)",
y = "Frequência"
) +
theme_minimal()3.5.4.2 facet_grid()
ggplot(data = dados_limpos, aes(x = sexo, y = idade, fill = sexo)) +
geom_boxplot() +
facet_grid(morte ~ raca_cor) +
labs(
title = "Idade por Sexo, Raça/Cor e Mortalidade",
x = "Sexo",
y = "Idade (anos)"
) +
theme_minimal() +
theme(legend.position = "none")3.5.5 Customizando Temas
O ggplot2 oferece vários temas prontos:
# Temas disponíveis
theme_minimal() # Minimalista (recomendado)
theme_classic() # Clássico
theme_bw() # Preto e branco
theme_light() # Leve
theme_dark() # Escuro
theme_void() # Vazio (sem eixos)3.5.5.1 Criando Tema Personalizado
# Tema personalizado para publicação
tema_publicacao <- theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 12, hjust = 0.5),
axis.title = element_text(size = 12, face = "bold"),
axis.text = element_text(size = 10),
legend.title = element_text(size = 11, face = "bold"),
legend.text = element_text(size = 10),
panel.grid.minor = element_blank()
)
# Aplicar ao gráfico
ggplot(dados_limpos, aes(x = sexo, y = idade)) +
geom_boxplot() +
tema_publicacao3.5.6 Salvando Gráficos
# Criar gráfico
p <- ggplot(dados_limpos, aes(x = sexo, fill = morte)) +
geom_bar() +
theme_minimal()
# Salvar como PNG
ggsave("grafico_mortalidade.png", plot = p, width = 10, height = 6, dpi = 300)
# Salvar como PDF (vetorial)
ggsave("grafico_mortalidade.pdf", plot = p, width = 10, height = 6)
# Salvar como TIFF (para publicação)
ggsave("grafico_mortalidade.tiff", plot = p, width = 10, height = 6, dpi = 600)3.6 Resumo do Capítulo
Neste capítulo, você aprendeu:
-
Estatística Descritiva:
- Criar tabelas descritivas profissionais com
gtsummary - Estratificar análises por grupos
- Exportar tabelas para Word e Excel
- Criar tabelas descritivas profissionais com
-
Testes Estatísticos:
- Teste de correlação (Pearson, Spearman)
- Teste qui-quadrado para variáveis categóricas
- Teste t para comparação de médias
- ANOVA para comparação de múltiplos grupos
-
Visualização com ggplot2:
- Gráficos de barras (simples, agrupados, empilhados)
- Boxplots e histogramas
- Gráficos de dispersão e hexagonais
- Gráficos de tendência temporal
- Faceting para múltiplos gráficos
- Customização de temas e cores
- Exportação de gráficos em diferentes formatos
No próximo capítulo, você aprenderá sobre modelos de regressão linear e logística, ferramentas essenciais para análise preditiva em saúde.
3.7 Exercícios Práticos
Crie uma tabela descritiva estratificada por sexo, incluindo p-valores para testar diferenças entre grupos
Teste se existe correlação significativa entre dias de permanência e valor total da internação
Realize um teste qui-quadrado para verificar se existe associação entre raça/cor e mortalidade
Crie um gráfico de barras mostrando a distribuição de internações por mês, colorido por mortalidade
Faça um boxplot comparando dias de permanência entre pacientes que foram a óbito e os que sobreviveram
Crie um gráfico de dispersão mostrando a relação entre idade e valor total, com pontos coloridos por sexo
Desenvolva um painel com 4 gráficos usando faceting para comparar diferentes variáveis
Exporte sua melhor tabela descritiva para Word e seu melhor gráfico como PNG de alta resolução (300 dpi)