Tag

visualização de dados Archives - Análise Macro

Visualizando dados com ggplot2

By | Data Science

Visualização de dados é uma habilidade essencial, seja para quando você quer plotar suas despesas e receitas mensais ou quando é pra gerar um relatório mais apresentável no seu trabalho. E com o pacote {ggplot2} essa tarefa fica mais simples, fácil e escalável. Neste exercício, vamos descobrir um pouco da mecânica por trás do pacote e como usá-lo para gerar seus primeiros gráficos!

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes:


# Carregar pacotes/dependências
library(ggplot2) # CRAN v3.3.5
library(magrittr) # CRAN v2.0.2

Criando gráficos com ggplot2

O {ggplot2} funciona em camadas e, para facilitar o entendimento, pense que ao criar um {ggplot2} você está fazendo uma receita de torta onde você começa adicionando a base, depois a(s) camada(s) do recheio e, por fim, a cobertura. Tanto quanto o resultado final das tortas depende da habilidade da(o) confeiteira(o), o gráfico de {ggplot2} depende do empenho e conhecimento do(a) programador(a). E ambos podem ficar incrivelmente prazerosos aos olhos depois de prontos!

Com isso em mente, vamos a um exemplo criando um gráfico simples de dispersão. Para tal, usaremos o dataset economics, disponível no próprio pacote. Esse conjunto de dados traz informações de indicadores econômicos agregados da economia norte americana (EUA), possuindo como característica o atributo de série temporal.

Abaixo, por conveniência, salvamos os dados em objetos para trabalharmos com eles adiante. Perceba que eles estão disponíveis em dois formatos, wide e long, e é necessário que os dados sejam de classe data.frame/tibble. Primeiro uma inspeção visual nos dados:

# Datasets de exemplo: dados econômicos dos EUA
dados <- ggplot2::economics
dados_long <- ggplot2::economics_long
dados
# # A tibble: 574 x 6
# date pce pop psavert uempmed unemploy
# <date> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1967-07-01 507. 198712 12.6 4.5 2944
# 2 1967-08-01 510. 198911 12.6 4.7 2945
# 3 1967-09-01 516. 199113 11.9 4.6 2958
# 4 1967-10-01 512. 199311 12.9 4.9 3143
# 5 1967-11-01 517. 199498 12.8 4.7 3066
# 6 1967-12-01 525. 199657 11.8 4.8 3018
# 7 1968-01-01 531. 199808 11.7 5.1 2878
# 8 1968-02-01 534. 199920 12.3 4.5 3001
# 9 1968-03-01 544. 200056 11.7 4.1 2877
# 10 1968-04-01 544 200208 12.3 4.6 2709
# # ... with 564 more rows

A camada inicial

Para criar um gráfico do {ggplot2} sempre comece especificando a camada inicial com a função ggplot(). Essa função recebe a entrada de dados a serem plotados e também pode servir para especificar os eixos X e Y:

# Camada inicial
dados %>%
ggplot2::ggplot()

Especificando os eixos

Conforme esperado, a camada inicial (ou seja, a "base" da nossa torta) não tem nada de muito informativo ou que dê uma pista sobre o que a imagem/gráfico se trata. Sendo assim, devemos adicionar a próxima camada: especificar os eixos X e Y - procedimento as vezes referido como "estética do gráfico" - usando a função aes(). Para adicionar novas camadas use, ao final da linha, o símbolo de adição (+).

Usaremos como exemplo as variáveis unemploy e psavert do dataset, que representam o número de desempregados em milhares e a taxa de poupança pessoal, respectivamente:

# Camada inicial e (+) estética dos eixos
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert)

Inserindo as observações

Agora já há uma informação de escala das variáveis tomando forma em ambos os eixos. O que está faltando são as observações dos dados. Para inseri-las há múltiplas possibilidades (família de funções geom_*()), mas o exercício proposto é criar um gráfico de dispersão, portanto devemos usar a função geom_point() adicionando nova camada.

# Gráfico de dispersão (obsevações)
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point()

Este é o exemplo mais simples de um gráfico de {ggplot2}, porém serve para entender o fluxo de trabalho com o pacote. A partir daqui, podemos adicionar mais camadas, títulos, definir tema, enfeitar e personalizar o gráfico para torná-lo mais apresentável. Vamos focar nisso agora!

Adicionando mais camadas

