Exercício 1.1 - Introdução ao ggplot2

Este relatório apresenta a resolução do Exercício 1.1, focado na análise exploratória do conjunto de dados mtcars. O objetivo é demonstrar a proficiência no uso do pacote ggplot2 para visualização de dados veiculares.

Gráfico de Dispersão (Scatter Plot)

O código abaixo gera a visualização solicitada, aplicando a distinção de cores por número de cilindros e utilizando uma estética minimalista para facilitar a leitura dos dados.

# Chamada do Dataset
data(mtcars)

# Criação do Gráfico
ggplot(data = mtcars) +
# Mapeamento das variáveis (Estética)
aes(x = wt, y = mpg, color = factor(cyl)) +

# Definição da Geometria (Pontos)
geom_point(size = 3) +
 # Configuração dos Rótulos (Labels)
  labs(
   title = "Relação entre Peso e Consumo de Combustível",
   subtitle = "Análise do dataset Motor Trend Car Road Tests",
   x = "Peso do Carro (1000 lbs)",
   y = "Milhas por Galão (mpg)",
   color = "Cilindros",
   caption = "Elaborado por: Heleno Costa"
   ) +

 # Aplicação do Tema
theme_minimal()
Figura 1: Relação Peso x Consumo x Cilindros

Figura 1: Relação Peso x Consumo x Cilindros

=====================================================================================================

Exercício 1.2 - Análise de Diamantes por Corte

Neste exercício, analisamos a distribuição dos diamantes de acordo com a qualidade do corte (cut), utilizando o dataset diamonds (com mais de 50.000 registros).

O objetivo é visualizar qual tipo de corte é mais frequente no mercado, ordenando os dados para facilitar a comparação imediata.

# Carregando o dataset
data(diamonds)

# Construção do Gráfico
ggplot(data = diamonds) +
  
  # 1. ESTÉTICA
  # No Eixo X, usamos 'fct_infreq' para ordenar as barras do maior para o menor
  # O 'fill' colore as barras baseado no corte
  aes(x = forcats::fct_infreq(cut), fill = cut) +
  
  # 2. GEOMETRIA DE BARRAS
  geom_bar() +
  
  # 3. RÓTULOS DE VALOR (Item b)
  # stat = "count": Pede para o geom_text calcular quantos são (igual o geom_bar faz)
  # vjust = -0.5: Empurra o número um pouquinho para cima da barra
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, size = 3.5) +
  
  # 4. ESCALA DE CORES (Item c)
  # Palette "Spectral" é uma paleta divergente famosa (Vermelho <-> Azul)
  scale_fill_brewer(palette = "Spectral") +
  
  # 5. RÓTULOS E TEMA
  labs(
    title = "Quantidade de Diamantes por Qualidade de Corte",
    subtitle = "Ordenado por frequência (Decrescente)",
    x = "Qualidade do Corte",
    y = "Contagem Total",
    fill = "Legenda"
  ) +
  theme_minimal() +
  # Removemos a legenda lateral pois a informação já está no eixo X (redundância)
  theme(legend.position = "none")
Figura 2: Contagem de Diamantes por Tipo de Corte

Figura 2: Contagem de Diamantes por Tipo de Corte

=====================================================================================================

Exercício 1.3 - Distribuição de Preços por Corte (Boxplot)

Nesta etapa, analisamos como o preço dos diamantes varia dentro de cada categoria de corte. Utilizamos um Boxplot para visualizar a mediana, a dispersão dos dados e identificar valores atípicos (outliers).

A customização inclui o uso de cores específicas definidas manualmente e ajuste de tipografia nos eixos.

# Carregando dados (se necessário)
data(diamonds)

