Análise Exploratória de Dados - Gráfica
IFMG - Campus Formiga
11 de junho de 2025
O que vimos até hoje?
Aula 1 ✅
Aula 2 ✅
Metodologia CRISP-DM ✅
Tipos de Análise ✅
Configurações: Git/GitHub ✅
Aula 3 ✅
Introdução ao RStudio ✅
Aula 4 ✅
Introdução ao Git e GitHub ✅
Aula 5 ✅
Breve Revisão do IDE RStudio ✅
Introdução ao Sistema de Publicação Quarto ✅
Sessão Prática Guiada com Relatório 1 ✅
Aula 6 ✅
Parte I ✅
Parte II ✅
Aula 7 ✅
Introdução ao sistema Quarto (continuação) ✅
Introdução à Linguagem R (continuação) ✅
Aula 8 ✅
Início do estudo do pacote dplyr para manipulação de dados ✅
Aula 9 ✅
Aula 10 ✅
Aula 11 ✅
Aula 12 ✅
Aula 13 ✅
Aula 14 ✅
Aula 15 ✅
Aula 16 ✅
Aula 17 ✅
Características da Distribuição de uma VA ✅
Aula 18 ✅
Características da Distribuição de uma VA ✅
Aula 19 ✅
Teoria da Probabilidade e Análise Estatística de Dados ✅
CRISP-DM e Análise Exploratória de Dados ✅
Análise Exploratória Numérica ✅
Aula 20 ✅
Análise Exploratória Gráfica ✅
Visualização de Dados e o Pacote ggplot2 ✅
Gráficos para Visualizar a Distribuição de Variáveis Numéricas ✅
Tópicos Vistos
Visualização de Dados e o Pacote ggplot2
Gráficos Univariados para Variáveis Numéricas:
Gráfico Bivariado:
Tópicos
Gráfico Univariado para Variáveis Categóricas:
Gráficos Bivariados:
Gráfico para Séries Temporais:
Instruções
Abra o RStudio e o seu Projeto da Disciplina
Crie a subpasta 13-relatorio dentro da pasta relatorios.
Acesse o site da disciplina e baixe o arquivo 13-relatorio.zip
Descompacte o arquivo, copie/recorte o arquivo 13-relatorio.qmd
e cole dentro da subpasta 13-relatorio.
Diretrizes para Aulas Mais Produtivas
🔊 Mantenha conversas em volume baixo
⌨️ Código com método:
95% dos erros são evitáveis com:
🤝 Inteligência colaborativa:
💪 Capacidade de Resolver Problemas
Cada erro resolvido é uma evolução da sua habilidade analítica
Relembrando
Variáveis categóricas, também conhecidas como variáveis qualitativas, são variáveis que representam categorias ou níveis que podem ser usadas para rotular diferentes atributos da variável.
Tipos de Variáveis Categóricas:
Nominais: Não existe uma ordem inerente entre as categorias. Exemplos incluem marcas de empresas, cor de um carro, ou gênero.
Ordinais: Existe uma ordem ou ranking claro entre as categorias, mas os intervalos entre as categorias não são necessariamente iguais ou conhecidos. Exemplos são níveis de educação (fundamental, médio, superior), satisfação do cliente (satisfeito, neutro, insatisfeito), etc.
Elas são essenciais para muitos tipos de pesquisa científica, social e de mercado, onde a classificação ou categorização desempenha um papel muito importante na análise dos dados coletados.
Definição
Um gráfico de barras utiliza barras retangulares para representar a distribuição dos valores de uma variável categórica, com a altura de cada barra proporcional à frequência absoluta ou relativa de cada categoria.
Estas barras podem ser organizadas verticalmente ou horizontalmente.
É comumente aplicado em análises que envolvem variáveis categóricas ou discretas, facilitando a interpretação e comparação dos valores representados.
Matéria do Nexo Jornal
Relembrando - Construção de Gráficos por Camadas
Data Frame Marriage do Pacote mosaicData
Vamos utilizar variáveis categóricas da data frame Marriage
do pacote mosaicData
para criar gráficos de barras.
A data frame Marriage
contém dados reais de uma pesquisa sobre casamentos realizada pelo National Center for Family & Marriage Research (NCFMR) dos EUA.
Inclui informações sobre 1.000 casamentos, incluindo a raça dos cônjuges, variável race
, que possui quatro categorias: “White”, “Black”, “Hispanic” e “American Indian”.
Inclui ainda outras variáveis como marital_status
(estado civil), sign
(signo astrológico), education
(nível de escolaridade), entre outras.
Inverter os Eixos
Descrição
Tabelas de frequência são úteis para resumir a distribuição de uma variável categórica, por exemplo, seja a variável categórica ordinal “nível de escolaridade dos respondentes de uma pesquisa” que entrevistou 200 pessoas.
Uma tabela de frequência para tabular os resultados da pesquisa sobre a variável “nível de escolaridade dos respondentes” poderia ser:
Categoria | Frequência Absoluta (\(fi\)) | Frequência Relativa | Frequência Percentual (%) |
---|---|---|---|
Ensino Fundamental | 45 | 0,225 | 22,5% |
Ensino Médio | 78 | 0,390 | 39,0% |
Ensino Superior | 62 | 0,310 | 31,0% |
Pós-graduação | 15 | 0,075 | 7,5% |
Total | 200 | 1,000 | 100,0% |
Onde:
\(fi\) = frequência absoluta da categoria i
\(n\) = total de observações
Essas tabelas foram muito usadas para apresentar os resultados de pesquisas antes da popularização dos gráficos de barras, mas ainda são úteis para apresentar resultados de pesquisas com envolvendo variáveis categóricas.
Função table
A função interna table()
é usada para criar tabelas de frequência exploratórias de uma variável categórica.
A função table()
conta o número de ocorrências de cada valor (nível) da variável categórica e retorna uma tabela com as frequências absolutas.
Sua sintaxe básica é:
Descrição
Também podemos usar o pacote dplyr para criar tabelas de frequência em R.
A função dplyr::count()
conta o número de ocorrências de cada valor (nível) da variável categórica e retorna uma data frame com duas colunas:
E a função dplyr::arrange()
pode ser usada para ordenar os resultados por frequência absoluta, relativa ou percentual.
Podemos usar a função dplyr::mutate()
para calcular a frequência relativa e a frequência percentual de cada nível da variável categórica.
# Preparação dos dados para o gráfico
# Calcula o número de participantes em cada nível de raça
tabela_raca_frequencia <- Marriage %>%
# conta o número de participantes por raça
count(race) %>%
# ordena os dados pela frequência em ordem CRESCENTE (menor para maior)
# vamos usar ordem crescente para compensar o efeito do coord_flip()
arrange(n) %>%
# sincroniza os niveis do factor com a ordem atual das linhas
mutate(race = factor(race, levels = race))
# exibe a tabela (dados em ordem crescente)
tabela_raca_frequencia
race n
1 American Indian 1
2 Hispanic 1
3 Black 22
4 White 74
# Salva o gráfico em objeto
grafico_barras_freq <-
# Cria um sistema de coordenadas para o gráfico com x sendo a raça e y sendo a frequência
ggplot(tabela_raca_frequencia, aes(x = race, y = n)) +
# Cria o gráfico de barras
# stat="identity" usa os valores exatos de x = 'n' (frequência)
geom_bar(stat="identity") +
# Inverte os eixos
coord_flip() +
# geom_text() adiciona rótulos (frequência) às barras
# hjust = -0.5: posiciona o texto um pouco à direita das barras horizontais
geom_text(aes(label = n), hjust = -1) +
# Adiciona rótulos aos eixos e título do gráfico
labs(x = "Raça",
y = "Número de Participantes",
title = "Distribuição dos Participantes por Raça") +
# Define um tema minimalista para o gráfico
theme_minimal()
# Exibe o gráfico
grafico_barras_freq
# Preparação dos dados para o gráfico
# Calcula o número e a porcentagem de participantes em cada nível de raça
tabela_raca_porcentagem <- Marriage %>%
# conta o número de participantes por raça
count(race) %>%
# calcula a porcentagem de cada categoria
# divide cada frequência (n) pelo total de observações
mutate(porcentagem = n / sum(n)) %>%
# ordena os dados pela frequência em ordem CRESCENTE (menor para maior)
# vamos usar ordem crescente para compensar o efeito do coord_flip()
arrange(n) %>%
# sincroniza os niveis do factor com a ordem atual das linhas
mutate(race = factor(race, levels = race))
# exibe a tabela (agora com frequência e porcentagem)
tabela_raca_porcentagem
race n porcentagem
1 American Indian 1 0.010204
2 Hispanic 1 0.010204
3 Black 22 0.224490
4 White 74 0.755102
# Salva o gráfico em objeto
grafico_barras_pct <-
# Cria um sistema de coordenadas para o gráfico com x sendo a raça e y sendo a %
ggplot(tabela_raca_porcentagem,
aes(x = race, y = porcentagem)) +
# Cria o gráfico de barras
# stat="identity" usa os valores exatos de x = 'porcentagem'
geom_bar(stat = "identity") +
# inverte os eixos para barras horizontais (e ordem decrescente visual)
coord_flip() +
# geom_text() adiciona rótulos às barras
# hjust = -0.3 posiciona o texto à direita das barras horizontais
# scales::percent converte para porcentagem 0.25 → 25%
geom_text(aes(label = scales::percent(porcentagem)),
hjust = -0.3) +
# scale_y_continuous() define a formatação do eixo y
# scales::percent converte os valores do eixo y para porcentagens
scale_y_continuous(labels = scales::percent) +
# Adiciona rótulos aos eixos e título do gráfico
labs(x = "Raça",
y = "% de Participantes",
title = "Porcentagem de Participantes por raça") +
# Define um tema minimalista para o gráfico
theme_minimal()
# exibe o gráfico
grafico_barras_pct
# Salva o gráfico em objeto
grafico_barras_freq_pub <-
# Cria sistema de coordenadas: x = raça, y = frequência, fill = cores por categoria
ggplot(tabela_raca_frequencia, aes(x = race, y = n, fill = race)) +
# Cria barras usando geom_bar com stat="identity"
geom_bar(stat = "identity") +
# Inverte os eixos (barras horizontais)
coord_flip() +
# Adiciona rótulos de frequência nas barras
# hjust = -0.1: posiciona o texto DO LADO DIREITO das barras (parte superior)
# size = 6 e fontface = "bold" para melhor legibilidade
geom_text(aes(label = n),
hjust = -0.3,
size = 6,
fontface = "bold") +
# Define cores personalizadas para cada categoria de raça
scale_fill_manual(
values = c(
"White" = "coral2",
"Black" = "coral2",
"Hispanic" = "grey70",
"American Indian" = "grey70"
)
) +
# Aplica tema clássico (fundo branco, bordas pretas)
theme_classic() +
# Personaliza elementos visuais para qualidade de publicação
theme(
legend.position = "none", # remove legenda (cores já identificam)
plot.title = element_text(size = 15), # título com fonte 15
axis.text.y = element_text(size = 18), # rótulos eixo Y (raças) fonte 18
axis.text.x = element_text(size = 16), # rótulos eixo X (números) fonte 16
axis.title.x = element_blank(), # remove título do eixo X
axis.title.y = element_blank() # remove título do eixo Y
) +
# Define título e fonte
labs(title = "Distribuição dos Participantes por Raça",
caption = "Fonte: Pacote ggplot2")
# Exibe o gráfico
grafico_barras_freq_pub
# Salva o gráfico em objeto
grafico_barras_pct_pub <-
# Cria sistema de coordenadas: x = raça, y = porcentagem, fill = cores por categoria
ggplot(tabela_raca_porcentagem,
aes(x = race, y = porcentagem, fill = race)) +
# Cria barras usando geom_bar com stat="identity"
geom_bar(stat = "identity") +
# Inverte os eixos para barras horizontais (e ordem decrescente visual)
coord_flip() +
# Adiciona rótulos de porcentagem nas barras
# hjust = -0.1: posiciona o texto DO LADO DIREITO das barras (parte superior)
# size = 6 e fontface = "bold" para melhor legibilidade
# scales::percent() formata como porcentagem (0.25 → 25%)
geom_text(aes(label = scales::percent(porcentagem)),
hjust = -0.1,
size = 6,
fontface = "bold") +
# Define cores específicas para cada categoria de raça
scale_fill_manual(
values = c(
"White" = "coral2",
"Black" = "coral2",
"Hispanic" = "grey70",
"American Indian" = "grey70"
)
) +
# Formata o eixo y como porcentagem E amplia o limite para acomodar os rótulos
# expand = expansion(mult = c(0, 0.1)) adiciona 10% de espaço extra no limite superior
scale_y_continuous(labels = scales::percent,
expand = expansion(mult = c(0, 0.1))) +
# Aplica tema clássico (fundo branco, bordas pretas)
theme_classic() +
# Personaliza elementos visuais para qualidade de publicação
theme(
legend.position = "none", # remove legenda (cores já identificam)
plot.title = element_text(size = 15), # título com fonte 15
axis.text.y = element_text(size = 18), # rótulos eixo Y (raças) fonte 18
axis.text.x = element_text(size = 16), # rótulos eixo X (%) fonte 16
axis.title.x = element_blank(), # remove título do eixo X
axis.title.y = element_blank() # remove título do eixo Y
) +
# Define título e fonte
labs(title = "Porcentagem de Participantes por Raça",
caption = "Fonte: Pacote ggplot2")
# Exibe o gráfico
grafico_barras_pct_pub
Gráficos de Barras Agrupadas
Os gráficos de barras agrupadas são úteis para comparar a distribuição de uma variável categórica em relação a outra variável categórica.
No entanto, eles possuem algumas desvantagens que podem impactar sua eficácia e interpretação.
Por exemplo: Se uma ou ambas as variáiveis contém muitos valores possíveis (níveis), isso pode tornar o gráfico difícil de ler e interpretar.
Recomendado apenas em casos com poucos valores possíveis (níveis) para cada variável categórica.
Gráficos condicionais (facetas), são melhores do que gráficos de barras agrupadas.
Descrição
Tabelas de contingência resumem a distribuição conjunta de duas variáveis categóricas, mostrando como as categorias de uma variável se relacionam com as categorias da outra.
Exemplo simplificado entre “Gênero” e “Preferência de Produto” (235 consumidores):
Gênero/Produto | Produto A | Produto B | Total |
---|---|---|---|
Feminino | 45 | 60 | 105 |
Masculino | 80 | 50 | 130 |
Total | 125 | 110 | 235 |
Frequência conjunta: \(n_{ij}\) = observações na categoria \(i\) (linha) e \(j\) (coluna)
Totais marginais:
Utilidade: Identificar associações entre variáveis categóricas, base para gráficos bivariados entre duas variáveis categóricas e para testes de associação.
# Cria tabela de contingência exploratória entre raça e signo astrológico
tabela_contingencia <- table(Marriage$race, Marriage$sign)
tabela_contingencia
Aquarius Aries Cancer Capricorn Gemini Leo Libra Pisces
American Indian 0 0 0 0 0 0 0 0
Black 1 2 1 0 4 3 4 2
Hispanic 0 0 0 0 0 0 0 1
White 6 8 7 2 5 4 3 13
Saggitarius Scorpio Taurus Virgo
American Indian 1 0 0 0
Black 3 0 2 0
Hispanic 0 0 0 0
White 5 7 4 10
Aquarius Aries Cancer Capricorn Gemini Leo Libra Pisces
American Indian 0 0 0 0 0 0 0 0
Black 1 2 1 0 4 3 4 2
Hispanic 0 0 0 0 0 0 0 1
White 6 8 7 2 5 4 3 13
Sum 7 10 8 2 9 7 7 16
Saggitarius Scorpio Taurus Virgo Sum
American Indian 1 0 0 0 1
Black 3 0 2 0 22
Hispanic 0 0 0 0 1
White 5 7 4 10 74
Sum 9 7 6 10 98
# Preparação dos dados para gráfico de barras agrupadas e empilhadas
# Cria tabela de contingencia entre raça e signo astrológico
tabela_bivariada <- Marriage %>%
# count() conta as combinações únicas de race e sign
# sort = TRUE ordena pela frequência em ordem decrescente
count(race, sign, sort = TRUE)
# exibe a tabela de contingência
tabela_bivariada
race sign n
1 White Pisces 13
2 White Virgo 10
3 White Aries 8
4 White Cancer 7
5 White Scorpio 7
6 White Aquarius 6
7 White Gemini 5
8 White Saggitarius 5
9 Black Gemini 4
10 Black Libra 4
11 White Leo 4
12 White Taurus 4
13 Black Leo 3
14 Black Saggitarius 3
15 White Libra 3
16 Black Aries 2
17 Black Pisces 2
18 Black Taurus 2
19 White Capricorn 2
20 American Indian Saggitarius 1
21 Black Aquarius 1
22 Black Cancer 1
23 Hispanic Pisces 1
# Criação do gráfico de barras agrupadas
grafico_barras_agrupadas <-
ggplot(tabela_bivariada, aes(x = sign, y = n, fill = race)) +
# geom_bar() cria o gráfico de barras agrupadas
# stat = "identity": usa os valores exatos da coluna 'n' (frequências)
# position = "dodge": agrupa as barras lado a lado
geom_bar(stat = "identity", position = "dodge") +
# Adiciona rótulos com os valores de frequência nas barras
geom_text(
aes(label = n), # exibe os valores da coluna 'n'
colour = "white", # cor do texto em branco
size = 4, # tamanho da fonte
vjust = 1.5, # posiciona o texto para baixo (dentro das barras)
position = position_dodge(.9) # alinha o texto com as barras agrupadas
# .9 corresponde à largura padrão do dodge
) +
# Paleta de cores acessível para daltônicos
scale_fill_brewer(
name = "Raça",
type = "qual",
palette = "Set1"
)
# Exibe o gráfico
grafico_barras_agrupadas
Parâmetros principais
Gráficos de Barras Empilhadas
Os gráficos de barras empilhadas também são úteis para comparar a distribuição de uma variável categórica em relação a outra variável categórica.
Possui a mesma limitação dos gráficos de barras agrupadas: se uma ou ambas as variáveis contêm muitos valores possíveis (níveis), isso pode tornar o gráfico difícil de ler e interpretar.
Recomendado apenas em casos com poucos valores possíveis (níveis) para cada variável categórica.
Gráficos condicionais (facetas), que veremos adiante, são melhores do que gráficos de barras empilhadas.
# Criação do gráfico de barras empilhadas
grafico_barras_empilhadas <-
ggplot(tabela_bivariada, aes(x = sign, y = n, fill = race)) +
# geom_bar() cria as barras empilhadas
# stat = "identity": usa os valores exatos da coluna 'n' (frequências)
# position = "stack": empilha as barras umas sobre as outras (padrão)
# Diferença do "dodge": em vez de lado a lado, as barras ficam sobrepostas
geom_bar(stat = "identity", position = "stack") +
# Adiciona rótulos com os valores de frequência dentro de cada segmento
geom_text(
aes(label = n), # exibe os valores da coluna 'n'
colour = "white", # cor do texto em branco (contraste)
size = 4, # tamanho da fonte
vjust = 1.2, # posiciona o texto ligeiramente para baixo
position = position_stack(.9) # alinha o texto de cada segmento empilhado
# .9 = posiciona a 90% da altura de cada segmento
) +
# Paleta de cores acessível para daltônicos
# ColorBrewer "Set1": cores distintas e com bom contraste para texto branco
scale_fill_brewer(
name = "Raça", # título da legenda
type = "qual", # qualitative: para variáveis categóricas
palette = "Set1" # paleta colorblind-friendly com cores escuras
)
# Exibe o gráfico
grafico_barras_empilhadas
Nunca use gráficos de barras tridimensionais
Por que não usar Gráficos de Barras 3D?
Gráficos de barras tridimensionais (3D) podem parecer visualmente atraentes e modernos, mas são considerados uma má prática:
Gráficos de barras 3D tendem a distorcer a percepção visual dos valores que estão sendo representados. Isso ocorre porque a perspectiva tridimensional pode alterar visualmente o tamanho aparente das barras, fazendo com que algumas barras pareçam maiores ou menores do que realmente são, dependendo de sua posição no gráfico.
Comparar as alturas das barras em um gráfico 3D é mais difícil do que em um gráfico de barras 2D. Isso se deve à perspectiva tridimensional, que pode obscurecer partes do gráfico ou criar um alinhamento que dificulta a comparação direta dos valores.
Em gráficos 3D, barras que estão posicionadas na frente podem bloquear parcial ou totalmente a visão de barras atrás delas, especialmente em gráficos densos com muitas categorias. Isso pode ocultar dados importantes, levando a interpretações errôneas ou incompletas da informação apresentada.
A terceira dimensão em um gráfico de barras raramente adiciona informações úteis. Geralmente, essa dimensão é estética e não funcional, aumentando a complexidade visual do gráfico sem oferecer benefícios claros para a compreensão dos dados.
Gráficos Recomendados
Gráficos de barras 2D simples para comparações diretas
Gráficos de barras agrupadas para múltiplas variáveis
Gráficos Condicionais (Faceting) para várias categorias
Definição
Um gráfico de dispersão, também conhecido como gráfico de pontos, é uma representação gráfica utilizada para exibir a correlação entre duas variáveis numéricas.
Ele é composto por um eixo horizontal (eixo x) e um eixo vertical (eixo y), cada um representando uma das variáveis. Os dados são representados como pontos no gráfico, onde a posição de cada ponto é determinada pelos valores das variáveis (x, y).
Este tipo de gráfico é particularmente útil:
para identificar padrões de correlação entre as variáveis — se é positiva (ambas as variáveis aumentam juntas), negativa (uma variável aumenta enquanto a outra diminui), ou nula (sem relação aparente).
permite a visualização de agrupamentos de dados e a presença de valores atípicos (outliers) que podem indicar erros de medição ou peculiaridades no conjunto de dados.
Padrões Identificáveis em Gráficos de Dispersão
Variabilidade/Dispersão da Nuvem vs Força da Correlação:
Descrição
\[ \begin{aligned} Cov(X,Y) &= E[(X - \mu_X)(Y - \mu_Y)], \\ &= E[XY] - \mu_X \mu_Y \end{aligned} \]
\[ Cor(X,Y) = \rho_{xy} = \frac{Cov(X,Y)}{\sigma_X \sigma_Y} \,\, (-1 \leq \rho_{xy} \leq +1) \]
Coeficiente de Correlação de Pearson
\[ r_{xy} = r = \frac{\sum_{i=1}^{n} (x_i - \bar{x}) (y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \bar{y})^2} } \]
Sendo \(x_i\) e \(y_i\) os dados ou observações.
O coeficiente de correlação de Pearson é uma medida adimensional que varia de -1 a +1, e se :
\(r \approx +1\) indica uma correlação positiva muito forte (se uma variável aumenta, a outra tende a aumentar, e vice-versa)
\(r \approx -1\) indica uma correlação negativa muito fornte (se uma variável aumenta enquanto a outra tende a diminuir, e vice-versa)
\(r \approx 0\) indica que não há correlação linear entre as variáveis.
Método paramétrico: É adequado se os dados seguem uma distribuição aproximadamente normal.
Critérios de Cohen (1988)
r | Magnitude |
---|---|
\(r \geq 0.5\) | correlação forte |
\(0.3 \leq r \leq 0.5\) | correlação moderada |
\(0.1 \leq r \leq 0.3\) | correlação fraca |
\(r < 0.1\) | correlação muito fraca |
Esses limiares ajudam os pesquisadores a entender a intensidade da associação entre as variáveis, indicando, por exemplo, se uma variação em uma variável poderia estar associada a mudanças previsíveis na outra variável.
A classificação de Cohen é amplamente utilizada em Estatística e Ciência de Dados para avaliar a relevância dos resultados de uma análise de correlação.
Função cor
# Salva o gráfico em um objeto
grafico_dispersao_simples <-
# mapeia o orçamento de marketing no YouTube para o eixo x e
# as vendas para o eixo y
ggplot(marketing, aes(x = youtube, y = sales)) +
# Adicona um gráfico de dispersão de sales vs youtube
geom_point()
# exibe o gráfico
grafico_dispersao_simples
# Salva o gráfico em um objeto
grafico_dispersao_reta <-
# mapeia o orçamento de marketing no YouTube para o eixo x e
# as vendas para o eixo y
ggplot(marketing, aes(x = youtube, y = sales)) +
# Adiciona o gráfico de dispersão de sales vs youtube
geom_point() +
# Adiciona a reta de regressão linear
# se = FALSE desativa o intervalo de confiança
geom_smooth(method = "lm", se = FALSE)
# exibe o gráfico
grafico_dispersao_reta
Reta de Regressão em um Gráfico de Dispersão
Adicionar uma reta (modelo) de regressão linear a um gráfico de dispersão é uma prática comum e tem como objetivo ajudar a visualizar se a relação entre as variáveis é linear e qual é a sua força. Esta reta é útil por várias razões:
A reta de regressão fornece uma representação visual clara se a relação entre as duas variáveis é linear. Ao modelar dados, cientistas e analistas de dados usualmente testam se um modelo linear é adequado, pois trata-se do modelo mais simples entre duas variáveis.
A inclinação da reta indica a força e a direção da relação entre as variáveis. Uma inclinação mais acentuada sugere uma relação mais forte, enquanto uma inclinação suave ou quase horizontal sugere uma relação fraca ou inexistente.
Da mesma forma, a dispersão dos pontos em torno da reta indica a força da relação: pontos mais próximos da reta indicam uma relação mais forte, enquanto pontos mais dispersos indicam uma relação mais fraca.
A reta de regressão também ajuda a identificar valores extremos (outliers) que podem influenciar a relação entre as variáveis. Se alguns pontos estão muito longe da reta em relação à maioria, isso pode indicar que a relação não é linear ou que há outliers que estão distorcendo a relação.
Definição
Dados de séries temporais referem-se a dados coletados ao longo do tempo, em geral, em intervalos regulares (anos, meses, dias…) sobre uma variável (série univariada) ou mais de uma variável (série multivariada) de uma entidade.
Este tipo de dados é amplamente produzido em diversas áreas, economia, administração e em muitas outras áreas onde a dimensão temporal é fundamental.
A norma ISO 8601 define um padrão internacional para a representação de dados numéricos de séries temporais, o padrão é YYYY-MM-DD (Ano-Mês-Dia). Exemplo: 2023-07-18
Exemplo: Arquivo de dados para uma série temporal mensal multivariada:
data | preco | volume |
---|---|---|
2020-01-01 | 100 | 1500 |
2020-02-01 | 105 | 1600 |
2020-03-01 | 102 | 1550 |
2020-04-01 | 108 | 1650 |
Tipos
Um gráfico pode ser um veículo poderoso para exibir mudanças de um processo aleatório ao longo do tempo, e para identificar padrões, tendências e sazonalidades.
O gráfico mais comum para séries temporais é o gráfico de linha. Outras opções incluem grráficos dumbbell, gráficos de área, entre outros.
# Salva o gráfico em um objeto
grafico_linha <-
# Mapeia variáveis para os eixos x e y
ggplot(economics, aes(x = date, y = psavert)) +
# Adiciona um gráfico de linha
geom_line() +
# Adiciona título e rótulos aos eixos
labs(title = "Taxa de Poupança Pessoal",
x = "Mês",
y = "Taxa de Poupança Pessoal")
# Exibe o gráfico
grafico_linha
Melhorias 1
Vamos usar função scale_x_date
para alterar como as datas são exibidas no eixo x para que reflitam a periodicidade mensal, vamos estabelecer marcas a cada 5 anos e as datas serão apresentadas no formato MM-AA.
Além disso, vamos atribuir um tom de vermelho para a linha e aumentar sua espessuara.
E, como sempre, vamos adotar um tema minimalista para o gráfico.
scale_x_date() - Opções principais
Formatos comuns de data:
# Salva o gráfico em um objeto
grafico_linha_pub <-
# Mapeia variáveis para os eixos x e y
ggplot(economics, aes(x = date, y = psavert)) +
# Adiciona um gráfico de linha
# color = "indianred3" define a cor da linha
# size = 1 define a espessura da linha
geom_line(color = "indianred3",
size= 1 ) +
# NOVA: Formata o eixo x para exibir datas a cada 5 anos
# date_breaks = '5 years' define os intervalos de 5 anos
# labels = date_format("%b-%y") formata as datas como mês-ano
scale_x_date(date_breaks = '5 years',
labels = date_format("%b-%y")) +
# Adiciona título e rótulos aos eixos
labs(title = "Evolução da Taxa de Poupança Pessoal (em %) nos EUA",
subtitle = "Período: Julho/1967 - Abril/2015",
x = NULL,
y = "Taxa de Poupança Pessoal (%)",
caption = "Fonte: Federal Reserve Bank of St. Louis") +
# Define um tema minimalista para o gráfico
theme_minimal()
# Exibe o gráfico
grafico_linha_pub
Melhoria Final
Por fim, vamos adicionar uma curva (modelo) não paramétrica para facilitar a visualização de tendências de longo prazo.
A curva não paramétrica é uma linha suavizada que ajuda a identificar tendências gerais nos dados, independentemente de flutuações sazonais ou ruídos de curto prazo.
# Salva o gráfico em um objeto
grafico_linha_pub <-
# Mapeia variáveis para os eixos x e y
ggplot(economics, aes(x = date, y = psavert)) +
# Adiciona um gráfico de linha
# color = "indianred3" define a cor da linha
# size = 1 define a espessura da linha
geom_line(color = "indianred3",
size= 1 ) +
# NOVA: Adiciona uma curva não paramétrica
geom_smooth() +
# Formata o eixo x para exibir datas a cada 5 anos
# date_breaks = '5 years' define os intervalos de 5 anos
# labels = date_format("%b-%y") formata as datas como mês-ano
scale_x_date(date_breaks = '5 years',
labels = date_format("%b-%y")) +
# Adiciona título e rótulos aos eixos
labs(title = "Evolução da Taxa de Poupança Pessoal (em %) nos EUA",
subtitle = "Período: Julho/1967 - Abril/2015",
x = NULL,
y = "Taxa de Poupança Pessoal (%)",
caption = "Fonte: Federal Reserve Bank of St. Louis") +
# Define um tema minimalista para o gráfico
theme_minimal()
# Exibe o gráfico
grafico_linha_pub
Quando Usar?
Gráficos de linhas para duas, três ou mais séries podem ser eficazes quando as séries têm a mesma periodicidade (e.g., mensal, trimestral) e são medidas na mesma escala ou unidade de medida.
É importante garantir que as séries sejam comparáveis e que não haja diferenças significativas em suas escalas, pois isso pode distorcer a interpretação dos dados.
tidyquant
Pacote tidyquant
O pacote tidyquant
integra os melhores pacotes da linguagem R para coletar, manipular e analisar dados financeiros com o tidyverse
.
Como o tidyquant é possível realizar análises financeiras completas usando a sintaxe do tidyverse
.
A função tq_get()
do pacote tidyquant
é uma muito útil para coletar dados financeiros de diversas fontes, como Yahoo Finance, FRED, entre outras.
tq_get()
Função tq_get()
tq_get()
é:Onde:
x
: é um vetor de tickers das ações ou o nome do índice que você deseja obter os dados.
from
: é a data de início para a coleta dos dados (formato “YYYY-MM-DD”).
to
: é a data de término para a coleta dos dados (formato “YYYY-MM-DD”).
A função retorna um data frame com as colunas:
symbol
: é o ticker da ação ou do índice.date
: é a data da observação.open
: é o preço de abertura da ação no dia.high
: é o preço mais alto da ação no dia.low
: é o preço mais baixo da ação no dia.close
: é o preço de fechamento da ação no dia.volume
: é o volume de ações negociadas no dia.# carrega o pacote tidyquant
library(tidyquant)
# salva as séries importadas no objeto serie_bivariada
serie_bivariada <- c("AAPL", "META") %>%
# obtem os dados de fechamento das ações
tq_get(from = "2024-01-01") %>%
# seleciona as colunas relevantes
select(symbol, date, close) %>%
# renomeia as colunas para facilitar a leitura
rename(
Compania = symbol,
Dia = date,
Fechamento = close
)
# Exibe as 6 primeiras linhas da data frame
head(serie_bivariada)
# A tibble: 6 × 3
Compania Dia Fechamento
<chr> <date> <dbl>
1 AAPL 2024-01-02 186.
2 AAPL 2024-01-03 184.
3 AAPL 2024-01-04 182.
4 AAPL 2024-01-05 181.
5 AAPL 2024-01-08 186.
6 AAPL 2024-01-09 185.
# A tibble: 6 × 3
Compania Dia Fechamento
<chr> <date> <dbl>
1 META 2025-06-03 667.
2 META 2025-06-04 688.
3 META 2025-06-05 685.
4 META 2025-06-06 698.
5 META 2025-06-09 694.
6 META 2025-06-10 702.
# salva o gráfico em um objeto
grafico_linha_multiseries <-
# mapeia as variáveis para os eixos x e y, e define a cor por empresa
ggplot(serie_bivariada,
aes(x = Dia, y = Fechamento, color = Compania)) +
# Adiciona um gráfico de linha
# size=1 define a espessura da linha
geom_line(size=1) +
# Formata o eixo x para exibir datas a cada mês-ano
scale_x_date(date_breaks = '1 month',
labels = scales::date_format("%b-%y")) +
# Formata o eixo y para exibir os preços de fechamento
# limits = c(120, 800) define os limites do eixo y
# breaks = seq(120, 800, 100) define os intervalos de 100
scale_y_continuous(limits = c(120, 800),
breaks = seq(120, 800, 100)
) +
# Adiciona título e rótulos aos eixos
labs(title = "Preço Diário de Fechamento das Ações da Apple (AAPL) e Meta (META)",
subtitle = "Período: 2024-01-01 até o presente",
caption = "Fonte: Yahoo Finance",
y = "Preço de Fechamento") +
# Define um tema minimalista para o gráfico
theme_minimal()
# Exibe o gráfico
grafico_linha_multiseries
Gráfico de Barras para 1 Variável Categórica
Objetivo: Criar um gráfico de barras para visualizar o número de respondentes por estado civil.
Instruções:
# Preparação dos dados para o gráfico
# Tabela de frequência da variável estado_civil
tabela_estadocivil <- questionario %>%
# conta o número de respondentes por estado_civil
count(estado_civil) %>%
# ordena os dados pela frequência em ordem CRESCENTE (menor para maior)
# vamos usar ordem crescente para compensar o efeito do coord_flip()
arrange(n) %>%
# sincroniza os niveis do factor com a ordem atual das linhas
mutate(estado_civil = factor(estado_civil, levels = estado_civil))
# exibe a tabela (dados em ordem crescente)
tabela_estadocivil
# A tibble: 6 × 2
estado_civil n
<fct> <int>
1 Sem resposta 17
2 Separado(a) 743
3 Viúvo(a) 1807
4 Divorciado(a) 3383
5 Nunca casou 5416
6 Casado(a) 10117
ggplot(tabela_estadocivil, aes(x = estado_civil, y = n)) +
geom_bar(stat = "identity") +
coord_flip()
Melhore o gráfico adicionando:
geom_text()
labs(title = "...")
theme_minimal()
# Salva o gráfico em objeto
grafico_estadocivil_freq <-
# Cria um sistema de coordenadas para o gráfico com x sendo a raça e y sendo a frequência
ggplot(tabela_estadocivil, aes(x = estado_civil, y = n)) +
# Cria o gráfico de barras
# stat="identity" usa os valores exatos de x = 'n' (frequência)
geom_bar(stat="identity") +
# Inverte os eixos
coord_flip() +
# geom_text() adiciona rótulos (frequência) às barras
# hjust = -0.1: posiciona o texto um pouco à direita das barras horizontais
geom_text(aes(label = n), hjust=-0.5) +
# Adiciona rótulos aos eixos e título do gráfico
labs(x = "Estado Civil",
y = "Número de Respondentes",
title = "Número de Respondentes por Estado Civil") +
# Define um tema minimalista para o gráfico
theme_minimal()
# Exibe o gráfico
grafico_estadocivil_freq
Gráfico de Linha para 1 Série Temporal
Objetivo: Baixar dados reais da ação da Petrobras (PETR4) a partir do dia 2024-01-01 e criar um gráfico de linha usando os pacotes tidyquant
e ggplot2
.
Instruções:
tq_get()
do pacote tidyquant
# A tibble: 6 × 2
date close
<date> <dbl>
1 2024-01-02 37.8
2 2024-01-03 39.0
3 2024-01-04 38.6
4 2024-01-05 38.7
5 2024-01-08 38.4
6 2024-01-09 38.1
# Salva o gráfico em um objeto
grafico_petrobras <-
# mapeia as variáveis para os eixos x e y
ggplot(dados_petrobras, aes(x = date, y = close)) +
# Adiciona um gráfico de linha
geom_line()
# Exibe o gráfico
grafico_petrobras
Melhore o gráfico adicionando:
# Salva o gráfico em um objeto
grafico_petrobras <-
ggplot(dados_petrobras, aes(x = date, y = close)) +
geom_line() +
labs(title = "Evolução do Preço das Ações da Petrobras (PETR4)",
x = "Data",
y = "Preço de Fechamento (R$)",
caption = "Fonte: Yahoo Finance") +
theme_minimal()
# Exibe o gráfico
grafico_petrobras
geom_smooth()
para visualizar a tendência geral. Mude a cor da linha da série para "indianred3"
e aumente a espessura da linha para 1# Salva o gráfico em um objeto
grafico_petrobras <-
ggplot(dados_petrobras, aes(x = date, y = close)) +
geom_line(color = "indianred3", size = 1) +
geom_smooth() +
labs(title = "Evolução do Preço das Ações da Petrobras (PETR4)",
x = "Dia",
y = "Preço de Fechamento (R$)",
caption = "Fonte: Yahoo Finance") +
theme_minimal()
# Exibe o gráfico
grafico_petrobras
Função pivot_wider() do tidyr - Exercício 3
A função pivot_wider()
transforma dados do formato longo para o formato largo (wide),.
Por que precisamos transformar?
Para estimar a correlação entre as séries de preços de duas ações, precisamos que cada série de preços seja uma coluna separada, com as datas alinhadas, entretanto, a função tq_get() retorna os dados no formato longo, onde cada linha representa um preço de uma ação em uma data específica, ou seja, as séries de preços estão empilhadas verticalmente.
Formato Longo (estrutura retornada pela função tq_get()
):
dados_longo <-
tibble(
empresa = c("PETR4.SA", "PETR4.SA", "ITUB4.SA", "ITUB4.SA"),
data = as.Date(c("2024-01-02", "2024-01-03", "2024-01-02", "2024-01-03")),
preco = c(35.50, 36.20, 28.30, 28.75)
)
dados_longo
# A tibble: 4 × 3
empresa data preco
<chr> <date> <dbl>
1 PETR4.SA 2024-01-02 35.5
2 PETR4.SA 2024-01-03 36.2
3 ITUB4.SA 2024-01-02 28.3
4 ITUB4.SA 2024-01-03 28.8
Formato Largo (necessário para análise de correlação):
dados_largo <-
tibble(
data = as.Date(c("2024-01-02", "2024-01-03")),
PETR4.SA = c(35.50, 36.20),
ITUB4.SA = c(28.30, 28.75)
)
dados_largo
# A tibble: 2 × 3
data PETR4.SA ITUB4.SA
<date> <dbl> <dbl>
1 2024-01-02 35.5 28.3
2 2024-01-03 36.2 28.8
Sintaxe:
Gráfico de Dispersão com Análise de Correlação
Objetivo: Baixar dados reais das ações da Petrobras (PETR4) e do Itaú (ITUB4) a partir do dia 2024-01-01, calcular a correlação entre elas e criar um gráfico de dispersão usando os pacotes tidyquant
, effectsize
e ggplot2
.
Instruções:
tq_get()
do pacote tidyquant
# Solução robusta e simples para baixar múltiplas séries
dados_acoes <- c("PETR4.SA", "ITUB4.SA") %>%
tq_get(from = "2024-01-01") %>%
select(symbol, date, close) %>%
rename(
empresa = symbol,
data = date,
preco = close
)
# Exibe as primeiras linhas do dataframe
head(dados_acoes)
# A tibble: 6 × 3
empresa data preco
<chr> <date> <dbl>
1 PETR4.SA 2024-01-02 37.8
2 PETR4.SA 2024-01-03 39.0
3 PETR4.SA 2024-01-04 38.6
4 PETR4.SA 2024-01-05 38.7
5 PETR4.SA 2024-01-08 38.4
6 PETR4.SA 2024-01-09 38.1
pivot_wider()
:dados_correlacao <- dados_acoes %>%
pivot_wider(names_from = empresa, values_from = preco) %>%
rename(petrobras = "PETR4.SA", itau = "ITUB4.SA")
# Exibe os dados transformados
head(dados_correlacao)
# A tibble: 6 × 3
data petrobras itau
<date> <dbl> <dbl>
1 2024-01-02 37.8 30.5
2 2024-01-03 39.0 30.1
3 2024-01-04 38.6 29.9
4 2024-01-05 38.7 30.6
5 2024-01-08 38.4 30.3
6 2024-01-09 38.1 30.3
[1] -0.596
[1] "large"
(Rules: cohen1988)
# Salva o gráfico em um objeto
grafico_dispersao <-
ggplot(dados_correlacao, aes(x = petrobras, y = itau)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Correlação entre Petrobras e Itaú",
subtitle = "Período de 2024-01-01 até hoje",
x = "Preço Petrobras (R$)",
y = "Preço Itaú (R$)",
caption = "Fonte: Yahoo Finance") +
theme_minimal()
# Exibe o gráfico
grafico_dispersao
Instruções
Prof. Washington Silva - Introdução à Ciência de Dados