Para adicionar mais camadas referentes às observações de dados devemos usar uma das funções geom_*(). Vamos supor que o gráfico de dispersão criado acima não tenha dado uma visão clara sobre a relação entre as variáveis. Neste caso, convém adicionar uma linha de regressão entre as variáveis. A função geom_smooth() serve para este propósito, havendo algumas opções de método que podem ser especificadas (consulte a documentação):

# Gráfico de dispersão + linha de regressão entre variáveis
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point() +
ggplot2::geom_smooth(method = "lm")

Adicionando tema e títulos

Com os dados plotados e camadas definidas, chegou o momento de ir um pouco além e "enfeitar a torta", deixando o resultado final mais atrativo aos olhos. Nesta etapa a criatividade, a curiosidade e olhar analítico fazem diferença, mas no exemplo abaixo vamos simplificar e usar um tema gráfico padronizado, disponibilizado pelo próprio {ggplot2} (família de funções theme_*()). Por fim, adicionamos título, subtítulo, títulos dos eixos X e Y e legenda do gráfico usando a função labs(). Simples, não?

# Adicionando tema padronizado e títulos
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point() +
ggplot2::geom_smooth() +
ggplot2::theme_light() +
ggplot2::labs(
title = "Relação entre Taxa de poupança e Nº de desempregados",
subtitle = "Dados de 1967 a 2015",
x = "Nº de desempregados (milhares)",
y = "Taxa de poupança pessoal",
caption = "Fonte: FRED"
)

Gráfico de linha

Vamos agora explorar um pouco mais do {ggplot2}: os gráficos de linha. Você pode criar um gráfico de linha com os seus dados, geralmente se for uma série temporal, usando a função geom_line().  No exemplo abaixo, plotamos a população total em milhares dos EUA (variável pop):

# Gráfico de linha
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = pop) +
ggplot2::geom_line()

Gráfico de múltiplas linhas

Se você quer criar um gráfico com mais de uma linha, também é muito fácil: dê preferência por usar dados em formato long e especifique, no argumento color da camada da estética, o nome da coluna que identifica cada linha no gráfico (variáveis). Por exemplo:

# Gráfico de múltiplas linhas
dados_long %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = value, color = variable) +
ggplot2::geom_line()

Matriz de gráficos de linhas lado a lado

Perceba que o gráfico de múltiplas linhas anterior dificultou a visualização por questão de escala das variáveis. Neste caso, convém separar cada linha em um gráfico, gerando vários gráficos organizados lado a lado. Isso pode ser feito pela função facet_wrap(), especificando a coluna com os "níveis" de separação dos gráficos e, opcionalmente, o comportamento de escala do eixo Y:

# Matriz de gráficos de linhas lado a lado
dados_long %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = value, color = variable) +
ggplot2::geom_line() +
ggplot2::facet_wrap(facets = ~variable, scales = "free_y")

Referências

Espero que estes simples exemplos tenham aguçado seu interesse por visualização de dados usando o {ggplot2}, pois este é um framework fantástico para apresentar dados. Veja abaixo algumas visualizações criadas com o {ggplot2} publicadas no blog da Análise Macro:

Posts dos gráficos:

E para se aprofundar, conheça o nosso Curso Gráficos com ggplot2.

Construindo belos gráficos com o pacote ggplot2

By | Hackeando o R

Nos últimos anos, o R se tornou bastante popular no Brasil. Com uma sintaxe simples, download fácil e gratuito, uma comunidade pujante e crescente, uma IDE bastante poderosa e inúmeros pacotes disponíveis para lidar com análise de dados, o R tem conquistado cada vez mais adeptos no país.

Uma das coisas que o R faz bem, diga-se, é auxiliar no trabalho de visualização de dados. Algo que exploraremos bastante no nosso novíssimo curso de Introdução ao R para Análise de Dados. Com o pacote ggplot2, um dos mais poderosos da linguagem para isso, é possível construir belos gráficos. Para ilustrar, vamos considerar aqui um tema que está em bastante evidência no Brasil: a reforma do sistema previdenciário.

Para introduzir a questão, podemos nos perguntar se o Brasil gasta muito com previdência em relação à sua população idosa. Para isso, precisamos comparar o Brasil com outros países, não é mesmo?

A ideia aqui, então, é construir um gráfico de correlação entre a variável gasto com previdência e a variável população idosa para países selecionados. 

Para iniciar a produção do nosso gráfico, precisamos de dados. Para esse exemplo, eu vou utilizar os dados compilados pela revista The Economist em diversas fontes, como OCDE, Banco Mundial e a nossa Previdência Social. Você pode fazer o download dos dados aqui. De posse desses dados, podemos importá-los para o R com o código abaixo.


