1 Manipulação de dados com data.table

#-----------------------------------------------------------------------
# Tutorial básico de data.table.

library(data.table)

# Curiosidade:
# https://stackoverflow.com/questions/24715894/faster-way-to-read-fixed-width-files-in-r
#-----------------------------------------------------------------------
# Carregando um conjunto de dados do repositório de ML.

# browseURL("http://archive.ics.uci.edu/ml/datasets/Bank+Marketing")

# Download do arquivo.
u <- "http://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip"
download.file(u, destfile = basename(u))

# Descompactação.
dir()
##  [1] "00-datatable-ggplot2_cache"          
##  [2] "00-datatable-ggplot2.Rmd"            
##  [3] "01-cross-validation.html"            
##  [4] "01-cross-validation.Rmd"             
##  [5] "02-gradient-methods.html"            
##  [6] "02-gradient-methods.Rmd"             
##  [7] "03-regularization.html"              
##  [8] "03-regularization.Rmd"               
##  [9] "04-regression-trees.html"            
## [10] "04-regression-trees.Rmd"             
## [11] "05-support-vector-machine.html"      
## [12] "05-support-vector-machine.Rmd"       
## [13] "06-k-nearest-neighborhood.html"      
## [14] "06-k-nearest-neighborhood.Rmd"       
## [15] "07-naive-bayes.html"                 
## [16] "07-naive-bayes.Rmd"                  
## [17] "08-logistic-regression.html"         
## [18] "08-logistic-regression.Rmd"          
## [19] "09-linear-discriminant-analysis.html"
## [20] "09-linear-discriminant-analysis.Rmd" 
## [21] "10-clustering.html"                  
## [22] "10-clustering.Rmd"                   
## [23] "bank.zip"                            
## [24] "_output.yaml"
utils::unzip(zipfile = basename(u))

# Número de linhas e topo da tabela usando funções do Shell.
system("wc -l bank-full.csv")
system("head -n 3 bank-full.csv")

# Carregando o arquivo com utils::read.table().
system.time(da <- read.table(file = "bank-full.csv",
                             header = TRUE,
                             sep = ";",
                             stringsAsFactors = FALSE))
##    user  system elapsed 
##   0.340   0.000   0.342
str(da)
## 'data.frame':    45211 obs. of  17 variables:
##  $ age      : int  58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr  "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : chr  "married" "single" "married" "married" ...
##  $ education: chr  "tertiary" "secondary" "secondary" "unknown" ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  2143 29 2 1506 1 231 447 2 121 593 ...
##  $ housing  : chr  "yes" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "no" "yes" "no" ...
##  $ contact  : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr  "may" "may" "may" "may" ...
##  $ duration : int  261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
# Lendo com a data.table::fread().
system.time(db <- fread(input = "bank-full.csv",
                        header = TRUE,
                        sep = ";"))
##    user  system elapsed 
##   0.028   0.000   0.027
str(db)
## Classes 'data.table' and 'data.frame':   45211 obs. of  17 variables:
##  $ age      : int  58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr  "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : chr  "married" "single" "married" "married" ...
##  $ education: chr  "tertiary" "secondary" "secondary" "unknown" ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  2143 29 2 1506 1 231 447 2 121 593 ...
##  $ housing  : chr  "yes" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "no" "yes" "no" ...
##  $ contact  : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr  "may" "may" "may" "may" ...
##  $ duration : int  261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
##  - attr(*, ".internal.selfref")=<externalptr>
#-----------------------------------------------------------------------
# Usando os operadores da estrutura DT[i, j, by].

# DT[i, j, by]
#    |  |   |
#    |  |   +--> Faz operações por estratos.
#    |  +--> Transforma variáveis (cria, muda, combina, resume e remove).
#    +--> Aplica filtros nas linhas.

# Filtrando os dados.
db[age > 50, ]
##       age         job  marital education default balance housing loan
##    1:  58  management  married  tertiary      no    2143     yes   no
##    2:  58     retired  married   primary      no     121     yes   no
##    3:  53  technician  married secondary      no       6     yes   no
##    4:  58  technician  married   unknown      no      71     yes   no
##    5:  57    services  married secondary      no     162     yes   no
##   ---                                                                
## 9251:  73     retired  married secondary      no    2850      no   no
## 9252:  51  technician  married  tertiary      no     825      no   no
## 9253:  71     retired divorced   primary      no    1729      no   no
## 9254:  72     retired  married secondary      no    5715      no   no
## 9255:  57 blue-collar  married secondary      no     668      no   no
##         contact day month duration campaign pdays previous poutcome   y
##    1:   unknown   5   may      261        1    -1        0  unknown  no
##    2:   unknown   5   may       50        1    -1        0  unknown  no
##    3:   unknown   5   may      517        1    -1        0  unknown  no
##    4:   unknown   5   may       71        1    -1        0  unknown  no
##    5:   unknown   5   may      174        1    -1        0  unknown  no
##   ---                                                                  
## 9251:  cellular  17   nov      300        1    40        8  failure yes
## 9252:  cellular  17   nov      977        3    -1        0  unknown yes
## 9253:  cellular  17   nov      456        2    -1        0  unknown yes
## 9254:  cellular  17   nov     1127        5   184        3  success yes
## 9255: telephone  17   nov      508        4    -1        0  unknown  no
db[age > 50 & y == "no", ]
##       age         job marital education default balance housing loan
##    1:  58  management married  tertiary      no    2143     yes   no
##    2:  58     retired married   primary      no     121     yes   no
##    3:  53  technician married secondary      no       6     yes   no
##    4:  58  technician married   unknown      no      71     yes   no
##    5:  57    services married secondary      no     162     yes   no
##   ---                                                               
## 7938:  70     retired married   primary      no     324      no   no
## 7939:  63     retired married secondary      no    1495      no   no
## 7940:  59     unknown married   unknown      no    1500      no   no
## 7941:  59  management married  tertiary      no     138     yes  yes
## 7942:  57 blue-collar married secondary      no     668      no   no
##         contact day month duration campaign pdays previous poutcome  y
##    1:   unknown   5   may      261        1    -1        0  unknown no
##    2:   unknown   5   may       50        1    -1        0  unknown no
##    3:   unknown   5   may      517        1    -1        0  unknown no
##    4:   unknown   5   may       71        1    -1        0  unknown no
##    5:   unknown   5   may      174        1    -1        0  unknown no
##   ---                                                                 
## 7938:  cellular  15   nov       78        1    96        7  success no
## 7939:  cellular  16   nov      138        1    22        5  success no
## 7940:  cellular  16   nov      280        1   104        2  failure no
## 7941:  cellular  16   nov      162        2   187        5  failure no
## 7942: telephone  17   nov      508        4    -1        0  unknown no
# O total de registros.
db[age > 50, .N]
## [1] 9255
db[age > 50 & y == "no", .N]
## [1] 7942
# A média para balanço.
db[age > 50, mean(balance)]
## [1] 1858.465
db[age > 50 & y == "no", mean(balance)]
## [1] 1773.603
# Duas medidas resumo.
db[, list(m = mean(balance), s = sd(duration))]
##           m        s
## 1: 1362.272 257.5278
# Tabela de frequência por categoria.
db[, .N, by = education]
##    education     N
## 1:  tertiary 13301
## 2: secondary 23202
## 3:   unknown  1857
## 4:   primary  6851
# Tabela de frequência por categoria.
db[, .N, by = list(education, y)]
##    education   y     N
## 1:  tertiary  no 11305
## 2: secondary  no 20752
## 3:   unknown  no  1605
## 4:   primary  no  6260
## 5: secondary yes  2450
## 6:  tertiary yes  1996
## 7:   unknown yes   252
## 8:   primary yes   591
db[, .N, by = .(education, y)]
##    education   y     N
## 1:  tertiary  no 11305
## 2: secondary  no 20752
## 3:   unknown  no  1605
## 4:   primary  no  6260
## 5: secondary yes  2450
## 6:  tertiary yes  1996
## 7:   unknown yes   252
## 8:   primary yes   591
# Medidas resumo por estrato.
db[, mean(balance), by = y]
##      y       V1
## 1:  no 1303.715
## 2: yes 1804.268
db[, mean(balance), by = education]
##    education       V1
## 1:  tertiary 1758.416
## 2: secondary 1154.881
## 3:   unknown 1526.754
## 4:   primary 1250.950
db[, mean(balance), by = job]
##               job        V1
##  1:    management 1763.6168
##  2:    technician 1252.6321
##  3:  entrepreneur 1521.4701
##  4:   blue-collar 1078.8267
##  5:       unknown 1772.3576
##  6:       retired 1984.2151
##  7:        admin. 1135.8389
##  8:      services  997.0881
##  9: self-employed 1647.9709
## 10:    unemployed 1521.7460
## 11:     housemaid 1392.3952
## 12:       student 1388.0608
# Converter para fator.
db[, education := factor(education)]
str(db)
## Classes 'data.table' and 'data.frame':   45211 obs. of  17 variables:
##  $ age      : int  58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr  "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : chr  "married" "single" "married" "married" ...
##  $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  2143 29 2 1506 1 231 447 2 121 593 ...
##  $ housing  : chr  "yes" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "no" "yes" "no" ...
##  $ contact  : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr  "may" "may" "may" "may" ...
##  $ duration : int  261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
##  - attr(*, ".internal.selfref")=<externalptr>
db[, levels(education)]
## [1] "primary"   "secondary" "tertiary"  "unknown"
db[, marital := factor(marital)]
str(db)
## Classes 'data.table' and 'data.frame':   45211 obs. of  17 variables:
##  $ age      : int  58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr  "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : Factor w/ 3 levels "divorced","married",..: 2 3 2 2 3 2 3 1 2 3 ...
##  $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  2143 29 2 1506 1 231 447 2 121 593 ...
##  $ housing  : chr  "yes" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "no" "yes" "no" ...
##  $ contact  : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr  "may" "may" "may" "may" ...
##  $ duration : int  261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
##  - attr(*, ".internal.selfref")=<externalptr>
db[, levels(marital)]
## [1] "divorced" "married"  "single"
# Padronizar uma variável para o intervalo unitário.
db[, ageu := (age - min(age))/diff(range(age))]
str(db)
## Classes 'data.table' and 'data.frame':   45211 obs. of  18 variables:
##  $ age      : int  58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr  "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : Factor w/ 3 levels "divorced","married",..: 2 3 2 2 3 2 3 1 2 3 ...
##  $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  2143 29 2 1506 1 231 447 2 121 593 ...
##  $ housing  : chr  "yes" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "no" "yes" "no" ...
##  $ contact  : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr  "may" "may" "may" "may" ...
##  $ duration : int  261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
##  $ ageu     : num  0.519 0.338 0.195 0.377 0.195 ...
##  - attr(*, ".internal.selfref")=<externalptr>
db[, summary(ageu)]
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.1948  0.2727  0.2979  0.3896  1.0000
# Ordenar a tabela.
db <- db[order(job, marital, age)]
db[, c("job", "marital", "age")]
##            job  marital age
##     1:  admin. divorced  26
##     2:  admin. divorced  26
##     3:  admin. divorced  26
##     4:  admin. divorced  27
##     5:  admin. divorced  27
##    ---                     
## 45207: unknown   single  51
## 45208: unknown   single  57
## 45209: unknown   single  58
## 45210: unknown   single  59
## 45211: unknown   single  61

