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)
<- readr::read_csv2("dados/Ano-2020.csv") df
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.