# Criação do Boxplot
ggplot(data = diamonds) +
  
  # 1. ESTÉTICA
  # X = Categoria, Y = Variável Numérica (Preço)
  aes(x = cut, y = price, fill = cut) +
  
  # 2. GEOMETRIA (Boxplot)
  # outlier.alpha deixa os pontos fora da curva mais transparentes para não poluir
  geom_boxplot(outlier.alpha = 0.3) +
  
  # 3. CORES CUSTOMIZADAS (Item b)
  # scale_fill_manual permite escolher a cor exata de cada barra.
  # Aqui escolhi tons que vão do cinza (Fair) ao ouro (Ideal)
  scale_fill_manual(values = c(
    "Fair" = "#A9A9A9",      # Cinza Escuro
    "Good" = "#87CEFA",      # Azul Claro
    "Very Good" = "#4682B4", # Azul Aço
    "Premium" = "#DAA520",   # Goldenrod (Dourado escuro)
    "Ideal" = "#FFD700"      # Gold (Dourado Ouro)
  )) +
  
  # 4. RÓTULOS (Item a)
  labs(
    title = "Distribuição de Preços por Qualidade de Corte",
    subtitle = "Visualização via Boxplot com cores personalizadas",
    x = "Qualidade do Corte",
    y = "Preço (USD)",
    caption = "Nota: Os pontos pretos representam valores atípicos (outliers)."
  ) +
  
  # 5. TEMA E AJUSTES FINAIS
  theme_minimal() +
  theme(
    # Item (c): Remover a legenda (pois o eixo X já explica as cores)
    legend.position = "none",
    
    # Item (d): Ajuste do ângulo do eixo X
    # angle = 45: Inclina o texto
    # hjust = 1: Alinha o final da palavra com o traço do eixo (essencial para leitura)
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10) 
  )
Figura 3: Variação de Preço conforme o Corte do Diamante

Figura 3: Variação de Preço conforme o Corte do Diamante

=====================================================================================================

Exercício 1.4 - Conceitos Fundamentais

Nesta seção, abordamos os conceitos teóricos que fundamentam a construção de gráficos no R.

Diferença entre geom_point() e geom_jitter()

Embora ambas as geometrias sejam utilizadas para criar gráficos de dispersão (scatter plots), elas possuem aplicações distintas relacionadas à natureza dos dados e à visualização da densidade.

1. geom_point()

  • Definição: Plota os pontos exatamente nas coordenadas definidas pelas variáveis x e y.
  • Problema: Em conjuntos de dados onde muitos valores são idênticos (especialmente variáveis discretas ou inteiras), ocorre o fenômeno de sobreposição (overplotting). Vários pontos ficam empilhados uns sobre os outros, parecendo ser apenas um.
  • Uso Recomendado: Ideal para dados contínuos de alta precisão onde a sobreposição não é um problema crítico.

2. geom_jitter()

  • Definição: Adiciona uma pequena quantidade de “ruído” aleatório (jitter) às posições dos pontos. Isso desloca levemente cada ponto para que eles não ocupem o mesmo espaço físico no gráfico.
  • Solução: Resolve o problema do overplotting, permitindo visualizar a concentração (densidade) de dados em uma determinada categoria ou valor.
  • Uso Recomendado: Essencial ao trabalhar com variáveis categóricas ou números inteiros pequenos (ex: número de cilindros, notas de 1 a 5), onde a repetição de valores é frequente.

A Gramática dos Gráficos no ggplot2

A “Gramática dos Gráficos” (Grammar of Graphics) é uma estrutura teórica que propõe que todo gráfico estatístico pode ser decomposto em componentes semânticos independentes, que são combinados para formar a visualização final. O ggplot2 implementa essa filosofia através de um sistema de camadas (layers) adicionadas sequencialmente com o operador +.

Os três componentes principais desta gramática são:

  1. Dados (Data): O conjunto de informações a ser visualizado (ex: mtcars).
  2. Estética (Aesthetics - aes): O mapeamento entre as variáveis dos dados e as propriedades visuais (eixo X, eixo Y, cor, tamanho, forma).
  3. Geometria (Geometries - geom): O objeto geométrico utilizado para representar os dados (pontos, barras, linhas, boxplots).

Exemplo da estrutura: > Gráfico = Dados + Estética + Geometria

Essa abordagem modular permite flexibilidade total: podemos alterar a geometria (de pontos para linhas) ou as variáveis estéticas sem precisar recriar o gráfico do zero, apenas alterando a camada correspondente.

Demonstração Prática: Point vs Jitter

O código abaixo compara a variável cyl (cilindros) usando as duas abordagens. Note como o geom_jitter revela a quantidade real de carros.

# Gráfico 1: geom_point (Sobreposição)
g1 <- ggplot(mtcars, aes(x = cyl, y = wt)) + 
  geom_point(size = 3, color = "red", alpha = 0.5) +
  labs(title = "Com geom_point()", subtitle = "Muitos pontos escondidos") +
  theme_bw()

g1

# Gráfico 2: geom_jitter (Dispersão)
g2 <- ggplot(mtcars, aes(x = cyl, y = wt)) + 
  geom_jitter(size = 3, color = "blue", alpha = 0.5, width = 0.2) +
  labs(title = "Com geom_jitter()", subtitle = "Visualização real da densidade") +
  theme_bw()
g2