2 Visualização de dados com ggplot2

#-----------------------------------------------------------------------
# Básico de visualização de dados com `ggplot2`.

library(ggplot2)

qplot(age,
      data = db,
      geom = "histogram")

qplot(age,
      data = db,
      geom = "histogram",
      color = I(4),
      fill = I("orange"))

qplot(age,
      data = db,
      geom = "density")

qplot(age,
      data = db,
      geom = "density",
      color = I(4),
      fill = I("orange"))

qplot(age,
      data = db,
      geom = "density",
      color = marital)

qplot(age,
      data = db,
      geom = "density",
      facets = ~marital)

qplot(age,
      data = db,
      geom = "density",
      color = y,
      facets = marital ~ education)

qplot(x = marital,
      y = age,
      data = db,
      geom = "boxplot")

qplot(x = marital,
      y = age,
      data = db,
      geom = "boxplot",
      facets = ~education)

qplot(x = age,
      y = duration,
      data = db)

qplot(x = age,
      y = duration,
      data = db,
      color = y)

qplot(x = age,
      y = duration,
      data = db,
      facets = ~marital)

qplot(x = age,
      y = duration,
      data = db,
      facets = ~marital,
      color = y)

ggplot(db,
       aes(age)) +
    stat_ecdf(geom = "step")

ggplot(db,
       aes(age, color = marital)) +
    stat_ecdf(geom = "step")

ggplot(db,
       aes(age, color = marital)) +
    stat_ecdf(geom = "step") +
    facet_wrap(facets = ~education)

3 Trabalhando com dados do IPEADATA

#-----------------------------------------------------------------------
# Manipulação de dados com classe `data.table`.

#--------------------------------------------
# Usando data.table com dados do IPEA data.

# Dados de abrangência nacional datificados por município das variáveis:
# i) população urbana, ii) população rural, iii) população
# econômicamente ativa urbana e iv) população econômicamente ativa
# rural. Fazer o download com todos os anos disponíveis. Todas as
# tabelas estão no tema social. As tabelas i e ii estão em "Demografia"
# e as iii e iv estão em "Mercado de trabalho".

# Muda o diretório de trabalho para onde estão os arquivos.
setwd("../datasets")

# Nomes dos arquivos.
f <- dir(pattern = "^ipeadata-")
f

# Lendo as tabelas mantendo todas em lista.
tabs <- sapply(f,
               simplify = FALSE,
               FUN = fread,
               header = TRUE,
               skip = 1,
               sep = ";",
               dec = ",",
               quote = "")
str(tabs)
# Lendo as tabelas mantendo todas em lista.
pre <- "http://leg.ufpr.br/~walmes/ensino/ML/datasets/"
fls <- c("ipeadata-pea-rural.csv",
         "ipeadata-pea-urban.csv",
         "ipeadata-pop-rural.csv",
         "ipeadata-pop-urban.csv")
f <- paste0(pre, fls)
tabs <- sapply(f,
               simplify = FALSE,
               FUN = fread,
               header = TRUE,
               skip = 1,
               sep = ";",
               dec = ",",
               quote = "")
str(tabs)
## List of 4
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv:Classes 'data.table' and 'data.frame':   5596 obs. of  8 variables:
##   ..$ Sigla    : chr [1:5596] "AC" "AC" "AC" "AC" ...
##   ..$ Código   : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ 0001     : int [1:5596] NA NA 2832 NA NA 9244 NA 4028 NA NA ...
##   ..$ 0001     : int [1:5596] NA 335 2514 NA NA 9981 NA 3834 NA 1437 ...
##   ..$ 0001     : num [1:5596] NA 374 3317 NA NA ...
##   ..$ 0001     : num [1:5596] 1560 295 3065 1448 1307 ...
##   ..$ 
       : int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv:Classes 'data.table' and 'data.frame':   5596 obs. of  8 variables:
##   ..$ Sigla    : chr [1:5596] "AC" "AC" "AC" "AC" ...
##   ..$ Código   : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ 0001     : int [1:5596] NA NA 749 NA NA 2664 NA 472 NA NA ...
##   ..$ 0001     : int [1:5596] NA 119 1590 NA NA 3244 NA 1038 NA 380 ...
##   ..$ 0001     : num [1:5596] NA 601 4339 NA NA ...
##   ..$ 0001     : num [1:5596] 1348 1089 3903 748 621 ...
##   ..$ 
       : int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv:Classes 'data.table' and 'data.frame':   5596 obs. of  6 variables:
##   ..$ Sigla    : chr [1:5596] "AC" "AC" "AC" "AC" ...
##   ..$ Código   : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ 0001     : int [1:5596] 4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
##   ..$ 0001     : int [1:5596] 4429 1339 7987 4198 3685 28470 3624 15482 3591 5301 ...
##   ..$ 
       : int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv:Classes 'data.table' and 'data.frame':   5596 obs. of  6 variables:
##   ..$ Sigla    : chr [1:5596] "AC" "AC" "AC" "AC" ...
##   ..$ Código   : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ 0001     : int [1:5596] 0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
##   ..$ 0001     : int [1:5596] 3506 2151 9026 1628 1521 38971 7404 11240 863 5794 ...
##   ..$ 
       : int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr>
# A última coluna tem que ser descartada.
sapply(tabs, ncol)
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv 
##                                                                    8 
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv 
##                                                                    8 
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv 
##                                                                    6 
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv 
##                                                                    6
sapply(tabs, colnames)
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv`
## [1] "Sigla"     "Código"    "Município" "0001"      "0001"      "0001"     
## [7] "0001"      "\r"       
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv`
## [1] "Sigla"     "Código"    "Município" "0001"      "0001"      "0001"     
## [7] "0001"      "\r"       
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv`
## [1] "Sigla"     "Código"    "Município" "0001"      "0001"      "\r"       
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv`
## [1] "Sigla"     "Código"    "Município" "0001"      "0001"      "\r"
# Nomes curtos para as colunas indentificadoras dos registros.
id <- c("sig", "id", "mun")

# Anos.
an <- c(1970, 1980, 1991, 2000)

# Notação: `a` e `p` para PEA e população; `r` e `u` para rural e
# urbana.
prefix <- c("ar", "au", "pr", "pu")

# Descartando e renomeando colunas.
i <- 1
tabs <- lapply(tabs,
               FUN = function(tb) {
                   cols <- ncol(tb)
                   if (cols == 8) {
                       tb[, 8 := NULL]
                       names(tb) <- c(id, paste0(prefix[i], an))
                   } else if (cols == 6) {
                       tb[, 6 := NULL]
                       names(tb) <- c(id, paste0(prefix[i], an[3:4]))
                   }
                   i <<- i + 1
                   return(tb)
               })

# Nomes das colunas.
sapply(tabs, colnames)
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv`
## [1] "sig"    "id"     "mun"    "ar1970" "ar1980" "ar1991" "ar2000"
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv`
## [1] "sig"    "id"     "mun"    "au1970" "au1980" "au1991" "au2000"
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv`
## [1] "sig"    "id"     "mun"    "pr1991" "pr2000"
## 
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv`
## [1] "sig"    "id"     "mun"    "pu1991" "pu2000"
# Fazendo a junção dos dados de população para o ano de 2000.
pop <- merge(tabs[[3]], tabs[[4]], by = id)
str(pop)
## Classes 'data.table' and 'data.frame':   5596 obs. of  7 variables:
##  $ sig   : chr  "AC" "AC" "AC" "AC" ...
##  $ id    : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun   : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ pr1991: int  4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
##  $ pr2000: int  4429 1339 7987 4198 3685 28470 3624 15482 3591 5301 ...
##  $ pu1991: int  0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
##  $ pu2000: int  3506 2151 9026 1628 1521 38971 7404 11240 863 5794 ...
##  - attr(*, ".internal.selfref")=<externalptr> 
##  - attr(*, "sorted")= chr  "sig" "id" "mun"
#-----------------------------------------------------------------------
# Um pouco mais sobre junção.

# Fazendo operações de junção (merges ou joins) com o `data.table`.
# https://rstudio-pubs-static.s3.amazonaws.com
# /52230_5ae0d25125b544caab32f75f0360e775.html

# Exemplo pequeno com data.frame simples.
df1 <- data.frame(grr = c(1:5), nota = runif(5, 70, 100))
df2 <- data.frame(grr = c(3:9), falt = rpois(7, 5))

# Interseção (inner join).
merge(df1, df2, by = "grr")
##   grr     nota falt
## 1   3 96.54916    6
## 2   4 71.42119    5
## 3   5 87.81755    4
# União (outer join).
merge(df1, df2, by = "grr", all = TRUE)
##   grr     nota falt
## 1   1 86.48013   NA
## 2   2 85.83807   NA
## 3   3 96.54916    6
## 4   4 71.42119    5
## 5   5 87.81755    4
## 6   6       NA    8
## 7   7       NA    6
## 8   8       NA    6
## 9   9       NA    6
# Todos da esquerda (left join).
merge(df1, df2, by = "grr", all.x = TRUE)
##   grr     nota falt
## 1   1 86.48013   NA
## 2   2 85.83807   NA
## 3   3 96.54916    6
## 4   4 71.42119    5
## 5   5 87.81755    4
# Todos da direita (right join).
merge(df1, df2, by = "grr", all.y = TRUE)
##   grr     nota falt
## 1   3 96.54916    6
## 2   4 71.42119    5
## 3   5 87.81755    4
## 4   6       NA    8
## 5   7       NA    6
## 6   8       NA    6
## 7   9       NA    6
#-----------------------------------------------------------------------
# Um pouco de visualização para conhecer os dados.

# Histograma por estado usando a qplot().
qplot(log10(pu2000),
      data = pop,
      geom = "histogram",
      facets = ~ sig)

# Usando a ggplot() seguida de camadas.
ggplot(data = pop,
       aes(x = pr2000)) +
    geom_histogram() +
    scale_x_log10() +
    facet_wrap(facets = ~ sig)

#-----------------------------------------------------------------------
# Exagerando no uso das camadas (um exemplo quase exaustivo).

ggplot(data = subset(pop, sig %in% c("PR", "SC", "RS")),
       aes(x = pr1991, y = pr2000)) +
    geom_point(aes(color = pr2000 > pr1991)) +
    geom_abline(a = 0, b = 1, linetype = 2) +
    scale_x_log10() +
    scale_y_log10() +
    stat_smooth(aes(x = pr1991, y = pr2000),
                method = "lm",
                formula = y ~ poly(x, degree = 2)) +
    facet_wrap(facets = ~ sig,
               ncol = 1,
               strip.position = "right") +
    labs(x = "Log 10 da população rural em 1991",
         y = "Log 10 da população rural em 2000") +
    scale_color_discrete(name = "População\ncresceu?") +
    theme(panel.background = element_rect(fill = "white",
                                          colour = "black"),
          panel.grid.major = element_line(colour = "gray75"),
          panel.grid.minor = element_line(colour = "gray80"),
          strip.background = element_rect(colour = "black",
                                          fill = "gray90"),
          legend.position = "left")

# Visite.
# http://www.cookbook-r.com/Graphs/

# Documentação online oficial:
# http://ggplot2.tidyverse.org/reference/

# Mais exemplos:
# http://tutorials.iq.harvard.edu/R/Rgraphics/Rgraphics.html

#-----------------------------------------------------------------------
# Empilhar, juntar e desempilhar variáveis.

