Capítulo 2 - Revisão de R


2.1 R e Rstudio

O R é uma linguagem de programação voltada para análise de dados. O Rstudio é uma IDE (interface de desenvolvimento), que nos ajuda a programar em R. No curso utilizaremos o Rstudio para facilitar programar em R.

Normalmente, iremos escrever um comando aqui no Script, clicar em executar (run) ou apertar ctrl + enter, e o Rstudio vai copiar o comando, colar no console e executá-los para nós.

2.2 R como calculadora

o R pode funcionar como calculadora.

2+2

[1] 4

3*4

[1] 12

10/2

[1] 5

2.3 Objetos no R

Tudo no R é um objeto. Isso significa que um número é um objeto.

pi

[1] 3.141593

Isso significa que funções (comandos) também são objetos

sum(c(1,2,3))

[1] 6

sum

function (…, na.rm = FALSE) .Primitive(“sum”)

E nós podemos criar nossos próprios objetos, dando os nomes que quisermos (exceto se já existe um objeto no R com aquele nome, como por exemplo o objeto “sum”).

x <- 3
y <- 7
x+y

[1] 10

2.4 Tipos de objetos

O R tem muitos tipos de objetos. Vamos listar aqui apenas os mais básicos.

2.4.1 Numeric

Objetos do tipo numeric são … números (“reais”).

# Exemplos
pi

[1] 3.141593

1/3

[1] 0.3333333

4

[1] 4

2.4.2 character

Objetos do tipo character são do tipo texto. Sempre são escritos entre aspas (simples ou duplas, tanto faz)

# Exemplos
"Manoel Galdino"

[1] “Manoel Galdino”

'abc'

[1] “abc”

"7"

[1] “7”

2.5 Armazenando dados

Para armazenar dados, usualmente teremos 4 tipos de objetos: 1. vetor, 2. Matriz. 3. data.frame, 4. lista. Não vou falar de lista agora (nem de array, que é uma generalização da matriz para mais de duas dimensões).

2.5.1 Vetor

Um vetor é uma sequência de objetos.

# Exemplos
c(1,2,3)

[1] 1 2 3

1:3

[1] 1 2 3

c("Manoel", "Hugo", "Lia", "Juliana", "Jéssica")

[1] “Manoel” “Hugo” “Lia” “Juliana” “Jéssica”

c(c(1,2,3), c(2,3,1))

[1] 1 2 3 2 3 1

os elementos de um vetor devem ser todos do mesmo tipo:

# Exemplos
x <- c("1", 1)
x[2]

[1] “1”

# sedundo elemento fica armazenado como character

# não é possível somar texto
# x[2] + x[2] # erro

2.5.2 Matriz

Uma matriz são vetores organizados por coluna, todas as colunas (vetores) só podem ser de um tipo, ou seja, não posso ter uma coluna numeric e outra de character, por exemplo.

library(knitr)
library(kableExtra)

# Exemplos
mat <- matrix(1:6, nrow=3, ncol=2)

kable(mat)
1 4
2 5
3 6

2.5.3 Data Frame

O data.frame é uma tabela/planilha, e é onde normalmente armazenamos nossos bancos de dados no R.

# Exemplos
df <- data.frame(x=1:3, y=c("a", "b", "c"))
kable(df)
x y
1 a
2 b
3 c

2.5.3.1 datas

## explicando data rapidamente
data_ex <- "2020-10-23"
data_ex1 <- as.Date(data_ex)

data_ex1 + 0:9

[1] “2020-10-23” “2020-10-24” “2020-10-25” “2020-10-26” [5] “2020-10-27” “2020-10-28” “2020-10-29” “2020-10-30” [9] “2020-10-31” “2020-11-01”

## fim da explicação rápida de data
## criando data de forma repetitiva e tediosa. O que queremos evitar!
minha_data <- c(as.Date('2009-01-01'), as.Date('2009-01-02'), as.Date('2009-01-03'),
  as.Date('2009-01-04'), as.Date('2009-01-05'), as.Date('2009-01-06'),
  as.Date('2009-01-07'), as.Date('2009-01-08'), as.Date('2009-01-09'),
  as.Date('2009-01-10'))

acoes <- data.frame(
  tempo = minha_data,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)
tempo X Y Z
2009-01-01 -0.3756029 -1.0422346 3.3800520
2009-01-02 -0.5618764 -0.9797409 3.8501119
2009-01-03 -0.3439172 0.0943089 2.7372377
2009-01-04 0.0904966 2.6003974 -5.5810974
2009-01-05 1.5985088 4.5861579 3.3985722
2009-01-06 -0.0885651 3.0951621 -1.7862289
2009-01-07 1.0807995 -0.2663019 0.6992108
2009-01-08 0.6307541 -3.5130548 0.2982047
2009-01-09 -0.1136399 -0.7775597 1.7126671
2009-01-10 -1.5329020 0.1784144 0.0986999
# criando data.frame de maneira mais inteligente
acoes <- data.frame(
  tempo = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)
tempo X Y Z
2009-01-01 -1.6674751 2.3367677 -2.8609687
2009-01-02 0.7364960 2.1083620 -3.0107559
2009-01-03 0.3860266 2.2905262 -3.7541548
2009-01-04 -0.2656516 -1.1549360 -4.2100531
2009-01-05 0.1181445 4.0049655 -1.7486381
2009-01-06 0.1340386 0.1334017 1.3247167
2009-01-07 0.2210195 3.7337037 -8.0568420
2009-01-08 1.6408462 -2.7018054 0.8479217
2009-01-09 -0.2190504 0.0419672 4.9467002
2009-01-10 0.1680654 2.4998291 8.1502961

2.6 Bibliotecas/pacotes

O R permite que a gente importe comandos que não vêm por padrão no R. Em gerla esses comandos es~toa agrupados sob um pacote. PAra usar esses comandos, primeiro a gente instala o pacote, e depois carrega a biblioteca.

# Exemplos
#install.packages("data.table")
#library(data.table)

2.7 importando dados

Para importar dados, vamos usar a bilioteca “data.table” Então, instalem ela se ainda não instalaram (usando o comando install.packages(“data.table”)) E depois carreguem a biblioteca: library(data.table)

Para importar, usaremos o comando fread do pacote data.table.

# vamos importar uma base de dados de pib municipais de 2013, do IBGE

# o arquivo está em formato RDS, que é um formato do R, e disponível no meu github. Para importá-lo direto no R, vamos ler o arquivo com a função url e depois import´-lo com a função readRDS. 

pib_cid <- readRDS(url("https://github.com/mgaldino/book-regression/raw/main/dados/pib_cid.RDS"))

# para visualizar os dados que forma importados, temos várias funções
# glimpse, head e View

library(dplyr) # para glimpse
## Warning: package 'dplyr' was built under R version 4.2.3
# glimpse(pib_cid)

# head(pib_cid)

# View(pib_cid)

2.8 Data wrangling

Para manipulação, limpeza e processamento de dados, iremos utilizar o chamado “tidyverse”.

library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.2
## Warning: package 'lubridate' was built under R version 4.3.3
# digamos que quero o pib total médio e o pib per capita médio
# basta usar o comando summarise, que resume os dados e escolher a função mean.

df <- pib_cid %>%
  summarise(pib_medio = mean(pib_total),
            pib_per_capita_medio = mean(pib_per_capita))

kable(df)
pib_medio pib_per_capita_medio
957202.7 17388.86
# se eu quiser a soma dos pibs municipais
df <- pib_cid %>%
  summarise(soma_pib = sum(pib_total)) %>%
  head()

kable(df)
soma_pib
5331618957
# maior e menos pibs e pibs per capita entre municípios
df <- pib_cid %>%
  summarise(pib_max = max(pib_total),
            pib_min = min(pib_total),
            pib_per_capita_max = max(pib_per_capita),
            pib_per_capita_min = min(pib_per_capita)) %>%
  head()

kable(df)
pib_max pib_min pib_per_capita_max pib_per_capita_min
582079726 4198.94 717343.7 301.6
# se eu quiser apenas dos municípios od estado de SP?
# basta filtrar pelo estado de SP, com o comando filter
df <- pib_cid %>%
  filter(sigla_uf == "SP") %>%
  summarise(soma_pib = sum(pib_total)) %>%
  head()
  
