Análise de Dados Financeiros e Econômicos com o R
EA-UFRGS
01/10/2026
Ao final desta aula, você será capaz de:
ggplot2 a partir da lógica de camadas.ggsave().Visualização de dados é a arte de transformar medidas em padrões visuais.
Nota-se os seguintes pontos e decisões dos autores:
Todos os diferentes investimentos – dólar, ações, dívida pública americana — começam com um dólar.
O melhor investimento, ações, possui uma linha mais forte no gráfico.
A escala do eixo vertical é não-linear.
O valor final do investimento é apresentado numericamente na direita do gráfico.
A tabela no lado esquerdo superior do gráfico mostra o retorno anualizado de cada investimento
Estimates of DiD Model
Evolution of PQ scholarships
Safe withdraw rates
AI usage by Field
A razão principal da análise de dados é a comunicação de ideias.
Princípios de visualização
Independência do elemento gráfico: Todas informações técnicas, como origem e período de dados, devem ser claramente indicadas no título, subtítulo ou legenda do gráfico.
Transmissão de informação: Use cores, formas, tamanho e transparência para distinguir efeitos e adjetivos (bom/ruim, lucro/prejuízo) dentro dos dados.
Manipulação da atenção: Use e abuse de formas visuais de chamar a atenção. O melhor gráfico é aquele que não precisa ser explicado.
Herança e reprodutibilidade: Ao escrever um código de criação de figuras, busque que o mesmo seja facilmente reproduzível no futuro.
Gráfico de exemplo para a inflação Brasileira
Gráfico melhorado para a inflação Brasileira
Versão original (esquerda) e versão melhorada (direita)
Comparando a primeira com a segunda versão, vemos as seguintes diferenças:
Elementos textuais – o título e o subtítulo já indicam o que estamos analisando no gráfico e qual a mensagem.
Elementos gráficos – uso de cores para distinguir os períodos de alta inflação dos períodos de baixa, reforçando e salientando a variação da inflação entre os meses.
Reprodutibilidade. Depois do código montado, uma mudança nos dados não exige mudança no código pois todos os elementos são baseados nos dados de entrada.
Veja mais exemplos no r/dataisugly.
O pacote ggplot2 (Wickham et al. 2023) é a principal ferramenta de visualização de dados do R.
Criado por Hadley Wickham e Winston Chang, ambos cientistas de dados da empresa Posit (anteriormente chamada de RStudio).
Usado por diferentes mídias profissionais (BBC, NY Times, ..) para criar gráficos
Utiliza uma abordagem voltada a sobreposição de camadas, a chamada “Gramática de Gráficos” (Grammar of Graphics)
Exemplo BBC
ggplot2Todo gráfico do ggplot2 é montado pela combinação de poucos componentes:
data): o dataframe de origem;aes): o mapeamento de variáveis para canais visuais (x, y, cor, tamanho…);geom_*): como os dados aparecem (linhas, pontos, barras…);scale_*): como os valores viram posições, cores e tamanhos;facet_*): a divisão em subgráficos;theme_*): os elementos que não representam dados (fontes, fundos, bordas).ggplot2A primeira camada do gráfico é dada pelo comando ggplot2::ggplot() :
Com a primeira camada definida, usamos variáveis de datas do R na adição dos elementos textuais do gráfico com o comando ggplot2::labs() :
min_year <- lubridate::year(min(df_yf$ref_date))
max_year <- lubridate::year(max(df_yf$ref_date))
today <- format(Sys.Date(), "%d/%m/%Y")
this_title <- stringr::str_glue(
"Preços da Petrobrás ({min_year} - {max_year})"
)
this_subtitle <- "Preços ajustados a eventos corporativos"
this_caption <- stringr::str_glue(
"Dados obtidos do Yahoo Finance em {today}"
)
p1 <- p0 +
labs(title = this_title,
subtitle = this_subtitle,
x = "Datas",
y = "Preços",
caption = this_caption
)
print(p1)Agora, adicionamos o miolo do gráfico – componente gráfico – como um canal de linha.
Adicionalmente, além da camada de linhas, podemos também inserir uma camada com pontos e mudar o tema do gráfico:
O resultado das adições das camadas:
Primeiro, vamos carregar os dados financeiros de índices do mercado Brasileiro e internacional, e verificar o formato do dataframe:
Rows: 264
Columns: 11
$ ticker <chr> "^BVSP", "^BVSP", "^BVSP", "^BVSP", "^BVSP", "^…
$ ref_date <date> 2015-01-02, 2015-02-02, 2015-03-02, 2015-04-01…
$ volume <dbl> 77719800, 65310100, 79890000, 81114600, 6784570…
$ price_open <dbl> 47759, 51760, 51243, 55312, 53974, 53014, 49897…
$ price_high <dbl> 50281, 52457, 52319, 56965, 58575, 54361, 53456…
$ price_low <dbl> 46484, 46760, 47905, 51186, 52760, 52548, 48624…
$ price_close <dbl> 46908, 51583, 51150, 56229, 52760, 53081, 50865…
$ price_adjusted <dbl> 46908, 51583, 51150, 56229, 52760, 53081, 50865…
$ ret_adjusted_prices <dbl> NA, 0.099663170, -0.008394238, 0.099296188, -0.…
$ ret_closing_prices <dbl> NA, 0.099663170, -0.008394238, 0.099296188, -0.…
$ cumret_adjusted_prices <dbl> 1.0000000, 1.0996632, 1.0904323, 1.1987081, 1.1…
Em seguida, vamos criar a primeira camada do gráfico do ggplot2 e adicionar a camada de linhas, definindo também que os tipos de linhas que devem ser diferentes para cada índice (color = "ticker").
Alternativamente, poderíamos usar os tipos de linhas como diferenciador de índices:
A melhor forma de lidar com cores no ggplot2 é através de uma paleta temática de cores pré-estabelecidas.
O grande benefício é poder, em uma linha de código, adicionar um efeito de cor que automaticamente se adapte aos dados.
sequenciais: paletas que indicam diferentes intensidades, podendo se utilizar de tom único ou múltiplo;
divergentes: paletas que realçam a diferença entre extremos dos dados, tal como máximo e mínimo;
qualitativas: paletas para diferenciar grupos nos dados.
Paletas de cores disponíveis em colorspace
Explore as paletas disponíveis com
colorspace::hcl_palettes(plot = TRUE)e aplique ao gráfico de índices uma paleta sequencial diferente de'Grays'.
colorspace::scale_color_continuous_sequential().Cerca de 8% dos homens têm algum grau de daltonismo.
Nunca dependa apenas da cor para transmitir informação: combine com formas, tipos de linha ou rótulos.
Prefira paletas seguras para daltonismo, como as da família viridis ou as geradas pelo colorspace.
Exemplo de paleta segura para daltonismo
Temas do ggplot2 são nada mais que configurações pré-definidas que podem ser aplicadas a qualquer gráfico.
Os temas controlam tudo que for editável no gráfico, incluindo:
Facetas são subgráficos criados pela divisão dos dados em grupos
facet_wrap(), podemos dividir os dados em duas dimensões com facet_grid().df_yf_filtered <- df_yf |>
mutate(year = lubridate::year(ref_date)) |>
filter(year >= 2020)
p <- ggplot(df_yf_filtered,
aes(x = ref_date,
y = cumret_adjusted_prices,
color = ticker)) +
geom_line() +
labs(title = "Desempenho de ações") +
theme_light() +
facet_grid(rows = vars(country),
cols = vars(year))
pExistem três formatos comumente utilizados
A sugestão é para focos em arquivos .png!
Sugiro colocar o texto fig no início do arquivo de figura, tal como em fig-Ibovespa.png.
Controle o tamanho físico da figura com width, height e units ("in", "cm", "mm").
Controle a resolução com dpi (300 é um bom padrão para impressão).
Para relatórios e artigos, prefira formatos vetoriais (pdf/svg), que não perdem qualidade ao serem ampliados.
No ggplot2 , salvamos figura com o comando ggplot2::ggsave() :
ggplot2 constrói figuras por camadas: dados + estéticas + geometrias + escalas + facetas + temas.ggsave() exporta a figura com controle de tamanho e resolução.ggplot2.A numeração das tarefas é independente da numeração das aulas. O gabarito desta tarefa está no arquivo
quarto-tarefa-04.qmd.
01 - O grupo LatinoMetrics produz e distribui um conteúdo muito interessante de visualização de dados econômicos para a América Latina. Observando o material do Instagram, visualize as seis últimas imagens disponibilizadas na página principal. Observando as figuras como um todo, destaque os elementos comuns na criação das imagens. Isto é, destaque os elementos visuais que foram repetidos entre uma figura e outra.
02 - No Reddit é possível encontrar o grupo r/dataisugly, o qual contém inúmeros posts sobre visualizações de dados realizadas da forma errada. Na data de 27/09/2022 foi publicada a seguinte mensagem no fórum. Analise o gráfico e, sem buscar a resposta no fórum, indique qual o problema com o gráfico.
03 - Em 22/09/2022, o grupo LatinoMetrics publicou uma visualização de dados a respeito da impressão de confiança da população brasileira em relação às diferentes mídias jornalísticas. O conteúdo pode ser acessado no Instagram. Observando a figura, destaque os elementos textuais e gráficos utilizados pelo autor.
04 - Statspanda é outro grupo especializado em produção de conteúdo relacionado a visualização de dados, porém com assuntos muito mais abrangentes que o LatinoMetrics. Em 17/09/2022, o grupo publicou a seguinte figura no Instagram. Neste caso, quais foram os elementos gráficos utilizados pelo autor e como os mesmos se associam a mensagem da figura.
05 - No Reddit/dataisbeautiful é possível encontrar a visualização da receita de todos os filmes da franchise Star Wars. Apesar de ser esteticamente interessante, o mesmo poderia ser melhorado. Com base no que aprendeu neste capítulo do livro, analise o gráfico e faça recomendações para sua melhoria buscando sempre maior claridade e simplicidade.
06 - Em um novo script do R, crie um vetor de valores aleatórios da distribuição Normal com o comando rnorm(N), onde N é igual a 100. Agora, crie um gráfico de pontos onde o eixo y é representado pela série anterior, e o eixo x é simplesmente a contagem dos valores (1..100). Para este gráfico, utilize o template básico do ggplot2, isto é, não precisas modificar nenhum elemento textual do gráfico, por enquanto.
07 - Para o gráfico anterior, adicione os seguintes elementos textuais e gráficos:
theme_light08 - Para o mesmo gráfico anterior, adicione uma nova coluna chamada type no dataframe, a qual pode tomar o valor “A” ou “B”. Para isto, podes usar o comando sample(c("A", "B"), size = N, replace = TRUE). Note que o valor de N foi definido anteriormente. Com base no novo dataframe, crie um gráfico de linhas com cores diferentes para cada valor em type.
09 - Para o mesmo gráfico anterior, adicione uma camada de linhas no gráfico.
10 - Com base na função yfR::yf_collection_get, baixe os dados de preços de ações para a composição atual do índice Ibovespa, com início a cinco anos atrás e término como sendo a data atual. Com base nos dados importados, siga os seguintes passos:
scale_y_continuous(labels = scales::percent);theme_light;~).ADFER - UFRGS