# Métodos para a classe `data.table`. Note a `merge()`, `melt()` e
# `dcast()`.
methods(class = "data.table")
##  [1] all.equal     anyDuplicated as.data.frame as.data.table as.list      
##  [6] as.matrix     [<-           [[<-          $<-           [            
## [11] dcast         dim           dimnames<-    dimnames      duplicated   
## [16] format        head          is.na         melt          merge        
## [21] names<-       na.omit       print         split         subset       
## [26] tail          transform     unique        within       
## see '?methods' for accessing help and source code
# Teste.
str(tabs[[1]])
## Classes 'data.table' and 'data.frame':   5596 obs. of  7 variables:
##  $ sig   : chr  "AC" "AC" "AC" "AC" ...
##  $ id    : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun   : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ ar1970: int  NA NA 2832 NA NA 9244 NA 4028 NA NA ...
##  $ ar1980: int  NA 335 2514 NA NA 9981 NA 3834 NA 1437 ...
##  $ ar1991: num  NA 374 3317 NA NA ...
##  $ ar2000: num  1560 295 3065 1448 1307 ...
##  - attr(*, ".internal.selfref")=<externalptr>
x <- melt(tabs[[1]], id.vars = id)
str(x)
## Classes 'data.table' and 'data.frame':   22384 obs. of  5 variables:
##  $ sig     : chr  "AC" "AC" "AC" "AC" ...
##  $ id      : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun     : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ variable: Factor w/ 4 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : num  NA NA 2832 NA NA ...
##  - attr(*, ".internal.selfref")=<externalptr>
# Fazendo para todas as tabelas.
tabsm <- lapply(tabs, FUN = melt, id.vars = id)
str(tabsm)
## List of 4
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv:Classes 'data.table' and 'data.frame':   22384 obs. of  5 variables:
##   ..$ sig     : chr [1:22384] "AC" "AC" "AC" "AC" ...
##   ..$ id      : int [1:22384] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ mun     : chr [1:22384] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ variable: Factor w/ 4 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ value   : num [1:22384] NA NA 2832 NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv:Classes 'data.table' and 'data.frame':   22384 obs. of  5 variables:
##   ..$ sig     : chr [1:22384] "AC" "AC" "AC" "AC" ...
##   ..$ id      : int [1:22384] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ mun     : chr [1:22384] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ variable: Factor w/ 4 levels "au1970","au1980",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ value   : num [1:22384] NA NA 749 NA NA ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv:Classes 'data.table' and 'data.frame':   11192 obs. of  5 variables:
##   ..$ sig     : chr [1:11192] "AC" "AC" "AC" "AC" ...
##   ..$ id      : int [1:11192] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ mun     : chr [1:11192] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ variable: Factor w/ 2 levels "pr1991","pr2000": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ value   : int [1:11192] 4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
##   ..- attr(*, ".internal.selfref")=<externalptr> 
##  $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv:Classes 'data.table' and 'data.frame':   11192 obs. of  5 variables:
##   ..$ sig     : chr [1:11192] "AC" "AC" "AC" "AC" ...
##   ..$ id      : int [1:11192] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##   ..$ mun     : chr [1:11192] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##   ..$ variable: Factor w/ 2 levels "pu1991","pu2000": 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ value   : int [1:11192] 0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
##   ..- attr(*, ".internal.selfref")=<externalptr>
# Verifica se os nomes são os mesmos.
sapply(tabsm, names)
##      http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv
## [1,] "sig"                                                               
## [2,] "id"                                                                
## [3,] "mun"                                                               
## [4,] "variable"                                                          
## [5,] "value"                                                             
##      http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv
## [1,] "sig"                                                               
## [2,] "id"                                                                
## [3,] "mun"                                                               
## [4,] "variable"                                                          
## [5,] "value"                                                             
##      http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv
## [1,] "sig"                                                               
## [2,] "id"                                                                
## [3,] "mun"                                                               
## [4,] "variable"                                                          
## [5,] "value"                                                             
##      http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv
## [1,] "sig"                                                               
## [2,] "id"                                                                
## [3,] "mun"                                                               
## [4,] "variable"                                                          
## [5,] "value"
# Empilhar as tabelas criando uma só.
tab <- do.call(rbind, tabsm)
str(tab)
## Classes 'data.table' and 'data.frame':   67152 obs. of  5 variables:
##  $ sig     : chr  "AC" "AC" "AC" "AC" ...
##  $ id      : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun     : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ variable: Factor w/ 12 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : num  NA NA 2832 NA NA ...
##  - attr(*, ".internal.selfref")=<externalptr>
# Criar os fatores:
#   zona = {rural, urbana};
#   resp = {pea, pop},
#   ano = {1970, 1980, 1991, 2000}.

# Testando.
substr(tab$variable[1:5], 2, 2)
## [1] "r" "r" "r" "r" "r"
substr(tab$variable[1:5], 1, 1)
## [1] "a" "a" "a" "a" "a"
substr(tab$variable[1:5], 3, 6)
## [1] "1970" "1970" "1970" "1970" "1970"
# Criando as novas variáveis.
tab[,
    zona := factor(substr(variable, 2, 2),
                  levels = c("r", "u"),
                  labels = c("rural", "urbana"))]