kable(df)
soma_pib
1715238417
df <- pib_cid %>%
  filter(sigla_uf == "SP") %>%
  summarise(pib_medio = mean(pib_total),
            pib_per_capita_medio = mean(pib_per_capita)) %>%
  head()

kable(df)
pib_medio pib_per_capita_medio
2659284 24827.14
# se eu quiser esse cálculo por uf (or cada umas das ufs?)
# Aí é melhor aguprar por uf
# ideia é: split by, apply (function), combine (summarise?)
df <- pib_cid %>%
  group_by(sigla_uf) %>%
  summarise(pib_medio = mean(pib_total),
            pib_per_capita_medio = mean(pib_per_capita)) %>%
  head()

kable(df)
sigla_uf pib_medio pib_per_capita_medio
AC 521542.3 11450.979
AL 365515.0 7931.148
AM 1339536.0 8975.314
AP 797717.9 14947.829
BA 491233.3 8814.841
CE 592590.0 7157.360
# agora, quero criar uma nova variável, que é o pib estadual
df <- pib_cid %>%
  group_by(sigla_uf) %>%
  mutate(pib_uf = sum(pib_total))

df <- head(df)

kable(df)
ano codigo_regiao nome_regiao codigo_uf sigla_uf nome_uf cod_municipio nome_munic nome_metro codigo_meso nome_meso codigo_micro nome_micro codigo_reg_geo_imediata nome_reg_geo_imediata mun_reg_geo_imediata codigo_reg_geo_intermediaria nome_reg_geo_intermediaria mun_reg_geo_intermediaria codigo_concentracao_urbana nome_concentracao_urbana tipo_concentracao_urbana codigo_arranjo_populacional nome_arranjo_populacional hierarquia_urbana hierarquia_urbana_principais codigo_regiao_rural nome_regiao_rural regiao_rural_classificacao amazonia_legal semiarido cidade_de_sao_paulo vab_agropecuaria vab_industria vab_servicos_exclusivo vab_adm_publica vab_total impostos pib_total pib_per_capita atividade_vab1 atividade_vab2 atividade_vab3 pib_uf
2013 1 Norte 11 RO Rondônia 1100015 Alta Floresta D’Oeste NA 1102 Leste Rondoniense 11006 Cacoal 110005 Cacoal do Entorno 1102 Ji-Paraná do Entorno NA NA NA NA NA Centro Local Centro Local 1101 Região Rural da Capital Regional de Porto Velho Região Rural de Capital Regional Sim Não Não 110850.84 20336.994 73025.07 120335.59 324548.50 16776.193 341324.69 13266.66 Administração, defesa, educação e saúde públicas e seguridade social Pecuária, inclusive apoio à pecuária Demais serviços 31121413
2013 1 Norte 11 RO Rondônia 1100023 Ariquemes NA 1102 Leste Rondoniense 11003 Ariquemes 110002 Ariquemes Polo 1101 Porto Velho do Entorno NA NA NA NA NA Centro Sub-regional B Centro Sub-regional 1101 Região Rural da Capital Regional de Porto Velho Região Rural de Capital Regional Sim Não Não 93249.75 354733.212 694832.17 466732.80 1609547.93 190304.571 1799852.51 17772.99 Administração, defesa, educação e saúde públicas e seguridade social Demais serviços Comércio e reparação de veículos automotores e motocicletas 31121413
2013 1 Norte 11 RO Rondônia 1100031 Cabixi NA 1102 Leste Rondoniense 11008 Colorado do Oeste 110006 Vilhena do Entorno 1102 Ji-Paraná do Entorno NA NA NA NA NA Centro Local Centro Local 1101 Região Rural da Capital Regional de Porto Velho Região Rural de Capital Regional Sim Não Não 38259.43 3412.205 17787.45 32838.64 92297.72 4066.819 96364.54 14836.73 Administração, defesa, educação e saúde públicas e seguridade social Pecuária, inclusive apoio à pecuária Agricultura, inclusive apoio à agricultura e a pós colheita 31121413
2013 1 Norte 11 RO Rondônia 1100049 Cacoal NA 1102 Leste Rondoniense 11006 Cacoal 110005 Cacoal Polo 1102 Ji-Paraná do Entorno NA NA NA NA NA Centro Sub-regional B Centro Sub-regional 5105 Região Rural do Centro Sub-regional de Vilhena (RO) e Cacoal (RO) Região Rural de Centro Sub-regional Sim Não Não 140658.88 140288.317 599519.83 395842.23 1276309.26 156944.241 1433253.51 16692.33 Administração, defesa, educação e saúde públicas e seguridade social Demais serviços Comércio e reparação de veículos automotores e motocicletas 31121413
2013 1 Norte 11 RO Rondônia 1100056 Cerejeiras NA 1102 Leste Rondoniense 11008 Colorado do Oeste 110006 Vilhena do Entorno 1102 Ji-Paraná do Entorno NA NA NA NA NA Centro de Zona B Centro de Zona 1101 Região Rural da Capital Regional de Porto Velho Região Rural de Capital Regional Sim Não Não 45153.64 19889.818 149569.44 83089.55 297702.45 55567.232 353269.68 19581.49 Administração, defesa, educação e saúde públicas e seguridade social Comércio e reparação de veículos automotores e motocicletas Demais serviços 31121413
2013 1 Norte 11 RO Rondônia 1100064 Colorado do Oeste NA 1102 Leste Rondoniense 11008 Colorado do Oeste 110006 Vilhena do Entorno 1102 Ji-Paraná do Entorno NA NA NA NA NA Centro Local Centro Local 1101 Região Rural da Capital Regional de Porto Velho Região Rural de Capital Regional Sim Não Não 51029.59 23179.131 66099.41 86090.50 226398.63 16368.611 242767.24 12650.72 Administração, defesa, educação e saúde públicas e seguridade social Demais serviços Pecuária, inclusive apoio à pecuária 31121413

