1. Introdução

1.1) O que é o R

A linguagem de programação R é versátil e pode ser usada para manipulação, análise, raspagem, visualização de dados, entre outros.

1.2) A estrututra do curso

Esta oficina foca no uso prática de consumo e análise de dados com foco na base de dados de pensionistas. O objetivo é o(a) aluno(a) sair do curso já sabendo trabalhar dados disponíveis na internet.

Isso inclui desde fazer o download do dado até fazer tratamentos e análises que permitam responder a perguntas típicas de um ambiente de jornalismo.

1.3) O caso dos pensionistas

Para esta oficina, vamos usar os dados de pensionistas do governo federal. A base de dados foi disponibilizada pelo Ministério da Economia após uma vitória do ‘Fiquem sabendo’.

1.4) Download do arquivo

Os arquivos são disponibilizados por mês no portal dados.gov.br em formato CSV. Também há um dicionário de dados em formato PDF.

Para esta análise, vamos usar o arquivo mais recente, de julho de 2020. Para baixar os arquivos, acesse o link, localize o arquivo, clique em “Explorar” e depois em “Ir para recurso”.

1.5) Instalar os pacotes

É preciso instalar alguns pacotes caso esta seja a primeira vez que você mexa com R no seu computador.

Para isso, nós vamos usar a função install.packages(). Dentro dos parêntesis, devemos informar o nome do pacote.

# install.packages("tidyverse")
# install.packages("data.table")
# install.packages("abjutils")

1.6) Carregar os pacotes

Precisamos também carregar os pacotes que serão usados. Usamos a função library() e informarmos o nome do pacote dentro dos parêntesis.

library(tidyverse)
library(data.table)
library(abjutils)

1.7) Importar o arquivo manualmente

Há diversas formas de importar um arquivo para o RStudio. Uma das formas mais simples é:
- Clique em “File”
- Clique em “Import Dataset”
- Clique em “From text (base)”
- Selecione o arquivo
- Cheque se tudo parece correto
- Clique em “Import”

1.8) Importar o arquivo automaticamente

Agora, vamos importar o arquivo apenas informar onde ele está e qual é o nome dele. Neste caso, optamos por usar a função fread() do pacote data.table.

# df_pensionistas_07_2020 <- fread("data/PENSIONISTAS_072020.csv")
df_pensionistas_07_2020 <- readRDS("data/julho2020.rds")

Se quisermos, podemos tambem informar ainda:
- a codificação do arquivo (encoding)
- o separador das colunas (sep)
- o número de linhas que queremos ler (nrows)
- quais colunas queremos ler (colnames)
- quais colunas não queremos ler (drop)
- outros

1.9) Descobrir a pasta

Uma das dificuldades na importação de arquivo é descobrir a pasta. Podemos usar as funções getwd(), setwd() e list.files() para nos ajudar.

getwd()
## [1] "/Users/gabrielacaesar/Downloads/oficina-R-master"
# setwd("~/Downloads")
list.files()
## [1] "LICENSE"         "README.md"       "aula.Rmd"        "aula.html"      
## [5] "data"            "image"           "index.html"      "oficina-R.Rproj"

1.10) Verificação de o arquivo

O arquivo já foi importado e agora queremos dar uma olhada nele. Usaremos as funções summary(), glimpse() e View().

summary(df_pensionistas_07_2020)
##  NOME DO SERVIDOR INSTITUIDOR CPF SERVIDOR INSTITUIDOR
##  Length:295468                Length:295468           
##  Class :character             Class :character        
##  Mode  :character             Mode  :character        
##                                                       
##                                                       
##                                                       
##  DATA NASCIMENTO INSTITUIDOR DATA FALECIMENTO INSTITUIDOR
##  Length:295468               Length:295468               
##  Class :character            Class :character            
##  Mode  :character            Mode  :character            
##                                                          
##                                                          
##                                                          
##  MATRICULA SERVIDOR INSTITUIDOR NOME DO ORGAO      SIGLA DO ORGAO    
##  Min.   :1.300e+11              Length:295468      Length:295468     
##  1st Qu.:2.500e+11              Class :character   Class :character  
##  Median :3.621e+11              Mode  :character   Mode  :character  
##  Mean   :3.326e+11                                                   
##  3rd Qu.:4.081e+11                                                   
##  Max.   :7.000e+11                                                   
##  CODIGO ORGAO SUPERIOR CARGO SERVIDOR INSTITUIDOR NIVEL ESCOLARIDADE CARGO
##  Min.   :    0         Length:295468              Length:295468           
##  1st Qu.:    0         Class :character           Class :character        
##  Median :17000         Mode  :character           Mode  :character        
##  Mean   :15313                                                            
##  3rd Qu.:17000                                                            
##  Max.   :55000                                                            
##  CLASSE SERVIDOR INSTITUIDOR PADRAO SERVIDOR INSTITUIDOR
##  Length:295468               Length:295468              
##  Class :character            Class :character           
##  Mode  :character            Mode  :character           
##                                                         
##                                                         
##                                                         
##  REFERENCIA SERVIDOR INSTITUIDOR NIVEL SERVIDOR INSTITUIDOR
##  Length:295468                   Length:295468             
##  Class :character                Class :character          
##  Mode  :character                Mode  :character          
##                                                            
##                                                            
##                                                            
##  OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR
##  Length:295468                                                 
##  Class :character                                              
##  Mode  :character                                              
##                                                                
##                                                                
##                                                                
##  DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR
##  Length:295468                                                         
##  Class :character                                                      
##  Mode  :character                                                      
##                                                                        
##                                                                        
##                                                                        
##  NOME DO BENEFICIARIO CPF DO BENEFICIARIO DATA DE NASCIMENTO
##  Length:295468        Length:295468       Length:295468     
##  Class :character     Class :character    Class :character  
##  Mode  :character     Mode  :character    Mode  :character  
##                                                             
##                                                             
##                                                             
##  UF DA UPAG DE VINCULACAO TIPO DE BENEFICIARIO TIPO PENSAO       
##  Length:295468            Length:295468        Length:295468     
##  Class :character         Class :character     Class :character  
##  Mode  :character         Mode  :character     Mode  :character  
##                                                                  
##                                                                  
##                                                                  
##  NATUREZA PENSAO    DATA INICIO DO BENEFICIO DATA FIM DO BENEFICIO
##  Length:295468      Length:295468            Length:295468        
##  Class :character   Class :character         Class :character     
##  Mode  :character   Mode  :character         Mode  :character     
##                                                                   
##                                                                   
##                                                                   
##  RENDIMENTO BRUTO   RENDIMENTO LIQUIDO PAGAMENTO SUSPENSO   X29         
##  Length:295468      Length:295468      Length:295468      Mode:logical  
##  Class :character   Class :character   Class :character   NA's:295468   
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
## 
glimpse(df_pensionistas_07_2020)
## Rows: 295,468
## Columns: 29
## $ `NOME DO SERVIDOR INSTITUIDOR`                                           <chr> …
## $ `CPF SERVIDOR INSTITUIDOR`                                               <chr> …
## $ `DATA NASCIMENTO INSTITUIDOR`                                            <chr> …
## $ `DATA FALECIMENTO INSTITUIDOR`                                           <chr> …
## $ `MATRICULA SERVIDOR INSTITUIDOR`                                         <dbl> …
## $ `NOME DO ORGAO`                                                          <chr> …
## $ `SIGLA DO ORGAO`                                                         <chr> …
## $ `CODIGO ORGAO SUPERIOR`                                                  <dbl> …
## $ `CARGO SERVIDOR INSTITUIDOR`                                             <chr> …
## $ `NIVEL ESCOLARIDADE CARGO`                                               <chr> …
## $ `CLASSE SERVIDOR INSTITUIDOR`                                            <chr> …
## $ `PADRAO SERVIDOR INSTITUIDOR`                                            <chr> …
## $ `REFERENCIA SERVIDOR INSTITUIDOR`                                        <chr> …
## $ `NIVEL SERVIDOR INSTITUIDOR`                                             <chr> …
## $ `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR`         <chr> …
## $ `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR` <chr> …
## $ `NOME DO BENEFICIARIO`                                                   <chr> …
## $ `CPF DO BENEFICIARIO`                                                    <chr> …
## $ `DATA DE NASCIMENTO`                                                     <chr> …
## $ `UF DA UPAG DE VINCULACAO`                                               <chr> …
## $ `TIPO DE BENEFICIARIO`                                                   <chr> …
## $ `TIPO PENSAO`                                                            <chr> …
## $ `NATUREZA PENSAO`                                                        <chr> …
## $ `DATA INICIO DO BENEFICIO`                                               <chr> …
## $ `DATA FIM DO BENEFICIO`                                                  <chr> …
## $ `RENDIMENTO BRUTO`                                                       <chr> …
## $ `RENDIMENTO LIQUIDO`                                                     <chr> …
## $ `PAGAMENTO SUSPENSO`                                                     <chr> …
## $ X29                                                                      <lgl> …
# View(df_pensionistas_07_2020)

1.11) Verificação de partes do arquivo

Outras funções úteis para checar o arquivo estão abaixo. São elas: head(), tail(), colnames(), unique() e length().

head(df_pensionistas_07_2020)
## # A tibble: 6 x 29
##   `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
##   <chr>            <chr>            <chr>            <chr>           
## 1 ADOLFO LEAO DE … ***602951**      12061944         10021998        
## 2 AGNELO FERREIRA… ***260401**      14121939         25012016        
## 3 ALBERTO FERNAND… ***421424**      08021947         13102012        
## 4 ALEXANDRE PEDRO… ***302341**      04111932         20112012        
## 5 ALUIZIO DE SOUZ… ***891031**      13031934         21082018        
## 6 ALVARO RAIMUNDO… ***818627**      06021918         25042000        
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## #   ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## #   SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## #   SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## #   `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## #   INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## #   INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## #   SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## #   BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## #   VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## #   `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## #   BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## #   `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
head(df_pensionistas_07_2020, 15)
## # A tibble: 15 x 29
##    `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
##    <chr>            <chr>            <chr>            <chr>           
##  1 ADOLFO LEAO DE … ***602951**      12061944         10021998        
##  2 AGNELO FERREIRA… ***260401**      14121939         25012016        
##  3 ALBERTO FERNAND… ***421424**      08021947         13102012        
##  4 ALEXANDRE PEDRO… ***302341**      04111932         20112012        
##  5 ALUIZIO DE SOUZ… ***891031**      13031934         21082018        
##  6 ALVARO RAIMUNDO… ***818627**      06021918         25042000        
##  7 AMERICO JORGE    ***397527**      22071929         22072018        
##  8 ANGELO PEREIRA … ***081931**      24051941         02072017        
##  9 ANGELO PEREIRA … ***081931**      24051941         02072017        
## 10 ANGELO PEREIRA … ***081931**      24051941         02072017        
## 11 ANGELO PEREIRA … ***081931**      24051941         02072017        
## 12 ARNALDO LEANDRO  ***518767**      20081922         06082019        
## 13 ARTHUR NATIVIDA… ***455941**      07081915         16122010        
## 14 AUREA JULIA MOR… ***217291**      10091940         28052008        
## 15 BENEDITO DIAS L… ***551781**      08091938         08022001        
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## #   ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## #   SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## #   SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## #   `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## #   INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## #   INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## #   SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## #   BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## #   VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## #   `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## #   BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## #   `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
tail(df_pensionistas_07_2020)
## # A tibble: 6 x 29
##   `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
##   <chr>            <chr>            <chr>            <chr>           
## 1 ANTONIO PRAZERE… ***522842**      11041927         22012013        
## 2 ROBERTO SOARES … ***515507**      01051929         03072012        
## 3 JOSE ESTEVES DE… 00000000000      10031921         15071986        
## 4 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## 5 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## 6 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## #   ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## #   SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## #   SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## #   `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## #   INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## #   INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## #   SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## #   BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## #   VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## #   `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## #   BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## #   `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
tail(df_pensionistas_07_2020, 14)
## # A tibble: 14 x 29
##    `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
##    <chr>            <chr>            <chr>            <chr>           
##  1 ADELSON PEREIRA… ***970657**      14091909         27091976        
##  2 JORGE MOURA      00000000000      29041915         13011949        
##  3 JORGE MOURA      00000000000      29041915         13011949        
##  4 JORGE ALVES RIB… ***508047**      12051935         24091976        
##  5 JORGE ALVES RIB… ***508047**      12051935         24091976        
##  6 ANTONIO DE PADU… ***751932**      08051929         09072012        
##  7 ANTONIO PRAZERE… ***522842**      11041927         22012013        
##  8 ANTONIO PRAZERE… ***522842**      11041927         22012013        
##  9 ANTONIO PRAZERE… ***522842**      11041927         22012013        
## 10 ROBERTO SOARES … ***515507**      01051929         03072012        
## 11 JOSE ESTEVES DE… 00000000000      10031921         15071986        
## 12 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## 13 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## 14 MANOEL WALDEMIR… ***350907**      11021914         27051989        
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## #   ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## #   SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## #   SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## #   `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## #   INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## #   INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## #   SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## #   BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## #   VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## #   `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## #   BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## #   `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
colnames(df_pensionistas_07_2020)
##  [1] "NOME DO SERVIDOR INSTITUIDOR"                                          
##  [2] "CPF SERVIDOR INSTITUIDOR"                                              
##  [3] "DATA NASCIMENTO INSTITUIDOR"                                           
##  [4] "DATA FALECIMENTO INSTITUIDOR"                                          
##  [5] "MATRICULA SERVIDOR INSTITUIDOR"                                        
##  [6] "NOME DO ORGAO"                                                         
##  [7] "SIGLA DO ORGAO"                                                        
##  [8] "CODIGO ORGAO SUPERIOR"                                                 
##  [9] "CARGO SERVIDOR INSTITUIDOR"                                            
## [10] "NIVEL ESCOLARIDADE CARGO"                                              
## [11] "CLASSE SERVIDOR INSTITUIDOR"                                           
## [12] "PADRAO SERVIDOR INSTITUIDOR"                                           
## [13] "REFERENCIA SERVIDOR INSTITUIDOR"                                       
## [14] "NIVEL SERVIDOR INSTITUIDOR"                                            
## [15] "OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR"        
## [16] "DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR"
## [17] "NOME DO BENEFICIARIO"                                                  
## [18] "CPF DO BENEFICIARIO"                                                   
## [19] "DATA DE NASCIMENTO"                                                    
## [20] "UF DA UPAG DE VINCULACAO"                                              
## [21] "TIPO DE BENEFICIARIO"                                                  
## [22] "TIPO PENSAO"                                                           
## [23] "NATUREZA PENSAO"                                                       
## [24] "DATA INICIO DO BENEFICIO"                                              
## [25] "DATA FIM DO BENEFICIO"                                                 
## [26] "RENDIMENTO BRUTO"                                                      
## [27] "RENDIMENTO LIQUIDO"                                                    
## [28] "PAGAMENTO SUSPENSO"                                                    
## [29] "X29"
unique(df_pensionistas_07_2020$`NOME DO ORGAO`)
##   [1] "MINIST.DA AGRICULTURA,PECUARIA E ABAST." 
##   [2] "MINISTERIO DA EDUCACAO"                  
##   [3] "COMANDO DO EXERCITO"                     
##   [4] "FUNDACAO OSORIO"                         
##   [5] "MINISTERIO DA ECONOMIA"                  
##   [6] "MINISTERIO DA JUSTICA E SEGURANCA PUBLIC"
##   [7] "AGENCIA BRASILEIRA DE INTELIGENCIA"      
##   [8] "POLICIA FEDERAL"                         
##   [9] "COMANDO DA AERONAUTICA"                  
##  [10] "CAIXA DE FINANCIAMENTO IMOB.AERONAUTICA" 
##  [11] "AGENCIA ESPACIAL BRASILEIRA"             
##  [12] "COMPANHIA NACIONAL DE ABASTECIMENTO"     
##  [13] "COMPANHIA DESENV. DO VALE SAO FRANCISCO" 
##  [14] "FUNDACAO NACIONAL DE ARTES"              
##  [15] "INSTITUTO DO PATR.HIST.E ART. NACIONAL"  
##  [16] "FUNDACAO BIBLIOTECA NACIONAL"            
##  [17] "MINISTERIO DA SAUDE"                     
##  [18] "INSTITUTO NACIONAL DE EDUCACAO DE SURDOS"
##  [19] "INSTITUTO BENJAMIN CONSTANT"             
##  [20] "FUNDO NACIONAL DE DESENVOLV. DA EDUCACAO"
##  [21] "INST.NACIONAL DE EST.E PESQ.EDUCACIONAIS"
##  [22] "COLEGIO PEDRO II"                        
##  [23] "FUND.UNIV.FED.DO VALE DO SAO FRANCISCO"  
##  [24] "UNIVERSIDADE FEDERAL DE ALAGOAS"         
##  [25] "UNIVERSIDADE FEDERAL DA BAHIA"           
##  [26] "UNIVERSIDADE FEDERAL DO CEARA"           
##  [27] "UNIVERSIDADE FEDERAL DO ESPIRITO SANTO"  
##  [28] "UNIVERSIDADE FEDERAL DE GOIAS"           
##  [29] "UNIVERSIDADE FEDERAL FLUMINENSE"         
##  [30] "UNIVERSIDADE FEDERAL DE JUIZ DE FORA"    
##  [31] "UNIVERSIDADE FEDERAL DE MINAS GERAIS"    
##  [32] "UNIVERSIDADE FEDERAL DO PARA"            
##  [33] "UNIVERSIDADE FEDERAL DA PARAIBA"         
##  [34] "UNIVERSIDADE FEDERAL DO PARANA"          
##  [35] "UNIVERSIDADE FEDERAL DE PERNAMBUCO"      
##  [36] "UNIVERSIDADE FED. DO RIO GRANDE DO NORTE"
##  [37] "UNIVERSIDADE FED. DO RIO GRANDE DO SUL"  
##  [38] "UNIVERSIDADE FEDERAL DO RIO DE JANEIRO"  
##  [39] "UNIVERSIDADE FEDERAL DE SANTA CATARINA"  
##  [40] "UNIVERSIDADE FEDERAL DE SANTA MARIA"     
##  [41] "UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO"
##  [42] "UNIV. FEDERAL RURAL DO RIO DE JANEIRO"   
##  [43] "UNIVERSIDADE FEDERAL DE RORAIMA"         
##  [44] "FUNDACAO UNIVERSIDADE FED. DO TOCANTINS" 
##  [45] "UNIVERSIDADE FEDERAL DE CAMPINA GRANDE"  
##  [46] "UNIVERSIDADE FEDERAL RURAL DA AMAZONIA"  
##  [47] "UNIVERSIDADE FED.DO TRIANGULO MINEIRO"   
##  [48] "UNI.FED.VALES DO JEQUITINHONHA E MUCURI" 
##  [49] "CENTRO FEDERAL DE EDUCACAO TECNOLOGICA -"
##  [50] "CENTRO FEDERAL DE EDUCACAO TECNOLOGICA D"
##  [51] "UNIVERS. TECNOLOGICA FEDERAL DO PARANA"  
##  [52] "UNIVERSIDADE FEDERAL DE ALFENAS"         
##  [53] "UNIVERSIDADE FEDERAL DE ITAJUBA"         
##  [54] "UNIVERSIDADE FEDERAL DE SAO PAULO"       
##  [55] "UNIVERSIDADE FEDERAL DE LAVRAS"          
##  [56] "UNIVERSIDADE FEDERAL RURAL DO SEMI-ARIDO"
##  [57] "FUNDACAO UNIVERSIDADE FEDERAL DO PAMPA"  
##  [58] "UNIVERSIDADE FEDERAL DA INTEGRACAO LATIN"
##  [59] "FUNDACAO UNIVERSIDADE FEDERAL DE RONDONI"
##  [60] "UNIVERSIDADE FEDERAL DO ESTADO DO RIO DE"
##  [61] "FUNDACAO UNIVERSIDADE DO AMAZONAS"       
##  [62] "FUNDACAO UNIVERSIDADE DE BRASILIA"       
##  [63] "FUNDACAO UNIVERSIDADE DO MARANHAO"       
##  [64] "FUNDACAO UNIVERSIDADE FEDERAL DO RIO GRA"
##  [65] "FUNDACAO UNIV. FEDERAL DE UBERLANDIA"    
##  [66] "UNIVERSIDADE FEDERAL DO ACRE"            
##  [67] "UNIVERSIDADE FEDERAL DE MATO GROSSO"     
##  [68] "FUNDACAO UNIVERSIDADE FEDERAL DE OURO PR"
##  [69] "FUNDACAO UNIVERSIDADE FEDERAL DE PELOTAS"
##  [70] "UNIVERSIDADE FEDERAL DO PIAUI"           
##  [71] "FUNDACAO UNIVERSIDADE FEDERAL DE SAO CAR"
##  [72] "FUNDACAO UNIVERSIDADE FEDERAL DE SERGIPE"
##  [73] "UNIVERSIDADE FEDERAL DE VICOSA"          
##  [74] "UNIV. FEDERAL DE MATO GROSSO DO SUL"     
##  [75] "FUNDACAO UNIVERSIDADE FEDERAL DE CIENCIA"
##  [76] "FUNDACAO UNIVERSIDADE FEDERAL DE SAO JOA"
##  [77] "FUNDACAO UNVERSIDADE FEDERAL DO AMAPA"   
##  [78] "FUNDACAO JOAQUIM NABUCO"                 
##  [79] "FUND COORD APERF PESSOAL NIVEL SUPERIOR" 
##  [80] "FUNDACAO UNIVERSIDADE FEDERAL DA GRANDE" 
##  [81] "UNIVERSIDADE FEDERAL DO RECONCAVO DA BAH"
##  [82] "FUNDACAO UNIVERSIDADE FEDERAL DO ABC"    
##  [83] "INSTITUTO FEDERAL DO ACRE"               
##  [84] "INSTITUTO FEDERAL DE ALAGOAS"            
##  [85] "INSTITUTO FEDERAL DO AMAZONAS"           
##  [86] "INSTITUTO FEDERAL BAIANO"                
##  [87] "INSTITUTO FEDERAL DO CEARA"              
##  [88] "INSTITUTO FEDERAL DO ESPIRITO SANTO"     
##  [89] "INSTITUTO FEDERAL GOIANO"                
##  [90] "INSTITUTO FEDERAL DO MARANHAO"           
##  [91] "INSTITUTO FEDERAL DE MINAS GERAIS"       
##  [92] "INSTITUTO FED. DO NORTE DE MINAS GERAIS" 
##  [93] "INSTITUTO FED.DO SUDESTE DE MINAS GERAIS"
##  [94] "INSTITUTO FEDERAL DO SUL DE MINAS GERAIS"
##  [95] "INSTITUTO FEDERAL DE EDUCACAO, CIENCIA E"
##  [96] "INSTITUTO FEDERAL DE MATO GROSSO"        
##  [97] "INSTITUTO FEDERAL DE MATO GROSSO DO SUL" 
##  [98] "INSTITUTO FEDERAL DO PARA"               
##  [99] "INSTITUTO FEDERAL DA PARAIBA"            
## [100] "INSTITUTO FEDERAL DE PERNAMBUCO"         
## [101] "INSTITUTO FEDERAL DO RIO GRANDE DO SUL"  
## [102] "INSTITUTO FEDERAL FARROUPILHA"           
## [103] "INSTITUTO FEDERAL DE RONDONIA"           
## [104] "INSTITUTO FEDERAL CATARINENSE"           
## [105] "INSTITUTO FEDERAL DE SERGIPE"            
## [106] "INSTITUTO FEDERAL DO TOCANTINS"          
## [107] "INSTITUTO FEDERAL DO AMAPA"              
## [108] "INSTITUTO FEDERAL DA BAHIA"              
## [109] "INSTITUTO FEDERAL DE BRASILIA"           
## [110] "INSTITUTO FEDERAL DE GOIAS"              
## [111] "INSTITUTO FEDERAL DO PIAUI"              
## [112] "INSTITUTO FEDERAL DO PARANA"             
## [113] "INSTITUTO FEDERAL DO RIO DE JANEIRO"     
## [114] "INSTITUTO FEDERAL FLUMINENSE"            
## [115] "INSTITUTO FEDERAL DO RIO GRANDE DO NORTE"
## [116] "INSTITUTO FEDERAL SUL RIO-GRANDENSE"     
## [117] "INSTITUTO FEDERAL DE RORAIMA"            
## [118] "INSTITUTO FEDERAL DE SANTA CATARINA"     
## [119] "INSTITUTO FEDERAL DE SAO PAULO"          
## [120] "UNIVERSIDADE FEDERAL DA FRONTEIRA SUL"   
## [121] "UNIVERSIDADE FEDERAL DO OESTE DO PARA"   
## [122] "UNIVERSIDADE DA INTEGRACAO INTERNACIONAL"
## [123] "UNIVERSIDADE FEDERAL DO SUL E SUDESTE DO"
## [124] "UNIVERSIDADE FEDERAL DO CARIRI"          
## [125] "UNIVERSIDADE FEDERAL DO SUL DA BAHIA"    
## [126] "FUNDACAO NACIONAL DO INDIO"              
## [127] "INST.NAC.METROLOGIA,NORM.E QUAL.INDL."   
## [128] "INSTITUTO NACIONAL DA PROPRIEDADE INDUST"
## [129] "POLICIA RODOVIARIA FEDERAL"              
## [130] "MINISTERIO DE MINAS E ENERGIA"           
## [131] "AGENCIA NACIONAL DE ENERGIA ELETRICA"    
## [132] "AGENCIA NAC PETROLEO GAS NAT BIOCOMBUSTI"
## [133] "AGENCIA NACIONAL DE MINERACAO"           
## [134] "MINISTERIO DAS RELACOES EXTERIORES"      
## [135] "FUNDACAO ALEXANDRE DE GUSMAO"            
## [136] "FUNDACAO OSWALDO CRUZ"                   
## [137] "FUNDACAO NACIONAL DE SAUDE"              
## [138] "AGENCIA NACIONAL DE VIGILANCIA SANITARIA"
## [139] "AGENCIA NACIONAL DE SAUDE SUPLEMENTAR"   
## [140] "DEFENSORIA PUBLICA DA UNIAO"             
## [141] "AGENCIA NACIONAL DE TRANSPORTES TERRESTR"
## [142] "AGENCIA NAC. DE TRANSPORTES AQUAVIARIOS" 
## [143] "DEPARTAMENTO NACIONAL DE INFRAESTRUTURA" 
## [144] "MINISTERIO DA DEFESA"                    
## [145] "ADVOCACIA-GERAL DA UNIAO"                
## [146] "MINISTERIO DA CIENCIA, TECNOLOGIA, INOVA"
## [147] "MINISTERIO DO MEIO AMBIENTE"             
## [148] "MINISTERIO DO DESENVOLVIMENTO REGIONAL"  
## [149] "FUNDACAO ESCOLA NACIONAL DE ADMINISTRACA"
## [150] "COMISSAO NACIONAL DE ENERGIA NUCLEAR"    
## [151] "FUNDACAO CASA DE RUI BARBOSA"            
## [152] "FUNDACAO CULTURAL PALMARES"              
## [153] "CONSELHO NAC.DE DESEN.CIEN.E TECNOLOGICO"
## [154] "SUPERINTENDENCIA ZONA FRANCA DE MANAUS"  
## [155] "INSTITUTO BRASILEIRO DO MEIO AMBIENTE E" 
## [156] "GOVERNO DO EX-TERRITORIO DO AMAPA"       
## [157] "GOVERNO DO EX-TERRITORIO DO ACRE"        
## [158] "GOVERNO DO EX-TERRITORIO DE RONDONIA"    
## [159] "GOVERNO DO EX-TERRITORIO DE RORAIMA"     
## [160] "ANTIGO EST.GUANABARA E DISTRITO FEDERAL" 
## [161] "DEP.DE CENTRAL.SERV.DE INATIVOS E PENS." 
## [162] "MINISTERIO DAS COMUNICACOES"             
## [163] "AGENCIA NACIONAL DE TELECOMUNICACOES"    
## [164] "INSTITUTO NAC. DE COLONIZ E REF AGRARIA" 
## [165] "DEPTO. NACIONAL DE OBRAS CONTRA AS SECAS"
## [166] "INSTITUTO BRASILEIRO DE MUSEUS"          
## [167] "AGENCIA NACIONAL DE AGUAS"               
## [168] "INSTITUTO DE PESQ. JARDIM BOTANICO DO RJ"
## [169] "INSTITUTO CHICO MENDES DE CONSERVACAO DA"
## [170] "COMISSAO DE VALORES MOBILIARIOS"         
## [171] "FUND. INST. BRASIL. GEOG. E ESTATISTICA" 
## [172] "INSTITUTO DE PESQUISA ECONOMICA APLICADA"
## [173] "SUPERINTENDENCIA DE SEGUROS PRIVADOS"    
## [174] "MINISTERIO DA INFRAESTRUTURA"            
## [175] "AGENCIA NACIONAL DE AVIACAO CIVIL"       
## [176] "SUPERINTENDENCIA DO DESENV. DA AMAZONIA" 
## [177] "SUPERINTENDENCIA DO DESENV. DO NORDESTE" 
## [178] "MINISTERIO DO TURISMO"                   
## [179] "MINISTERIO DA CIDADANIA"                 
## [180] "FUND.JORGE DUPRAT FIG. SEG. MED.TRABALHO"
## [181] "INSTITUTO NACIONAL DE SEGURO SOCIAL"     
## [182] "CONTROLADORIA-GERAL DA UNIAO"            
## [183] "COMANDO DA MARINHA"
length(unique(df_pensionistas_07_2020$`NOME DO ORGAO`))
## [1] 183
length(colnames(df_pensionistas_07_2020))
## [1] 29

1.12) Renomeação de cabeçalho

A função rename() nos permite renomear alguma coluna do cabeçalho. Outra função interessante para isso é clean_names(), do pacote janitor.

df_pensionistas_07_2020_novo <- df_pensionistas_07_2020 %>%
  rename("servidor_instituidor" = "NOME DO SERVIDOR INSTITUIDOR")
df_pensionistas_07_2020_novo <- df_pensionistas_07_2020 %>%
  janitor::clean_names()

1.13) Outras funções úteis

As funções toupper() e tolower() colocam o texto em letra maiúscula e minúscula.

A função rm_accent() do pacote abjutils elimina o acento do texto.

A função str_trim() elimina espaços excedentes antes e depois do texto.

A função distinct() ajuda a eliminar e identificar duplicatas.

As funções separate() e unite() separam e unem colunas com base no separador indicado.

As funções pivot_longer() e pivot_wider() reorganizam a estrutura de linhas e colunas.

2. Caracterização dos dados

O uso da linguagem de programação R permite uma grande diversidade de análises e descobertas. Muitas delas podem envolver uma elevada complexidade matemática ou de recursos computacionais.

É necessário destacar, no entanto, que no começo de tudo há a necessidade de se conhecer o melhor possível o dado que se tem em mão. Aí é comum o uso de operações de estatística descritiva como mínimo valor, máximo valor, média e mediana, por exemplo.

Observa-se ainda que mesmo para essas operações mais simples é muito frequente a necessiddade de se fazer alguns ajustes para que os dados possam ser corretamente utilizados. Nessa seção vamos fazer alguns exercícios de ajuste do dado e em seguida vamos usar alguns roteiros para caracterização básica dos dados de pensionsitas.

2.1) Um primeiro ajuste nos dados

É importante saber se o dado que estamos utilizando está num formato que se encaixa para o tipo de operações que desejamos efetuar. Uma das situações mais frequentes que enfrentamos é quando os valores numéricos não são imediatamente reconhecidos pelo R.

Isso ocorre quando fazemos importações de dados e elementos como vírgula e ponto que são interpretados pelo R como parte de um texto e não de um número. Isso faz com que o dado não possa ser usado em operações aritméticas simples como soma, por exemplo.

Veja abaixo as seis primeiras informações de rendimento bruto e rendimento líquido da tabela com os dados de pensionistas de julho de 2020.

#a função head traz informações relacionadas às seis primeiras linhas de uma tabela
#o símbolo pipe %>% indica ao r que desejamos fazer alguma operação sobre a tabela.
#nesse caso a operação que desejamos fazer é a seleção das colunas Rendimento Bruto e Rendimento Líquido
head(df_pensionistas_07_2020 %>% 
         select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
##   `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##   <chr>              <chr>               
## 1 1.924,95           1.857,90            
## 2 4.046,19           4.046,19            
## 3 30.305,13          24.518,19           
## 4 5.414,89           5.414,89            
## 5 25.155,49          20.723,33           
## 6 19.105,33          14.866,84

Observe que o resultado do bloco de código anterior é uma tabela de seis linhas com duas colunas. Veja que ambas colunas estão marcadas como chr. Isso indica que o tipo de ambas colunas é texto e não numérico. Essa característica impede fazer operações aritméticas simples, tais como soma. Se tentarmos fazer a operação abaixo…

# tentativa de somar os rendimentos brutos 
# sum(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)

… vamos receber a seguinte mensagem de erro gerada pelo R

O R não permitiu fazer soma dos valores de uma coluna numérica. Precisamos então tratar essas duas colunas. Primeiramente precisamos retirar os pontos e vírgulas para deixar num formato que seja possível indicar ao R que as duas colunas são numéricas. Veja abaixo:

#install.packages("stringr")
library(stringr) # a função str_remove_all está na library stringr
#a função mutate permite fazer alterações nos valores das colunas de uma tabela.
#Nesse caso a função mutate vai fazer alterações nos valores da coluna `RENDIMENTOS BRUTO`
#a função str_remove_all exclui partes de texto.
#Nesse caso, primeiro vai excluir todos os pontos e em seguida todas as vírgulas. Observe que no caso do ponto o R exige que o ponto esteja escrito entre colchetes[].
df_pensionistas_07_2020 <-
      df_pensionistas_07_2020 %>%
      mutate(`RENDIMENTO BRUTO` = str_remove_all(`RENDIMENTO BRUTO`,"[.]"),
             `RENDIMENTO BRUTO` = as.numeric(str_remove_all(`RENDIMENTO BRUTO`,",")))
#no fim vamos repetir novamente a instrução do bloco anterior.
head(df_pensionistas_07_2020 %>% 
         select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
##   `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##                <dbl> <chr>               
## 1             192495 1.857,90            
## 2             404619 4.046,19            
## 3            3030513 24.518,19           
## 4             541489 5.414,89            
## 5            2515549 20.723,33           
## 6            1910533 14.866,84

Observe que agora a coluna “Rendimento Bruto” não está mais marcada como chr e sim como dbl, que é um tipo numérico. Obseve ainda que se compararmos os valores de rendimento bruto antes e após a transformação veremos que o valor está 100 vezes maior. Isso decorre pelo fato de termos retirado a notação da vírgula. Precisamos então dividir a coluna por 100 para recuperarmos o valor correto. Veja abaixo:

#o novo valor da coluna rendimento bruto vai ser o valor que a coluna tem no momento divido por 100
df_pensionistas_07_2020 <-
      df_pensionistas_07_2020 %>%
      mutate(`RENDIMENTO BRUTO` = `RENDIMENTO BRUTO`/100)
#agora executamos novamente a exibição dos seis primeiros valores da tabela
head(df_pensionistas_07_2020 %>% 
         select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
##   `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##                <dbl> <chr>               
## 1              1925. 1.857,90            
## 2              4046. 4.046,19            
## 3             30305. 24.518,19           
## 4              5415. 5.414,89            
## 5             25155. 20.723,33           
## 6             19105. 14.866,84

Perfeito. Agora temos o valor de rendimento bruto já transformado para numérico e está também com o valor correto. A coluna redimento líquido continua com problema. Temos que refazer todo o procedimento feito em redimento bruto na coluna rendimento líquido. É isso o que é feito logo abaixo.

df_pensionistas_07_2020 <-
      df_pensionistas_07_2020 %>%
      mutate(`RENDIMENTO LIQUIDO` = str_remove_all(`RENDIMENTO LIQUIDO`,"[.]"),
             `RENDIMENTO LIQUIDO` = as.numeric(str_remove_all(`RENDIMENTO LIQUIDO`,",")))
df_pensionistas_07_2020 <-
      df_pensionistas_07_2020 %>%
      mutate(`RENDIMENTO LIQUIDO` = `RENDIMENTO LIQUIDO`/100)
head(df_pensionistas_07_2020 %>% 
         select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
##   `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##                <dbl>                <dbl>
## 1              1925.                1858.
## 2              4046.                4046.
## 3             30305.               24518.
## 4              5415.                5415.
## 5             25155.               20723.
## 6             19105.               14867.

Agora que as duas colunas já estão no formato correto, podemos calcular o total de rendimento bruto e de rendimento líquido pago processados em julho de 2020.

#somatório do rendimento bruto
sum(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 2404020856
#somatório do rendimento líquido
sum(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 2009970612

Com isso já temos repostas a uma pergunta que podem interessar quando se trata dos dados de pensionistas: considerando o último mês disponível, qual é o total de rendimentos líquido e bruto pagos pelo governo federal brasileiro? Vamos ver em seguida algumas funções de estatística descritiva que ajudam na formulação da resposta a outras perguntas para essa base.

2.2) Caracterização dos dados de pensionistas

Uma das melhores feramentas para descobrirmos o que caracteriza os dados que esperamos analisar é a estatística descritiva. E antes que se assuste, aqui vamos falar de coisas que já usamos há muito tempo: contagem, média, valor máximo, valor mínimo, mediana e também ordenação de dados por valores.

2.3) Contagem de ocorrências

A base de dados de pensionista é do tipo tabular. As bases tabulares são aquelas que se estruturam em linhas e colunas. A contagem de ocorrências em dados tabulares, nada mais é do que a indicação do número de linhas de uma tabela que se enquadram dentro de um determinado parâmetro.

A tabela que estamos trabalhando se refere às pensões que foram pagas em julho de 2020. Para sabermos o número de pensões que se enquadram nessa característica basta contar o número de linhas da tabela. Veja o bloco de código abaixo.

#a função que indica o número de linhas de uma tabela á NROW. 
NROW(df_pensionistas_07_2020)
## [1] 295468

Utilizando o bloco de código acima descobrimos que 295.468 é o número de pensões pagas em Julho de 2020.

Agora vamos imaginar que queremos saber se há mais pensionistas com pensões temporárias ou vitalícias. Existem algumas formas de se fazer isso. Por enquanto vamos explicar a mais simples que é com o uso de filtros.

#A função filter indica ao R qual a condição de filtro que se deseja executar sobre a tabela.
#No primeiro caso vamos filtrar todas as pensões cuja na ntureza ( campo Natureza Pensao) seja vitalícia
NROW(df_pensionistas_07_2020%>%
  filter(`NATUREZA PENSAO` == "VITALICIA"))
## [1] 198063
#Fazemos a mesma coisa agora com as pensões temporárias
#Observe o operador ==  usado para fazer comparações de igualdade
NROW(df_pensionistas_07_2020%>%
  filter(`NATUREZA PENSAO` == "TEMPORARIA"))
## [1] 97402

Observe no código acima que a função de contagem de linhas NROW não é mais aplicada à tabela completa, mas apenas ao resultado dos dois filtros sobre a tabela.

Com a contagem das linhas dos dois filtros temos que o número de pensões vitalícias corresponde a quase o dobro das pensões temporárias.

2.4) Valores máximos e mínimos

É muito simples descobrir os valores máximos e mínimos de qualquer conjunto de dados usando o R. Veja o bloco de código abaixo para o caso do valor máximo.

# Max: a função para descobrir o valor máximo 
#Logo abaixo temos o valor máximo de rendimento bruto
max(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 650661.1
#E aqui o valor máximo de rendimento líquido
max(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 650661.1

E aqui abaixo veja como descobrimos o valor mínimo

# Min: a função para descobrir o valor mínimo 
#Logo abaixo temos o valor mínimo de rendimento bruto
min(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 0
#E aqui o valor mínimo de rendimento líquido
min(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 0

Observe que aparecem valores estranhos ao que esperaríamos. No caso do valor máximo, os rendimentos bruto e líquido são iguais e esperaríamos o bruto > líquido.

Já no caso de valor mínimo os valores estão zerados para ambas variáveis.

Esse é um tipo de situação comum em ciência de dados: identificar ocorrência inesperadas que requerem maiores investigações e eventualmente faxina dos dados. Aqui vamos tentar investigar um pouco mais do que se tratam esses dados. Uma opção interessante é usar o ordenamento de valores e descobrir mais informações que possam nos ajudar a tomar decisões sobre os dados.

Vamos começar ordenando os valores em ordem decrescente e capturando apenas as 10 primeiras linhas

# a função slice_max vai nos trazer os n maiores valores de um conjunto de dados de acordo com uma variável que indicarmos.
# no caso abaixo o n=10 (os dez maiores valores) da variável rendimento bruto
# o select que vem logo em seguida indica ao R que queremos que sejam exibidas apenas as colunas `NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`
df_pensionistas_07_2020 %>%
  slice_max(`RENDIMENTO BRUTO`,n=10) %>%
  select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 10 x 3
##    `NOME DO SERVIDOR INSTITUIDOR`          `RENDIMENTO BRUT… `RENDIMENTO LIQUID…
##    <chr>                                               <dbl>               <dbl>
##  1 HEBER MARANHAO RODRIGUES                          650661.             650661.
##  2 JOAO BATISTA ALVES NOVAES                         398633.             289414.
##  3 JORGE VARGAS                                       97177.              43150.
##  4 JOSE GERALDO RODRIGUES DE ALCKMIN                  92703.              45286.
##  5 LAERTE NEPOMUCENO VIANNA                           89566.              60070.
##  6 RAIMUNDO HOLANDA FARIAS                            80604.              54696.
##  7 MOACYR CORREA NUNES                                79949.              52322.
##  8 ALBERICO ALUCIO DE ALCANTARA VELHO BAR…            79805.              78725.
##  9 ARMANDO LEITE ROLLEMBERG                           78222.              37438.
## 10 CARLOS ANTONIO SOARES MEIRELLES                    77152.              53604.

Como se vê, pode-se descartar problemas maiores na base já que da amostra dos 10 valores brutos mais elevados, apenas justamente o maior rendimento bruto tem valor igual ao maior rendimento líquido. Existem algumas possibilidades para que isso ocorra, mas pode ser um erro mesmo da base. O R nos ajudou aqui a descobrir com certa facilidade um ponto de investigação.

Agora vamos tentar ver o que está por trás dos valores mínimos zerados. As próximas linhas de código tratam disso

# a função slice_min vai nos trazer os n menores valores de um conjunto de dados de acordo com uma variável que indicarmos.
# no caso abaixo o n=10 (os dez maiores valores) da variável rendimento bruto
# o select que vem logo em seguida indica ao R que queremos que sejam exibidas apenas as colunas `NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`
df_pensionistas_07_2020 %>%
  slice_min(`RENDIMENTO BRUTO`, n=10) %>%
  select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 3,722 x 3
##    `NOME DO SERVIDOR INSTITUIDOR`     `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##    <chr>                                           <dbl>                <dbl>
##  1 MARIA RODRIGUES DA SILVA                            0                    0
##  2 JOSE FRANCISCO DOS SANTOS                           0                    0
##  3 WALTER PEREIRA PINTO                                0                    0
##  4 FERNANDO ROCHA DA SILVA                             0                    0
##  5 FRANCISCO MONTEIRO MENDES DA COSTA                  0                    0
##  6 MAXIMINO OLIVEIRA DA SILVA                          0                    0
##  7 ISAAC SIMINANKRU MARINHO XERENTE                    0                    0
##  8 BENEVENUTO RIEDEL                                   0                    0
##  9 RAIMUNDO SILVINO                                    0                    0
## 10 RAIMUNDO SILVINO                                    0                    0
## # … with 3,712 more rows

Observe que o R indica que o resultado do código é uma tabela com o número de linhas bem maior do que esperávamos: ## # A tibble: 3,722 x 3. São mais de 3.700 linhas a mais. Isso se deve porque existem 3.722 linhas em que o valor de rendimento bruto = 0. Esse achado sugere que o valor mínimo da base bruta não caracteriza por si só os menores valores de rendimento bruto ou de rendimento líquido. É preciso retirar da nossa análise essas linhas para chegarmos a valores mais apropriados. Vamos ver como se faz isso no bloco de código abaixo.

#nesse bloco de código, antes de descobrirmos os valores mínimos fazemos o filtro para que permaneçam na nossa análise apenas as linhas da tabela que tenham valor de rendimento bruto >= 0.01. Para isso usamos a função filter
df_pensionistas_07_2020 %>%
  filter(`RENDIMENTO BRUTO`>=0.01)%>%
  slice_min(`RENDIMENTO BRUTO`, n=10) %>%
  select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 11 x 3
##    `NOME DO SERVIDOR INSTITUIDOR`    `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
##    <chr>                                          <dbl>                <dbl>
##  1 <NA>                                             5.4                  5.4
##  2 <NA>                                            16.0                 16.0
##  3 JUSTO SEREHITE                                  17.8                 17.8
##  4 <NA>                                            28.8                 28.8
##  5 JOAO GUILHERME DA SILVA                         35.4                 35.4
##  6 CARLOS ALBERTO DE LIMA PINTO                    45.6                 45.6
##  7 FRANCISCO DE ASSIS DE SOUZA RAMOS               46.9                 39.9
##  8 MIGUEL SILVA DE SOUZA                           54.5                 54.5
##  9 NEWTON SALGADO                                  68.8                 68.8
## 10 <NA>                                            69.4                 69.4
## 11 <NA>                                            69.4                 69.4

Agora temos a informação no caminho que desejamos. Muito embora os valores ainda estejam muito baixos. Observe ainda que existem algumas linhas em que não há informação do servidor instituidor. Isso sugere uma tarefa de avaliação dos valores ausentes e tentar entender o que gera esses valores tão baixos para tomar decisão sobre o que fazer na faxina de dados. Mas isso é outro assunto. Por enquanto parece que está fácil de caracterizar os valores mínimos e máximos com as instruções que passamos até agora, que é o objetivo dessa seção.

2.5) Médias e medianas

A média e a mediana são conhecidas como medidas de centralidade na estatística. A função delas é caracterizar um conjunto de dados. É importante conhecer as duas medidas já que em algumas situações uma pode ser mais recomendada que a outra.

Vamos começar com o cálculo da média. Lembrando que essa medida é calculada pela somatória dos valores/número de valores. No bloco abaixo vamos conhecer o uso da média no R.

# a função mean faz o cálculo da média
# abaixo a média dos rendimentos brutos e dos rendimentos líquidos
mean(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 8136.315
mean(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 6802.668

Como era de se esperar a média dos valores de rendimento bruto é maior do que o rendimento líquido.

Agora vamos ver o cálculo da mediana. Antes, vale recordar que a mediana é uma medida de posição. É o valor que fica no meio de uma série de valores ordenados.

Se temos, por exemplo, onze valores numéricos, ordenamos esses valores e a mediana será o valor que ficar na posição 6, já que teremos cinco valores maiores e cinco valores menores do que o que está na posição 6.

# a função median faz o cálculo da média
# abaixo a mediana dos rendimentos brutos e dos rendimentos líquidos
median(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 5799.02
median(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 5179.965

Observe que quando se trata de mediana, novamente o valor relativo a rendimento bruto é maior do que o relativo a rendimento líquido. Mas esse achado dos valores da mediana traz alguns pontos para análise

  • O primeiro é que a diferença entre as duas medianas é bem menor do que a diferença entre as duas médias

  • O segundo é que os valores de médias para ambas variáveis, mas principalmente para rendimento bruto, é bem maior do que a mediana.

Essas situações são relativamente comuns. É importante entender a dinãmica de formação desses valores e a distribuição dos valores para encontrar o que melhor caracteriza os dados, se a média ou mediana. Esse é um assunto importante e que deve ser melhor explorado. Aqui foge do objetivo dessa aula.

3. Trabalhando as colunas da tabela

Usando as funções do pacote tidyverse fica muito fácil de se trabalhar com colunas em tabelas do R. Às vezes é necessario alterar valores e tipos. E algumas vezes é também interessante acrescentar novas colunas que são formadas a partir de colunas já previamente existente. Vamos explorar um pouco essas possibildiades nesse bloco.

3.1) Modificando colunas tipo data

Na seção anterior vimos como fazer modificações nas duas colunas relativas a valores numéricos. Outro tipo de variável que é bem comum fazermos modificações são as do tipo data. Na tabela que estamos trabalhando as datas estão em um formato pouco usual e que não é rapidamente reconhecida pelo R como data. Isso impede a possibilidade de se fazer operações de data que possam responder, por exemplo, qual a pensão mais antiga paga em Julho de 2020.

Antes de prosseguirmos mostrando como se faz a transformação de variável tipo data, é interessante dar uma olhada em algumas amostras de datas para duas variáveis desse tipo.

head(df_pensionistas_07_2020%>%
       select(`DATA INICIO DO BENEFICIO`, `DATA DE NASCIMENTO` ))
## # A tibble: 6 x 2
##   `DATA INICIO DO BENEFICIO` `DATA DE NASCIMENTO`
##   <chr>                      <chr>               
## 1 10021998                   18041951            
## 2 25012016                   14011948            
## 3 13102012                   18031954            
## 4 20112012                   27111943            
## 5 21082018                   10051935            
## 6 26042000                   18041925

Observe que as datas são formadas pela concatenação de dia, mês e ano. Por exemplo, na primeira linha a data 10021998 corresponde a 10/02/1998. O nosso objetivo é fazer uma transformação para que o R possa compreender que isso é uma data. Para o R uma data tem que estar no formato aaaa-mm-dd. No caso da data exemplificada essa data teria que ser representada como 1998-02-10.

No bloco de código logo abaixo vamos ver como fazemos modificações em colunas

#para podermos usar as funções que facilitam o trabalho com datas é necessário usar o pacote lubridate. Lembre de instalá-lo antes, caso não esteja ainda instaldo, usando a função install.package()
library(lubridate)
#A função dmy indica que a variável que está sendo passada como parâmetro está no formato dia, mês, ano. Com essa informação o R é capaz de fazer a transformação e gerar a data correta
df_pensionistas_07_2020<-
df_pensionistas_07_2020 %>%
  mutate(`DATA INICIO DO BENEFICIO` = dmy(`DATA INICIO DO BENEFICIO`),
         `DATA DE NASCIMENTO` = dmy(`DATA DE NASCIMENTO`)) 
head(
df_pensionistas_07_2020%>%
  select(`DATA INICIO DO BENEFICIO`, `DATA DE NASCIMENTO`))
## # A tibble: 6 x 2
##   `DATA INICIO DO BENEFICIO` `DATA DE NASCIMENTO`
##   <date>                     <date>              
## 1 1998-02-10                 1951-04-18          
## 2 2016-01-25                 1948-01-14          
## 3 2012-10-13                 1954-03-18          
## 4 2012-11-20                 1943-11-27          
## 5 2018-08-21                 1935-05-10          
## 6 2000-04-26                 1925-04-18

Observe agora que as duas datas que trabalhamos já estão no formato correto e podem ser usadas em operações típicas de data.

3.2) Acresecentando colunas derivadas de data

A partir das duas colunas que acabamos de fazer os ajustes, vamos criar duas novas colunas que indicam o tempo de recebimento da pensão e idade de beneficiário. Vamos ver como isso pode ser feito.

# Para fazermos o cálculo das duas novas variáveis vamoos precisar usar mais duas  funções que estão no pacote lubridate que já foi carregado no bloco de códigos anterior. Essas funções são today e year
# A função today informa a data de hoje
# A função year informa o ano de uma determinada data
df_pensionistas_07_2020<- 
df_pensionistas_07_2020 %>%
  mutate(tempo_recebimento_pensao = year(today()) - year(`DATA INICIO DO BENEFICIO`)) %>%
  mutate(idade_beneficario = year(today()) - year(`DATA DE NASCIMENTO`))
df_pensionistas_07_2020 %>%
  select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao, idade_beneficario)
## # A tibble: 295,468 x 3
##    `NOME DO BENEFICIARIO`           tempo_recebimento_pensao idade_beneficario
##    <chr>                                               <dbl>             <dbl>
##  1 CARMEN LUCINDA FARKAS DE ARAUJO                        22                69
##  2 MARIA DE LOURDES DA SILVA                               4                72
##  3 MARIZETE DIAS SOUZA                                     8                66
##  4 MARGARIDA ALEXANDRIA                                    8                77
##  5 MARIA JOSE PINTO LIMA                                   2                85
##  6 MARIA AMELIA DE ARAUJO LIMA                            20                95
##  7 ELI DA SILVA JORGE                                      2                85
##  8 MARIA DO SOCORRO PESSOA DE SOUSA                        3                44
##  9 DEIVID PEREIRA DE SOUSA                                 3                19
## 10 GABRIEL PEREIRA DE SOUSA                                3                15
## # … with 295,458 more rows

Aqui vale explorar um pouco mais o bloco de código logo acima. Começando pelo trecho abaixo

year(today())

Esse trecho vai trazer como resultado o ano [função year] referente à data de hoje [função today()]

Vamos analisar agora esse outro trecho de código

tempo_recebimento_pensao = year(today()) - year(`DATA INICIO DO BENEFICIO`)

Aqui estamos calculando o intervalo em anos entre duas datas. No caso, a diferença entre o ano da data de hoje e a data do início do benefício

Agora que já temos a data de início do benefício, podemos saber, por exemplo, quem são os 10 beneficiários com os maiores tempos de benefício.

#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
  slice_max(tempo_recebimento_pensao, n=10) %>%
  select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao)
## # A tibble: 13 x 2
##    `NOME DO BENEFICIARIO`            tempo_recebimento_pensao
##    <chr>                                                <dbl>
##  1 WANDA CARDOSO TOROK                                    107
##  2 MARIA DE PAIVA GUSMAO                                  100
##  3 ZILDA SAMPAIO ORSANO                                    99
##  4 MARINA RITA ABRANCHES DE OLIVEIRA                       99
##  5 ARMINDA SA STIEBLER                                     99
##  6 OLINDA ROSA DE CARVALHO                                 98
##  7 ISOLINA GONZAGA BENTES                                  97
##  8 JURANDYR GOMES DA SILVA MELLO                           97
##  9 LUIZA VASCONCELOS DE JESUS                              96
## 10 CECILIA LINO MOREIRA                                    96
## 11 LAURA MARIA BRANDAO                                     96
## 12 MARIA CLEO VASCONCELOS SALEM                            96
## 13 URBANA DOS PASSOS SOUZA                                 96

Temos então a impressionante informação de que existem benefícios seculares. Se isso não for erro da base, dá uma boa dica de matéria, não é mesmo?

E que tal agora descobrirmos os beneficiários mais velhos. Vamos seguir a mesma lógica do bloco de código anterior.

#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
  slice_max(idade_beneficario, n=10) %>%
  select(`NOME DO BENEFICIARIO`, idade_beneficario)
## # A tibble: 10 x 2
##    `NOME DO BENEFICIARIO`        idade_beneficario
##    <chr>                                     <dbl>
##  1 DULCINA RIBEIRO                             120
##  2 MERCEDES DA COSTA LOUREIRO                  118
##  3 WILHERMINE LUEB HEIDEGGER                   117
##  4 ALICE TAVARES DE OLIVEIRA                   117
##  5 ANGELINA DINARDI                            116
##  6 AMANDA GALVAO DE SA CAMPOS                  115
##  7 ANNA DOS SANTOS DIAS                        115
##  8 ALMERINDA FERRARI DE OLIVEIRA               115
##  9 FRANCISCA LUIZA DE OLIVEIRA                 115
## 10 LEONIRA FERREIRA DE MORAIS                  114

Novamente as informações que aparecem são de chamar muita atenção. A lista dos beneficários mais idosos são de super-centenários. De novo isso indica ou problema na base ou uma dica de matérias muito interessantes.

Isso nos leva à curiosidade de fazer novas ordenações, levando agora em consideração as duas informações de tempo de benefício e idade do beneficiário no resultado da consulta.

#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
  slice_max(idade_beneficario, n=10) %>%
  select(`NOME DO BENEFICIARIO`, idade_beneficario, tempo_recebimento_pensao)
## # A tibble: 10 x 3
##    `NOME DO BENEFICIARIO`        idade_beneficario tempo_recebimento_pensao
##    <chr>                                     <dbl>                    <dbl>
##  1 DULCINA RIBEIRO                             120                       53
##  2 MERCEDES DA COSTA LOUREIRO                  118                       45
##  3 WILHERMINE LUEB HEIDEGGER                   117                       NA
##  4 ALICE TAVARES DE OLIVEIRA                   117                       73
##  5 ANGELINA DINARDI                            116                       29
##  6 AMANDA GALVAO DE SA CAMPOS                  115                       27
##  7 ANNA DOS SANTOS DIAS                        115                       16
##  8 ALMERINDA FERRARI DE OLIVEIRA               115                       NA
##  9 FRANCISCA LUIZA DE OLIVEIRA                 115                       29
## 10 LEONIRA FERREIRA DE MORAIS                  114                        7
#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
  slice_max(tempo_recebimento_pensao, n=10) %>%
  select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao, idade_beneficario)
## # A tibble: 13 x 3
##    `NOME DO BENEFICIARIO`            tempo_recebimento_pensao idade_beneficario
##    <chr>                                                <dbl>             <dbl>
##  1 WANDA CARDOSO TOROK                                    107               107
##  2 MARIA DE PAIVA GUSMAO                                  100               101
##  3 ZILDA SAMPAIO ORSANO                                    99                98
##  4 MARINA RITA ABRANCHES DE OLIVEIRA                       99               104
##  5 ARMINDA SA STIEBLER                                     99               102
##  6 OLINDA ROSA DE CARVALHO                                 98               101
##  7 ISOLINA GONZAGA BENTES                                  97                99
##  8 JURANDYR GOMES DA SILVA MELLO                           97               110
##  9 LUIZA VASCONCELOS DE JESUS                              96               100
## 10 CECILIA LINO MOREIRA                                    96                97
## 11 LAURA MARIA BRANDAO                                     96                99
## 12 MARIA CLEO VASCONCELOS SALEM                            96                96
## 13 URBANA DOS PASSOS SOUZA                                 96                98

3.3) Acrescentando colunas resultadas de valores numéricos

Vimos o ganho de análises quando acrescentamos novas colunas a partir de infomações de data. Agora vamos acrescentar uma outra coluna, faixa de rendimento bruto, que no caso será de tratamento de coluna de valor numérico.

#para identificar as faixas salariais usamos duas funcões case_hwen e betewwem
# a função case_when testa condições para identificar o valor que uma variável vai assumir.
#No caso, a função case_when vai testar condições sobre a variável rendimento bruto para gerar o valor para a variável faixa_rendimento_bruto
# a função between indica se um dado valor está dentro de uma faixa de valores numéricos
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
  mutate(faixa_rendimento_bruto = case_when(
    `RENDIMENTO BRUTO`<=2000 ~ '0-2000 reais',
    between(`RENDIMENTO BRUTO`,2001, 4000) ~ 'Faixa 1: 2001-4000 reais',
    between(`RENDIMENTO BRUTO`,4001, 6000) ~ 'Faixa 2: 4001-6000 reais',
    between(`RENDIMENTO BRUTO`,6001, 8000) ~ 'Faixa 3: 6001-8000 reais',
    between(`RENDIMENTO BRUTO`,8001, 10000) ~ 'Faixa 4: 8001-10000 reais',
    between(`RENDIMENTO BRUTO`,10001, 15000) ~ 'Faixa 5: 10001-15000 reais',
    `RENDIMENTO BRUTO` >= 15001 ~'Faixa 5: 15001 reais ou mais')
    
  ) 

Com a execução do bloco de código acima, a tabela já possui a informação da faixa de valores de rendimento bruto que será usada para tratamento de agrupamentos.

3.4) Acrescentando colunas de outras tabelas

Uma das possiblidades interessantes de se trabalhar com linguagem de programação, como o R, é a facilidade de se fazer cruzamentos com outras tabelas.

Vamos imaginar, por exemplo, que queremos identificar fenômenos que relacionem o recebimento de pensões à abertura de empresas. Para isso, vamos cruzar a tabela de pensionistas com a tabela de sócios de empresas, disponível no Brasil.io.

#A função ReadDS permite ao R trabalhar com objetos já trabalhados em outras sessões de uso da linguagem
socio_amostra <- readRDS("data/socio_amostra.rds")
#Para que se possa trabalhar a junção de duas tabelas, é recomendável que ambas tabelas tenham uma coluna com o mesmo nome, tipo e significado. Nesse caso a tabela socio_amostra possui uma coluna chamada chave que é composta pela junção do CPF e do nome do beneficiário. Vamos então criar uma nova coluna na tabela de pensionistas que estamos trabalhando que vai ter exatamente essas mesmas características. Para isso, usamos a função mutate.


df_pensionistas_07_2020<-
df_pensionistas_07_2020 %>%
  mutate( chave= str_c(`CPF DO BENEFICIARIO`, `NOME DO BENEFICIARIO`))


#Após garantirmos que as duas tabelas têm um campo em comum usamos a função inner_join que vai juntar a tabela df_pensionistas_07_2020 com a tabela socio_amostra. O resultado dessa junção é armazenado numa nova tabela: df_Pensionista_socio
df_Pensionista_socio<-
df_pensionistas_07_2020 %>%
  inner_join(socio_amostra)

Acabamos de criar uma outra tabela com 300 linhas que apresentam todas os pensionistas que foram localizadas numa tabela que tem 300.000 CPFs ligados a alguma sociedade de empresa. Um exercício interessante a ser feito aqui é tentar diferenciar o grupo dos pensionistas sócios do conjunto total dos pensionistas em julho de 2020. Vamos comparar, por exemplo, a média dos rendimentos brutos e líquidos.

#Comparação de médias de rencimentos bruntos
mean(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 8136.315
mean(df_Pensionista_socio$`RENDIMENTO BRUTO`)
## [1] 11305.28
#Comparação de médias de idade de beneficiário
mean(df_pensionistas_07_2020$idade_beneficario, na.rm = TRUE)
## [1] 69.21876
mean(df_Pensionista_socio$idade_beneficario, na.rm = TRUE)
## [1] 69.87021
#Comparação de médias de tempo de rendimento de pensão
mean(df_pensionistas_07_2020$tempo_recebimento_pensao, na.rm = TRUE)
## [1] 20.67559
mean(df_Pensionista_socio$tempo_recebimento_pensao, na.rm = TRUE)
## [1] 16.32153

Observando o que sai nas nas seis linhas de código acima, parece que as médias de rendimento bruto de pensionistas que são sócios é bem maior do que a mesma média do conjunto total. Já quando se vê a comparação das idades dos beneficiários não há praticamente diferença nas médias. Por outro lado volta a ter diferença nas médias quando se compara o tempo de recebimento das pensões.

4. Agrupando e filtrando dados

4.1) Agrupar por órgão

Agora vamos fazer algo parecido com a tabela dinâmica do Excel / Google Spreadsheet. Para agrupar os dados usamos group_by() e informamos por qual coluna queremos agrupar.

Em seguida, o summarise() - ou summarize() - vai contar o número de linhas, com n(). E também vai somar os valores da coluna “RENDIMENTO BRUTO”, com sum().

pens_orgao <- df_pensionistas_07_2020 %>%
  group_by(`NOME DO ORGAO`) %>%
  summarise(contagem = n(),
            soma = sum(`RENDIMENTO BRUTO`))

4.2) Agrupar por tipo de beneficiário

A única diferença em comparação com o código anterior é a coluna informada em group_by().

pens_beneficiario <- df_pensionistas_07_2020 %>%
  group_by(`TIPO DE BENEFICIARIO`) %>%
  summarise(contagem = n(),
            soma = sum(`RENDIMENTO BRUTO`))

4.3) Agrupar por tipo de pensão (vitalícia, temporária)

Novamente, só vamos mudar a coluna informada dentro de group_by().

pens_tipo <- df_pensionistas_07_2020 %>%
  group_by(`NATUREZA PENSAO`) %>%
  summarise(contagem = n(),
            soma = sum(`RENDIMENTO BRUTO`))

4.4) Agrupar por UF

Mudamos novamente a coluna informada dentro de group_by(). Além de n() e sum(), aqui também usamos mean() e median().

pens_uf <- df_pensionistas_07_2020 %>%
  group_by(`UF DA UPAG DE VINCULACAO`) %>%
  summarise(contagem = n(),
            soma = sum(`RENDIMENTO BRUTO`),
            média = mean(`RENDIMENTO BRUTO`),
            mediana = median(`RENDIMENTO BRUTO`))

4.5) Filtrar por órgão e ver quem ganha mais

Usamos o filter() para filtrar o órgão de interesse. Depois, usamos arrange() para ordenar em ordem decrescente, com desc().

pens_orgao_MS <- df_pensionistas_07_2020 %>%
  filter(`NOME DO ORGAO` == "MINISTERIO DA SAUDE") %>%
  arrange(desc(`RENDIMENTO BRUTO`))

4.6) Filtrar por órgão e cargo e ver quem ganha mais

Aqui usamos o filter() novamente. Desta vez, definimos interesses em duas colunas. Os dois quesitos precisam ser cumpridos.

pens_cargo_MS_MEDICO <- df_pensionistas_07_2020 %>%
  filter(`NOME DO ORGAO` == "MINISTERIO DA SAUDE" &
           `CARGO SERVIDOR INSTITUIDOR` == "MEDICO") %>%
  arrange(desc(`RENDIMENTO BRUTO`))

4.7) Filtrar por três órgãos e ver quem ganha mais

Agora, pedimos ao filter() para manter apenas as linhas em que aparece alguma daquelas siglas.

pens_cargo_MS_ME_MCTIC <- df_pensionistas_07_2020 %>%
  filter(`SIGLA DO ORGAO` == "MS" |
         `SIGLA DO ORGAO` == "ME" |
         `SIGLA DO ORGAO` == "MCTIC") %>%
  arrange(desc(`RENDIMENTO BRUTO`))

5. Baixando e salvandos os dados

Conforme já dito logo no início, os dados com que estamos trabalhando estão disponíveis na internet. Vamos ver como podemos usar o R para baixar esses dados para seu ambiente computacional. Também vamos ver como salvar o trabalho que você fez em arquivo CSV para ser aproveitado em outros usos que não seja a partir da linguagem R e, por fim, você vai prender a ler vários arquivos com um único comando.

5.1) Download automatizado do CSV

É muito simples fazer o download de um arquivo CSV. Basta uma única instrução. Veja abaixo.

# A função downloadfile vai fazer o download a partir de um endereço de internet especificado e acrescentar o arquivo numa pasta de destino informada
download.file("http://repositorio.dados.gov.br/segrt/pensionistas/PENSIONISTAS_072020.zip", destfile = "data/PENSIONISTAS_072020.zip", mode="wb")

Você vai observar na pasta destino que esse arquivo veio zipado. Isso vai dificultar a maior parte dos trabalhos que queiramos fazer com o arquivo. O mais interessnate é descompactá-lo e em seguida trabalhar com o formato CSV. Veja abaixo como fazer isso.

unzip(zipfile = "data/PENSIONISTAS_072020.ZIP", exdir = "data/csv")

5.2) Salvando o trabalho

A função write.csv() salva o dataframe que você criou usando o R. Basta informar o nome do dataframe e, em seguida, o nome do arquivo que você quer gerar e a extensão CSV.

write.csv(pens_cargo_MS_ME_MCTIC, "pens_cargo_MS_ME_MCTIC.csv")

5.3) Leitura de vários arquivos

Baixamos todos os CSVs referentes aos meses de 2020. Em seguida, lemos o CSV com o fread() no RStudio e logo salvamos o dataframe com saveRDS(). Para janeiro de 2020, por exemplo, veja abaixo.

OBS: Você não precisa fazer isso porque todos os arquivos RDS já estão salvos dentro de uma pasta chamada “pensionistas_2020”, que está dentro da pasta “data”.

PENSIONISTAS_012020 <- fread(“PENSIONISTAS_012020.csv”) saveRDS(PENSIONISTAS_012020, file = “PENSIONISTAS_012020.rds”)

Abaixo listamos os arquivos RDS que estão na nossa pasta.

arquivos <- list.files("data/pensionistas_2020")

Agora vamos informar dentro de map_df() o caminho (“data/pensionistas_2020/”), seguido pelo nome dos arquivos (estão guardados dentro “arquivos”), a função readRDS (que faz a leitura de RDS) e também .id = "source" para uma coluna difereciar o arquivo de origem.

getwd()
## [1] "/Users/gabrielacaesar/Downloads/oficina-R-master"
pensionistas_2020_all <- map_df(paste0("data/pensionistas_2020/", arquivos), readRDS, .id = "source")

6. Agradecimentos

6.1) Fim

Obrigado por acompanhar a oficina até aqui. Há inúmeras possibilidades com o R, então não deixe de pesquisar e buscar por outros materiais.

Obrigado também à Abraji pela iniciativa e pelo convite.

Caso queira entrar em contato, nós estamos disponíveis aqui:

Gabriela Caesar - Twitter / Site
Fernando Barbalho - Twitter