tab[,
    resp := factor(substr(variable, 1, 1),
                  levels = c("a", "p"),
                  labels = c("pea", "pop"))]
tab[,
    ano := as.integer(substr(variable, 3, 6))]
str(tab)
## Classes 'data.table' and 'data.frame':   67152 obs. of  8 variables:
##  $ sig     : chr  "AC" "AC" "AC" "AC" ...
##  $ id      : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun     : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ variable: Factor w/ 12 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : num  NA NA 2832 NA NA ...
##  $ zona    : Factor w/ 2 levels "rural","urbana": 1 1 1 1 1 1 1 1 1 1 ...
##  $ resp    : Factor w/ 2 levels "pea","pop": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ano     : int  1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
##  - attr(*, ".internal.selfref")=<externalptr>
# Passar o tipo de resposta para as colunas (desempilhar).
tab <- dcast(tab,
             formula = sig + id + mun + zona + ano ~ resp,
             value.var = "value")
str(tab)
## Classes 'data.table' and 'data.frame':   44768 obs. of  7 variables:
##  $ sig : chr  "AC" "AC" "AC" "AC" ...
##  $ id  : int  1200013 1200013 1200013 1200013 1200013 1200013 1200013 1200013 1200054 1200054 ...
##  $ mun : chr  "Acrelândia" "Acrelândia" "Acrelândia" "Acrelândia" ...
##  $ zona: Factor w/ 2 levels "rural","urbana": 1 1 1 1 2 2 2 2 1 1 ...
##  $ ano : int  1970 1980 1991 2000 1970 1980 1991 2000 1970 1980 ...
##  $ pea : num  NA NA NA 1560 NA ...
##  $ pop : num  NA NA 4792 4429 NA ...
##  - attr(*, ".internal.selfref")=<externalptr> 
##  - attr(*, "sorted")= chr  "sig" "id" "mun" "zona" ...
#-----------------------------------------------------------------------
# Extração de medidas resumo.

# PEA média do Brasil por zona e ano.
tab[,
    .(`media` = mean(pea, na.rm = TRUE)),
    by = .(zona, ano)]
##      zona  ano     media
## 1:  rural 1970  3292.430
## 2:  rural 1980  3253.894
## 3:  rural 1991  2855.916
## 4:  rural 2000  2374.467
## 5: urbana 1970  4188.517
## 6: urbana 1980  7579.409
## 7: urbana 1991 10160.366
## 8: urbana 2000 11692.625
# Filtrando só para o Paraná.
tab[sig == "PR",
    .(`media` = mean(pea, na.rm = TRUE)),
    by = .(zona, ano)]
##      zona  ano    media
## 1:  rural 1970 5104.611
## 2:  rural 1980 3978.538
## 3:  rural 1991 2880.750
## 4:  rural 2000 2079.119
## 5: urbana 1970 2800.785
## 6: urbana 1980 5894.024
## 7: urbana 1991 8303.906
## 8: urbana 2000 9579.606
#-----------------------------------------------------------------------
# Gráficos.

ggplot(data = tab,
       aes(x = pea, color = zona)) +
    geom_density() +
    geom_rug() +
    scale_x_log10() +
    facet_wrap(facets = ~ ano, ncol = 1)

# TODO: adicionar linhas verticais. Trocar `ano` e `zona` de
# lugar. Refazer apenas para os estados do sul. Criar boxplot.
#-----------------------------------------------------------------------
# Outra possibilidade é usar o pacote `sqldf` que permite uso de
# instruções SQL para manipulação das tabelas de dados no R.

browseURL("https://cran.r-project.org/web/packages/sqldf/index.html")

# Alguns tutoriais:
# https://jasdumas.github.io/tech-short-papers/sqldf_tutorial.html
# http://www.burns-stat.com/translating-r-sql-basics/
# http://anythingbutrbitrary.blogspot.com.br/2012/08/manipulating-data-frames-using-sqldf.html

#-----------------------------------------------------------------------
25px