Adiciona tutorial de ggplot2 e data.table.

parent 0770671b
......@@ -23,6 +23,8 @@ navbar:
- icon: fa-television
text: "Material"
menu:
- text: "Manipulação e visualização"
href: tutorials/00-datatable-ggplot2.html
- text: "Validação cruzada"
href: tutorials/01-cross-validation.html
- text: "Gradiente descendente"
......
---
title: "Manipulação e visualização de dados"
author: Prof. Walmes M. Zeviani & Prof. Eduardo V. Ferreira
date: 2017-08-24
---
```{r, include = FALSE}
source("../config/setup.R")
opts_chunk$set(
message = FALSE,
warning = FALSE)
```
```{r, eval = FALSE, include = FALSE}
#-----------------------------------------------------------------------
# Lendo arquivo FWF com o data.table.
# Dados disponíveis em (url quebrada em várias linhas):
# http://www.ibge.gov.br/home/estatistica/populacao/censo2010
# /resultados_gerais_amostra/resultados_gerais_amostra_tab_uf_microdados.shtm
# Comando shell que exibe o número de linhas da tabela.
system("wc -l Amostra_Pessoas_41.txt")
# Baixar a tabela com a documentação das tabelas e variáveis. Ao
# descompactar a tabela, abra o arquivo Layout_microdados_Amostra.ods
# (ou *.xls) e recorte o conteúdo na região H2:I78 da aba `PESS`.
# Edite para gerar uma matriz.
br <- c(3, 7, 8, 20, 21, 28, 29, 44, 45, 45, 46, 47, 48, 50, 51, 52, 53,
53, 54, 55, 56, 57, 58, 58, 59, 61, 62, 64, 65, 66, 67, 67, 68,
68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76,
76, 77, 80, 81, 81, 82, 88, 89, 95, 96, 98, 99, 101, 102, 102,
103, 109, 110, 116, 117, 123, 124, 124, 125, 131, 132, 138, 139,
145, 146, 146, 147, 147, 148, 149, 150, 151, 152, 152, 153, 153,
154, 155, 156, 156, 157, 157, 158, 158, 159, 161, 162, 164, 165,
167, 168, 168, 169, 175, 176, 182, 183, 189, 190, 190, 191, 192,
193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199,
199, 200, 203, 204, 208, 209, 209, 210, 210, 211, 211, 212, 212,
213, 218, 219, 224, 225, 230, 231, 231, 232, 237, 238, 246, 247,
253, 254, 262, 263, 269, 270, 278, 279, 285, 286, 295, 296, 303,
304, 312, 313, 315, 316, 316, 317, 317, 318, 318, 319, 319, 320,
320, 321, 321, 322, 327, 328, 328, 329, 335, 336, 342, 343, 349,
350, 350, 351, 351, 352, 352, 353, 354, 355, 356, 357, 358, 359,
359, 360, 361, 362, 363, 364, 365, 366, 366, 367, 369, 370, 370,
371, 371, 372, 372, 373, 374, 375, 378, 379, 379, 380, 381, 382,
383, 384, 385, 386, 387, 388, 388, 389, 390, 391, 391, 392, 392,
393, 393, 394, 394, 395, 395, 396, 398, 399, 399, 400, 401, 402,
403, 404, 405, 406, 413, 414, 422, 423, 426, 427, 431, 432, 432,
433, 433, 434, 434, 435, 435, 436, 436, 437, 437, 438, 439, 440,
440, 441, 441, 442, 442, 443, 443, 444, 444, 445, 445, 446, 446,
447, 447, 448, 448, 449, 449, 450, 450, 451, 451, 452, 452, 453,
453, 454, 454, 455, 455, 456, 456, 457, 457, 458, 458, 459, 459,
460, 460, 461, 461, 462, 462, 463, 463, 464, 464, 465, 465, 466,
466, 467, 467, 468, 468, 469, 469, 470, 470, 471, 471, 472, 472,
473, 473, 474, 474, 475, 475, 476, 476, 477, 477, 478, 478, 479,
479, 480, 480, 481, 481, 482, 482, 483, 483, 484, 484, 485, 485,
486, 486, 487, 487, 488, 488, 489, 489, 490, 490, 491, 491, 492,
492, 493, 493, 494, 494, 495, 495, 496, 496, 497, 497, 498, 498,
499, 499, 500, 500, 501, 501, 502, 502, 503, 503, 504, 504, 505,
505, 506, 506, 507, 507, 508, 508, 509, 509, 510, 510, 511, 511,
512, 512, 513, 513, 514, 514, 515, 515, 516, 516, 517, 517, 518,
518, 519, 519, 520, 520, 521, 521, 522, 522, 523, 523, 524, 524,
525, 525, 526, 526, 527, 527, 528, 528, 529, 529, 530, 530, 531,
531, 532, 532, 533, 533, 534, 534, 535, 535, 536, 536, 537, 537,
538, 538, 539, 539, 540, 540)
w <- matrix(br, ncol = 2, byrow = TRUE)
head(w)
# Nem tente rodar porque leva tempo demais.
# a <- read.fwf("Amostra_Pessoas_41.txt",
# widths = diff(w))
library(data.table)
# Criando um arquivo com as 50 linhas do topo para prototipação.
system("head -n 50 Amostra_Pessoas_41.txt > teste.txt")
# Lendo cada linha (primeiro rodar com o teste.txt)
# a <- fread("teste.txt", header = FALSE, sep = "\n")
a <- fread("Amostra_Pessoas_41.txt", header = FALSE, sep = "\n")
str(a)
# Quebrando as strings nas devidas posições para formar os campos.
b <- a[,
lapply(seq_len(nrow(w)),
FUN = function(i) {
# stringi::stri_sub(V1, w[i, 1], w[i, 2])
substr(V1, w[i, 1], w[i, 2])
})]
# Cabeça e cauda da tabela para as primeiras colunas.
b[, 1:7]
```
# Manipulação de dados com `data.table`
```{r}
#-----------------------------------------------------------------------
# Tutorial básico de data.table.
library(data.table)
# Curiosidade:
# https://stackoverflow.com/questions/24715894/faster-way-to-read-fixed-width-files-in-r
```
```{r, cache = TRUE}
#-----------------------------------------------------------------------
# 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()
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))
str(da)
# Lendo com a data.table::fread().
system.time(db <- fread(input = "bank-full.csv",
header = TRUE,
sep = ";"))
str(db)
```
```{r}
#-----------------------------------------------------------------------
# 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, ]
db[age > 50 & y == "no", ]
# O total de registros.
db[age > 50, .N]
db[age > 50 & y == "no", .N]
# A média para balanço.
db[age > 50, mean(balance)]
db[age > 50 & y == "no", mean(balance)]
# Duas medidas resumo.
db[, list(m = mean(balance), s = sd(duration))]
# Tabela de frequência por categoria.
db[, .N, by = education]
# Tabela de frequência por categoria.
db[, .N, by = list(education, y)]
db[, .N, by = .(education, y)]
# Medidas resumo por estrato.
db[, mean(balance), by = y]
db[, mean(balance), by = education]
db[, mean(balance), by = job]
# Converter para fator.
db[, education := factor(education)]
str(db)
db[, levels(education)]
db[, marital := factor(marital)]
str(db)
db[, levels(marital)]
# Padronizar uma variável para o intervalo unitário.
db[, ageu := (age - min(age))/diff(range(age))]
str(db)
db[, summary(ageu)]
# Ordenar a tabela.
db <- db[order(job, marital, age)]
db[, c("job", "marital", "age")]
```
# Visualização de dados com `ggplot2`
```{r}
#-----------------------------------------------------------------------
# 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)
```
# Trabalhando com dados do IPEADATA
```{r, eval = FALSE}
#-----------------------------------------------------------------------
# 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)
```
```{r, cache = TRUE}
# 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)
```
```{r}
# A última coluna tem que ser descartada.
sapply(tabs, ncol)
sapply(tabs, colnames)
# 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)
# Fazendo a junção dos dados de população para o ano de 2000.
pop <- merge(tabs[[3]], tabs[[4]], by = id)
str(pop)
#-----------------------------------------------------------------------
# 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")
# União (outer join).
merge(df1, df2, by = "grr", all = TRUE)
# Todos da esquerda (left join).
merge(df1, df2, by = "grr", all.x = TRUE)
# Todos da direita (right join).
merge(df1, df2, by = "grr", all.y = TRUE)
#-----------------------------------------------------------------------
# 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")
# Teste.
str(tabs[[1]])
x <- melt(tabs[[1]], id.vars = id)
str(x)
# Fazendo para todas as tabelas.
tabsm <- lapply(tabs, FUN = melt, id.vars = id)
str(tabsm)
# Verifica se os nomes são os mesmos.
sapply(tabsm, names)
# Empilhar as tabelas criando uma só.
tab <- do.call(rbind, tabsm)
str(tab)
# Criar os fatores:
# zona = {rural, urbana};
# resp = {pea, pop},
# ano = {1970, 1980, 1991, 2000}.
# Testando.
substr(tab$variable[1:5], 2, 2)
substr(tab$variable[1:5], 1, 1)
substr(tab$variable[1:5], 3, 6)
# 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)
# Passar o tipo de resposta para as colunas (desempilhar).
tab <- dcast(tab,
formula = sig + id + mun + zona + ano ~ resp,
value.var = "value")
str(tab)
#-----------------------------------------------------------------------
# Extração de medidas resumo.
# PEA média do Brasil por zona e ano.
tab[,
.(`media` = mean(pea, na.rm = TRUE)),
by = .(zona, ano)]
# Filtrando só para o Paraná.
tab[sig == "PR",
.(`media` = mean(pea, na.rm = TRUE)),
by = .(zona, ano)]
#-----------------------------------------------------------------------
# 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.
```
```{r, eval = FALSE}
#-----------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment