R: R EDA: Análise Exploratória de Dados
Última atualização: 2026-08-26
Nas seis aulas anteriores, abordamos estatística descritiva, distribuições de probabilidade, teste de hipóteses e regressão — todas essas são ferramentas “analíticas”. No entanto, o primeiro passo na análise de dados não é a modelagem, mas sim a EDA (Análise Exploratória de Dados) — explorar como os dados “se apresentam”. Nesta aula, aprenderemos a metodologia completa de EDA no R.
Ao concluir esta lição, você será capaz de usar o R para explorar detalhadamente qualquer conjunto de dados — incluindo sua forma, distribuição, valores atípicos, valores ausentes e correlações —, estabelecendo as bases para futuras modelagens.
1. O que você vai aprender
- O processo completo de EDA (5 etapas)
- Formato dos dados: str / dim / nrow / ncol
- Distribuição: resumo / skimr
- Valores ausentes: md.pattern / naniar
- Visualização de distribuição: histograma / gráfico de caixa / gráfico de densidade
- Relações: Gráfico de dispersão / Matriz de correlação
- Valores atípicos: gráfico de caixa e bigodes + IQR
- EDA automatizada (DataExplorer / SmartEDA)
2. Desafios com um conjunto de dados desconhecido
(1) Desafio: Por onde começo com um arquivo CSV de 100 colunas?
Bob recebeu um conjunto de dados de clientes composto por 100 colunas e 10.000 linhas, e seu gerente perguntou: “Dê uma olhada nesses dados primeiro”. Ele ficou olhando para o arquivo do Excel por cinco minutos, sem saber por onde começar.
(2) Solução usando R
library(DataExplorer)
# One line EDA Report
create_report(df, output_file = "eda_report.html")
1 linha de código → Relatório EDA completo em HTML (mais de 30 páginas de gráficos e estatísticas).
3. O processo completo de EDA (5 etapas)
(1) O método de 5 etapas
graph TB
A[1. Data Shape] --> B[2. Data Types]
B --> C[3. Missing Value Analysis]
C --> D[4. Distribution Exploration]
D --> E[5. Exploring Relationships]
A --> A1[dim/str/head]
B --> B1[summary/skimr]
C --> C1[md.pattern/naniar]
D --> D1[Histogram/Box plot]
E --> E1[Scatter/Correlation Matrix]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
(2) Referência rápida em 5 etapas
| Etapa | Objetivo | Funções principais |
|---|---|---|
| 1. Formato | Qual é o tamanho dos dados? | dim() nrow() ncol() str() |
| 2. Tipo | Qual é o tipo da coluna? | sapply(df, class) summary() |
| 3. Ausentes | Quantos estão ausentes? | colSums(is.na()) skimr naniar |
| 4. Distribuição | Intervalo numérico? | hist() boxplot() geom_density() |
| 5. Relações | As colunas estão relacionadas? | pairs() cor() corrplot |
4. Etapa 1: Formato dos dados
# Prepare the data
df <- iris # Use iris as demo
# Basic Information
dim(df) # [1] 150 5 ← 150 row 5 col
nrow(df) # [1] 150
ncol(df) # [1] 5
names(df) # Listed
str(df) # Structure
# 'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 ...
# $ Species : Factor w/ 3 levels "setosa",...
# Data Preview
head(df, 3) # First 3 rows
tail(df, 3) # Last 3 rows
5. Etapa 2: Tipo e resumo
(1) Colunas numéricas x colunas categóricas
# Column Types
sapply(df, class)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# "numeric" "numeric" "numeric" "numeric" "factor"
# Automatic Recognition
library(dplyr)
df |> summarise(across(everything(), class))
(2) summary() — um resumo de uma linha
summary(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min. :4.30 Min. :2.00 Min. :1.00 Min. :0.1
# 1st Qu.:5.10 1st Qu.:2.80 1st Qu.:1.60 1st Qu.:0.3
# Median :5.80 Median :3.00 Median :4.35 Median :1.3
# Mean :5.84 Mean :3.05 Mean :3.76 Mean :1.2
# 3rd Qu.:6.40 3rd Qu.:3.30 3rd Qu.:5.10 3rd Qu.:1.8
# Max. :7.90 Max. :4.40 Max. :6.90 Max. :2.5
# Species
# setosa :50
# versicolor:50
# virginica :50
(3) Resumo avançado do skimr
install.packages("skimr")
library(skimr)
skim(iris)
# ── Data Summary ────────────────────────
# Values
# Number of rows 150
# Number of columns 5
# ── Variable type: factor ──
# Species: 1 unique, 50 each
# ── Variable type: numeric ──
# Sepal.Length: mean=5.84, sd=0.83, p0=4.3, p25=5.1, p50=5.8, p75=6.4, p100=7.9
# ... (Each variable 20+ metrics)
6. Etapa 3: Análise de valores ausentes
(1) Estatísticas sobre valores ausentes
# Simulating Data with Missing Values
df <- data.frame(
a = c(1, 2, NA, 4),
b = c("x", NA, "z", "w"),
c = c(NA, 2, 3, NA)
)
# Number of missing values
colSums(is.na(df))
# a b c
# 1 1 2
# Proportion of Missing Values
colMeans(is.na(df)) * 100
# a b c
# 25 25 50
# Entire rows with NA
sum(!complete.cases(df)) # [1] 3
(2) naniar: Visualização avançada de valores ausentes
install.packages("naniar")
library(naniar)
# Missing Value Patterns
vis_miss(iris) # iris has no missing values, can draw empty chart
# Simulation with Missing Values
df_with_na <- iris
df_with_na[sample(150, 20), 1] <- NA
df_with_na[sample(150, 10), 3] <- NA
vis_miss(df_with_na)
# Missing Correlation
gg_miss_upset(df_with_na)
# Missing vs Variable Relationships
ggplot(df_with_na, aes(x = Sepal.Length, y = Petal.Length)) +
geom_miss_point() # The red dot indicates a missing item.
7. Etapa 4: Visualização da distribuição
(1) Distribuição univariada
library(ggplot2)
# Histogram
ggplot(iris, aes(x = Sepal.Length)) +
geom_histogram(bins = 30, fill = "skyblue", color = "white") +
labs(title = "Sepal.Length Distribution")
# Density Plot
ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.5) +
labs(title = "Sepal.Length Distribution by Species")
# Box-and-Whisker Plot (Identifying Outliers)
ggplot(iris, aes(y = Sepal.Length)) +
geom_boxplot(fill = "lightblue", outlier.color = "red") +
labs(title = "Sepal.Length Box-and-Whisker Plot")
# Box-and-Whisker Plot by Species
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
geom_boxplot() +
labs(title = "Sepal.Length Distribution by Species")
(2) Distribuições multivariadas
# Scatter Plot + Return
ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Sepal vs Petal Length")
# Pair Graphs (Scatter Plot Matrix)
library(GGally)
ggpairs(iris, aes(color = Species))
(3) Matriz de correlação
# CalculateCorrelation Coefficient
cor_matrix <- cor(iris |> select(-Species))
print(round(cor_matrix, 2))
# Visualization of Related Matrices
library(corrplot)
corrplot(cor_matrix, method = "circle", type = "upper")
# ggplot2 Version
library(reshape2)
melted <- melt(cor_matrix)
ggplot(melted, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
8. Etapa 5: Detecção de valores atípicos
(1) Método do IQR (o mais robusto)
detect_outliers <- function(x) {
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr <- q3 - q1
lower <- q1 - 1.5 * iqr
upper <- q3 + 1.5 * iqr
x < lower | x > upper
}
# Applications
iris |>
mutate(across(where(is.numeric), detect_outliers, .names = "{.col}_out")) |>
select(ends_with("_out")) |>
summarise(across(everything(), sum))
# Sepal.Length_out Sepal.Width_out Petal.Length_out Petal.Width_out
# 0 4 0 0
(2) Método 3σ (apenas para dados com distribuição normal)
detect_outliers_z <- function(x, threshold = 3) {
z <- (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
abs(z) > threshold
}
9. EDA automatizada
(1) DataExplorer
install.packages("DataExplorer")
library(DataExplorer)
# 1. One-Line Report
create_report(iris, output_file = "eda_report.html")
# 2. Report Contents
plot_intro(iris) # Data Overview
plot_missing(iris) # Missing values
plot_histogram(iris) # Histogram of All Numeric Columns
plot_density(iris) # Density Plot
plot_bar(iris) # Bar Chart by Category
plot_boxplot(iris) # Box-and-Whisker Plot
plot_scatterplot(iris) # Scatter Plot Matrix
plot_correlation(iris) # Related Matrices
(2) SmartEDA
install.packages("SmartEDA")
library(SmartEDA)
ExpReport(iris, op_file = "smarteda_report.html")
ExpNumStat(iris) # Statistical Data
ExpCatStat(iris) # Categorical Statistics
10. Exemplo completo: EDA utilizando os conjuntos de dados Iris e MPG
A seguir, apresentamos um exemplo de um fluxo de trabalho completo que reúne todos os conceitos de EDA abordados nesta aula.
▶ Exemplo: Análise de dados exploratória (EDA) completa para os conjuntos de dados Iris e MPG
# ============================================
# iris + mpg Both Datasets Complete EDA
# Features: 5-step EDA Complete Process
# ============================================
library(ggplot2)
library(dplyr)
library(skimr)
library(naniar)
library(GGally)
# 1. Step 1: Data Shape
cat("=== Step 1: Data Shape ===\n")
cat("iris:", nrow(iris), "rows x", ncol(iris), "cols\n")
cat("mpg:", nrow(mpg), "rows x", ncol(mpg), "cols\n\n")
# 2. Step 2: Type + Abstract
cat("=== Step 2: Type and Abstract ===\n")
cat("iris Column Types:\n")
print(sapply(iris, class))
cat("\nmpg Column Types:\n")
print(sapply(mpg, class))
cat("\niris Summary:\n")
print(summary(iris))
cat("\nmpg Summary:\n")
print(summary(mpg |> select(displ, year, cyl, cty, hwy)))
# 3. Step 3: Missing Value Analysis
cat("\n=== Step 3: Missing values ===\n")
cat("iris Missing values:", sum(is.na(iris)), "\n")
cat("mpg Missing values:", sum(is.na(mpg)), "\n\n")
# Simulation with Missing Data
set.seed(42)
iris_na <- iris
iris_na[sample(150, 20), 1] <- NA
iris_na[sample(150, 10), 3] <- NA
vis_miss(iris_na, cluster = TRUE)
gg_miss_upset(iris_na)
# 4. Step 4: Distribution Visualization
cat("\n=== Step 4: Distribution Visualization ===\n")
# 4.1 Distribution of Numeric Variables
iris |>
select(-Species) |>
pivot_longer(everything(), names_to = "variable", values_to = "value") |>
ggplot(aes(x = value)) +
geom_histogram(bins = 20, fill = "skyblue", color = "white") +
facet_wrap(~ variable, scales = "free") +
labs(title = "iris 4 Distribution of a Numeric Variable")
# 4.2 By Component
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
geom_boxplot() +
labs(title = "Sepal.Length Box-and-Whisker Plot by Species")
# 4.3 Scatter Plot Matrix
ggpairs(iris, aes(color = Species))
# 5. Step 5: Correlation Matrix
cat("\n=== Step 5: Correlation Matrix ===\n")
cor_matrix <- cor(iris |> select(-Species))
print(round(cor_matrix, 2))
library(corrplot)
corrplot(cor_matrix, method = "circle", type = "upper",
addCoef.col = "black", number.cex = 0.8)
# 6. Outlier Detection
cat("\n=== Step 6: Outlier Detection ===\n")
detect_outliers <- function(x) {
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr <- q3 - q1
lower <- q1 - 1.5 * iqr
upper <- q3 + 1.5 * iqr
sum(x < lower | x > upper, na.rm = TRUE)
}
iris |>
summarise(across(where(is.numeric), detect_outliers)) |>
print()
# 7. Automated Reports
cat("\n=== Step 7: Automated Reports ===\n")
library(DataExplorer)
create_report(iris, output_file = "iris_eda_report.html")
cat("iris_eda_report.html Generated\n")
create_report(mpg, output_file = "mpg_eda_report.html")
cat("mpg_eda_report.html Generated\n")
# 8. Summary of Business Insights
cat("\n=== Business Insights ===\n")
cat("1. iris 4 None of the numerical variables have missing values.\n")
cat("2. Setosa Species' Petal.Length Significantly smaller than the other two\n")
cat("3. Petal.Length and Petal.Width Highly correlated (0.96)\n")
cat("4. Sepal.Width The distribution is approximately normal\n")
cat("5. mpg 11 Numeric variables, 38 Vehicle models\n")
Resultado esperado: mais de 30 páginas de relatórios EDA em HTML + vários gráficos estatísticos.
❓ Perguntas Frequentes
P: Qual é a diferença entre EDA e análise formal? R: EDA significa “exploração” (sem suposições pré-concebidas; deixar que os dados falem por si mesmos), enquanto análise formal significa “validação” (começar com uma hipótese e, em seguida, utilizar testes estatísticos). Realize a EDA primeiro e, depois, construa um modelo.**
P: Como devo lidar com valores ausentes? R: Existem três estratégias: ① Exclusão (linhas/colunas que contêm NA) ② Imputação (média/mediana/previsão baseada em modelo) ③ Marcação (adicionar uma coluna “is_missing”). Não há uma resposta padrão; isso depende da importância dos dados.
P: Como os valores atípicos devem ser tratados? R: Existem quatro estratégias: ① Excluir (se for confirmado que se trata de um erro) ② Substituir (pela mediana) ③ Truncar (Winsorização) ④ Manter (utilizando um método robusto). Primeiro, determine se se trata de uma “anomalia comercial”.
P: Correlação ≠ Causalidade! R: A correlação indica apenas que “duas variáveis variam juntas”; ela não indica qual delas causa a outra. A causalidade requer experimentação (testes A/B) ou uma análise aprofundada.
P: Qual é o tamanho dos relatórios do DataExplorer? R: 30 a 50 colunas de dados geram de 20 a 50 páginas em HTML, incluindo todos os gráficos e estatísticas. Um relatório completo leva de 5 a 10 segundos para ser gerado.
P: Quando se deve usar uma transformação logarítmica? R: Quando a distribuição é assimétrica (assimétrica para a direita) — como no caso da renda, dos preços dos imóveis e dos tempos de espera.
log(x)Isso comprime os valores extremos, tornando a distribuição mais próxima de uma distribuição normal.
📖 Resumo
- O método EDA em 5 etapas: Forma → Tipo → Dados ausentes → Distribuição → Relações
- Formato:
dimnrowncolstrDependendo do tamanho dos dados - Tipo:
summaryskimrVisualizar estatísticas para cada variável - Ausente:
colSums(is.na)Contagem +naniar::vis_missVisualização - Distribuição:
hist/boxplot/density(univariada) +pairs/ggpairs(multivariada) - Relacionado:
cor()+corrplotVisualização da matriz de correlação - Valores atípicos: método do IQR (robusto) < Q1 - 1,5×IQR ou > Q3 + 1,5×IQR
- Automação:
DataExplorer::create_report()Gerar um relatório HTML completo em uma única linha - A EDA é imprescindível antes da modelagem — sem EDA, não há modelagem
- Correlação ≠ Causalidade — Somente experimentos podem comprovar a causalidade
📝 Exercícios
-
Exercício básico: Realize uma análise exploratória de dados (EDA) completa no conjunto de dados embutido
mtcarsno R: ① Forma dos dados ② Resumo ③ Valores ausentes ④ Histogramas para 4 variáveis numéricas ⑤ Matriz de correlação. Salve uma captura de tela. -
Exercício básico: Simule um data frame (1.000 linhas, 5 colunas) contendo 20% de valores ausentes. Use
naniar::vis_miss()para visualizar os padrões dos valores ausentes e compare os resultados de três estratégias de tratamento (exclusão, imputação pela média e imputação pela mediana). -
Exercício básico: Use
irispara traçar a matriz de correlação (corrplot) das quatro variáveis numéricas, identifique os dois pares de variáveis mais fortemente correlacionados e verifique os resultados por meio de um gráfico de dispersão. -
Exercício avançado: Realize uma análise EDA completa utilizando o conjunto de dados
mpg: ① Forma ② Resumo ③ Gráficos de caixa agrupados porclass④ Matriz de gráficos de dispersão porclass⑤ Matriz de correlação ⑥ Relatório automatizado. Salve as capturas de tela. -
Desafio: Crie um conjunto de dados misto contendo 10.000 linhas e 20 colunas (incluindo valores numéricos, categóricos, ausentes e atípicos), use o
DataExplorer::create_report()para gerar um relatório abrangente de EDA (mais de 30 páginas em HTML) e redija um resumo das percepções de negócios (500 caracteres) com base no relatório.