Marcus Nunes, professor do Departamento de Estatística da UFRN
Big Data
Visualização de dados
Curso em duas partes
Hoje: introdução ao ggplot2
e ao dplyr
Ideias básicas, mudança de paradigma e exemplos
Amanhã: aula prática
Análise de dados de gastos de deputados federais
O material deste curso está disponível em um pacote no R
Este pacote poder ser instalado com os comandos
para acessá-lo dentro da sua instalação do R
ou do RStudio
ggplot2
é um pacote de visualização de dados
Foi criado por Hadley Wickham em 2007, baseado no livro Grammar of Graphics, de Leland Wilkinson
A ideia principal é criar gráficos como se eles fossem frases de uma língua, onde cada elemento do gráfico é uma palavra
Isto nos permite construir gráficos tão complexos quanto quisermos
Os gráficos criados com esta ferramenta são, em geral, mais bonitos do que os gráficos tradicionais do R
Entretanto, esta versatilidade tem dois custos associados:
A curva de aprendizagem do ggplot2
é um pouco maior do que das funções gráficas tradicionais do R
(por exemplo, plot
, boxplot
e hist
)
É uma ferramenta um pouco mais lenta para exibir os resultados dos gráficos criados
Por exemplo, veja o gráfico do próximo slide
Este gráfico foi criado com ggplot2
, utilizando poucas linhas de código
Como seria possível criá-lo utilizando as ferramentas tradicionais do R
?
O ggplot2
exige que os dados a serem plotados estejam em um data frame
Não é possível plotar diretamente os dados presentes em uma matriz ou um vetor
Sempre teremos que transformar os dados para data frame ou construir um data frame com os dados que possuímos
Cada gráfico é formado por sete camadas: dados, estética, geometria, facets, estatística, coordenadas e tema
As três primeiras são fundamentais: todo gráfico vai possuí-las
dados: consistem na camada base; a partir dos dados que pensaremos quais variáveis serão trabalhadas
estética: consiste nas variáveis selecionadas para plotagem, agrupamento, coloração etc.
geometria: camada onde definimos as formas dos elementos gráficos, tais como pontos, linhas e e intervalos
As quatro seguintes são opcionais: elas permitem que personalizemos nossas visualizações
facets: útil quando desejamos dividir informações do gráfico para uma melhor visualização, podendo ser utilizada para comparações de grupos
estatística: é a camada que representa a análise dos dados, caso eles sejam transformados
coordenadas: informa onde o gráfico será construído, se em coordenadas cartesianas ou polares, por exemplo
tema: é a última camada, referente à visualização geral do gráfico
Trabalharemos com o conjunto de dados sleepstudy
Originalmente, este conjunto de dados faz parte do pacote lme4
Carregue este arquivo na memória do R
através do comando
str(sleepstudy)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 180 obs. of 3 variables:
#> $ Reaction: num 250 259 251 321 357 ...
#> $ Days : num 0 1 2 3 4 5 6 7 8 9 ...
#> $ Subject : Factor w/ 18 levels "308","309","310",..: 1 1 1 1 1 1 1 1 1 1 ...
head(sleepstudy)
#> # A tibble: 6 x 3
#> Reaction Days Subject
#> <dbl> <dbl> <fct>
#> 1 250. 0 308
#> 2 259. 1 308
#> 3 251. 2 308
#> 4 321. 3 308
#> 5 357. 4 308
#> 6 415. 5 308
Este conjunto de dados reporta o tempo médio de reação (Reaction
) de 18 voluntários após um certo número de dias (Days
) em que eles dormiram 3 horas por noite
Queremos fazer a análise exploratória deste conjunto de dados
O objetivo ao final é que consigamos entender como construir o gráfico que vimos alguns slides atrás
O comando principal a ser utilizado se chama ggplot
Através dele vamos definir qual é a variável preditora e qual é a variável resposta em nosso conjunto de dados
O comando básico a partir do qual vamos gerar todos os gráficos é
O pacote dplyr
é utilizado para manipular dados
Foi lançado por Hadley Wickham, Romain François, Lionel Henry e Kirill Müller em 2014
Segue as ideias principais do ggplot2
: criar uma gramática de análise de dados, como se comandos fossem verbos e frases pudessem ser construídas a partir deles
Isto nos permite manipular dados para extrairmos informações tão complexas quanto quisermos
O código utilizado para fazer estas manipulações é, em geral, mais limpo e enxuto do que os códigos tradicionais do R
Código mais limpo é mais fácil de ser auditado por outras pessoas e por nós mesmos no futuro, quando tivermos que procurar bugs
O dplyr
possui algumas funções bastante simples
Entretanto, quando combinadas, elas produzem uma infinidade de resultados diferentes
filter
: selecionas casos baseados em seus valores (linhas)summarise
: resume múltiplos valores a apenas umarrange
: muda a ordem das linhasmutate
: cria novas variáveis em função de outras já existentesVamos ver como utilizar as funções select
e filter
O funcionamento básico delas nos ajudará a entender como utilizar as demais funções do pacote
Vamos utilizar o conjunto de dados gapminder
para aprender a utilizar o dplyr
data(gapminder)
str(gapminder)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 3313 obs. of 6 variables:
#> $ pais : Factor w/ 187 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
#> $ continente : Factor w/ 6 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
#> $ ano : int 1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
#> $ expVida : num 28.8 30.3 32 34 36.1 ...
#> $ pop : int 8425333 9240934 10267083 11537966 13079460 14880372 12881816 13867957 16317921 22227415 ...
#> $ pibPerCapita: num 779 821 853 836 740 ...
select(gapminder, pais, pibPerCapita)
#> # A tibble: 3,313 x 2
#> pais pibPerCapita
#> <fct> <dbl>
#> 1 Afghanistan 779.
#> 2 Afghanistan 821.
#> 3 Afghanistan 853.
#> 4 Afghanistan 836.
#> 5 Afghanistan 740.
#> 6 Afghanistan 786.
#> 7 Afghanistan 978.
#> 8 Afghanistan 852.
#> 9 Afghanistan 649.
#> 10 Afghanistan 635.
#> # ... with 3,303 more rows
filter(gapminder, pibPerCapita > 10000)
#> # A tibble: 1,409 x 6
#> pais continente ano expVida pop pibPerCapita
#> <fct> <fct> <int> <dbl> <int> <dbl>
#> 1 Argentina Americas 1977 68.5 26983828 10079.
#> 2 Argentina Americas 1997 73.3 36203463 10967.
#> 3 Argentina Americas 2007 75.3 40301927 12779.
#> 4 Aruba Americas 1982 74.1 61569 10875.
#> 5 Aruba Americas 1987 74.5 65415 17674.
#> 6 Aruba Americas 1992 74.1 67174 25121.
#> 7 Aruba Americas 1997 73.0 68341 26484.
#> 8 Aruba Americas 2002 73.5 70441 26468.
#> 9 Aruba Americas 2007 74.2 72194 27231.
#> 10 Australia Oceania 1950 69.0 8267337 10031.
#> # ... with 1,399 more rows
filter(gapminder, pais=="Brazil")
#> # A tibble: 12 x 6
#> pais continente ano expVida pop pibPerCapita
#> <fct> <fct> <int> <dbl> <int> <dbl>
#> 1 Brazil Americas 1952 50.9 56602560 2109.
#> 2 Brazil Americas 1957 53.3 65551171 2487.
#> 3 Brazil Americas 1962 55.7 76039390 3337.
#> 4 Brazil Americas 1967 57.6 88049823 3430.
#> 5 Brazil Americas 1972 59.5 100840058 4986.
#> 6 Brazil Americas 1977 61.5 114313951 6660.
#> 7 Brazil Americas 1982 63.3 128962939 7031.
#> 8 Brazil Americas 1987 65.2 142938076 7807.
#> 9 Brazil Americas 1992 67.1 155975974 6950.
#> 10 Brazil Americas 1997 69.4 168546719 7958.
#> 11 Brazil Americas 2002 71.0 179914212 8131.
#> 12 Brazil Americas 2007 72.4 190010647 9066.
Embora os comandos isolados já sejam bastante úteis, o verdadeiro poder deles surge quando os combinamos
Utilizamos o comando %>%
, chamado de pipe, para isto
Este comando serve para concatenar duas ou mais operações no dplyr
Brazil
e obter apenas as colunas ano
e pibPerCapita
, fazemos o seguinte:gapminder %>%
filter(pais=="Brazil") %>%
select(ano, pibPerCapita)
#> # A tibble: 12 x 2
#> ano pibPerCapita
#> <int> <dbl>
#> 1 1952 2109.
#> 2 1957 2487.
#> 3 1962 3337.
#> 4 1967 3430.
#> 5 1972 4986.
#> 6 1977 6660.
#> 7 1982 7031.
#> 8 1987 7807.
#> 9 1992 6950.
#> 10 1997 7958.
#> 11 2002 8131.
#> 12 2007 9066.
gapminder %>%
filter(pais=="Brazil") %>%
select(ano, pibPerCapita) %>%
print(n=Inf)
#> # A tibble: 12 x 2
#> ano pibPerCapita
#> <int> <dbl>
#> 1 1952 2109.
#> 2 1957 2487.
#> 3 1962 3337.
#> 4 1967 3430.
#> 5 1972 4986.
#> 6 1977 6660.
#> 7 1982 7031.
#> 8 1987 7807.
#> 9 1992 6950.
#> 10 1997 7958.
#> 11 2002 8131.
#> 12 2007 9066.
A função group_by
permite agrupar observações similares
Utilizada em conjunto com summarise_all
, podemos calcular estatísticas sobre grupos
Por exemplo, se desejarmos calcular a média de cada variável por continente:
gapminder %>%
group_by(continente) %>%
na.omit() %>%
summarise_all(mean)
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> Warning in mean.default(pais): argument is not numeric or logical:
#> returning NA
#> # A tibble: 6 x 6
#> continente pais ano expVida pop pibPerCapita
#> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Africa NA 1979. 49.0 9728850. 2176.
#> 2 Americas NA 1980. 67.1 39416728. 10803.
#> 3 Asia NA 1980. 62.4 95444180. 10074.
#> 4 Europe NA 1979. 72.7 15315944. 16551.
#> 5 FSU NA 1992. 68.8 31793002. 7327.
#> 6 Oceania NA 1982. 69.7 5424172. 14057.
A função summarise
permite que trabalhemos com apenas uma das colunas
Além disso, não é necessário ficar restrito a apenas uma estatística
gapminder %>%
group_by(continente) %>%
summarise(Media=mean(expVida), DesvPad=sd(expVida)) %>%
arrange(Media)
#> # A tibble: 6 x 3
#> continente Media DesvPad
#> <fct> <dbl> <dbl>
#> 1 Africa 49.0 9.24
#> 2 Asia 62.4 11.8
#> 3 Americas 67.1 8.75
#> 4 FSU 68.8 2.35
#> 5 Oceania 69.7 7.15
#> 6 Europe 72.7 4.51
gapminder %>%
group_by(continente) %>%
summarise(Media=mean(expVida), DesvPad=sd(expVida)) %>%
arrange(desc(Media))
#> # A tibble: 6 x 3
#> continente Media DesvPad
#> <fct> <dbl> <dbl>
#> 1 Europe 72.7 4.51
#> 2 Oceania 69.7 7.15
#> 3 FSU 68.8 2.35
#> 4 Americas 67.1 8.75
#> 5 Asia 62.4 11.8
#> 6 Africa 49.0 9.24
Podemos usar a função mutate
para adicionar colunas ao conjunto de dados, realizando operações sobre elas
Por exemplo, suponha que desejamos converter a coluna pibPerCapita
para reais e padronizar as observações de pibPerCapita
apenas para o ano de 2007:
gapminder %>%
filter(ano==2007) %>%
select(pibPerCapita) %>%
mutate(pibPerCapitaReais=pibPerCapita*3.5,
pibPerCapitaPadronizado=scale(pibPerCapita))
#> # A tibble: 183 x 3
#> pibPerCapita pibPerCapitaReais pibPerCapitaPadronizado
#> <dbl> <dbl> <dbl>
#> 1 975. 3411. -0.826
#> 2 5937. 20780. -0.468
#> 3 6223. 21782. -0.447
#> 4 4797. 16790. -0.550
#> 5 12779. 44728. 0.0272
#> 6 4943. 17299. -0.539
#> 7 27231. 95307. 1.07
#> 8 34435. 120524. 1.59
#> 9 36126. 126443. 1.72
#> 10 7709. 26980. -0.339
#> # ... with 173 more rows
Já vimos como preparar alguns dos gráficos mais utilizados na estatística
Já aprendemos como utilizar o dplyr
A partir de agora veremos como sofisticar nossas análises descritivas
Veremos diversos gráficos que combinam e remixam ideias já conhecidas
library(ggExtra)
g <- gapminder %>%
filter(ano==2007) %>%
ggplot(., aes(x=log(pibPerCapita), y=expVida, colour=continente)) +
geom_point(aes(size=pop, alpha=0.25)) +
labs(x="Logaritmo do PIB per capita", y="Expectativa de Vida ao Nascer", colour="continente")
ggMarginal(g, type = "histogram", fill="transparent")
anos <- seq(from=1952, to=2007, by=5)
paises <- c("Argentina", "Bolivia", "Brazil", "Chile", "Colombia", "Equador", "Paraguay", "Peru", "Uruguay", "Venezuela")
gapminder %>%
filter(ano %in% anos) %>%
filter(pais %in% paises) %>%
ggplot(., aes(x=ano, y=expVida, colour=pais)) +
geom_line() +
labs(x="Ano", y="Expectativa de Vida ao Nascer", colour="Países") +
scale_x_continuous(breaks=anos)
anos <- seq(from=1952, to=2007, by=5)
paises <- c("Argentina", "Bolivia", "Brazil", "Chile", "Colombia",
"Equador", "Paraguay", "Peru", "Uruguay", "Venezuela")
gapminder %>%
filter(ano %in% anos) %>%
filter(pais %in% paises) %>%
ggplot(., aes(x=ano, y=expVida, colour=pais)) +
geom_line() +
labs(x="Ano", y="Expectativa de Vida ao Nascer", colour="Países") +
scale_x_continuous(breaks=anos) +
scale_color_brewer(palette="Reds")
anos <- seq(from=1952, to=2007, by=5)
paises <- c("Argentina", "Bolivia", "Brazil", "Chile", "Colombia",
"Equador", "Paraguay", "Peru", "Uruguay", "Venezuela")
gapminder %>%
filter(ano %in% anos) %>%
filter(pais %in% paises) %>%
ggplot(., aes(x=ano, y=expVida, colour=pais)) +
geom_line() +
labs(x="Ano", y="Expectativa de Vida ao Nascer", colour="Países") +
scale_x_continuous(breaks=anos) +
scale_color_brewer(palette="Spectral")
anos <- seq(from=1952, to=2007, by=5)
paises <- c("Argentina", "Bolivia", "Brazil", "Chile", "Colombia",
"Equador", "Paraguay", "Peru", "Uruguay", "Venezuela")
gapminder %>%
filter(ano %in% anos) %>%
filter(pais %in% paises) %>%
ggplot(., aes(x=ano, y=expVida, colour=pais)) +
geom_line() +
labs(x="Ano", y="Expectativa de Vida ao Nascer", colour="Países") +
scale_x_continuous(breaks=anos) +
scale_color_brewer(palette="Spectral") +
theme_bw()
anos <- seq(from=1952, to=2007, by=5)
gapminder %>%
filter(ano %in% anos) %>%
ggplot(., aes(x=continente, y=expVida, fill=continente)) +
geom_violin() +
labs(x="Continente", y="Expectativa de Vida ao Nascer", colour="Continente") +
facet_wrap(~ ano, nrow=3) +
theme(axis.text.x = element_text(angle = 90, vjust=0.5, hjust = 1))
R
através do comandoPara ver a descrição do siginificado de cada coluna deste conjunto de dados, rode
reembolsos
com os gastos entre 2009 e 2017.Encontre o número total de gastos dos deputados da Paraíba neste conjunto de dados utilizando a coluna state
.
Repita o exercício anterior, mas agrupe os resultados por year
.
A coluna congressperson_name
contém o nome dos deputados brasileiros. Descubra quais os 10 deputados da Paraíba que fizeram mais pedidos únicos de reembolso no último mandato (2015 a 2017), sem considerar o valor destes reembolsos.
Utilize a coluna total_net_value
e descubra os deputados da Paraíba que tiveram os maiores valores totais ressarcidos durante o atual mandato (2015 a 2017).
Agrupe os gastos dos deputados do Brasil inteiro por partido (party
). A partir disso, crie um gráfico de linhas mostrando a evolução dos gastos totais por partido entre 2009 e 2017.
Crie um gráfico de barras que exiba as categorias de gasto (subquota_description
) que de acordo o total de reembolsos pedidos em 2017
Dentro da coluna subquota_description
, os gastos dos deputados com refeições são identificados como Congressperson meal
. Encontre os restaurantes (supplier
) com maiores pedidos médios de reembolso feitos pelos deputados da Paraíba durante todo o período disponível.
Repita a análise do item anterior, contando o número de gastos em cada local
Repita a análise anterior, mantendo no resultado final apenas os locais com 10 ou mais reembolsos