Universidade Federal do Paraná
Curso de Estatística
CE 083 - Estatística Computacional I - 2014/2
Prof. Dr. Walmes Marques Zeviani


Aula 17

Tabela de conteúdo


Introdução a biblioteca gráfica lattice

##-----------------------------------------------------------------------------
## Lendo os arquivos de dados.

setwd("/home/walmes/Dropbox/XML-leituras/carros2/")
list.files(pattern="^aval.*\\.(txt|csv)$")

## Notas no formato longo (emplilhado nos itens).
nt <- read.table("aval_carros_nota.txt",
                 header=TRUE, sep="\t")
str(nt)
head(nt)

## Informações de cada dono/veículo.
dn <- read.table("aval_carros_info.csv",
                 header=TRUE, sep=";",
                 stringsAsFactors=FALSE)
str(dn)
head(dn)

## Dicionário com nomes e comprimentos dos campos.
dic <- read.table("aval_carros_dic.txt",
                  header=FALSE, sep="\t",
                  stringsAsFactors=FALSE)
str(dic)
head(dic)

## Notas no formato amplo em arquivo de comprimento de campo fixo.
ntw <- read.fwf("aval_carros_fwf.txt",
                widths=dic$V2)
names(ntw) <- dic$V1
str(ntw)

## Removendo os espaços extras na posta das strings.
levels(ntw$carro) <- gsub("^\\s*", "", levels(ntw$carro))
head(ntw)

##-----------------------------------------------------------------------------
## Selecionar um par de carros e filtrar em cada tabela.

sel <- c("fox","gol")

## nt <- droplevels(subset(nt, is.element(carro, sel)))
nt <- droplevels(subset(nt, carro%in%sel))
str(nt)

dn <- droplevels(subset(dn, carro%in%sel))
str(dn)

ntw <- droplevels(subset(ntw, carro%in%sel))
str(ntw)

##-----------------------------------------------------------------------------
## Gráficos da biblioteca lattice.

require(lattice)
## Loading required package: lattice
require(latticeExtra)
## Loading required package: latticeExtra
## Loading required package: RColorBrewer
## Histograma.
## histogram(~nota|item, data=nt)
histogram(~nota|item, data=nt, breaks=0:11-0.5)

plot of chunk unnamed-chunk-2

col2rgb(col="seagreen")
col2rgb(col="purple")

histogram(~nota|item, data=subset(nt, carro=="fox"),
          breaks=0:11-0.5, main="Fox", col="seagreen")

plot of chunk unnamed-chunk-2

histogram(~nota|item, data=subset(nt, carro=="gol"),
          breaks=0:11-0.5, main="Gol", col="purple")

plot of chunk unnamed-chunk-2

dput(round(c(col2rgb(col="seagreen")/255), 4))
dput(round(c(col2rgb(col="purple")/255), 4))

## Cores com transparência.
cols <- c(rgb(0.1804, 0.5451, 0.3412, alpha=0.25),
          rgb(0.6275, 0.1255, 0.9412, alpha=0.25))

## Apesar dos esforços, ainda não fica tão bom.
histogram(~nota|item, data=subset(nt, carro=="fox"),
          breaks=0:11-0.5, main="Fox", col=cols[1])+
              as.layer(
                  histogram(~nota|item, data=subset(nt, carro=="gol"),
                            breaks=0:11-0.5, main="Gol", col=cols[2]))

plot of chunk unnamed-chunk-2

## Trocar o histograma por pontos que representam a frequência.
## Uma tabela de frequência flat entre ocorrências de nota para item em
## cada carro.
xt <- xtabs(~item+carro+nota, nt)
str(xt)

ftbl <- ftable(xt); ftbl

## Convertendo em data.frame.
tb <- as.data.frame(ftbl)
str(tb)

## Dividir pela frequência marginal de cada carro.
xtabs(~carro, ntw)

fm <- ave(tb$Freq, tb$carro, FUN=sum)/nlevels(tb$item)
head(fm)

## A soma das frequências relativas da 1.
tb$FreqRel <- tb$Freq/fm
with(tb, tapply(FreqRel, list(item, carro), FUN=sum))

## Se sobrepõem. Adicionar descolamento para mais e menos ajudaria.
xyplot(FreqRel~nota|item, groups=carro, data=tb)

plot of chunk unnamed-chunk-2

## Adicionando deslocamento.
tb$nota <- as.integer(as.character(tb$nota))-
    (0.2*(as.integer(tb$carro)-
              median(c(1, nlevels(tb$carro)))
          )
     )

xyplot(FreqRel~nota|item, groups=carro, data=tb,
       type="h", lwd=2, auto.key=list(lines=TRUE, points=FALSE))

plot of chunk unnamed-chunk-2

##-----------------------------------------------------------------------------
## Distribuição de frequências acumuladas.

str(tb)

ecdfplot(~nota|item, groups=carro, data=nt,
         auto.key=TRUE)

plot of chunk unnamed-chunk-2

##-----------------------------------------------------------------------------
## Gráfico de caixas.

## 1) Cuidado: os dados são discretos e limitados!.

bwplot(nota~carro|item, data=nt, pch="|")

plot of chunk unnamed-chunk-2

bwplot(carro~nota|item, data=nt, pch="|", horiz=TRUE)

plot of chunk unnamed-chunk-2

xyplot(Consumo~Motor, data=ntw, jitter.x=TRUE, jitter.y=TRUE)

plot of chunk unnamed-chunk-2

xyplot(Consumo~Motor|carro, data=ntw, jitter.x=TRUE, jitter.y=TRUE)

plot of chunk unnamed-chunk-2

xyplot(Consumo~Motor|carro, data=ntw, jitter.x=TRUE, jitter.y=TRUE,
       type=c("p","smooth"))

plot of chunk unnamed-chunk-2

xtb <- xtabs(~Consumo+Motor+carro, data=ntw)

## levelplot(xtb)
levelplot(xtb, col.regions=gray.colors)

plot of chunk unnamed-chunk-2


Noções de expressão regular

##-----------------------------------------------------------------------------
## Uso de expressões regulares.

## Quantificadores de ocorrência.
##  ?: 0 ou 1;
##  *: >=0;
##  +: >0;
##  {m}; m;
##  {m,n}; >=m e <=n;
##  {m,}; >=m;

x <- c("aabbcc","abc","aabcd","bbbc","aacc")
grep(x=x, pattern="ab?c", value=TRUE)
grep(x=x, pattern="ab*c", value=TRUE)
grep(x=x, pattern="ab+c", value=TRUE)
grep(x=x, pattern="ab{2}c", value=TRUE)

## Representantes.
##  [123], os elementos 1, 2 ou 3;
##  [1-3], os elementos 1, 2 ou 3;
##  [0-9], as unidades;
##  [a-f], de a até f;
##  [a-z], de a até z;
##  [A-Z], de A até Z;
##  [^02468], exceto os pares;
##  [^aeiou], exceto as vogais;
##  [^walmes], exceto as letras que formam meu nome;
##  \d, igual a [0-9];
##  \D, igual a [^0-9];
##  \w, igual a [0-9A-z];
##  \W, igual a [^0-9A-z];
##  ., qualquer coisa.

x <- c("abBBc", "a10c", "a100bc", "a8Bc", "aAABc","aacc")
grep(x=x, pattern="a...c", value=TRUE)
grep(x=x, pattern="a.+c", value=TRUE)
grep(x=x, pattern="a.{2}c", value=TRUE)
grep(x=x, pattern="a[bB]{3}c", value=TRUE)
grep(x=x, pattern="a[0-9]", value=TRUE)
grep(x=x, pattern="a[^0-9]", value=TRUE)
grep(x=x, pattern="a[0-9]+", value=TRUE)
grep(x=x, pattern="a[0-9]{2}", value=TRUE)
grep(x=x, pattern="a\\d{2}", value=TRUE)
grep(x=x, pattern="a\\d{2,}.?c", value=TRUE)

## Âncoras.
##  ^: início da string;
##  $: final da string;
##  \b: borda de palavra;

