Capítulo 2 Introdução ao R e RStudio

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.1.1 Instalação do R

Para instalar o R, acesse o site oficial do CRAN (Comprehensive R Archive Network) em https://cran.r-project.org/ e baixe a versão adequada para o seu sistema operacional (Windows, Mac ou Linux). Siga as instruções do instalador.

2.1.2 Instalação do RStudio

Após instalar o R, acesse https://posit.co/download/rstudio-desktop/ e baixe o RStudio Desktop (versão gratuita). O RStudio requer que o R já esteja instalado no computador.

2.1.3 A interface do RStudio

O RStudio possui quatro painéis principais:

  1. Editor de Script (canto superior esquerdo): onde escrevemos nossos códigos.
  2. Console (canto inferior esquerdo): onde os comandos são executados e os resultados aparecem.
  3. Ambiente/Histórico (canto superior direito): mostra os objetos criados na sessão.
  4. Arquivos/Plots/Pacotes/Help (canto inferior direito): navegação de arquivos, visualização de gráficos, gerenciamento de pacotes e ajuda.

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. É possível sobrescrever objetos que já existem no R (como “sum”), mas não é recomendável, pois isso pode gerar erros difíceis de encontrar.

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"
# segundo elemento fica armazenado como character

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

2.5.2 Matriz

Uma matriz é uma coleção bidimensional de elementos do mesmo tipo. Todas as colunas 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" "2020-10-27"
##  [6] "2020-10-28" "2020-10-29" "2020-10-30" "2020-10-31" "2020-11-01"
## fim da explicação rápida de data
# criando data.frame com datas
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.7556454 -1.9804232 1.8047263
2009-01-02 -1.7728978 -2.3583263 -0.8073561
2009-01-03 0.4346231 -1.3218195 4.5460194
2009-01-04 0.3331528 -3.7578016 1.1785721
2009-01-05 0.0301538 -1.8504934 -0.5753270
2009-01-06 -0.1079605 2.1674238 -3.5796846
2009-01-07 -0.2913344 -3.4508179 -6.5314670
2009-01-08 0.2002774 -0.8655171 5.9921115
2009-01-09 -0.3983832 0.7038554 5.1514685
2009-01-10 -0.3321210 3.9076437 -3.5424204

2.6 Bibliotecas/pacotes

O R permite que a gente importe comandos que não vêm por padrão no R. Em geral esses comandos estão 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, existem diversas funções e pacotes no R. Vamos usar como exemplo um arquivo RDS (formato nativo do R) com dados de PIB municipal de 2013 do IBGE.

# importando arquivo RDS local
pib_cid <- readRDS("dados/pib_cid.RDS")

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

library(dplyr) # para glimpse

# 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)

# 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 menor 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 do 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 (para cada uma das ufs?)
# Aí é melhor agrupar 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.

df <- pib_cid %>%
  filter(pib_per_capita > 700000) %>%
  dplyr::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

2.9 Visualização

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

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

A lógica geral de um grá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 fazer, nesse caso, pontos, com geom_point. É possível customizar o gráfico para ele ficar mais bonito. Vamos fazer isso agora.

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")

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

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

2.10 Exercícios

2.10.1 Importação de dados

  1. (Fácil) Importe o arquivo dados/municipios_virgula.csv usando read.csv(). Quantos municípios há no banco? Quais são as colunas?

  2. (Fácil) Tente importar o arquivo dados/municipios_pontovirgula.csv usando read.csv() (sem argumentos adicionais). O que acontece? Por que dá erro? Agora importe corretamente usando read.csv2() com o argumento fileEncoding = "latin1". Explique a diferença entre read.csv() e read.csv2().

  3. (Médio) Importe o arquivo dados/eleicoes_2022.csv. Verifique se o município “Pau D’Arco” foi importado corretamente. Dica: use filter() para buscar o município e verifique se o nome aparece completo.

  4. (Médio) Importe o arquivo dados/idh_municipios.csv. Este arquivo usa ponto e vírgula como separador e está codificado em latin1. Importe-o corretamente e verifique se as colunas numéricas (como idh_2010) são de fato numéricas (use str() ou class()).

  5. (Difícil) Tente importar o arquivo dados/idh_municipios.csv de três formas diferentes: (a) read.csv() sem argumentos extras; (b) read.csv2() sem fileEncoding; (c) read.csv2() com fileEncoding = "latin1". Para cada tentativa, verifique: a importação funciona sem erro? Os nomes dos municípios com acento aparecem corretamente? As colunas numéricas são numéricas? Explique o que deu errado em cada caso.

2.10.2 Data wrangling com dplyr

  1. (Fácil) Usando o banco municipios_virgula.csv, encontre o município com o maior IDH e o município com o menor IDH.

  2. (Fácil) Usando o banco municipios_virgula.csv, calcule a população total (soma) e a população média dos municípios.

  3. (Médio) Usando o banco eleicoes_2022.csv, calcule o total de votos de cada candidato considerando todos os municípios. Ordene o resultado do mais votado para o menos votado (dica: arrange(desc(...))).

  4. (Médio) Usando o banco idh_municipios.csv (importado corretamente), calcule o IDH médio por região do Brasil. Qual região tem o maior IDH médio? E o menor?

  5. (Médio) Usando o banco eleicoes_2022.csv, crie uma nova coluna chamada vencedor que indica, para cada município, o candidato com o maior percentual de votos. Dica: agrupe por município, filtre a linha com o maior percentual (slice_max()), e selecione as colunas relevantes.

  6. (Difícil) Usando o banco idh_municipios.csv, crie uma nova variável chamada categoria_idh que classifica os municípios em: “Muito Alto” (IDH >= 0.8), “Alto” (0.7 <= IDH < 0.8), “Médio” (0.55 <= IDH < 0.7) e “Baixo” (IDH < 0.55). Use mutate() com case_when(). Quantos municípios há em cada categoria?

  7. (Difícil) Usando o banco idh_municipios.csv, calcule, para cada região, qual é a dimensão do IDH (educação, longevidade ou renda) que tem a maior média e qual tem a menor média. Dica: use group_by(), summarise() e depois pivot_longer() para facilitar a comparação.

2.10.3 Visualização com ggplot2

  1. (Fácil) Usando o banco municipios_virgula.csv, faça um gráfico de barras (geom_col()) mostrando a população de cada município. Ordene as barras da maior para a menor população (dica: use reorder()).

  2. (Médio) Usando o banco idh_municipios.csv, faça um gráfico de dispersão (geom_point()) com o IDH de educação no eixo x e o IDH de renda no eixo y. Pinte os pontos por região (color = regiao). Adicione rótulos nos eixos e um título informativo.

  3. (Difícil) Usando o banco eleicoes_2022.csv, faça um gráfico de barras empilhadas (geom_col()) que mostre, para cada município, a proporção de votos de cada candidato. Use y = votos e fill = candidato para empilhar as barras, e position = "fill" para normalizar em proporções. Adicione coord_flip() para facilitar a leitura dos nomes dos municípios.