O tidyverse é uma coleção de pacotes do R desenhados para Ciência de Dados (Data Science). O objetivo deste curso é introduzir o uso de parte destes pacotes analisando uma base de dados construída com dados da Gapminder Fundation (Gapminder Foundation 2020).
list.of.packages <- c("RCurl", "tidyverse","RColorBrewer", 'readr', 'knitr' , 'readxl', 'scales', 'ggpubr','googledrive')
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
#Carrega os pacotes
library(RCurl) #baixar arquivos
library(tidyverse) #Conjunto de pacotes
library(readr)
library(RColorBrewer) #Create color palletes (colorbrewer2.org)
library(readxl) #
library(knitr)
library(scales)
library(ggpubr)Gapminder é uma fundação independente originária da Suécia sem fins
lucrativos e sem vinculações políticas, religiosas ou econômicas que se
autointitula um repositório de fatos (fact think) e não um
repositório de ideias (think tank). O objetivo dessa fundação é
disponibilizar recursos para o ensino que traduzam fatos mundiais de
forma mais compreensível. A ideia da fundação é trabalhar com dados
estatísticos gerados ou processados por universidades, agências da ONU e
organizações não-governamentais. Recomendo uma visita ao site da instituição que
possui diversas ferramentas para o ensino de dados sobre a economia,
demografia e geografia mundial. Os dados baixados do site foram
processadas e foi gerado o arquivo gapminder.rds disponível
neste link
para download.
#Depois de baixar o arquivo e salvar na pasta do projeto atual
#rode o comando a seguir
gapminder<-readRDS('gapminder.rds')O banco de dados tem um conjunto de 19 variáveis, sendo 12 de identificação dos países e territórios e 7 variáveis socioeconômicas, assim descritas:
geo: unidade territorial que neste banco de dados
(191 estados reconhecidos pela ONU)
name: nome da unidade territorial
four_regions, eight_regions e
six_regions: região do país, considerando a subdivisão em
quatro, oito e seis regiões globais, respectivamente
member_oecd_g77: Países signatários da “Declaração
conjunta dos 77 países em Desenvolvimento” (G-77), membro da OECD ou
outros.
Lat e Long: Centroide (local útil para
títulos e pontos de rotas)
Dt_Member: Data em que o país se tornou membro da
ONU
WB_reg e WB_income2017: classficação
do país no Banco Mundial segundo a região, e nível de
renda.
time: ano a que se refere a informação (de 1800 a
2010)
pop: População passada e projetada (versão ONU
2017)
ipp e GDP: renda per capita e produto
interno bruto
le: Expectativa de vida ao nascer
cm: Probabilidade de morte antes de completar cinco
anos
tfr: taxa de fecundidade total (numero médio de
nascidos vivos por mulher)
co2: emissão de dióxido de carbono pela queima de
combustível fóssil (ton de CO2 por pessoa)
Para maiores informações sobre as fontes dessas informações consulte no site do Gapminder. Para explorar o banco de dados, use os comandos a seguir
str(gapminder) #Apresenta a estrutura do Banco de Dados Gapminder
## tibble [59,297 × 19] (S3: tbl_df/tbl/data.frame)
## $ geo : Factor w/ 197 levels "afg","ago","alb",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ name : Factor w/ 197 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ four_regions : Factor w/ 4 levels "África","Américas",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ eight_regions : Factor w/ 8 levels "África do Norte",..: 5 5 5 5 5 5 5 5 5 5 ...
## $ six_regions : Factor w/ 6 levels "América","Extremo Oriente",..: 5 5 5 5 5 5 5 5 5 5 ...
## $ members_oecd_g77: Factor w/ 3 levels "g77","oecd","others": 1 1 1 1 1 1 1 1 1 1 ...
## $ Lat : num [1:59297] 33 33 33 33 33 33 33 33 33 33 ...
## $ Long : num [1:59297] 66 66 66 66 66 66 66 66 66 66 ...
## $ Dt_UNMember : Date[1:59297], format: "1946-11-19" "1946-11-19" ...
## $ WB_reg : Factor w/ 7 levels "East Asia & Pacific",..: 6 6 6 6 6 6 6 6 6 6 ...
## $ WB_income2017 : Ord.factor w/ 4 levels "Low income"<"Lower middle income"<..: 1 1 1 1 1 1 1 1 1 1 ...
## $ time : num [1:59297] 1800 1801 1802 1803 1804 ...
## $ pop : num [1:59297] 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 ...
## $ ipp : num [1:59297] 603 603 603 603 603 603 603 603 603 603 ...
## $ gdp : num [1:59297] 1.98e+09 1.98e+09 1.98e+09 1.98e+09 1.98e+09 ...
## $ tfr : num [1:59297] 7 7 7 7 7 7 7 7 7 7 ...
## $ le : num [1:59297] 28.2 28.2 28.2 28.2 28.2 ...
## $ cm : num [1:59297] 469 469 469 469 469 ...
## $ co2 : num [1:59297] NA NA NA NA NA NA NA NA NA NA ...head(gapminder) # Exibe as 6 primeiras observações| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1800 | 3280000 | 603 | 1977840000 | 7 | 28.21 | 468.58 | NA |
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1801 | 3280000 | 603 | 1977840000 | 7 | 28.20 | 468.58 | NA |
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1802 | 3280000 | 603 | 1977840000 | 7 | 28.19 | 468.58 | NA |
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1803 | 3280000 | 603 | 1977840000 | 7 | 28.18 | 468.58 | NA |
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1804 | 3280000 | 603 | 1977840000 | 7 | 28.17 | 468.58 | NA |
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33 | 66 | 1946-11-19 | South Asia | Low income | 1805 | 3280000 | 603 | 1977840000 | 7 | 28.16 | 468.58 | NA |
summary(gapminder) # Principais estatísticas descritivas das variáveis
## geo name four_regions
## afg : 301 Afghanistan : 301 África :16254
## ago : 301 Albania : 301 Américas:10535
## alb : 301 Algeria : 301 Asia :17759
## and : 301 Andorra : 301 Europa :14749
## are : 301 Angola : 301
## arg : 301 Antigua and Barbuda: 301
## (Other):57491 (Other) :57491
## eight_regions six_regions
## África Subsaariana:14448 América :10535
## Extremo Oriente : 9632 Extremo Oriente : 9632
## Ásia Ocidental : 8127 Europa Central e Ásia Ocidental:16254
## Europa Ocidental : 7525 Oriente Médio e Norte da África: 6020
## Leste Europeu : 7224 Sul da Ásia : 2408
## América do Norte : 6923 África Subsaariana :14448
## (Other) : 5418
## members_oecd_g77 Lat Long Dt_UNMember
## g77 :39130 Min. :-42.00 Min. :-175.00 Min. :1945-10-24
## oecd : 9030 1st Qu.: 4.00 1st Qu.: -5.50 1st Qu.:1945-12-27
## others:10836 Median : 17.50 Median : 21.75 Median :1960-09-28
## NA's : 301 Mean : 19.15 Mean : 22.95 Mean :1965-09-09
## 3rd Qu.: 40.00 3rd Qu.: 51.52 3rd Qu.:1977-09-20
## Max. : 65.00 Max. : 179.14 Max. :2011-07-14
## NA's :1204
## WB_reg WB_income2017 time
## Europe & Central Asia :15652 Low income : 9331 Min. :1800
## Sub-Saharan Africa :14448 Lower middle income:15652 1st Qu.:1875
## Latin America & Caribbean : 9933 Upper middle income:16555 Median :1950
## East Asia & Pacific : 9632 High income :17458 Mean :1950
## Middle East & North Africa: 6321 NA's : 301 3rd Qu.:2025
## (Other) : 3010 Max. :2100
## NA's : 301
## pop ipp gdp tfr
## Min. :6.450e+02 Min. : 245 Min. :1.016e+06 Min. :0.900
## 1st Qu.:4.253e+05 1st Qu.: 901 1st Qu.:4.880e+08 1st Qu.:2.160
## Median :2.627e+06 Median : 1750 Median :3.405e+09 Median :5.100
## Mean :2.312e+07 Mean : 6486 Mean :1.600e+11 Mean :4.501
## 3rd Qu.:1.082e+07 3rd Qu.: 4855 3rd Qu.:2.918e+10 3rd Qu.:6.380
## Max. :1.651e+09 Max. :179297 Max. :5.046e+13 Max. :8.870
## NA's :12302 NA's :12302 NA's :3311
## le cm co2
## Min. : 1.01 Min. : 0.25 Min. : 0.00
## 1st Qu.:32.30 1st Qu.: 15.67 1st Qu.: 0.19
## Median :48.73 Median :179.09 Median : 0.95
## Mean :53.09 Mean :209.17 Mean : 3.31
## 3rd Qu.:74.25 3rd Qu.:403.44 3rd Qu.: 4.00
## Max. :94.76 Max. :756.29 Max. :247.00
## NA's :3167 NA's :1800 NA's :42415Não faz muito sentido para nós visualizarmos as variáveis descritivas
de todas as variáveis em todas as observações (comando
summary). Pelo comando head é possível notar
que há uma linha para cada ano, referente a cada país (só o Afeganistão
aparece na lista). Embora os dados estejam ali, não sabemos, a princípio
como processa-los e visualiza-los. Por exemplo, queremos saber qual a
população do Brasil, em 2020. Os comandos a seguir fazem esta seleção da
forma tradicional do R (os comandos foram feitos passo a passo para
esclarecer as relações de igualdade).
#LINHA com o nome Brazil
gapminder[gapminder$name=='Brazil'
# E (AND) time = 2020
& gapminder$time==2020
# COLUNA com o nome pop
, names(gapminder)=='pop']| pop |
|---|
| 212559409 |
Ou seja, 212.559.409 habitantes. Mas, vamos combinar que essa
sequencia de comandos é complexa e difícil de entender. Isso posto,
vamos introduzir os pacotes associados ao tidyverse, que
nos fornecem ferramentas inestimáveis para essas operações. e que serão
tratadas nas seções seguinte.
dplyrO pacote dplyr é um pacote construído para manipulação
de dados e usa tipo de gramática para isso de dados. Essa
gramática nos fornece um conjunto de verbos
consistentes para ajudar a resolver os principais desafios da
manipulação de base de dados. A sintaxe dessa gramática é
x %>% verbo onde o x seria o sujeito (um
dataframe - df, por exemplo) e o verbo é um comando no R. O símbolo
%>% é, por convenção chamado de pipe (conector,
em português). Escrever o comando x %>% comando é o
mesmo que escrever comando(x), como ilustrado a seguir:
x<-c(3,6,9,26)
sum(x)
## [1] 44Considerando que o pacote dplyr está carrega, a
sequencia acima pode ser escrita como
x %>% sum()
## [1] 44Ou seja, sempre que quisermos usar um verbo na gramática do
dplyr, nós temos de usar um pipe que quer dizer
que: pegue tudo que está antes de %>% e execute o
comando. Mas, Nenhuma novidade por enquanto. Mas, vamos considerar os
comandos filter e select, dois verbos do
dplyr.
filter e selectPrimeira pergunta: qual a população do Brasil, em 2020? O comando
gapminder %>% filter (time==2020) filtra o banco de
dados gapminder criando um subconjunto de dados contendo
apenas os dados do ano de 2020 . O simbolo == é um comando
lógico de igualdade e é a forma como você pede ao R para selecionar no
banco de dados as linhas cujo time seja exatamente igual a
2020. Ou seja, usamos filter quando estamos
interessados apenas em parte das observações que satisfaçam uma condição
lógica.
== é
diferente do simbolo =.
gapminder %>%
filter(time==2020) %>% # Todos os países em 2020
head() # Exibe apenas a seis primeira observações do dataset| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33.00000 | 66.00000 | 1946-11-19 | South Asia | Low income | 2020 | 38928341 | 1800 | 70068416143 | 4.04 | 64.41 | 58.08 | NA |
| alb | Albania | Europa | Leste Europeu | Europa Central e Ásia Ocidental | others | 41.00000 | 20.00000 | 1955-12-14 | Europe & Central Asia | Upper middle income | 2020 | 2877800 | 13225 | 38059435150 | 1.70 | 78.58 | 8.52 | NA |
| dza | Algeria | África | África do Norte | Oriente Médio e Norte da África | g77 | 28.00000 | 3.00000 | 1962-10-08 | Middle East & North Africa | Upper middle income | 2020 | 43851043 | 14040 | 615652019591 | 2.54 | 78.31 | 22.18 | NA |
| and | Andorra | Europa | Europa Ocidental | Europa Central e Ásia Ocidental | others | 42.50779 | 1.52109 | 1993-07-28 | Europe & Central Asia | High income | 2020 | 77265 | 55047 | 4253206455 | NA | NA | 2.85 | NA |
| ago | Angola | África | África Subsaariana | África Subsaariana | g77 | -12.50000 | 18.50000 | 1976-12-01 | Sub-Saharan Africa | Lower middle income | 2020 | 32866268 | 5444 | 178938060987 | 5.41 | 65.36 | 72.29 | NA |
| atg | Antigua and Barbuda | Américas | América do Norte | América | g77 | 17.05000 | -61.80000 | 1981-11-11 | Latin America & Caribbean | High income | 2020 | 97928 | 25007 | 2448889606 | 2.01 | 77.41 | 6.09 | NA |
Mas, este comando sozinho gera uma no data set de 197 linhas,
começando no Afeganistão e terminando no Zimbabwe. Para selecionarmos o
Brasil é necessário incluir outro filtro após um pipe, no caso,
o comando filter(name=='Brazil')% que filtra tudo que está
antes %>% usando o banco de dados gerado na etapa
anterior como o sujeito da oração da gramática do dplyr, que
são os dados do Brasil para todos os anos.
') ou duplas ("). Já um número
deve ser tratado sem as aspas. 2). O comando head() usado
no fim do algorítimo é usada para que o R exiba apenas as seis primeiras
observações do dataset. Isso evita do sistema ficar ocupado exibindo
textos que, a princípio, possam não nos interessar.
gapminder %>%
filter(time==2020)%>% # Todos os países em 2020
filter(name=='Brazil') # Apenas Brazil| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| bra | Brazil | Américas | América do Sul | América | g77 | -10 | -55 | 1945-10-24 | Latin America & Caribbean | Upper middle income | 2020 | 212559409 | 14501 | 3.082339e+12 | 1.67 | 76.14 | 13.47 | NA |
O resultado agora é uma linha com todos as colunas referentes ao Brasil em 2020.
Mas, como queremos apenas a coluna pop, seria necessário
também filtrar a coluna que nos interessa. Para filtrar uma ou
mais colunas usamos o comando select(coluna1,...) que
seleciona apenas a coluna de nome coluna1 do banco de dados
que está antes do conector (%>%), com a seguir.
gapminder %>%
filter(name=='Brazil')%>%
filter(time==2020) %>%
select(pop)| pop |
|---|
| 212559409 |
O uso de relações condicionais - & (and) e/ou
| (or) - são válidas no comando filter e as condições podem
ser separadas com vírgulas. Já no select exige que as
colunas de interesse sejam listadas e separadas por
vírgulas(,). No exemplo a seguir, filtramos no df
gapminder os EUA e Brasil, em 2020, e selecionamos as
colunas nome do país, população e renda per capita.
gapminder %>%
filter(geo=='usa' | geo=='bra', time==2020)%>%
select(name,pop,ipp)| name | pop | ipp |
|---|---|---|
| Brazil | 212559409 | 14501 |
| United States | 331002647 | 57530 |
A flexibilidade do comando é a principal vantagem do uso do
pipe e do dplyr. Outro exemplo, apresentado a
seguir, calcula a soma da população da América do Sul, em 2020, que são
aproximadamente 430 milhões de habitantes.
gapminder %>%
filter(eight_regions=='América do Sul', time==2020)%>%
select(pop) %>%
sum()
## [1] 430457607table(gapminder$name)
que gera uma tabela de frequência dos nomes. Outra forma é criar um df
apenas com os nome ou outras variáveis de interesse e uma ano específico
(geo<-gapminder %>% filter(time==2020) %>% select(geo, name,eight_regions)).
O df resultante geo tem apenas os códigos, os nomes e as
regiões que cada dos países membros pertencem.
arrangeO verbo arrange organiza um banco de dados em ordem
crescente ou decrescente. Este comando é útil especialmente quando
queremos analisar os valores extremos em um conjunto de dados e é
utilizado como os demais, logo após um pipe. Entre parenteses,
você informa ao R em relação a qual coluna você quer que o banco de
dados seja organizado. Assim como o comando filter e
select, o comando arrange não altera o banco
de dados original, gerando um novo dataset após o comando.
gapminder %>%
arrange(tfr) %>%
head()| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| twn | Taiwan | Asia | Extremo Oriente | Extremo Oriente | others | 24.00000 | 121.0000 | NA | East Asia & Pacific | High income | 2010 | 23187556 | 37253 | 863806023668 | 0.90 | 79.50 | 5.38 | NA |
| hkg | Hong Kong, China | Asia | Extremo Oriente | Extremo Oriente | others | 22.28552 | 114.1577 | NA | East Asia & Pacific | High income | 2003 | 6724687 | 35487 | 238636973975 | 0.95 | 81.11 | 3.51 | NA |
| hkg | Hong Kong, China | Asia | Extremo Oriente | Extremo Oriente | others | 22.28552 | 114.1577 | NA | East Asia & Pacific | High income | 2002 | 6701771 | 34366 | 230315653994 | 0.96 | 80.95 | 3.70 | NA |
| hkg | Hong Kong, China | Asia | Extremo Oriente | Extremo Oriente | others | 22.28552 | 114.1577 | NA | East Asia & Pacific | High income | 2004 | 6744563 | 38274 | 258144105670 | 0.96 | 81.33 | 3.35 | NA |
| hkg | Hong Kong, China | Asia | Extremo Oriente | Extremo Oriente | others | 22.28552 | 114.1577 | NA | East Asia & Pacific | High income | 2001 | 6664775 | 33956 | 226311713379 | 0.97 | 80.72 | 3.91 | NA |
| hkg | Hong Kong, China | Asia | Extremo Oriente | Extremo Oriente | others | 22.28552 | 114.1577 | NA | East Asia & Pacific | High income | 2005 | 6769579 | 40923 | 277031544805 | 0.97 | 81.56 | 3.22 | NA |
Pelo comando acima observamos que o país com a menor Taxa de
Fecundidade Total (TFT ou TFR) observada é em Taiwan, em 2010.
Perceba que por default o arrange organiza na ordem
crescente. Para organiza-lo na ordem decrescente inclua a função
desc(var) dentro dos parenteses do arrange
gapminder %>%
arrange(desc(tfr))%>%
head()| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1985 | 9572170 | 3545 | 33934390401 | 8.87 | 56.55 | 153.72 | 0.904 |
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1984 | 9213078 | 3689 | 33982771809 | 8.86 | 56.02 | 162.42 | 0.779 |
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1986 | 9941102 | 3507 | 34858953744 | 8.86 | 54.57 | 146.40 | 0.832 |
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1983 | 8869363 | 3662 | 32479897914 | 8.85 | 55.38 | 172.41 | 0.714 |
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1982 | 8541605 | 3570 | 30492218183 | 8.83 | 54.11 | 183.53 | 0.696 |
| yem | Yemen | Asia | Ásia Ocidental | Oriente Médio e Norte da África | g77 | 15.5 | 47.5 | 1947-09-30 | Middle East & North Africa | Lower middle income | 1987 | 10322044 | 3529 | 36429522371 | 8.83 | 57.46 | 140.17 | 0.841 |
É possível ver que o Yemem é o país que em 1985 apresentava a maior
TFR de todo o banco. Tawain, por sua vez, em 2010 era o pais com a menor
TFR. Entretanto, os dois bancos de dados, por enquanto, nos dizem muito
pouco: todos os anos aparecem e não é possível ver o valor da TRF. Vamos
supor um exercício mais lógico agora: qual o país com a maior TFR em
2018 e qual o valor desta variável? Para fazer isso é necessário
combinar os verbos que vimos até agora: arrange,
filter e select
gapminder %>%
filter(time==2018)%>%
arrange(tfr)%>%
select(name,tfr, time)%>%
head()| name | tfr | time |
|---|---|---|
| Taiwan | 1.22 | 2018 |
| Moldova | 1.23 | 2018 |
| Portugal | 1.24 | 2018 |
| Singapore | 1.26 | 2018 |
| Poland | 1.29 | 2018 |
| Greece | 1.30 | 2018 |
O país com a maior número de filhos por mulher é Taiwan com 1.22
filhos em média. Para ordenar em ordem decrescente basta acrescentar a
função desc() dentro do comando arrange.
gapminder %>%
filter(time==2018)%>%
arrange(desc(tfr))%>%
select(name,tfr, time)%>%
head()| name | tfr | time |
|---|---|---|
| Niger | 7.13 | 2018 |
| Somalia | 6.08 | 2018 |
| Congo, Dem. Rep. | 5.92 | 2018 |
| Mali | 5.88 | 2018 |
| Chad | 5.75 | 2018 |
| Angola | 5.55 | 2018 |
No outro extremo da tabela, país com a maior número de filhos por mulher, em 2018, é o Níger com 7,13 filhos em média.
mutateO verbo mutate é usado quando desejamos alterar o valor
de uma variável ou criar uma variável nova. Para alterar uma variá o
verbo mutate é acrescentado depois de um pipe .
Dentro dos parenteses construímos uma formula:
var1 = formula. Do lado esquerdo da equação, acrescentamos
a variável a ser alterada (var) e do lado direito a fórmula
que vai gerar a variável.
gapminder %>%
mutate(pop=pop/1000000)%>%
select(name,time,pop)%>%
head()| name | time | pop |
|---|---|---|
| Afghanistan | 1800 | 3.28 |
| Afghanistan | 1801 | 3.28 |
| Afghanistan | 1802 | 3.28 |
| Afghanistan | 1803 | 3.28 |
| Afghanistan | 1804 | 3.28 |
| Afghanistan | 1805 | 3.28 |
A linha de comando mutate(pop=pop/1000) divide a
população de todos os países, em todos os anos, por 1.000.000 e a grava
na variável pop (o símbolo / é o simbolo de divisão). O
resultado é uma tabela com a variável pop em que cada
unidade são milhões de habitantes: em 1800, a população do Afeganistão
era de 3,28 milhões de pessoas. Perceba que a variável pop será
substituída por uma nova variável pop. Obviamente, os comandos
arrange, filter e select podem
ser usados para organizar o banco de dados e facilitar a
visualização.
= é
diferente do simbolo ==. O simbolo = é uma
ordem para que o computador transforme variável que está à esquerda da
equação naquilo que está a direita dessa equação. O simbolo
==, por outra lado, é uma relação de igualdade: pergunta ao
computador se o que está à esquerda da equação é igual ao que está à
direita.
Para criar uma nova variável banta colocarmos o nome que desejarmos no lado esquerdo da equação. Por exemplo, vamos supor que desejamos saber o total emissões de dióxido de carbono por um país. A variável CO2 originalmente refere-se a emissão de dióxido de carbono pela queima de combustível fóssil por pessoa. Não temos a variável que desejamos pronta no banco de dados, que seria o total por. Entretanto, nós temos a população e as toneladas de CO2 por pessoa: para calcularmos o total de emissões basta multiplicar essas duas variáveis.
gapminder %>%
mutate(co2_total=co2*pop)%>%
select(name,time,co2,co2_total)%>%
head()| name | time | co2 | co2_total |
|---|---|---|---|
| Afghanistan | 1800 | NA | NA |
| Afghanistan | 1801 | NA | NA |
| Afghanistan | 1802 | NA | NA |
| Afghanistan | 1803 | NA | NA |
| Afghanistan | 1804 | NA | NA |
| Afghanistan | 1805 | NA | NA |
Obviamente não há emissões de gases provenientes da queima de combustíveis fosseis em 1800 no Afeganistão e a nova variável nem pode ser visualizada no banco de dados resultante. Para visualizar melhor a tabela vamos conectar verbos e pipes como a seguir.
gapminder %>%
mutate(co2_total=co2*pop)%>%
select(name,time,pop,co2,co2_total) %>%
filter(time==2014)%>%
arrange(desc(co2_total))%>%
head()| name | time | pop | co2 | co2_total |
|---|---|---|---|---|
| China | 2014 | 1399453966 | 7.35 | 10285986650 |
| United States | 2014 | 318673422 | 16.50 | 5258111463 |
| India | 2014 | 1295600768 | 1.73 | 2241389329 |
| Russia | 2014 | 144664837 | 11.80 | 1707045077 |
| Japan | 2014 | 128168630 | 9.47 | 1213756926 |
| Germany | 2014 | 81450370 | 8.84 | 720021271 |
E tabela resultante indica que, em 2014, o país com maior emissão de CO2 é a China com, aproximadamente, 10 bilhões de toneladas, seguido pelos EUA com 5 bilhões. Mas, a população da China é muito maior e, nesse sentido, é válido ordenar o banco de dados de outra forma, para que outras análises podem ser feitas.
gapminder %>%
mutate(co2_total=co2*pop)%>%
select(name,time,pop,co2,co2_total) %>%
filter(time==2014)%>%
arrange(desc(co2))%>%
head()| name | time | pop | co2 | co2_total |
|---|---|---|---|---|
| Qatar | 2014 | 2459202 | 43.9 | 107958968 |
| Trinidad and Tobago | 2014 | 1362337 | 34.0 | 46319458 |
| Kuwait | 2014 | 3690939 | 25.8 | 95226226 |
| Bahrain | 2014 | 1336073 | 23.5 | 31397716 |
| United Arab Emirates | 2014 | 9214182 | 22.9 | 211004768 |
| Brunei | 2014 | 409778 | 22.2 | 9097072 |
Esse novo dataframe indica que, em 2014, o país com maior produção de CO2 per capita é o Qatar, com 44 ton/pessoa, embora sua população seja de apenas 2,5 milhões de pessoas.
ggplot2Anteriormente, nós estudamos como organizar um banco de dados,
filtrando e ordenando os casos para destacar variáveis de interesse.
Nesse seção, a proposta é aprender os conceitos iniciais para
elaborarmos gráficos para visualizar esse mesmo banco de dados por meio
do pacote ggplot2. No gráfico a seguir, por exemplo, são
apresentadas quatro variáveis para o ano de 2018: renda per capita, no
eixo dos x; esperança de vida ao nascer, no eixo dos
y; a região que o país se localiza, identificada pelas cores;
e, a população de cada país, identificada pelo tamanho de cada bolinha (
bubbles). O gráfico demonstra claramente que há uma associação
quase que direta entre a renda per capita e a esperança de vida, ou em
outras palavras, é notório que quanto menor a renda per capita menor a
esperança de vida. A partir da análise das cores também é possível
sugerir que há uma associação geográfica entre a renda per capita, a
esperança de vida e a região do globo onde o país se localiza. Mas,
aparentemente não há qualquer relação entre a renda, a esperança de vida
e a população total. Esse gráfico sozinho já é capaz de nos levar a uma
pergunta: então Malthus estava errado?
Para a construção deste gráfico os dois pacotes trabalham juntos: as
funções do primeiro (dplyr) preparam os dados a serem
exibidos pelo segundo (ggplot2). Por exemplo, pode ser
interesse da pesquisa comparar os países em 1950 e, nesse sentido, seu
banco de dados deverá ser filtrado para 1950 ou, em outras palavras,
devem ser criados subconjuntos de dados ( subsets). No exemplo
a seguir um subconjunto de dados é criado a partir do banco de dados
principal utilizando o operador <-.
gapminder_1950 <- gapminder %>%
filter(time==1950)O comando acima parece não retornar resultados. Mas, na verdade,
salva o subconjunto do dataset gapminder, que foi
filtrado pela sequencia
gapminder %>% filter(time==1950), em um novo dataset
chamado aqui de gapminder_1950. Observe que um novo dataset
gapminder_1950 surge na aba Environment do RStudio. Se você
chamar agora o dataset head(gapminder_1950) no console de
comandos, você verá apenas dados 1950.
head(gapminder_1950)| geo | name | four_regions | eight_regions | six_regions | members_oecd_g77 | Lat | Long | Dt_UNMember | WB_reg | WB_income2017 | time | pop | ipp | gdp | tfr | le | cm | co2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| afg | Afghanistan | Asia | Ásia Ocidental | Sul da Ásia | g77 | 33.00000 | 66.00000 | 1946-11-19 | South Asia | Low income | 1950 | 7752117 | 2392 | 18543063864 | 7.57 | 32.48 | 415.95 | 0.0109 |
| alb | Albania | Europa | Leste Europeu | Europa Central e Ásia Ocidental | others | 41.00000 | 20.00000 | 1955-12-14 | Europe & Central Asia | Upper middle income | 1950 | 1263164 | 1784 | 2253484576 | 5.87 | 54.15 | 280.00 | 0.2350 |
| dza | Algeria | África | África do Norte | Oriente Médio e Norte da África | g77 | 28.00000 | 3.00000 | 1962-10-08 | Middle East & North Africa | Upper middle income | 1950 | 8872250 | 4642 | 41182435132 | 7.49 | 47.25 | 257.50 | 0.4270 |
| and | Andorra | Europa | Europa Ocidental | Europa Central e Ásia Ocidental | others | 42.50779 | 1.52109 | 1993-07-28 | Europe & Central Asia | High income | 1950 | 6198 | 6984 | 43286832 | NA | NA | 76.93 | NA |
| ago | Angola | África | África Subsaariana | África Subsaariana | g77 | -12.50000 | 18.50000 | 1976-12-01 | Sub-Saharan Africa | Lower middle income | 1950 | 4548021 | 3180 | 14462706780 | 7.11 | 35.16 | 331.25 | 0.0411 |
| atg | Antigua and Barbuda | Américas | América do Norte | América | g77 | 17.05000 | -61.80000 | 1981-11-11 | Latin America & Caribbean | High income | 1950 | 45515 | 3474 | 158119110 | 4.45 | 58.53 | 128.34 | NA |
A novidade aqui é o operador <- que, embora pareça
estranho para a maioria dos usuários novatos em linguagens de
computação, ele é um velho conhecido dos programadores e pode ser ser
visualizado como uma seta aprontada da direita para esquerda. É um
comando apontador, que aponta o objeto que está à direita para o objeto
que está a esquerda e ordena: faça que o objeto à esquerda seja
exatamente igual ao o objeto que está à direita. Ou ainda, em uma
linguagem especializada, a expressão x<-y é o mesmo que:
inicialize x como y, ou, x inicializado como y.
Agora é possível fazer um gráfico que relacione a fecundidade nos
países (tfr, ou número médio de filhos por mulher) e a
esperança de vida ao nascer (le). Você pode fazer isso a
partir de um diagrama de dispersão que use o eixo das abcessas (
x) para a tfr e o eixo das ordenadas ( y)
o número médio de filhos.
ggplot(data=gapminder_1950, aes(x=le,y=tfr))+geom_point()Para desenhar este gráfico e comparar a Taxa de Fecundidade Total
(TFR) e a Esperança de Vida ao Nascer (LE) devemos indicar que a TFR
deve estar no eixo y e a LE no eixo x. Adicionalmente temos de informar
ao sistema qual banco de dados vamos utilizar e o tipo de gráfico
devemos desenhar: ou seja, três elementos básicos. Isso será feito por
meio de um gráfico de dispersão ( scater plot ) e aqui este
comando será criado pelo pacote ggplot2. Ele deve ser
carregado no sistema da mesma forma que o pacote dplyr foi
carregado, ou seja: library(ggplot2). A a seguir é
apresentado o código que gera o gráfico apresentado.
ggplot(data=gapminder_1950, aes(x=le,y=tfr))+
geom_point()Obviamente existem outros pacotes e comandos do R que desenham
gráficos muito similares. O comando
plot(x=gapminder_1950$le,y=gapminder_1950$tfr) produz um
resultado muito similar, como pode ser visto a seguir.
plot(gapminder_1950$le,gapminder_1950$tfr)Então, por que usarmos o ggplot? Porque, assim como no
pacote dplyr que usava um tipo gramática para
manipulação de dados, o pacote ggplot2 também usa um tipo
gramática para os gráficos. A sequência dos comandos é composta no
mínimo por três partes: o banco de dados, as variáveis a serem mapeadas
e a geometria. A primeira parte é a indicação da base de dados que serão
usados no gráfico que, neste caso, foi indicado pelo código internamente
ao comando ggplot pelo código
data=gapminder_1950.
A segunda parte refere-se a indicação das variáveis que serão usadas
no gráfico indicado dentro dos parenteses do comando
aes(x=le,y=tfr) que é uma abreviação de aesthetic
. Essa indicação aponta quais e quantas dimensões serão mapeadas (verbo
to map em inglês) em nosso gráfico que, nesse caso, foram
apenas duas dimensões (eixos x e y). Nessa gramática de gráficos são as
variáveis que definem a estética de nosso gráfico, como se
fossem os adjetivos do sujeito da frase que seria o banco de dados
(data=gapminder_1950), mapeando quais características de
nosso banco de dados deverão ser destacadas em nosso gráfico. Nesses
termos, o primeiro comando
(ggplot(data=gapminder_1950, aes(x=le,y=tfr))) define o
sujeito, adjetivado, de nossa oração.
O tipo de gráfico é apresentado pela geometria, ou seja, pelo comando
geom_point() que acrescenta pontos ao gráfico por meio do
sinal +. O comando + geom_point() após
ggplot(data=gapminder_1950, aes(x=le,y=tfr)) passa a
informação de como nosso gráfico deverá ser desenhado ou qual o tipo de
geometria desejamos utilizar. Em outras palavras, no pacote
ggplot2, os comandos iniciados por geom_
indicam qual a forma do gráfico deverá ter ou qual ação nosso
sujeito deverá executar : o verbo. Com os comandos do tipo
geom_ adicionamos camadas ao gráfico ( layer em
inglês, ou vegetal no português de Portugal) que podem ser uma,
como nesse primeiro exemplo, ou várias, como veremos a seguir.
Perceba que o comando
ggplot(data=gapminder_1950, aes(x=le,y=tfr)) não gera
nenhum resultado na janela de gráficos. Nessa gramática, digitar a
apenas o comando ggplot seria o mesmo que apresentar um
sujeito sem o seu verbo: o sujeito isolado não é uma oração
completa.
O gráfico desenhado na seção anterior revelam uma relação interessante entre essas duas variáveis. Em 1950, famílias maiores (6 ou mais filhos por mulher nas ordenadas) apresentavam baixa esperança de vida (entre 30 e 50 anos). A medida que a esperança de vida cresce acima de 50 anos observamos uma queda progressiva do número médio de filhos. De certa forma, em 1950, nota-se que países com famílias grandes tinha mortalidade mais alta. Segundo Rosling (2009), professor sueco, quando ele perguntava ao seus alunos sobre assuntos globais frequentemente ele escutava a divisão do mundo entre ‘nós’ e ‘eles’ que significava nada mais do que uma divisão preconceituosa e preconcebida que se resumia ao mundo ocidental (nós) e o mundo em desenvolvimento (eles). Percebendo o preconceito, ele ia além: mas qual a definição disso? Existe uma definição clara para diferenciar esses dois mundos? Todo mundo sabe qual a diferenciação desses mundos, é óbvio. Mas, uma aluna dele deu uma descrição simples e intrigante: o mundo ocidental tem vida longa e família pequena e o mundo em desenvolvimento tem famílias grandes e vida curta. O gráfico apresenta mostra-nos um mundo assim: separado em um grupo com vida longa e família pequena e um outro separado em famílias pequenas e vida longa. Ou nas palavras de Caldwell and Demografhy (1982) dois regimes distintos: (i) Alta Fecundidade e Alta Mortalidade (países mundo Ocidental); e (ii) Baixa Fecundidade e Baixa Mortalidade (países em desenvolvimento)
Mas, fica o questionamento: tal relação ainda é verdadeira? Sabemos pelos nossos estudos que os países em desenvolvimento também entraram numa tendencia de queda da mortalidade e da fecundidade. Como será que esses gráfico se apresentaria para dados de 2020?
Na seção anterior, nós aprendemos a combinar duas variáveis mapeando-as como elementos estéticos para fazer um gráfico simples de duas dimensões (LE e TFR). Mas, essas não são as únicas variáveis do banco de dados gapminder. Temos ainda os continentes, a população e o período. Será que é possível possível combinar cinco variáveis em um único gráfico? É possível fazer um gráfico de cinco dimensões? Possível é, mas vamos por partes. Para isso, vamos continuar mapeando os esperança de vida no eixo x e a taxa de fecundidade total no eixo y e, progressivamente, vamos acrescentar outros elementos estéticos. Inicialmente vamos trabalhar cor e tamanho, mapeados esteticamente como regiões e população, respectivamente. Dessa forma será possível visualizar quatro variáveis no mesmo gráfico.
A região será mapeada por meio da variável eight_regions
que é uma variável categórica que assume oito valores possíveis: África
do Norte, África Subsaariana, América do Norte, América do Sul, Ásia
Ocidental, Extremo Oriente, Leste Europeu e Europa Ocidental. Uma boa
forma de mapear uma variável categórica e por cores, como pode ser visto
a seguir. Novamente, ainda estamos mapeando dados de 1950 em que a
divisão entre nós e eles era clara e inequívoca. Países da Europa
(púrpura e rosa) e América do Norte (verde) tinham, de fato, famílias
pequenas e vidas longas e os países da África (vermelho e ocre), América
do Sul (verde) e Ásia (azul), com alguma diferenças entre eles, tinham
alta fecundidade e alta mortalidade.
ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions))+
geom_point()Percebam que o comando apenas acrescenta um novo elemento estético ao
gráfico: color=eight_regions. A variável apenas foi mapeada
no comando ggplot. É possível gerar esse mesmo gráfico com
outros comandos do R, mas, nesse caso, é necessário criar um código bem
mais complexo que esse.
As cores são automáticas e podem ser alteradas para outras escalas mais contrastantes (veremos mais tarde). Ou, se estivermos imaginando uma publicação em P&B, podemos utilizar o elemento estático shape (forma). No gráfico a seguir optou-se por apresentar apenas seis regiões globais.
ggplot(data=gapminder_1950, aes(x=le,y=tfr,shape=six_regions))+
geom_point()Muitas informações adicionais são representadas quando mapeamos os
continentes. Mas, estamos interessados em acrescentar a variável da
população ao gráfico. População é uma variável que pode ser encarada
como uma contagem ou uma variável numérica. Uma boa forma de
representa-las no gráficos é com pontos de vários tamanhos: quanto
maiores os pontos, maior a população. Assim como para as regiões apenas
um novo elemento estático é acrescentado ao nosso gráfico:
size=pop
ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions,size=pop))+
geom_point()Até agora aprendemos a usar quatro elementos estéticos no gráfico.
| aes | Variável |
|---|---|
| x | le |
| y | tfr |
| color | eight_regions |
| size | pop |
De certa forma, desenhamos um gráfico com quatro dimensões. Mas, ainda queremos saber se o mundo ainda pode ser dividido em famílias grandes de vida curta e em famílias pequenas com vida longa. Uma solução para fazer isso é desenhar outro gráfico, agora para os dados de 2020, por exemplo. O gráfico agora nos apresenta um padrão bem distinto: apenas a África Subsaariana ainda está na condição de família grande e vida curta. Todo o resto do mundo é mais parecido: famílias com tamanho inferior a 2,5 filhos por mulher e esperança de vida entre 65 e 80 anos.
gapminder_2020 <- gapminder %>%
filter(time==2020)
ggplot(data=gapminder_2020, aes(x=le,y=tfr,color=eight_regions,size=pop))+
geom_point()Um ponto relevante a destacar aqui é que escala do gráfico de 2020 é diferente da escala apresentada em 1950. Para o gráfico com os dados de 1950, o eixo das ordenadas variava entre 2 e 8 e o eixo das abscissas variava entre 30 e 70 anos. Em 2020, as famílias estão menores no mundo todo e o eixo das ordenadas agora varia entre 1,5 e 6 e o eixo das abcissas varia entre 55 e 85. Esse comportamento não é desejável foi dificulta a comparação entre os dois gráficos enganando leitores menos atentos. Existem várias soluções para contornar esse problema. na seção seguinte vamos explorar algumas formas de contornar isso.
Até agora nós vimos como exibir conjuntos de dados organizados em um
plano cartesiano e ainda alterando as cores, formas e tamanhos dos
objetos. O gpplot2 permite ainda separar seus gráficos sem
sub-gráficos, como por exemplo, um gráfico para cada continente. Isto é
chamado de faceting e é uma nova forma de adicionar informações
e relacionamento entre variáveis do seu banco de dados. Do inglês
Facet pode ser traduzido como face em português mas
não se aplica à face de uma pessoa se aplica mais a objetos a
exemplo de sólidos (as faces de cubo) ou pedras lapidadas (as faces de
um diamante).
ggplot(data=gapminder_2020, aes(x=le,y=tfr,size=pop))+
geom_point()+facet_wrap(~four_regions)Você cria faces num gráfico adicionando uma nova opção ao
comando do ggpplot depois de um sinal de +. A
sequencia de comandos a seguir separa o gráfico desenhado até então em
quatro gráficos, sendo um para cada grande continente. Para gerar este
gráfico foi acrescentado após o sinal + a linha de código
facet_wrap(~ four_regions). O símbolo ~ aqui
pode ser traduzido como por ou baseadas em: “faça
faces baseada na variável que definem os quatro
continentes”.
ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions,size=pop))+
geom_point()+facet_wrap(~ four_regions)
Este comando é muito poderoso e, como pode ser visto a seguir, é
possível criar várias faces criar gráficos complexos que revelam
informações distribuídas no tempo e no espaço.
gapminder_decenal <- gapminder %>%
filter(time==2020|time==2000|time==1990|time==1980|time==1970|time==1960)
ggplot(data=gapminder_decenal, aes(x=le,y=tfr,color=eight_regions,size=pop))+
geom_point()+facet_wrap(~ time)O formato básico de uma oração de gráficos no ggplot2 é dada por
ggplot(data,aes) + geom_. Entretanto é relativamente comum
alterarmos a escala do gráfico. No exemplo apresentado a seguir estão
plotados a renda per capita (IPP) nas abscissas e a esperança de vida
(LE) nas ordenadas, relativas ao ano de 2020.
gapminder_2020<- gapminder %>%
filter(time==2020)
ggplot(data=gapminder_2020, aes(x=ipp,y=le))+geom_point()O gráfico indica que quanto maior a renda, maior a esperança de vida. Observem que os valores que estão entre 10 mil e 20 mil dólares por pessoa, tem esperança de vida, de forma geral, acima de 60 anos. Entretanto este gráfico tem alguns problemas: existem muitos pontos concentrados em valores de renda muito baixos, amontoados junto ao eixo dos y. Isso acontece pois temos muitos países concentrados em valores da renda per capita próximo a algumas centenas de dólares e outros algumas dezenas de milhares de dólares.
Quando isso acontece, é recomendável trabalharmos com a escala logarítimica dos dados que cada valor representado é uma multiplicação do valor anterior. O gráfico a seguir apresenta exatamente os mesmos dados do anterior. Mas, agora, cada valor apresentado no eixo x é 10 vezes maior que o valor anterior (1.000, 10.000 e 100.000 US$ per capita). Essa alteração transforma matematicamente a relação entre a IPP e a LE que agora aparenta ser mais linear e fica mais fácil distinguir os valores que estão na base do gráfico.
ggplot(data=gapminder_2020, aes(x=ipp,y=le))+
geom_point()+
scale_x_log10(labels=comma)Para acrescentar algumas perfumarias ao gráfico, como pode ser visto
no código a seguir, inicialmente filtramos o banco de dados com os
valores relativos a 2020 e 1950 e criamos o dataset de nome
gapminder_1950_2020. Ao comando ggplot foi
acrescentada após o comando geom_point() um sinal de
+ e o comando scale_x_log10(labels=comma) que
informa ao computador que a escala do eixo x (scale_x_)
será logarítimica na base 10 (log10). Ainda foram
acrescentados os elementos estéticos size e
color e a layer facet_wrap ao
gráfico.
gapminder_1950_2020<- gapminder %>%
filter(time==2020|time==1950)
ggplot(data=gapminder_1950_2020, aes(x=ipp,y=le,size=pop,color=eight_regions))+
geom_point()+facet_wrap(.~time)+
scale_x_log10(labels=comma)labels=comma foi
acrescentado ao comando para dizer que os rótulos ( labels em
inglês) devem ser exibidos no formato de vírgulas ( comma em
inglês). O formato comma está disponível com o pacote
scales carregado pelo comando library(scales)
e exibe os números em notação inglesa, ou seja, as vírgulas separam as
casas de milhares e os pontos separam os decimais. Na notação comum no
Brasil (notação europeia) escreveríamos o valor 1.324,5 (um ponto três
dois quatro vírgula cinco) e na notação inglesa o mesmo número é escrito
como 1,324.5 (um vírgula dois quatro ponto cinco).
dplyrsummarizeNeste ponto é importante retornarmos a processamentos de nosso banco de dados. Vamos analisar outra formas de explorarmos e entendermos nossos dados
.
A figura apresenta em linhas bem gerais como organizamos nosso
trabalho de análise e compreensão de um banco de dados. A caixa cinza
destacada é o que estamos fazendo neste exercício: transformando, com o
verbo mutate, por exemplo e visualizando, com o
ggplot; e fazendo alguma inferências sobre os dados, como
na pergunta “Malthus estava correto?”. Mas perceba que para
compreendermos um banco de dados essas três etapas do trabalho são
complementares e muitas vezes retornados a etapas anteriores de nossa
análise.Você estudou os verbos filter e select
para isolar observações específicas do banco de dados, como no código a
seguir, por exemplo.
gapminder %>%
filter(time==2018, name=='Brazil')%>%
select(name,tfr, time)| name | tfr | time |
|---|---|---|
| Brazil | 1.7 | 2018 |
O verbo summarize transforma várias linhas em uma só.
Como, por exemplo, poderíamos calcular a população de todo o globo,
somando todos os países em um ano específico. No código a seguir apenas
o ano de 2020 foi selecionado e o verbo summarize soma a
população de todos os 197 países para calcular a população total do
planeta Terra em 2020 que, nesse caso, é estimada em 7,79 bilhões de
habitantes. Perceba que não faz sentido somar a população de todos os
países em todos os anos (1800 a 2100). Por isso o verbo foi
summarize combinado com o filter()
gapminder %>%
filter(time==2020)%>%
summarize(population=sum(pop))| population |
|---|
| 7786445859 |
Qualquer outra função pode ser usada no comando
summarize a exemplo do apresentado na tabela a seguir.
| Função | Descrição |
|---|---|
| mean | Média da variável |
| sum | Soma da variável |
| median | Mediana da variável |
| min | Minimo |
| max | Máximo |
| n | Contagem |
No código a seguir, são calculadas várias medidas. Perceba que os
valores que forem iguais a NA foram filtrados do banco de
dados e apenas os valores de 2018 foram usados pelo
summarize(). Por esta tabela é possível observar que a
renda média entre os países é de US$ 18 mil e a mediana é de US$ 12 mil.
A menor renda per capita observada foi de US$ 629 e maior é de US$ 112
mil. 195 países foram usados na estimativa e a soma da população desses
países é de 7,63 bilhões de pessoas.
gapminder %>%
filter(time==2018&!is.na(ipp))%>%
summarize(mean_ipp=mean(ipp),
median_ipp=median(ipp),
min_ipp=min(ipp),
max_ipp=max(ipp),
freq=n(),
sum_pop=sum(pop))| mean_ipp | median_ipp | min_ipp | max_ipp | freq | sum_pop |
|---|---|---|---|---|---|
| 18786.1 | 12143 | 629 | 112532 | 195 | 7622634768 |
Os comandos podem ainda ser concatenados para produzir resultados diferentes. Por exemplo, a média da renda per capita foi caculada pela soma de todos os países e dividido por 195. Esta é fórmula padrão de calculo de uma média simples. Mas, caso quiséssemos calcular a renda per capita ponderada pela população? Tal informação seria útil pois, conforme a tabela a seguir, observamos que a renda per capita dos Estados Unidos é mais de três vezes menor que a renda da China enquanto a população americana é apenas um quarto da população chinesa. Para evitar distorções nesse calculo o ideal seria usar a media ponderada.
gapminder %>%
filter(time==2018&!is.na(ipp)&(name=='China' | name=='United States'))%>%
select(name,pop,ipp)| name | pop | ipp |
|---|---|---|
| China | 1427647789 | 16187 |
| United States | 327096263 | 55681 |
A função weighted.mean() calcula a média ponderada faz
parte do pacote tidyverse. Os comandos a seguir estimam a
média da renda per capita ponderada pela população. Acionalmente, são
calculadas a média simples para efeito de comparação. Outros
estatísticas ponderadas (quartis e mediana ponderada, por exemplo dentre
outros) podem ser calculado por meio de outros pacotes do R, a exemplo
do comando weightedMedian do pacote
matrixStats.
library(matrixStats)
##
## Attaching package: 'matrixStats'
## The following object is masked from 'package:dplyr':
##
## count
gapminder %>%
filter(time==2018&!is.na(ipp))%>%
summarize(mean_ipp=mean(ipp),
meanW_ipp=weighted.mean(ipp,pop),
median_ipp=median(ipp),
medianW_ipp=weightedMedian(ipp,pop))| mean_ipp | meanW_ipp | median_ipp | medianW_ipp |
|---|---|---|---|
| 18786.1 | 15837.13 | 12143 | 11907.21 |
Observa-se que a media da renda ponderada pela população é menor que a renda média: países populosos com renda per capita baixa, a exemplo do Brasil, China, México, são contabilizados uma única vez na média simples. Na média ponderada a população é considerada na aritmética.
group_byNos exemplos anteriores nós trabalhamos com o verbo
summarize para um ano específico ou para todo o conjunto de
dados (o dataset gapminder), como no exemplo a seguir que
retorna a média da esperança de vida e a população total do mundo, em
2010.
mean e
sum acrescentaram o argumento na.rm=T. Este
argumento evita que o resultado da média ou da soma seja
NA, excluindo os países sem dados do dataset antes de
somar. É uma forma alternativa de filtras os valores nulos
(NA)
gapminder %>%
filter(time==2010)%>%
summarize(mean_le=mean(ipp,na.rm=T),totalpop=sum(pop,na.rm=T))| mean_le | totalpop |
|---|---|
| 16966.95 | 6948272251 |
Mas, se quiséssemos calcular a população total em todos os anos entre
2000 e 2010? Para sem desnecessário digitar este comando 11 vezes,
existe o verbo group_by que gera um dataset
agrupado em função da variável de interesse, como apresentado
na sequência.
gapminder %>%
filter(time >= 2000 & time <=2010)%>%
group_by(time)%>%
summarize(mean_le=mean(le,na.rm=T),totalpop=sum(pop,na.rm=T))| time | mean_le | totalpop |
|---|---|---|
| 2000 | 67.60503 | 6135505426 |
| 2001 | 67.88677 | 6214559887 |
| 2002 | 68.09302 | 6293633991 |
| 2003 | 68.37624 | 6372978598 |
| 2004 | 68.62635 | 6452889886 |
| 2005 | 68.95820 | 6533578300 |
| 2006 | 69.30429 | 6615134119 |
| 2007 | 69.65847 | 6697512478 |
| 2008 | 69.96492 | 6780609313 |
| 2009 | 70.32074 | 6864248382 |
| 2010 | 70.58503 | 6948272251 |
Perceba que para o verbo group_by(time) fazer exatamente
o que desejamos, foi necessário incluir um filtro antes
(filter(time >= 2000 & year <=2010)) e o
summarize(mean_le=mean(ipp,na.rm=T),totalpop=sum(pop,na.rm=T))
ou seja, seguindo o seguinte algorítimo
.
O resultado gera um dataframe com as populações em todos os países
entre 2000 e 2010. Outras varáveis podem ser acrescentadas no comando
group_by, agrupando os dados em função de duas ou mais
variáveis. O exemplo a seguir cria um dataframe que contém a média da
esperança de vida e a população total segundo o ano e a região, dentre
2000 e 2100 para todos os continentes ao longo do século XXI e, na
sequência, visualiza os dados por meio do comando
head(gapminder_2000_2100)
gapminder_2000_2100 <- gapminder %>%
filter(time >= 2000 & time <=2100)%>%
group_by(time,six_regions)%>%
summarize(mean_le=mean(le,na.rm=T),totalpop=sum(pop,na.rm=T))
head(gapminder_2000_2100)| time | six_regions | mean_le | totalpop |
|---|---|---|---|
| 2000 | América | 72.91618 | 828977534 |
| 2000 | Extremo Oriente | 68.66897 | 2075021915 |
| 2000 | Europa Central e Ásia Ocidental | 74.23240 | 860338684 |
| 2000 | Oriente Médio e Norte da África | 71.90600 | 314895499 |
| 2000 | Sul da Ásia | 65.03375 | 1390946065 |
| 2000 | África Subsaariana | 54.93312 | 665325729 |
O dataframe criado a partir do comando anterior pode ainda ser usado
na construção de uma gráfico, por meio de uma sequencia de comandos do
`ggplot a exemplo da sequencia a seguir. Caso as hipóteses
das projeções se confirmem, o continente mais populoso do globo em 2100
será a África, com quase quatro bilhões de habitantes, considerando que
a população total do mundo será de 10.9 bilhões de habitantes. Essa
projeção é um pouco conservadora, uma vez que não considera a hipótese
de transição da fecundidade, na África Subsaariana ao longo do século
XXI.
ggplot(data=gapminder_2000_2100, aes(x=time,y=totalpop,color=six_regions))+
geom_line()
Observe que o comando
ggplot faz uso do da geometria
geom_line(), ao invés da geometria
geom_point() usada até então. A geometria
geom_line() desenha linhas ao invés de pontos do gráfico. O
ggplot uma variedade extensa de geometrias disponíveis e na
próxima seção iremos abordar algumas dessas geometrias.
Os gráficos feitos até agora neste curso são gráficos de pontos ou, na terminologia técnica, gráficos de dispersão ou scatter plots. Esses gráficos são especialmente úteis quando desejamos comparar duas variáveis numéricas, a exemplo do gráfico a seguir que compara o log da renda per capita, no eixo das abcissas, com a esperança de vida, nas ordenadas. Este gráfico, relativo ao ano de 2020, representa de forma bem clara quase direta entre a renda per capita e a esperança de vida: em linhas gerais, quanto mais o renda, maior a esperança de vida.
Nesta seção vamos criar um gráficos de linhas geralmente usado para
variáveis que mudam ao longo do tempo; ou gráfico de barras, que
apresenta o valor de uma variável nas ordenadas para cada categoria
apresentada nas abcessas; histogramas, que representam a frequência de
cada valor de uma única variável contínua; e, boxplots, que apresenta a
frequência de uma variável contínua em função de várias categorias. Cada
um desses gráficos irá requerer métodos distintos de manipulação dos
dados e, dessa forma, os dados devem ser preparados antes de serem
plotados1. Os procedimentos são similares ao que nós
vimos até agora: é necessário indicar qual variável será representada
por cada um dos elementos estéticos (os aes).
Na sequencia é apresentado um gráfico da média da esperança de vida
entre 1960 e 2010, fazendo uso da geometria geom_point()
que usamos até então. Ele representa esta variação, mas seria mais fácil
de compreender se fosse desenhado com linhas.
gapminder_1970_2010 <-gapminder %>%
filter(time>=1970&time<=2010)%>%
group_by(six_regions,time)%>%
summarize(le=mean(le,na.rm=T))
ggplot(data=gapminder_1970_2010, aes(x=time,y=le,color=six_regions))+
geom_point()+
labs(x='Período', y = 'População',color='Região')+expand_limits(y=0)Como vista anteriormente, quando usamos a geometria
geom_line() os pontos são conectados formando uma linha
contínua e o gráfico fica mais fácil de ser lido. A diferença principal
entre este gráfico e o anterior é apenas a alteração da geometria que em
gráficos de linhas e gráficos de dispersão fazem uso dos mesmos
elementos estéticos, no casosx, y e
color.
gapminder_1970_2010 <-gapminder %>%
filter(time>=1970&time<=2010)%>%
group_by(six_regions,time)%>%
summarize(le=mean(le,na.rm=T))
ggplot(data=gapminder_1970_2010, aes(x=time,y=le,color=six_regions))+
geom_line()+expand_limits(y=0)+
labs(x='Período', y = 'População',color='Região')
O uso do elemento estático
size, que também é compatível
com um gráfico de linhas, irá variar as espessuras das linhas, a exemplo
do gráfico a seguir.
gapminder_1970_2010 <-gapminder %>%
filter(time>=1970&time<=2010)%>%
group_by(six_regions,time)%>%
summarize(pop=sum(pop,na.rm=T),le=mean(le,na.rm=T))
ggplot(data=gapminder_1970_2010, aes(x=time,y=le,color=six_regions,size=pop))+
geom_line()+expand_limits(y=0)+
labs(x='Período', y = 'População',color='Região',size= 'População')expand_limits(y=0), que
faz com que o eixo das ordenadas comece em zero; e
labs(x='Período', y = 'População',color='Região'), que dá
nome aos elementos estéticos (labs de labels ou, em
português, rótulos).
O gráfico de barras é útil para plotar variáveis categóricas, como
continentes. Aprendemos fazer um resumo de dados segundo o continente
fazendo uso do verbo group_by(), como no exemplo a seguir
que cria um novo dataset (by_region) com a média da
esperança de vida para cada continente em 1950
by_region <-gapminder %>%
filter(time==1950) %>%
group_by(four_regions)%>%
summarize(le=mean(le,na.rm=T))
head(by_region,n=6)| four_regions | le |
|---|---|
| África | 41.10407 |
| Américas | 53.84061 |
| Asia | 47.04982 |
| Europa | 62.42295 |
Mesmo já visualizando esses dados em uma tabela, pode ser de nosso
interesse construir um gráfico representando esses dados. Para isso nós
usamos um gráfico de barras e a geometria geom_col(). Nesse
gráfico cada barra representa um continente e a altura da barra é a
média da esperança de vida estimada para este continente. Esse gráfico
tem dois elementos estéticos: x, que é a variável
categórica que no caso é a variável four_regions; e,
y, que é a variável numérica que, no caso, é a variável
le relativa à esperança de vida. Como esperado, para o ano
de 1950, é observada uma desigualdade regional muito marcante: o
continente africano é o que a presenta a menor esperança de vida média,
próximo de 40 anos e a Europa com maior esperança de vida, acima de 60
anos. Os mesmos comandos podem ser alterados para construir datasets
relativo a anos mais recentes (2020, por exemplo) que sugerem que as
desigualdades regionais persistem, embora a diferença entre os
continentes tenham diminuído um pouco.
ggplot(data=by_region, aes(x=four_regions,y=le))+
geom_col()+
labs(x='Continente', y = 'Esperança de vida')Nesse tipo de gráfico, as barras sempre se iniciam no zero e podem representar tanto variáveis numéricas discretas ou contínuas. O exemplo anterior apresenta, na altura das barras, uma variável contínua. Mas, um gráfico de barras pode também representar uma variável discreta (contagens). O exemplo a seguir apresenta o total de países em cada um dos quatro continentes: a Asia é o continente com o maior número de territórios, seguido pela Africa, Europa e Américas, nessa ordem.
by_region <-gapminder %>%
filter(time==1950) %>%
group_by(four_regions)%>%
summarize(n=n())
ggplot(data=by_region, aes(x=four_regions,y=n))+
geom_col()+
labs(x='Continente', y = 'Total de territórios')Cada gráfico é indicado para representar um tipo de dado. Até o momento nós exploramos o relacionamento entre duas ou mais variáveis. O histograma é um tipo de gráfico que explora a distribuição de frequências de uma única variável numérica, seja ela contínua ou discreta. O gráfico na sequencia, por exemplo, exibe a frequência de países de acordo com a esperança de vida de cada um deles, em 1950. Cada barra representa uma classe ( bin) da esperança de vida ou, em outras palavras, um intervalo ( 50 a 52 por exemplo). A altura de cada barra corresponde à frequência de países que são contabilizados em cada uma das classes. Esse tipo de gráfico nos ajuda a visualizar a forma de uma distribuição como neste exemplo pode ser notado um padrão bimodal, com um grupo de países com a esperança de vida mais baixa (abaixo de 45 anos) e um outro grupo com a esperança de vida acima de 60 anos.
ggplot(data=gapminder_1950, aes(x=le))+
geom_histogram()Perceba que os comandos tem apenas um elemento estético:
x=le. O elemento geométrico usado neste caso é o
geom_histogram(). O gráfico anterior foi desenhado com as
opções default do comando, como apresentado na sequencia de
comandos anterior. É possível customizar as opções. Uma delas é a opção
binwidth que define o tamanho de cada classe. Na sequencia
de comandos a seguir o tamanho da classe foi definida como
binwidth=5 que define que barra do histograma terá
exatamente 5 unidades de largura. No caso específico desse
gráfico, cada barra tem então cinco anos de tamanho, ou seja, a primeira
classe é [23.75,28.75), a segunda [28.75,33.75), e assim sucessivamente.
Percebemos que o a característica bimodal da curva não se alterou de
forma expressiva. Em alguns casos é possível alterar a escala da
variáveis de interesse ou acrescentar outras opões ao gráfico.
ggplot(data=gapminder_1950, aes(x=le))+
geom_histogram(binwidth=5)Na sequência a seguir, por exemplo, é representado a distribuição de
frequências segunda a população de cada país. Percebam que foi
acrescentada a opção bins=50 dentro do comando
geom_histogram() que informa ao computador que desejamos
que a variável população seja subdividade em 50 classes. Notamos um
distribuição fortemente assimétrica à direita indicando que muitos
países tem uma população relativamente pequena enquanto alguns poucos
tem população muito grande.
ggplot(data=gapminder_1950, aes(x=pop))+
geom_histogram(bins=50)
Uma outra forma de representar a mesma informação é acrescentar o
comando
scale_x_log10() que altera a escala numérica da
variável pop para a escala logaritimica. A escala
logaritimica apenas altera matematicamente os dados e não altera a
natureza deles: apenas a representação dos dados são alterados.
Na escala aritmética (usada na maioria dos gráficos), a distância entre as marcas na escala equivale ao mesmo valor absoluto. No gráfico anterior a distância entre os rótulos do eixo são sempre 2x10^8 (200 milhões em notação científica que é o mesmo que 2e+8). Na escala logarítmica, representado no próximo gráfico, a distância entre as marcas na escala equivale à mesma proporção (no caso, 10 unidades). Dessa forma, na figura abaixo, a distância entre as marcas do eixo x são sempre um múltiplo de 10x, no caso, 100 (10^2, ou 1e+2). Ou seja, o primeiro rótulo indica 1x10^4 (dez mil), o segundo indica 1x10^6 (1 milhão = 10.000 x 100) e o terceiro indica 1x10^8 (ou 10 milhões = 1.000.000 x 100).
Repare nos números que são apresentados na escala
ggplot(data=gapminder_1950, aes(x=pop))+
geom_histogram(bins=50)+
scale_x_log10()A sequencia de comandos a seguir apresenta vários gráficos, que fazem uso dos mesmos dados, com elementos geométricos distintos.
##geom_bar()
gapminder %>%
filter(time >= 2000 & time <=2100)%>%
group_by(time,six_regions)%>%
summarize(mean_le=mean(le,na.rm=T),totalpop=sum(pop,na.rm=T)) %>%
ggplot(aes(x=time,y=totalpop,fill=six_regions))+
geom_bar(stat='identity') gapminder %>%
filter(time >= 2000 & time <=2100)%>%
group_by(time,six_regions)%>%
summarize(mean_le=mean(le,na.rm=T),totalpop=sum(pop,na.rm=T)) %>%
ggplot(aes(x=time,y=mean_le,size=totalpop,color=six_regions))+
geom_line(stat='identity')+
labs(x= 'Período',y='Esperança de Vida',size='População Total',color='Região do mundo')+
scale_size_continuous('População',breaks=c(0.5e+9,1e+9,2e+9,3e+9),labels=c('500 milh','1 Bil', '2 Bil','3 Bil'))gapminder %>%
filter(time>=1950,time<=2100)%>%
group_by(time,six_regions)%>%
summarize(mean_tfr=mean(tfr,na.rm=T),mean_le=mean(le,na.rm=T),totalpop=sum(pop,na.rm=T))%>%
ggplot(aes(x=mean_le,y=mean_tfr,color=six_regions))+
geom_point()+scale_x_log10(labels=comma)+
ggtitle('Esperança de vida em função da Taxa de fecundidade total')+
labs(y= 'Taxa de Fecundidade Total',x='Esperança de Vida')# an <- gapminder %>% filter(time>=1950,time<=2018) %>%
# ggplot( aes(x=ipp,y=le,size=pop,color=eight_regions))+
# geom_point()+scale_x_log10(labels=comma)+transition_time(time)
# animate(an,renderer=gifski_renderer()) Versão aportuguesada do verbo inglês to plot que não tem tradução em português mas significa algo como ‘desenhar um gráfico’ (ou graficar)↩︎