data = read.csv2('Economist_pensions.csv', header=TRUE, sep=',', dec='.')

Se você observar os dados, verá que o nome das colunas não é lá muito intuitivo, bem como existem três linhas no final do arquivo que não nos interessam. Podemos tratar esses problemas com o código abaixo.


data = data[-c(36:38),]
colnames(data) = c('country', 'population', 'pension')

Maravilha. Agora, o nosso arquivo tem três colunas, sendo as duas últimas relacionadas à primeira, que contém os nossos países selecionados. Podemos então começar a produzir o nosso gráfico com o ggplot2 colocando a variável population no eixo x e a variável pension no eixo y. Como estamos interessados em um gráfico de correlação, então o geom que utilizaremos será o geom_point. O código abaixo implementa.


library(ggplot2)
ggplot(data, aes(x=population, y=pension))+
geom_point()

E o resultado...

Conseguimos construir o nosso gráfico de correlação. Mas ele não está lá muito agradável aos olhos, não é mesmo? A primeira pergunta que o leitor deverá se fazer é que dados são essesesses pontos representam o quê, etc. Em outras palavras, o gráfico não traz muita informação para o leitor. De forma a melhorar o nosso gráfico, podemos adicionar o nome dos países nos pontos com o outro geom, o geom_text. O código abaixo implementa.


ggplot(data, aes(x=population, y=pension))+
geom_point()+
geom_text(aes(label=country))

E o resultado...

Bom, agora aparecem os nomes dos países. Então, o leitor saberá que o pontos do gráfico se referem às variáveis pension population para países selecionados. Mas, novamente, o gráfico não é bom porque os nomes ficam uns colados nos outros. Podemos melhorar isso, mudando a função geom_text pela função geom_text_repel do pacote ggrepel, uma espécie de extensão do ggplot2. O código abaixo implementa.


library(ggrepel)
ggplot(data, aes(x=population, y=pension))+
geom_point()+
geom_text_repel(aes(label=country))

E o resultado...

Bem melhor, não é mesmo? Bom, nós chegamos agora a um gráfico razoável. Ele traz os pontos associados às duas variáveis pension population. Para terminar o nosso trabalho, nós podemos polir o nosso gráfico, tornando-o mais informativo para o leitor final. Fazemos isso, adicionando um tema mais interessante, como o tema da própria revista The Economist. Além disso, como estamos interessados em comparar o Brasil com outros países, podemos destacá-lo no gráfico. Também podemos adicionar uma reta de regressão no gráfico, uma vez que parece existir uma correlação positiva entre as nossas variáveis population pension. O código abaixo implementa essas modificações.


library(ggthemes)
ggplot(data, aes(x=population, y=pension))+
geom_point(size=6, colour=ifelse(data$pension>=11.8, '#014d64',
'#76c0c1'),
alpha=ifelse(data$pension>=11.8&data$population<8, 1,.6))+
geom_text_repel(aes(label=country),
colour='black',
alpha=c(.4,1,rep(.4,5)),
box.padding = .2,
point.padding = .3,
data=subset(data, pension>=11.8))+
theme_economist()+
xlab('População acima de 65 anos (% do Total)')+
ylab('Gastos com Previdência Social (% PIB)')+
labs(title='Brasil: uma aberração no gasto previdenciário',
caption='Fonte: OCDE, Banco Mundial e Previdência Social')+
theme(plot.title = element_text(size=15))+
geom_smooth(method='lm', colour='black', linetype='dashed', se=FALSE)

E o resultado...

Bem melhor, não é mesmo? Observe que destacamos o Brasil da nossa amostra. Pelo nosso gráfico, podemos ver que o Brasil apesar de ter uma população idosa ainda baixa, se comparada com os demais países, gasta bastante com previdência. Isso torna o país um outlier, na linguagem dos estatísticos. Isto é, um país afastado dos demais países. Países que gastam tanto ou mais do que o Brasil - os pontos mais escuros do gráfico - têm populações idosas bem maiores. O Japão, por seu turno, tem um gasto similar ao Brasil para uma população idosa três vezes maior!

Gostou? Então dê uma olhada no nosso novíssimo Curso de Introdução ao R para Análise de Dados, onde ensinaremos além da visualização de dados com o pacote ggplot2, também a parte de coleta, tratamento, modelagem e comunicação de resultados. As inscrições para o curso começam no dia 6 de maio, com um 1º lote com 30% de desconto!

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente