3 Lendo os dados

Após o entendimento do problema/projeto que se resolverá com a ciência de dados, será necessário fazer com que o R leia os dados. Seja lá qual for o assunto do projeto, é muito importante garantir uma boa fonte de dados. Dados ruins, inconsistentes, não confiáveis ou mal formatados podem gerar muita dor de cabeça para o analista.

3.1 Tipos de Estrutura dos Dados

Os dados podem ser apresentados de diversas maneiras, não existe um padrão único para a difusão ou divulgação. Sendo assim, é bom que você esteja preparado para lidar com qualquer tipo de estrutura de dados.

Existem diversas classificações de estrutura de dados. Vamos utilizar uma classificação mais generalista, que diz respeito a como os dados são disponibilizados. Sendo assim, podemos classificar os dados em três grandes tipos quanto à sua estrutura ou forma: dados estruturados, semiestruturados e não estruturados.

3.1.1 Dados Estruturados

Talvez seja o formato de dados mais fácil de se trabalhar no R. São conjuntos de informações organizadas em colunas (atributos, variáveis, features etc.) e linhas (registros, itens, observações etc.). São dados mais comumente encontrados diretamente em bancos de dados, arquivos com algum tipo de separação entre as colunas, Excel, arquivos com campos de tamanho fixo etc.

3.1.2 Dados Não Estruturados

Como o nome diz, estes dados não têm uma estrutura previsível, ou seja, cada conjunto de informações possui uma forma única. Geralmente são arquivos com forte teor textual. Não podemos dizer que são dados “desorganizados,” e sim que são organizações particulares para cada conjunto de informações. Podemos citar, por exemplo, e-mails, twitters, PDF, imagens, vídeos etc.

Analisar este tipo de dado é muito mais complexo e exige conhecimento avançado em mineração de dados. Apesar disso, é o tipo de dado mais abundante na realidade.

3.1.3 Dados Semiestruturados

São dados que também possuem uma organização fixa, porém não seguem o padrão de estrutura linha/coluna, ou seja, seguem uma estrutura mais complexa e flexível, geralmente hierárquica, estruturada em tags ou marcadores de campos. São exemplos de arquivos semiestruturados: JSON, XML, HTML, YAML etc. É o formato mais usado em troca de dados pela internet e consumo de Application programming interface (API). Dados semiestruturados, algumas vezes, são facilmente transformados em dados estruturados.

3.2 Definindo o Local dos Dados

O R sempre trabalha com o conceito de Working direcotry, ou seja, uma pasta de trabalho onde vai “ler” e “escrever” os dados. Para verificar qual o diretório que o R está “olhando,” utilize o seguinte comando:

getwd() #Get Working Directory

Para informar ao R em qual pasta ele deve ler os arquivos, utilizamos o comando set working directory, que muda o diretório padrão do R para leitura e escrita:

setwd('D:/caminho/do/arquivo/arquivo.csv')

3.3 Pacote para leitura dos dados

O R base possui funções para a leitura dos principais tipos de arquivos. Um outro pacote específico, e muito bom para isso, é o readr. O Tidyverse inclui o carregamento do pacote readr.

Diversos tipos de arquivos são lidos pelo R: Comma-Separated Values (csv), Excel, arquivos separados por delimitadores, colunas de tamanho fixo etc. Talvez o tipo de arquivo (estruturado) mais comum hoje em dia, e mais simples de trabalhar, seja o csv. Começaremos a importar dados com arquivos csv.

library(tidyverse) # já carrega o readr

Vamos importar um csv chamado Ano-2020.csv.zip, que corresponde ao dataset de despesas pela Cota para Exercício da Atividade Parlamentar. Caso o arquivo esteja em seu working directory (getwd()), basta passar apenas o nome do arquivo para a função, caso contrário será necessário informar todo o caminho até a pasta do arquivo. Usamos o read_csv() para fazer isso.

library(readr)
df <- readr::read_csv2("dados/Ano-2020.csv")

Esse comando carrega o conteúdo do arquivo Ano-2020.csv para o objeto (variável) df. Após o carregamento, começaremos a investigar o conteúdo desse objeto: os dados.

O head e o tail são funções para ver a “cabeça” e o “rabo” dos seus dados, ou seja, o começo e o fim das amostras. É muito importante sempre observar a “aparência” dos dados após o carregamento. Essa observação ajuda a identificar erros básicos no carregamento, possibilitando ajustes o quanto antes, impedindo que esses erros se propaguem. Repare que na primeira linha temos os nomes das colunas e, em seguida, os registros.

head(df)
## # A tibble: 6 × 31
##   txNomeParlamentar         cpf ideCadastro nuCarteiraParlamentar nuLegislatura sgUF  sgPartido codLegislatura numSubCota txtDescricao
##   <chr>                   <dbl>       <dbl>                 <dbl>         <dbl> <chr> <chr>              <dbl>      <dbl> <chr>       
## 1 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          4 CONSULTORIA…
## 2 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          4 CONSULTORIA…
## 3 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          4 CONSULTORIA…
## 4 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          4 CONSULTORIA…
## 5 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          5 DIVULGAÇÃO …
## 6 LIDERANÇA DO DEMOCRATAS    NA          NA                    NA          2019 <NA>  <NA>                  56          5 DIVULGAÇÃO …
## # … with 21 more variables: numEspecificacaoSubCota <dbl>, txtDescricaoEspecificacao <chr>, txtFornecedor <chr>,
## #   txtCNPJCPF <chr>, txtNumero <chr>, indTipoDocumento <dbl>, datEmissao <dttm>, vlrDocumento <chr>, vlrGlosa <chr>,
## #   vlrLiquido <chr>, numMes <dbl>, numAno <dbl>, numParcela <dbl>, txtPassageiro <chr>, txtTrecho <chr>, numLote <dbl>,
## #   numRessarcimento <dbl>, vlrRestituicao <lgl>, nuDeputadoId <dbl>, ideDocumento <dbl>, urlDocumento <chr>
tail(df)
## # A tibble: 6 × 31
##   txNomeParlamentar         cpf ideCadastro nuCarteiraParlamentar nuLegislatura sgUF  sgPartido codLegislatura numSubCota txtDescricao
##   <chr>                   <dbl>       <dbl>                 <dbl>         <dbl> <chr> <chr>              <dbl>      <dbl> <chr>       
## 1 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56          9 PASSAGEM AÉ…
## 2 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56          9 PASSAGEM AÉ…
## 3 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56         10 TELEFONIA   
## 4 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56         11 SERVIÇOS PO…
## 5 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56         11 SERVIÇOS PO…
## 6 Jorge Goetten     43927998915      214694                   563          2019 SC    PL                    56         11 SERVIÇOS PO…
## # … with 21 more variables: numEspecificacaoSubCota <dbl>, txtDescricaoEspecificacao <chr>, txtFornecedor <chr>,
## #   txtCNPJCPF <chr>, txtNumero <chr>, indTipoDocumento <dbl>, datEmissao <dttm>, vlrDocumento <chr>, vlrGlosa <chr>,
## #   vlrLiquido <chr>, numMes <dbl>, numAno <dbl>, numParcela <dbl>, txtPassageiro <chr>, txtTrecho <chr>, numLote <dbl>,
## #   numRessarcimento <dbl>, vlrRestituicao <lgl>, nuDeputadoId <dbl>, ideDocumento <dbl>, urlDocumento <chr>

Outros comandos muito importantes para começar a investigar os dados são o str(), o class() e o summary().

Para verificar o tipo do objeto, ou seja, sua classe, utilize:

class(df)
## [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"

Já para verificar a estrutura do objeto, ou seja, seus campos (quando aplicável), insira:

glimpse(df) #STRucture
## Rows: 144,367
## Columns: 31
## $ txNomeParlamentar         <chr> "LIDERANÇA DO DEMOCRATAS", "LIDERANÇA DO DEMOCRATAS", "LIDERANÇA DO DEMOCRATAS", "LIDERANÇA DO…
## $ cpf                       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ ideCadastro               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ nuCarteiraParlamentar     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ nuLegislatura             <dbl> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019…
## $ sgUF                      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ sgPartido                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ codLegislatura            <dbl> 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56…
## $ numSubCota                <dbl> 4, 4, 4, 4, 5, 5, 5, 5, 12, 12, 12, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ txtDescricao              <chr> "CONSULTORIAS, PESQUISAS E TRABALHOS TÉCNICOS.", "CONSULTORIAS, PESQUISAS E TRABALHOS TÉCNICOS…
## $ numEspecificacaoSubCota   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ txtDescricaoEspecificacao <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ txtFornecedor             <chr> "LINEAR COMUNICACAO LTDA - EPP", "LINEAR COMUNICACAO LTDA - EPP", "LINEAR COMUNICACAO LTDA - E…
## $ txtCNPJCPF                <chr> "109.472.430/0019-5", "109.472.430/0019-5", "109.472.430/0019-5", "109.472.430/0019-5", "109.4…
## $ txtNumero                 <chr> "2737", "2764", "2809", "2908", "2786", "2833", "2856", "2934", "45375674408", "2714", "2880",…
## $ indTipoDocumento          <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0…
## $ datEmissao                <dttm> 2020-04-27 00:00:00, 2020-05-27 00:00:00, 2020-07-27 00:00:00, 2020-11-26 01:00:00, 2020-06-2…
## $ vlrDocumento              <chr> "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "613.6…
## $ vlrGlosa                  <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "20", "0", "0", "0", "0", "0", "0"…
## $ vlrLiquido                <chr> "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "1527.28", "613.6…
## $ numMes                    <dbl> 4, 5, 7, 11, 6, 8, 9, 12, 2, 3, 10, 7, 12, 9, 7, 7, 12, 10, 1, 1, 3, 4, 6, 7, 8, 12, 5, 9, 9, …
## $ numAno                    <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020…
## $ numParcela                <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ txtPassageiro             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ txtTrecho                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ numLote                   <dbl> 1693866, 1698547, 1709149, 1730495, 1703569, 1714269, 1720322, 1738558, 1692485, 1689241, 1724…
## $ numRessarcimento          <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ vlrRestituicao            <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ nuDeputadoId              <dbl> 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713…
## $ ideDocumento              <dbl> 7050172, 7058437, 7078508, 7123566, 7067718, 7088718, 7101137, 7140186, 7047615, 7042111, 7109…
## $ urlDocumento              <chr> "http://camara.leg.br/cota-parlamentar/nota-fiscal-eletronica?ideDocumentoFiscal=7050172", "ht…

Para verificar estatísticas básicas do objeto (média, mediana, quantis, mínimo, máximo etc.), quando aplicáveis:

summary(df)
##  txNomeParlamentar       cpf             ideCadastro     nuCarteiraParlamentar nuLegislatura      sgUF          
##  Length:144367      Min.   :1.609e+06   Min.   : 62881   Min.   :  1           Min.   :2019   Length:144367     
##  Class :character   1st Qu.:6.630e+09   1st Qu.:143084   1st Qu.:165           1st Qu.:2019   Class :character  
##  Mode  :character   Median :2.194e+10   Median :178966   Median :297           Median :2019   Mode  :character  
##                     Mean   :3.220e+10   Mean   :168038   Mean   :292           Mean   :2019                     
##                     3rd Qu.:5.143e+10   3rd Qu.:204455   3rd Qu.:429           3rd Qu.:2019                     
##                     Max.   :9.990e+10   Max.   :214694   Max.   :566           Max.   :2019                     
##                     NA's   :391         NA's   :390      NA's   :390                                            
##   sgPartido         codLegislatura   numSubCota    txtDescricao       numEspecificacaoSubCota txtDescricaoEspecificacao
##  Length:144367      Min.   :56     Min.   :  1.0   Length:144367      Min.   :0.0000          Length:144367            
##  Class :character   1st Qu.:56     1st Qu.:  3.0   Class :character   1st Qu.:0.0000          Class :character         
##  Mode  :character   Median :56     Median :  5.0   Mode  :character   Median :0.0000          Mode  :character         
##                     Mean   :56     Mean   :116.3                      Mean   :0.2819                                   
##                     3rd Qu.:56     3rd Qu.: 14.0                      3rd Qu.:1.0000                                   
##                     Max.   :56     Max.   :999.0                      Max.   :4.0000                                   
##                                                                                                                        
##  txtFornecedor       txtCNPJCPF         txtNumero         indTipoDocumento   datEmissao                  vlrDocumento      
##  Length:144367      Length:144367      Length:144367      Min.   :0.000    Min.   :2019-11-25 00:00:00   Length:144367     
##  Class :character   Class :character   Class :character   1st Qu.:0.000    1st Qu.:2020-03-04 00:00:00   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Median :0.000    Median :2020-06-23 00:00:00   Mode  :character  
##                                                           Mean   :1.009    Mean   :2020-06-21 23:00:20                     
##                                                           3rd Qu.:1.000    3rd Qu.:2020-10-01 00:00:00                     
##                                                           Max.   :4.000    Max.   :2021-02-03 00:00:00                     
##                                                                            NA's   :5892                                    
##    vlrGlosa          vlrLiquido            numMes           numAno       numParcela       txtPassageiro       txtTrecho        
##  Length:144367      Length:144367      Min.   : 1.000   Min.   :2020   Min.   :0.000000   Length:144367      Length:144367     
##  Class :character   Class :character   1st Qu.: 3.000   1st Qu.:2020   1st Qu.:0.000000   Class :character   Class :character  
##  Mode  :character   Mode  :character   Median : 6.000   Median :2020   Median :0.000000   Mode  :character   Mode  :character  
##                                        Mean   : 6.128   Mean   :2020   Mean   :0.000194                                        
##                                        3rd Qu.: 9.000   3rd Qu.:2020   3rd Qu.:0.000000                                        
##                                        Max.   :12.000   Max.   :2020   Max.   :1.000000                                        
##                                                                                                                                
##     numLote        numRessarcimento vlrRestituicao  nuDeputadoId   ideDocumento     urlDocumento      
##  Min.   :      0   Min.   :0        Mode:logical   Min.   :  74   Min.   :      0   Length:144367     
##  1st Qu.:1673118   1st Qu.:0        NA's:144367    1st Qu.:2301   1st Qu.:7007282   Class :character  
##  Median :1697973   Median :0                       Median :3195   Median :7057354   Mode  :character  
##  Mean   :1355186   Mean   :0                       Mean   :2776   Mean   :5782888                     
##  3rd Qu.:1719478   3rd Qu.:0                       3rd Qu.:3323   3rd Qu.:7099364                     
##  Max.   :1743675   Max.   :0                       Max.   :3473   Max.   :7150790                     
##                    NA's   :114672

Acontece que nem sempre o separador será o ;, típico do csv. Nesse caso será necessário usar o read_delim(), onde você pode informar qualquer tipo de separador. Outro tipo de arquivo bastante comum é o de colunas com tamanho fixo (fixed width), também conhecido como colunas posicionais. Nesse caso, será necessário usar o read_fwf() informando o tamanho de cada coluna.

Exemplo:

#lendo arquivo com delimitador #
read_delim('caminho/do/arquivo/arquivo_separado_por#.txt', delim = '#')

#lendo arquivo de coluna fixa
#coluna 1 de tamanho 5, coluna 2 de tamanho 2 e coluna 3 de tamanho 10
read_fwf('caminho/do/arquivo/arquivo_posicional.txt', col_positions = fwf_widths(c(5, 2, 10), c("col1", "col2", "col3")))

No capítulo a seguir exploraremos melhor os tipos de objetos mais comuns no R.