Este dashboard foi desenvolvido como o artefato final das atividades
de Análise Preditiva. O objetivo central transcende a simples plotagem
de dados; visa demonstrar o domínio técnico sobre a ferramenta
flexdashboard e a capacidade de customização
avançada utilizando R Markdown.
A estrutura foi pensada para simular um ambiente de análise real
aplicado ao contexto do 19º Batalhão da Polícia Militar (19º
BPM), integrando visualizações estáticas (ggplot2)
e interativas (plotly, crosstalk) em um layout
responsivo e profissional.
Para garantir que o dashboard não apenas funcione, mas também
comunique profissionalismo, foi implementada uma folha de estilos
personalizada (style.css). As principais alterações
incluem:
Rawline e Segoe UI.#AB2328 e Cáqui
#B3A369) nas barras de navegação, bordas e elementos de
destaque.Foi injetado um script jQuery no cabeçalho do documento
com o objetivo de melhorar a usabilidade da barra de navegação
(navbar).
O script foi desenhado para forçar que links externos (WhatsApp, Instagram, GitHub) abram em novas abas (
target="_blank").Contudo, observa-se que, ao realizar a publicação via RPubs, essa funcionalidade pode ser restringida devido às políticas de segurança de iframes e sandboxing da plataforma, que muitas vezes bloqueiam a execução de scripts que manipulam janelas do navegador. Em ambiente local ou servidor próprio, a funcionalidade opera plenamente.
A construção deste painel seguiu um fluxo de trabalho iterativo, combinando programação estatística clássica com ferramentas modernas de assistência ao desenvolvimento.
flexdashboard: Utilizado como
framework principal para o layout em colunas e abas
(.tabset).ggplot2: Para criação de gráficos estáticos robustos e
customizados.plotly: Para converter gráficos estáticos em
interativos.crosstalk: Para implementação de filtros dinâmicos sem
necessidade de servidor Shiny (Client-side interactivity).Para otimização do código, depuração de erros (debugging) e sugestões de design CSS, foram utilizadas ferramentas de IA Generativa: * Gemini (Google) e ChatGPT (OpenAI): Auxiliaram na estruturação do HTML, na lógica de seletores CSS complexos e na revisão da sintaxe do R Markdown.
Todo o desenvolvimento foi estritamente baseado na documentação oficial do pacote, garantindo aderência às melhores práticas.
data-navmenu), ícones
(data-icon) e layouts de preenchimento vertical
(vertical_layout: fill).O design foi concebido para refletir a sobriedade e o profissionalismo da instituição.
O Gráfico de Dispersão gerado revela
uma forte correlação negativa entre o peso do veículo
(wt) e a Milhas por Galão (mpg). Isso
significa que, invariavelmente, veículos mais pesados tendem a ter uma
eficiência de combustível significativamente menor.
cyl):Conclusão: O número de cilindros atua como um forte fator de estratificação. Para otimizar a eficiência de combustível, a redução no peso, especialmente na transição para um menor número de cilindros, é a alavanca mais eficaz.
# O código a seguir é a versão fonte original (Chart A) para referência.
# Este chunk tem eval=FALSE, ou seja, ele APENAS exibe o código, não o executa.
# OBJETIVO: Criar um gráfico de dispersão (mpg x wt), cor por cyl, com theme_minimal().
# Criando o gráfico de dispersão conforme as instruções
grafico_1 <- ggplot(data = mtcars) +
# Mapeamento estético: X = peso, Y = milhas/galão, Cor = cilindros
aes(x = wt, y = mpg, color = as.factor(cyl)) +
# Geometria de dispersão (pontos)
geom_point(size = 3) +
# Customização de Títulos e Rótulos
labs(
title = "2.1 Relação entre Peso e Consumo de Combustível",
subtitle = "Aumento de peso (wt) resulta em menor eficiência (mpg).",
x = "Peso (1000 lbs)",
y = "Milhas por Galão (mpg)",
color = "Cilindros"
) +
# Aplicação do tema minimalista
theme_minimal() +
theme(legend.position = "bottom") Em variáveis categóricas ordinais (como a qualidade
cut), a ordem padrão alfabética muitas vezes confunde a
análise.
Para uma visualização eficaz, é crucial ordenar as barras pela
frequência (n). Isso permite identificar instantaneamente
qual categoria é a mais predominante e qual a curva de distribuição dos
dados.
Nesta atividade, construímos o gráfico em 3 etapas progressivas: 1. Ordenação: Reordenar os fatores. 2. Rótulos: Adicionar o valor exato para leitura precisa. 3. Cores: Usar uma paleta divergente para destacar as diferenças.
O gráfico de barras finalizado permite as seguintes conclusões sobre a qualidade dos diamantes no dataset:
Ideal (azul escuro) domina amplamente o dataset com mais de
20.000 unidades. Isso indica uma forte prevalência de alta qualidade
neste mercado específico.Ideal > Premium > Very Good > Good > Fair)
mostra uma queda progressiva. Cortes de qualidade intermediária
(Premium e Very Good) ainda são comuns.Good e Fair (tons avermelhados na paleta RdBu)
representam a minoria absoluta. Isso sugere que pedras de baixa
qualidade de corte são raras ou descartadas.O boxplot (diagrama de caixa) é uma ferramenta visual para interpretar a distribuição de dados numéricos. Ele exibe:
Utilizaremos o dataset diamonds contido no pacote
ggplot2, analisando especificamente: *
Price: Preço do diamante em dólares. *
Cut: Qualidade do corte (Fair, Good, Very Good,
Premium, Ideal).
Ao criar gráficos de dispersão com dados que possuem categorias
discretas (como números inteiros de cilindros ou classes de veículos), é
comum que muitos pontos caiam exatamente nas mesmas coordenadas
x e y.
Isso cria um problema visual: você vê apenas um ponto, mas podem existir centenas ali.
A diferença fundamental entre as funções reside em como elas tratam essa posição:
A função geom_point() é o padrão geométrico para criar
gráficos de dispersão (scatterplots).
Ela mapeia as variáveis estéticas x e y
diretamente para a posição no plano cartesiano.
Principais Argumentos:
size: Tamanho do ponto.shape: Formato do ponto (círculo, triângulo,
quadrado).color: Cor da borda ou preenchimento.alpha: Transparência (útil quando há alguma
sobreposição leve).O geom_point() é a escolha correta quando:
A função geom_jitter() é um atalho conveniente para
geom_point(position = "jitter").
Ela adiciona uma pequena quantidade de variação aleatória à localização de cada ponto. Isso é puramente visual; não altera os dados estatísticos subjacentes, mas melhora a interpretabilidade gráfica.
Controle: Você pode controlar a quantidade de
espalhamento usando os argumentos width (largura) e
height (altura).
O geom_jitter() deve ser utilizado quando:
O pacote ggplot2 é baseado na “Gramática dos Gráficos”
(Leland Wilkinson). A ideia central é que você pode construir qualquer
gráfico a partir dos mesmos componentes básicos:
Além do básico, refinamos o gráfico com:
# Estrutura da Gramática dos Gráficos
ggplot(data = mpg) + # 1. DADOS
aes(x = displ, y = hwy, color = drv) + # 2. ESTÉTICA (Mapeamento Global)
geom_jitter() + # 3. GEOMETRIA (Camada de Pontos)
geom_smooth() + # 4. ESTATÍSTICA (Camada de Tendência)
facet_wrap(~year) + # 5. FACETAS (Divisão de painéis)
labs(...) + # 6. ANOTAÇÕES
theme_bw() # 7. TEMA (Aparência)---
title: "Análise Preditiva do 19º BPM"
author: "3º Sgt Novais"
subtitle: "Layout Focado da Atividade 1"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
source_code: embed
css: style.css
# O logo precisa ser um caminho válido no servidor.
logo: 'C:/Projetos_R/flaskdashboard/imgens/logo_pmmg_25mm.png'
navbar:
- { icon: "fa-whatsapp", href: "https://wa.me/5533999481310" }
- { icon: "fa-instagram", href: "https://www.instagram.com/valfridonovais/" }
- { icon: "fa-github", href: "https://github.com/ValfridoNovais" }
---
<script>
$(document).ready(function() {
// Seleciona todos os links da barra de navegação que começam com "http"
// e adiciona o atributo para abrir em nova aba
$('.navbar-nav a[href^="http"]').attr('target', '_blank');
});
</script>
```{r setup, include=FALSE}
# Configuração de ambiente e carregamento de bibliotecas
library(flexdashboard)
library(tidyverse) # Fundamental para manipulação de dados e ggplot2
library(knitr) # Para formatação de tabelas e do relatório
library(scales) # Para formatar rótulos (usado no Ex 1.2)
library(leaflet)
library(crosstalk)
library(plotly)
# Configuração global para evitar quebra de linha longa em chunks de código
knitr::opts_chunk$set(tidy = FALSE, warning = FALSE, message = FALSE)
# Dados do mtcars para o Ex 1.1
data(mtcars)
```
Apresentação {data-navmenu="INTRODUÇÃO" data-navmenu-icon="fa-list" data-icon="fa-home"}
=====================================
Column {data-width=500}
-----------------------------------------------------------------------
### Sobre o Projeto
#### **Objetivo Geral**
Este dashboard foi desenvolvido como o artefato final das atividades de Análise Preditiva. O objetivo central transcende a simples plotagem de dados; visa demonstrar o **domínio técnico sobre a ferramenta `flexdashboard`** e a capacidade de customização avançada utilizando R Markdown.
A estrutura foi pensada para simular um ambiente de análise real aplicado ao contexto do **19º Batalhão da Polícia Militar (19º BPM)**, integrando visualizações estáticas (`ggplot2`) e interativas (`plotly`, `crosstalk`) em um layout responsivo e profissional.
#### **Estrutura de Navegação**
O painel está organizado em seções lógicas acessíveis pelo menu superior:
* **Metodologia:** Detalha as ferramentas e processos de construção.
* **Questões Gerais:** Agrupa os exercícios práticos (1.1, 1.2, 1.3) demonstrando diferentes tipos de visualização (Dispersão, Barras, Boxplots Interativos).
* **Conceitos Fundamentais:** (Ex 1.4) Uma abordagem didática sobre a gramática dos gráficos e diferenças geométricas.
Column {data-width=500 .tabset}
-----------------------------------------------------------------------
### Arquitetura Técnica e Customização
#### **Customização via CSS**
Para garantir que o dashboard não apenas funcione, mas também comunique profissionalismo, foi implementada uma folha de estilos personalizada (`style.css`). As principais alterações incluem:
* **Tipografia:** Utilização da família de fontes `Rawline` e `Segoe UI`.
* **Identidade Visual:** Aplicação das cores institucionais da PMMG (Vermelho `#AB2328` e Cáqui `#B3A369`) nas barras de navegação, bordas e elementos de destaque.
* **Efeitos Visuais:** Implementação de sombras (box-shadow) e efeitos de hover (3D lift e brilho) nos títulos dos gráficos para uma experiência de usuário moderna.
### **Comportamento de Links (JavaScript)**
Foi injetado um script `jQuery` no cabeçalho do documento com o objetivo de melhorar a usabilidade da barra de navegação (`navbar`).
#### **Nota Técnica sobre Publicação:**
> O script foi desenhado para forçar que links externos (WhatsApp, Instagram, GitHub) abram em novas abas (`target="_blank"`).
>
> Contudo, observa-se que, ao realizar a publicação via **RPubs**, essa funcionalidade pode ser restringida devido às políticas de segurança de *iframes* e *sandboxing* da plataforma, que muitas vezes bloqueiam a execução de scripts que manipulam janelas do navegador. Em ambiente local ou servidor próprio, a funcionalidade opera plenamente.
Metodologia {data-navmenu="INTRODUÇÃO" data-navmenu-icon="fa-list" data-icon="fa-cogs"}
=====================================
Column {data-width=500}
-----------------------------------------------------------------------
### Ferramentas e Recursos Utilizados
A construção deste painel seguiu um fluxo de trabalho iterativo, combinando programação estatística clássica com ferramentas modernas de assistência ao desenvolvimento.
#### **Stack Tecnológico**
1. **Linguagem R & RStudio:** Base para todo o processamento de dados e geração de relatórios dinâmicos.
2. **Pacote `flexdashboard`:** Utilizado como framework principal para o layout em colunas e abas (`.tabset`).
3. **Visualização de Dados:**
* `ggplot2`: Para criação de gráficos estáticos robustos e customizados.
* `plotly`: Para converter gráficos estáticos em interativos.
* `crosstalk`: Para implementação de filtros dinâmicos sem necessidade de servidor Shiny (Client-side interactivity).
#### **Assistência de Inteligência Artificial**
Para otimização do código, depuração de erros (debugging) e sugestões de design CSS, foram utilizadas ferramentas de IA Generativa:
* **Gemini (Google) e ChatGPT (OpenAI):** Auxiliaram na estruturação do HTML, na lógica de seletores CSS complexos e na revisão da sintaxe do R Markdown.
Column {data-width=500}
-----------------------------------------------------------------------
### Referências e Design
#### **Documentação Oficial**
Todo o desenvolvimento foi estritamente baseado na documentação oficial do pacote, garantindo aderência às melhores práticas.
* **Fonte de Consulta:** [R Studio - Flexdashboard: Using flexdashboard](https://rstudio.github.io/flexdashboard/articles/using.html)
* A análise dos exemplos da documentação permitiu a implementação correta de menus aninhados (`data-navmenu`), ícones (`data-icon`) e layouts de preenchimento vertical (`vertical_layout: fill`).
#### **Identidade Visual (19º BPM)**
O design foi concebido para refletir a sobriedade e o profissionalismo da instituição.
* **Paleta de Cores:**
* <span style="color: #AB2328; font-weight: bold;">■ Vermelho PMMG (#AB2328)</span>: Utilizado em destaques, barras ativas e elementos de atenção.
* <span style="color: #B3A369; font-weight: bold;">■ Cáqui PMMG (#B3A369)</span>: Utilizado em bordas, detalhes secundários e no logo.
* **Logotipo:** A inclusão do brasão do 19º BPM na barra de navegação personaliza o artefato para a Unidade de Execução Operacional (UEOp) do autor.
Gráfico de Dispersão (Ex 1.1){data-navmenu="QUESTÕES GERAIS" data-navmenu-icon="fa-list" data-icon="fa-check"}
=====================================
Column {data-width=350}
-----------------------------------------------------------------------
### **Interpretação da Relação Peso vs. Consumo** {data-heigth=100}
O [Gráfico de Dispersão](#grafico_dispersao) gerado revela uma **forte correlação negativa** entre o peso do veículo (`wt`) e a Milhas por Galão (`mpg`). Isso significa que, invariavelmente, veículos mais pesados tendem a ter uma eficiência de combustível significativamente menor.
### **Observações Segmentadas por Cilindros (`cyl`):** {data-heigth=900}
1. **Diferenciação Clara:** Os dados estão perfeitamente agrupados de acordo com o número de cilindros (4, 6 e 8), reforçando que esta é a principal variável de influência na eficiência.
2. **4 Cilindros (Verde):** Correspondem aos veículos mais leves e mais econômicos, com a maior média de MPG.
3. **8 Cilindros (Vermelho):** Correspondem aos veículos mais pesados e menos econômicos, com a menor média de MPG.
**Conclusão:** O número de cilindros atua como um forte fator de estratificação. Para otimizar a eficiência de combustível, a redução no peso, especialmente na transição para um menor número de cilindros, é a alavanca mais eficaz.
Column {data-width=650 .tabset}
-------------------------------------
### Gráfico de Dispersão
```{r ex_1_1}
# OBJETIVO: Criar um gráfico de dispersão (mpg x wt), cor por cyl, com theme_minimal().
# Criando o gráfico de dispersão conforme as instruções
grafico_1 <- ggplot(data = mtcars) +
# Mapeamento estético: X = peso, Y = milhas/galão, Cor = cilindros
aes(x = wt, y = mpg, color = as.factor(cyl)) +
# Geometria de dispersão (pontos)
geom_point(size = 3) +
# Customização de Títulos e Rótulos
labs(
title = "2.1 Relação entre Peso e Consumo de Combustível",
subtitle = "Aumento de peso (wt) resulta em menor eficiência (mpg).",
x = "Peso (1000 lbs)",
y = "Milhas por Galão (mpg)",
color = "Cilindros"
) +
# Aplicação do tema minimalista
theme_minimal() +
theme(legend.position = "bottom")
# PLOTANDO O GRÁFICO
grafico_1
```
### Código R Fonte Gráfico de Dispersão
```{r eval=FALSE, echo=TRUE}
# O código a seguir é a versão fonte original (Chart A) para referência.
# Este chunk tem eval=FALSE, ou seja, ele APENAS exibe o código, não o executa.
# OBJETIVO: Criar um gráfico de dispersão (mpg x wt), cor por cyl, com theme_minimal().
# Criando o gráfico de dispersão conforme as instruções
grafico_1 <- ggplot(data = mtcars) +
# Mapeamento estético: X = peso, Y = milhas/galão, Cor = cilindros
aes(x = wt, y = mpg, color = as.factor(cyl)) +
# Geometria de dispersão (pontos)
geom_point(size = 3) +
# Customização de Títulos e Rótulos
labs(
title = "2.1 Relação entre Peso e Consumo de Combustível",
subtitle = "Aumento de peso (wt) resulta em menor eficiência (mpg).",
x = "Peso (1000 lbs)",
y = "Milhas por Galão (mpg)",
color = "Cilindros"
) +
# Aplicação do tema minimalista
theme_minimal() +
theme(legend.position = "bottom")
```
<!--INICIO DA SEGUNDA PÁGINA DO QUESTÕES GERAIS-->
Gráficos de Barras (Ex 1.2) {data-navmenu="QUESTÕES GERAIS" data-navmenu-icon="fa-list" data-icon="fa-check"}
=====================================
Column {data-width=350}
-----------------------------------------------------------------------
### Estruturação de Gráficos de Barras
#### **Importância da Ordenação**
Em variáveis categóricas ordinais (como a qualidade `cut`), a ordem padrão alfabética muitas vezes confunde a análise.
Para uma visualização eficaz, é crucial ordenar as barras pela frequência (`n`). Isso permite identificar instantaneamente qual categoria é a mais predominante e qual a curva de distribuição dos dados.
#### **Elementos Visuais**
Nesta atividade, construímos o gráfico em 3 etapas progressivas:
1. **Ordenação:** Reordenar os fatores.
2. **Rótulos:** Adicionar o valor exato para leitura precisa.
3. **Cores:** Usar uma paleta divergente para destacar as diferenças.
Column {data-width=650 .tabset}
-----------------------------------------------------------------------
### Passo A: Ordenação das Barras
```{r ex_1_2_a}
# PREPARAÇÃO DOS DADOS
library(forcats) # Pacote para manipular fatores
# Criando dataframe com contagem e reordenando o fator 'cut'
diamonds_ordered <- diamonds %>%
count(cut) %>%
mutate(cut = fct_reorder(cut, n, .desc = TRUE))
# PLOT A: Apenas barras ordenadas
ggplot(data = diamonds_ordered, aes(x = cut, y = n)) +
geom_bar(stat = "identity", fill = "gray70") + # Cor neutra inicial
labs(
title = "Passo A: Barras Ordenadas",
subtitle = "Ordenação decrescente por frequência",
x = "Qualidade do Corte",
y = "Contagem"
) +
theme_minimal()
```
### Passo B: Adicionando Rótulos
```{r ex_1_2_b}
library(scales) # Para formatar números (comma)
# PLOT B: Adicionando geom_text
ggplot(data = diamonds_ordered, aes(x = cut, y = n)) +
geom_bar(stat = "identity", fill = "gray70") +
# Adicionando os Rótulos
geom_text(aes(label = comma(n)),
vjust = -0.5, # Move o texto para cima da barra
size = 4,
fontface = "bold") +
labs(
title = "Passo B: Inserção de Rótulos",
subtitle = "Facilitando a leitura exata dos valores",
x = "Qualidade do Corte",
y = "Contagem"
) +
theme_minimal()
```
### Passo C: Paleta de Cores (Final)
```{r ex_1_2_c}
# PLOT C: Aplicando Paleta Brewer 'RdBu'
ggplot(data = diamonds_ordered, aes(x = cut, y = n, fill = cut)) +
geom_bar(stat = "identity") +
geom_text(aes(label = comma(n)),
vjust = -0.5, size = 4, fontface = "bold") +
# APLICAÇÃO DA PALETA DIVERGENTE SOLICITADA
scale_fill_brewer(palette = "RdBu", guide = "none") +
labs(
title = "Contagem de Diamantes por Qualidade do Corte",
subtitle = "Gráfico Final: Ordenado, Rotulado e Colorido",
x = "Qualidade do Corte",
y = "Contagem de Diamantes (n)"
) +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
```
### Análise e Interpretação
O gráfico de barras finalizado permite as seguintes conclusões sobre a qualidade dos diamantes no dataset:
1. **Dominância do Corte Ideal:** O corte de qualidade `Ideal` (azul escuro) domina amplamente o dataset com mais de 20.000 unidades. Isso indica uma forte prevalência de alta qualidade neste mercado específico.
2. **Ordem de Frequência:** A ordenação visual (`Ideal > Premium > Very Good > Good > Fair`) mostra uma queda progressiva. Cortes de qualidade intermediária (`Premium` e `Very Good`) ainda são comuns.
3. **Escassez de Baixa Qualidade:** Os cortes `Good` e `Fair` (tons avermelhados na paleta RdBu) representam a minoria absoluta. Isso sugere que pedras de baixa qualidade de corte são raras ou descartadas.
Customização Avançada (Ex 1.3) {data-navmenu="QUESTÕES GERAIS" data-navmenu-icon="fa-list" data-icon="fa-check"}
=====================================
Column {data-width=350}
-----------------------------------------------------------------------
### Customização Avançada
#### **O Boxplot**
O boxplot (diagrama de caixa) é uma ferramenta visual para interpretar a distribuição de dados numéricos. Ele exibe:
1. **Mediana:** A linha central da caixa.
2. **Quartis:** As bordas da caixa representam o 1º e 3º quartil (50% dos dados).
3. **Outliers:** Pontos fora dos "bigodes" que indicam valores atípicos.
#### **Dataset Diamonds**
Utilizaremos o dataset `diamonds` contido no pacote `ggplot2`, analisando especificamente:
* **Price:** Preço do diamante em dólares.
* **Cut:** Qualidade do corte (Fair, Good, Very Good, Premium, Ideal).
Column {data-width=650 .tabset}
-------------------------------------
### Títulos e Rótulos (PT-BR)
```{r}
# Gráfico simples com rótulos traduzidos
ggplot(diamonds, aes(x = cut, y = price)) +
geom_boxplot() +
labs(
title = "Preço dos Diamantes por Tipo de Corte",
subtitle = "Análise exploratória inicial",
x = "Qualidade do Corte",
y = "Preço (USD)"
)
```
### Cores Customizadas
```{r}
# Adicionando cores personalizadas (fill)
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_boxplot() +
labs(
title = "Preço por Corte (Com Cores)",
x = "Qualidade do Corte",
y = "Preço (USD)"
) +
scale_fill_manual(values = c(
"Fair" = "#E69F00", # Laranja
"Good" = "#56B4E9", # Azul Claro
"Very Good" = "#009E73", # Verde
"Premium" = "#F0E442", # Amarelo
"Ideal" = "#0072B2" # Azul Escuro
))
```
### Sem Legenda
```{r}
# Removendo a legenda redundante
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_boxplot() +
labs(
title = "Preço por Corte (Sem Legenda)",
x = "Qualidade do Corte",
y = "Preço (USD)"
) +
scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2")) +
theme(legend.position = "none") # Remove a legenda
```
### Gráfico Final (Ajuste Eixo X)
```{r}
# Ajustando o ângulo do texto do eixo X
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_boxplot() +
labs(
title = "Análise Final: Distribuição de Preços",
subtitle = "Ajuste de ângulo nos rótulos",
x = "Qualidade do Corte",
y = "Preço (USD)",
caption = "Fonte: Dataset Diamonds (ggplot2)"
) +
scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2")) +
theme_minimal() + # Aplicando um tema limpo
theme(
legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1, face = "bold") # Rotaciona 45 graus
)
```
Conceitos Fundamentais (Ex 1.4) {data-navmenu="CONCEITOS FUNDAMENTAIS" data-navmenu-icon="fa-list" data-icon="fa-check"}
=====================================
Column {data-width=500}
-----------------------------------------------------------------------
### Introdução aos Geoms de Dispersão
#### O Problema da Sobreposição (Overplotting)
Ao criar gráficos de dispersão com dados que possuem categorias discretas (como números inteiros de cilindros ou classes de veículos), é comum que muitos pontos caiam exatamente nas mesmas coordenadas `x` e `y`.
Isso cria um problema visual: **você vê apenas um ponto**, mas podem existir centenas ali.
##### A Solução: Jitter (Tremulação)
A diferença fundamental entre as funções reside em como elas tratam essa posição:
1. **geom_point():** Plota o ponto exatamente onde o dado diz. É preciso e exato.
2. **geom_jitter():** Adiciona um pequeno ruído aleatório (tremulação) aos dados antes de plotar. Isso "espalha" os pontos para que possamos ver a densidade real dos dados.
Column {data-width=500}
-----------------------------------------------------------------------
### Exemplo 1: geom_point() (Pontos Sobrepostos)
```{r}
ggplot(mpg, aes(x = cyl, y = hwy)) +
geom_point(size = 3, alpha = 0.5, color = "#AB2328") +
labs(
title = "Cilindros vs Eficiência na Estrada",
subtitle = "Muitos pontos estão escondidos uns atrás dos outros",
x = "Número de Cilindros",
y = "Milhas por Galão (Rodovia)"
) +
theme_minimal()
```
### Exemplo 2: geom_jitter() (Pontos Espalhados)
```{r}
ggplot(mpg, aes(x = cyl, y = hwy)) +
geom_jitter(size = 3, alpha = 0.5, color = "#B3A369", width = 0.2) +
labs(
title = "Cilindros vs Eficiência na Estrada",
subtitle = "O Jitter revela a verdadeira quantidade de dados",
x = "Número de Cilindros",
y = "Milhas por Galão (Rodovia)"
) +
theme_minimal()
```
geom_point() {data-navmenu="CONCEITOS FUNDAMENTAIS" data-navmenu-icon="fa-list" data-icon="fa-bullseye"}
=====================================
Column {data-width=350}
-----------------------------------------------------------------------
### Definição da Função
#### Precisão Absoluta
A função `geom_point()` é o padrão geométrico para criar gráficos de dispersão (scatterplots).
Ela mapeia as variáveis estéticas `x` e `y` diretamente para a posição no plano cartesiano.
**Principais Argumentos:**
* `size`: Tamanho do ponto.
* `shape`: Formato do ponto (círculo, triângulo, quadrado).
* `color`: Cor da borda ou preenchimento.
* `alpha`: Transparência (útil quando há alguma sobreposição leve).
Column {data-width=650 .tabset}
-----------------------------------------------------------------------
### Exemplo Prático
```{r}
# Exemplo usando dataset diamonds para ver relação contínua
ggplot(diamonds[1:200,], aes(x = carat, y = price, color = cut)) +
geom_point(size = 3) +
labs(title = "Relação Quilates x Preço") +
theme_light()
```
### Quando Utilizar?
#### Situação Ideal
O `geom_point()` é a escolha correta quando:
1. **Variáveis Contínuas:** Ambas as variáveis (X e Y) são contínuas e possuem muitas casas decimais (ex: 1.254, 1.255). Nesse caso, a sobreposição é rara.
2. **Precisão é Crítica:** Quando a posição exata do ponto importa mais do que a visualização da densidade.
3. **Gráficos Resumo:** Quando você está plotando médias ou estatísticas agregadas, onde cada ponto representa um grupo único.
geom_jitter() {data-navmenu="CONCEITOS FUNDAMENTAIS" data-navmenu-icon="fa-list" data-icon="fa-random"}
=====================================
Column {data-width=350}
-----------------------------------------------------------------------
### Definição da Função
#### Visualizando Densidade em Dados Discretos
A função `geom_jitter()` é um atalho conveniente para `geom_point(position = "jitter")`.
Ela adiciona uma pequena quantidade de variação aleatória à localização de cada ponto. Isso é puramente visual; não altera os dados estatísticos subjacentes, mas melhora a interpretabilidade gráfica.
**Controle:**
Você pode controlar a quantidade de espalhamento usando os argumentos `width` (largura) e `height` (altura).
Column {data-width=650 .tabset}
-----------------------------------------------------------------------
### Exemplo Prático
```{r}
# Exemplo com dados discretos (classe do carro)
ggplot(mpg, aes(x = class, y = hwy, color = class)) +
geom_jitter(width = 0.2, height = 0, size = 2, alpha = 0.7) +
labs(title = "Consumo por Classe de Veículo") +
theme_light() +
theme(legend.position = "none")
```
### Quando Utilizar?
#### Situação Ideal
O `geom_jitter()` deve ser utilizado quando:
1. **Variáveis Discretas ou Categóricas:** Uma ou ambas as variáveis possuem poucos valores únicos (ex: notas 1 a 5, número de cilindros 4, 6, 8).
2. **Excesso de Sobreposição (Overplotting):** Quando seu gráfico parece ter poucos pontos, mas seu dataset tem milhares de linhas.
3. **Análise de Distribuição:** Quando você quer ter uma ideia visual da distribuição dos dados sem recorrer a um Boxplot ou Violino.
Gramática dos Gráficos {data-navmenu="CONCEITOS FUNDAMENTAIS" data-navmenu-icon="fa-list" data-icon="fa-layer-group"}
=====================================
Column {data-width=500}
-----------------------------------------------------------------------
### A Gramática em Camadas (Layered Grammar)
#### O Conceito
O pacote `ggplot2` é baseado na "Gramática dos Gráficos" (Leland Wilkinson). A ideia central é que você pode construir qualquer gráfico a partir dos mesmos componentes básicos:
1. **Data (Dados):** O que você quer visualizar.
2. **Aesthetics (Estética - aes):** O mapeamento dos dados para propriedades visuais (x, y, cor, tamanho).
3. **Geometries (Geometrias - geom):** A forma visual (pontos, barras, linhas).
##### Camadas Adicionais
Além do básico, refinamos o gráfico com:
* **Facets:** Dividir em sub-gráficos.
* **Statistics:** Transformações estatísticas (médias, contagens).
* **Coordinates:** O espaço onde o gráfico é desenhado.
* **Themes:** A aparência não-relacionada aos dados (fontes, fundos).
Column {data-width=500 .tabset}
-----------------------------------------------------------------------
### Exemplo Completo (Camadas)
```{r}
# Construindo um gráfico complexo camada por camada
ggplot(data = mpg) +
# Camada Estética (Mapeamento)
aes(x = displ, y = hwy, color = drv) +
# Camada Geométrica 1 (Pontos)
geom_jitter(width = 0.1) +
# Camada Geométrica 2 (Linha de tendência suave)
geom_smooth(method = "lm", se = FALSE) +
# Camada de Facetas (Dividir por ano)
facet_wrap(~year) +
# Camada de Etiquetas/Títulos
labs(title = "Eficiência do Motor por Tração e Ano",
subtitle = "Aplicando múltiplas camadas da gramática",
x = "Cilindrada", y = "Milhas/Galão") +
# Camada de Tema
theme_bw()
```
### Código Fonte Comentado
```r
# Estrutura da Gramática dos Gráficos
ggplot(data = mpg) + # 1. DADOS
aes(x = displ, y = hwy, color = drv) + # 2. ESTÉTICA (Mapeamento Global)
geom_jitter() + # 3. GEOMETRIA (Camada de Pontos)
geom_smooth() + # 4. ESTATÍSTICA (Camada de Tendência)
facet_wrap(~year) + # 5. FACETAS (Divisão de painéis)
labs(...) + # 6. ANOTAÇÕES
theme_bw() # 7. TEMA (Aparência)
```
### Exemplo Extra 1 (Boxplot + Jitter)
```{r}
# Combinando duas geometrias para máxima informação
ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
geom_boxplot(alpha = 0.3, outlier.shape = NA) + # Oculta outliers do boxplot
geom_jitter(width = 0.2, alpha = 0.5) + # Mostra todos os pontos
labs(title = "Combinação de Geometrias", subtitle = "Boxplot (Resumo) + Jitter (Dados Brutos)") +
theme_minimal() +
theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
```
### Exemplo Extra 2 (Barras + Coords)
```{r}
# Mudando o sistema de coordenadas
ggplot(mpg, aes(x = class, fill = manufacturer)) +
geom_bar() + # Geometria de barra (usa stat de contagem padrão)
coord_polar() + # Muda para coordenadas polares
labs(title = "Coordenadas Polares (Coxcomb)", subtitle = "Mudando apenas a camada de Coordenadas") +
theme_void() # Tema vazio para limpar eixos
```