Este dashboard apresenta uma série de exercícios práticos utilizando
a biblioteca ggplot2 do R, baseada no conceito da
Gramática dos Gráficos. Serão explorados diferentes
tipos de visualizações, como gráficos de dispersão, gráficos de barras e
boxplots, utilizando os datasets mtcars e
diamonds.
O gráfico de dispersão mostra a relação entre o peso e o consumo de combustível de veículos, com cores diferenciadas pelo número de cilindros. Sendo possível notar que veículos com peso abaixo de 3 mil libras, tendem a percorrer mais de 20 milhas por galão. Acima desse peso os vículos percorrem nenos de 20 milhas por galão. Observa-se que os veículos mais leves, e com menos cilindros são mais econônicos.
data(mtcars)
mtcars$cyl <- factor(mtcars$cyl)
ggplot(data = mtcars) +
aes(x = wt, y = mpg, color = cyl) +
geom_point(size = 3) +
labs(
title = "Gráfico 1 - Relação entre Peso e Consumo de Combustível",
x = "Peso do Carro (lb/1000)",
y = "Milhas por Galão (mpg)",
color = "Cilindros"
) +
theme_minimal()O gráfico abaixo mostra a quantidade de diamantes por tipo de corte, sendo possível notar que o corte com maior quantidade é o tipo Ideal, seguido pelo corte Premium, o tipo de corte com menor quantidade é o Razoável, com apenas 1610 peças.
data(diamonds)
diamonds_count <- diamonds %>%
group_by(cut) %>%
summarise(count = n()) %>%
arrange(desc(count))
diamonds_count$cut <- factor(diamonds_count$cut, levels = diamonds_count$cut)
traducao <- c("Fair" = "Razoável",
"Good" = "Bom",
"Very Good" = "Muito Bom",
"Premium" = "Premium",
"Ideal" = "Ideal")
# Gráfico de Barras Modificado
ggplot(diamonds_count, aes(x = cut, y = count, fill = cut)) +
geom_bar(stat = "identity") +
geom_text(aes(label = count), vjust = -0.5, size = 3.5) +
labs(
title = "Contagem de Diamantes por Tipo de Corte",
x = "Corte",
y = "Número de Diamantes",
fill = "Corte"
) +
scale_x_discrete(labels = traducao) +
scale_fill_brewer(palette = "RdYlBu") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))+
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.line.y = element_blank())O gráfico abaixo mostra que o tipo de corte ideal, melhor qualidade de diamante, tem a menor mediana de Preço em relação aos demais tipos.Indicando que apesar de serem de melhor qualidade, tem preço mais baixo. Os diamantes de tipo Razoável, que tem menor qualidade, apresentam o menor intervalo interquartilico, demonstrando que diamantes com essa qualidade tem menor variação nos preços, se desconsiderarmos os outliers.
# Boxplot da variável price por cut
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_boxplot() +
labs(
title = "Distribuição de Preços por Tipo de Corte",
subtitle = "Dataset Diamonds",
x = "Qualidade do Corte",
y = "Preço (dólares)",
fill = "Corte"
) +
scale_x_discrete(labels = traducao) +
scale_fill_manual(values = c("Fair" = "#E41A1C", "Good" = "#377EB8", "Very Good" = "#4DAF4A", "Premium" = "#984EA3", "Ideal" = "#FF7F00")) +
# (c) Remoção da legenda
guides(fill = "none") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
# (d) Ajuste do ângulo dos rótulos do eixo X
axis.text.x = element_text(angle = 45, hjust = 1)
)geom_point() e
geom_jitter()A principal diferença reside no tratamento de pontos, especialmente quando as coordenadas dos dados são discretas, conforme podemos verificar na tabela abaixo.
| Geom | Descrição | Situação Apropriada |
|---|---|---|
geom_point() |
Desenha cada ponto de dado exatamente em suas coordenadas, ficando sobrepostos. | Apropriado para dados com variáveis contínuas (altura vs peso) ou quando a localização precisa é crucial. |
geom_jitter() |
Adiciona uma pequena quantidade de ruído aleatório (jitter) às coordenadas. | Mais apropriado quando as variáveis são discretas ou categóricas (notas, dias da semana), pois espalha os pontos, revelando a densidade e o número real de observações. |
O conceito de “Gramática dos Gráficos” (Grammar of Graphics), descreve uma estrutura que associa cada componente de um gráfico a uma estrutura gramatical, de forma similiar à composição de uma frase.
Desta forma o gráfico é formado por camadas que se complementam:
aes()): Mapeia variáveis a
atributos visuais (posição, cor, tamanho).geom_*()): A forma visual de
representação (pontos, barras, linhas).---
title: "Relatório de Análise de Dados - "
#Author: Wesley Naites de Paulo
date: "`r format(Sys.Date(), '%d de %B de %Y')`"
output:
flexdashboard::flex_dashboard:
theme: yeti
orientation: rows
vertical_layout: fill
logo: "logo.png"
source_code: embed
---
```{css, echo=FALSE}
.navbar-logo {
max-height: 50px !important;
width: auto;
}
/* Ou se preferir controlar a largura */
.navbar-logo img {
max-height: 50px !important;
width: auto;
}
.custom-paragraph{
font-size: 16px !important;
text-align: justify;
width: auto;
}
p {
font-size: 16px !important;
text-align: justify;
width: auto;
}
```
```{r setup, include=FALSE}
# Configuração global e carregamento de bibliotecas
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE,
fig.width = 12,
fig.height = 4)
library(ggplot2)
library(dplyr)
library(flexdashboard) # Necessário para rodar o dashboard
```
# Introdução {data-icon="fa-book"}
### Introdução
Este dashboard apresenta uma série de exercícios práticos utilizando a biblioteca **ggplot2** do R, baseada no conceito da **Gramática dos Gráficos**. Serão explorados diferentes tipos de visualizações, como gráficos de dispersão, gráficos de barras e boxplots, utilizando os datasets `mtcars` e `diamonds`.
# Exercício 1.1 {data-icon="fa-chart-area"}
### 📈 Exercício 1.1 - Gráfico de Dispersão
O gráfico de dispersão mostra a relação entre o **peso** e o **consumo de combustível** de veículos, com cores diferenciadas pelo **número de cilindros**. Sendo possível notar que veículos com peso abaixo de 3 mil libras, tendem a percorrer mais de 20 milhas por galão. Acima desse peso os vículos percorrem nenos de 20 milhas por galão. Observa-se que os veículos mais leves, e com menos cilindros são mais econônicos.
####
```{r }
data(mtcars)
mtcars$cyl <- factor(mtcars$cyl)
ggplot(data = mtcars) +
aes(x = wt, y = mpg, color = cyl) +
geom_point(size = 3) +
labs(
title = "Gráfico 1 - Relação entre Peso e Consumo de Combustível",
x = "Peso do Carro (lb/1000)",
y = "Milhas por Galão (mpg)",
color = "Cilindros"
) +
theme_minimal()
```
# Exercício 1.2 {data-icon="fa-chart-area"}
### 📊 Exercício 1.2 - Gráfico de Barras
O gráfico abaixo mostra a quantidade de diamantes por tipo de corte, sendo possível notar que o corte com maior quantidade é o tipo Ideal, seguido pelo corte Premium, o tipo de corte com menor quantidade é o Razoável, com apenas 1610 peças.
####
```{r }
data(diamonds)
diamonds_count <- diamonds %>%
group_by(cut) %>%
summarise(count = n()) %>%
arrange(desc(count))
diamonds_count$cut <- factor(diamonds_count$cut, levels = diamonds_count$cut)
traducao <- c("Fair" = "Razoável",
"Good" = "Bom",
"Very Good" = "Muito Bom",
"Premium" = "Premium",
"Ideal" = "Ideal")
# Gráfico de Barras Modificado
ggplot(diamonds_count, aes(x = cut, y = count, fill = cut)) +
geom_bar(stat = "identity") +
geom_text(aes(label = count), vjust = -0.5, size = 3.5) +
labs(
title = "Contagem de Diamantes por Tipo de Corte",
x = "Corte",
y = "Número de Diamantes",
fill = "Corte"
) +
scale_x_discrete(labels = traducao) +
scale_fill_brewer(palette = "RdYlBu") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))+
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.line.y = element_blank())
```
# Exercício 1.3 {data-icon="fa-chart-area"}
## 3\. Customização Avançada {data-icon="fa-flask"}
### 📦 Exercício 1.3 - Boxplot Customizado
O gráfico abaixo mostra que o tipo de corte ideal, melhor qualidade de diamante, tem a menor mediana de Preço em relação aos demais tipos.Indicando que apesar de serem de melhor qualidade, tem preço mais baixo.
Os diamantes de tipo Razoável, que tem menor qualidade, apresentam o menor intervalo interquartilico, demonstrando que diamantes com essa qualidade tem menor variação nos preços, se desconsiderarmos os outliers.
####
```{r }
# Boxplot da variável price por cut
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_boxplot() +
labs(
title = "Distribuição de Preços por Tipo de Corte",
subtitle = "Dataset Diamonds",
x = "Qualidade do Corte",
y = "Preço (dólares)",
fill = "Corte"
) +
scale_x_discrete(labels = traducao) +
scale_fill_manual(values = c("Fair" = "#E41A1C", "Good" = "#377EB8", "Very Good" = "#4DAF4A", "Premium" = "#984EA3", "Ideal" = "#FF7F00")) +
# (c) Remoção da legenda
guides(fill = "none") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
# (d) Ajuste do ângulo dos rótulos do eixo X
axis.text.x = element_text(angle = 45, hjust = 1)
)
```
# Exercicio 1.4
## Exercício - Conceitos Fundamentais {.tabset .tabset-fade .tabset-pills}
### Diferença entre `geom_point()` e `geom_jitter()`
A principal diferença reside no tratamento de pontos, especialmente quando as coordenadas dos dados são discretas, conforme podemos verificar na tabela abaixo.
| Geom | Descrição | Situação Apropriada |
| :--- | :--- | :--- |
| **`geom_point()`** | Desenha cada ponto de dado exatamente em suas coordenadas, ficando sobrepostos. | Apropriado para dados com variáveis contínuas (altura vs peso) ou quando a localização precisa é crucial. |
| **`geom_jitter()`** | Adiciona uma pequena quantidade de ruído aleatório (jitter) às coordenadas. | Mais apropriado quando as variáveis são discretas ou categóricas (notas, dias da semana), pois espalha os pontos, revelando a densidade e o número real de observações. |
#### Solução com geom_point()
```{r}
ggplot(mtcars, aes(x = cyl, y = gear)) +
geom_point()
```
#### Solução com geom_jitter()
```{r}
ggplot(mtcars, aes(x = cyl, y = gear)) +
geom_jitter(width = 0.2, height = 0.2)
```
### Conceito de "Gramática dos Gráficos"
O conceito de "Gramática dos Gráficos" (Grammar of Graphics), descreve uma estrutura que associa cada componente de um gráfico a uma estrutura gramatical, de forma similiar à composição de uma frase.
Desta forma o gráfico é formado por camadas que se complementam:
1. Dados (Data) - base do gráfico, utiliza o conjunto de dados (dataframe).
2. Estéticos (Aesthetics - `aes()`): Mapeia variáveis a atributos visuais (posição, cor, tamanho).
3. Geometrias (Geoms - `geom_*()`): A forma visual de representação (pontos, barras, linhas).
4. Facetas (facets): Organiza o gráfico em sub-gráficos ou painéis que mostram um subconjunto de dados.
5. Estatíticas (statistics): Realizam transformações estatísticas nos dados antes da plotagem.
6. Coordenadas (coorndinates): Controla o sistema de coordenadas do gráfico
7. Tema (theme): Controla a aparência não relacionada aos dados, e composta por elementos estéticos que não representam informações.