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



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

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

100%
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

R
# 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

R
# 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

R
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

R
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

R
# 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

R
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

R
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

R
# 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

R
# 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)

R
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)

R
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

R
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

R
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

R 📖 Somente leitura
# ============================================
# 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")
68 linhas de lógica (limite de 40, somente leitura)

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


📝 Exercícios

  1. Exercício básico: Realize uma análise exploratória de dados (EDA) completa no conjunto de dados embutido mtcars no R: ① Forma dos dados ② Resumo ③ Valores ausentes ④ Histogramas para 4 variáveis numéricas ⑤ Matriz de correlação. Salve uma captura de tela.

  2. 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).

  3. Exercício básico: Use iris para 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.

  4. Exercício avançado: Realize uma análise EDA completa utilizando o conjunto de dados mpg: ① Forma ② Resumo ③ Gráficos de caixa agrupados por class ④ Matriz de gráficos de dispersão por class ⑤ Matriz de correlação ⑥ Relatório automatizado. Salve as capturas de tela.

  5. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%