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:

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:

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.

Vamos importar um csv chamado senado.csv. 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.

Esse comando carrega o conteúdo do arquivo senado.csv para o objeto (variável) senado. 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.

## # A tibble: 6 x 15
##   VoteNumber SenNumber SenatorUpper Vote  Party GovCoalition State
##        <dbl> <chr>     <chr>        <chr> <chr> <lgl>        <chr>
## 1    2007001 PRS0002/… FLEXA RIBEI… S     PSDB  FALSE        PA   
## 2    2007001 PRS0002/… ARTHUR VIRG… S     PSDB  FALSE        AM   
## 3    2007001 PRS0002/… FLAVIO ARNS  N     PT    TRUE         PR   
## 4    2007001 PRS0002/… MARCELO CRI… S     PRB   TRUE         RJ   
## 5    2007001 PRS0002/… JOAO DURVAL  N     PDT   FALSE        BA   
## 6    2007001 PRS0002/… PAULO PAIM   S     PT    TRUE         RS   
## # … with 8 more variables: FP <dbl>, Origin <dbl>, Contentious <dbl>,
## #   PercentYes <dbl>, IndGov <chr>, VoteType <dbl>, Content <chr>,
## #   Round <dbl>
## # A tibble: 6 x 15
##   VoteNumber SenNumber SenatorUpper Vote  Party GovCoalition State
##        <dbl> <chr>     <chr>        <chr> <chr> <lgl>        <chr>
## 1    2010027 PLC0010/… EDISON LOBAO S     PMDB  TRUE         MA   
## 2    2010027 PLC0010/… EDUARDO SUP… S     PT    TRUE         SP   
## 3    2010027 PLC0010/… JARBAS VASC… N     PMDB  TRUE         PE   
## 4    2010027 PLC0010/… MARISA SERR… S     PSDB  FALSE        MS   
## 5    2010027 PLC0010/… EPITACIO CA… S     PTB   FALSE        MA   
## 6    2010027 PLC0010/… INACIO ARRU… S     PCdoB TRUE         CE   
## # … with 8 more variables: FP <dbl>, Origin <dbl>, Contentious <dbl>,
## #   PercentYes <dbl>, IndGov <chr>, VoteType <dbl>, Content <chr>,
## #   Round <dbl>

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:

## [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"

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

## tibble [9,262 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ VoteNumber  : num [1:9262] 2007001 2007001 2007001 2007001 2007001 ...
##  $ SenNumber   : chr [1:9262] "PRS0002/07" "PRS0002/07" "PRS0002/07" "PRS0002/07" ...
##  $ SenatorUpper: chr [1:9262] "FLEXA RIBEIRO" "ARTHUR VIRGILIO" "FLAVIO ARNS" "MARCELO CRIVELLA" ...
##  $ Vote        : chr [1:9262] "S" "S" "N" "S" ...
##  $ Party       : chr [1:9262] "PSDB" "PSDB" "PT" "PRB" ...
##  $ GovCoalition: logi [1:9262] FALSE FALSE TRUE TRUE FALSE TRUE ...
##  $ State       : chr [1:9262] "PA" "AM" "PR" "RJ" ...
##  $ FP          : num [1:9262] 2 2 2 2 2 2 2 2 2 2 ...
##  $ Origin      : num [1:9262] 11 11 11 11 11 11 11 11 11 11 ...
##  $ Contentious : num [1:9262] 0 0 0 0 0 0 0 0 0 0 ...
##  $ PercentYes  : num [1:9262] 85.5 85.5 85.5 85.5 85.5 ...
##  $ IndGov      : chr [1:9262] "S" "S" "S" "S" ...
##  $ VoteType    : num [1:9262] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Content     : chr [1:9262] "Creates the Senate Commission of Science, Technology, Innovation, Communication, and Information Technology (CCT)." "Creates the Senate Commission of Science, Technology, Innovation, Communication, and Information Technology (CCT)." "Creates the Senate Commission of Science, Technology, Innovation, Communication, and Information Technology (CCT)." "Creates the Senate Commission of Science, Technology, Innovation, Communication, and Information Technology (CCT)." ...
##  $ Round       : num [1:9262] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   VoteNumber = col_double(),
##   ..   SenNumber = col_character(),
##   ..   SenatorUpper = col_character(),
##   ..   Vote = col_character(),
##   ..   Party = col_character(),
##   ..   GovCoalition = col_logical(),
##   ..   State = col_character(),
##   ..   FP = col_double(),
##   ..   Origin = col_double(),
##   ..   Contentious = col_double(),
##   ..   PercentYes = col_double(),
##   ..   IndGov = col_character(),
##   ..   VoteType = col_double(),
##   ..   Content = col_character(),
##   ..   Round = col_double()
##   .. )

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

##    VoteNumber       SenNumber         SenatorUpper      
##  Min.   :2007001   Length:9262        Length:9262       
##  1st Qu.:2008006   Class :character   Class :character  
##  Median :2009003   Mode  :character   Mode  :character  
##  Mean   :2008483                                        
##  3rd Qu.:2009048                                        
##  Max.   :2010027                                        
##      Vote              Party           GovCoalition   
##  Length:9262        Length:9262        Mode :logical  
##  Class :character   Class :character   FALSE:3480     
##  Mode  :character   Mode  :character   TRUE :5782     
##                                                       
##                                                       
##                                                       
##     State                 FP            Origin        Contentious     
##  Length:9262        Min.   :1.000   Min.   : 1.000   Min.   :0.00000  
##  Class :character   1st Qu.:2.000   1st Qu.: 1.000   1st Qu.:0.00000  
##  Mode  :character   Median :2.000   Median : 2.000   Median :0.00000  
##                     Mean   :1.878   Mean   : 2.595   Mean   :0.01781  
##                     3rd Qu.:2.000   3rd Qu.: 4.000   3rd Qu.:0.00000  
##                     Max.   :2.000   Max.   :11.000   Max.   :1.00000  
##    PercentYes         IndGov             VoteType    
##  Min.   :  2.174   Length:9262        Min.   :1.000  
##  1st Qu.: 66.667   Class :character   1st Qu.:1.000  
##  Median : 96.078   Mode  :character   Median :1.000  
##  Mean   : 82.509                      Mean   :1.159  
##  3rd Qu.: 98.148                      3rd Qu.:1.000  
##  Max.   :100.000                      Max.   :2.000  
##    Content              Round      
##  Length:9262        Min.   :1.000  
##  Class :character   1st Qu.:1.000  
##  Mode  :character   Median :1.000  
##                     Mean   :1.358  
##                     3rd Qu.:2.000  
##                     Max.   :4.000

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:

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