Coisas estranhas. O maior pib per capita municipal deu muito alto. vamos ver qual município é? Vamos filtrar e depois selecionar apenas algumas colunas

# agora, quero criar uma nova variável, que é o pib estadual
df <- pib_cid %>%
  filter(pib_per_capita > 700000) %>%
  select(sigla_uf, nome_munic, pib_per_capita, pib_total) %>%
  head()

kable(df)
sigla_uf nome_munic pib_per_capita pib_total
ES Presidente Kennedy 717343.7 7984035

Vamos entrar na Wiki do município ou perguntar pra chatGPT o que explica isso aí? Veremos que “faz sentido”, embora na verdade não faça.

Exercício em sala de aula: veja os impostos desse município.

2.9 Visualização

Para visualizarmos os dados com gráficos, utilizaremos a biblioteca ggplot2

# gráficos

library(ggplot2)
pib_cid %>%
  ggplot(aes(y=pib_total, x=impostos)) + geom_point()

A lgócia geral de um grtáfico com ggplot2 é como no exemplo acima. Primeiro passamos as variáveis por meio do comando ggplot, dentro de aes (de aesthetics), depois combinamos com o tipo de plot que queremos faze,r nesse caso, pontos, com geom_point. É possívle customizar o gráfico para ele ficar mais bonito. Vamos fazer isso agora.

# gráficos  mais bonitos


pib_cid %>%
  ggplot(aes(y=pib_total, x=impostos)) + geom_point() +
  scale_y_continuous(labels = scales::dollar) + theme_light() + theme(text=element_text(size=20)) +
  xlab("impostos municipais") + ggtitle("PIB municipal de 2013 x impostos municipais")

Podemos usar vários temas feitos pela comunidade. Por exemplo, Barbie:

# gráficos  mais bonitos

# install.packages("remotes")
#remotes::install_github("MatthewBJane/theme_park")
library(ThemePark)

pib_cid %>%
  ggplot(aes(y=pib_total, x=impostos)) + geom_point() +
  scale_y_continuous(labels = scales::dollar) + theme(text=element_text(size=20)) + theme_barbie() +
  xlab("impostos municipais") + ggtitle("PIB municipal de 2013 x impostos municipais")

Vocês podem ver outros temas de filmes no github do autor do pacote: https://github.com/MatthewBJane/theme_park E, claro, há muito mais na internet.

Para fazer outro tipo de gráfico, é só variar o geom. Por exemplo, um histograma do PIB per capita.

# Histograma


pib_cid %>%
  ggplot(aes(x=pib_per_capita)) + geom_histogram() +
  theme_light() + theme(text=element_text(size=20)) + ggtitle("PIB per capita municipal")