x <- c("Andre Marques", "Luciana Martins", "Carlos Ribeiro",
       "Alcidez Bernal", "Cristina Poeta")
grep(x=x, pattern="^A", value=TRUE)
grep(x=x, pattern="s$", value=TRUE)
grep(x=x, pattern="\\bM", value=TRUE)
grep(x=x, pattern="a\\b", value=TRUE)

## Combinando esses poderes as possibilidades são inúmeras.

##-----------------------------------------------------------------------------
## Extraindo pedaços das informações dos donos e veículos.

str(dn)
x <- dn$espec
sx <- head(sample(x), 10); sx

## Retirar modelo. Primeiro o teste depois definitivo.
gsub(pattern="^.*/([0-9]{4})$", replacement="\\1", x=sx)
dn$modelo <- gsub(pattern="^.*/([0-9]{4})$", replacement="\\1", x=x)

## Retirar ano. Primeiro o teste depois definitivo.
gsub(pattern="^.*([0-9]{4})/[0-9]{4}$", replacement="\\1", x=sx)
dn$ano <- gsub(pattern="^.*([0-9]{4})/[0-9]{4}$", replacement="\\1", x=x)

xtabs(~modelo+carro, dn)
xtabs(~ano+carro, dn)

## Retirar potência.
gsub(pattern="^.*(\\d\\.\\d).*[0-9]{4}/[0-9]{4}$",
     replacement="\\1", x=sx)

dn$pot <- gsub(pattern="^.*(\\d\\.\\d).*[0-9]{4}/[0-9]{4}$",
               replacement="\\1", x=x)

xtabs(~pot+carro, data=dn)

## Como se trata de apenas dois níveis, isso aqui, nesse caso, é
## equivalente.
dn$pot <- 1.6
dn$pot[grepl("1\\.0", x)] <- 1.0

## Nem todos os carros têm os km rodados. O que fazer?
x <- dn$hist
sx <- head(sample(x), 10); sx

## Retirar km rodados.
gsub(pattern="^.*- (.*) km.*$", replacement="\\1", x=sx)
dn$kmrod <- gsub(pattern="^.*- (.*) km.*$",
                 replacement="\\1", x=x)
dn$kmrod <- as.numeric(dn$kmrod)
## Warning: NAs introduced by coercion
## Retirar ano com o veículo.
gsub(pattern="^.*(\\d) ano.*$", replacement="\\1", x=sx)
dn$donoha <- gsub(pattern="^.*(\\d) ano.*$",
                  replacement="\\1", x=x)
dn$donoha <- as.integer(dn$donoha)

densityplot(~kmrod|carro, data=dn)

plot of chunk unnamed-chunk-3

densityplot(~log10(kmrod)|carro, data=dn)

plot of chunk unnamed-chunk-3

ecdfplot(~log10(kmrod), groups=carro, data=dn, auto.key=TRUE)

plot of chunk unnamed-chunk-3

xtabs(~ano+carro, data=dn)

with(dn, tapply(kmrod, carro, summary))

##-----------------------------------------------------------------------------
## Como juntar os dados de uma tabela com os de outra?

bd1 <- data.frame(id=1:5, nota=runif(5))
bd2 <- data.frame(id=3:9, aptdao=runif(7))

merge(bd1, bd2, by="id")
merge(bd1, bd2, by="id", all.x=TRUE)
merge(bd1, bd2, by="id", all.y=TRUE)
merge(bd1, bd2, by="id", all=TRUE)

names(ntw)
names(dn)

mrg <- merge(ntw, dn, by=c("carro","dono"), all=TRUE)
names(mrg)

ag <- aggregate(cbind(Consumo, Recomendação, Motor)~carro+ano, data=mrg, FUN=mean)
str(ag)

xyplot(Consumo~as.numeric(ano), groups=carro, data=ag,
       type="b")

plot of chunk unnamed-chunk-3

xyplot(Consumo+Recomendação+Motor~as.numeric(ano), groups=carro, data=ag,
       type="b", outer=TRUE)

plot of chunk unnamed-chunk-3

O cara que fez a biblioteca lattice alguns anos mais jovem

Deepayan Sarkar