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