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


Aula 14

Tabela de conteúdo


Análise gráfica

##-----------------------------------------------------------------------------
## Dados de carros Duster à venda no webmotors em 26/03/2014.

dus <-
    read.table("http://www.leg.ufpr.br/~walmes/data/duster_venda_260314.txt",
               header=TRUE, sep="\t", encoding="utf-8")
str(dus)

## Quantidade de NA em cada coluna.
apply(dus, MARGIN=2, function(x) sum(is.na(x)))

## Elimina registros com NA.
dus <- na.omit(dus)

##-----------------------------------------------------------------------------
## Gráfico de barras e setores.

x <- table(dus$cambio)
class(x)

## Se vem da xtabs() também tem classe `table`.
x <- xtabs(~cambio, data=dus)
class(x)

## barplot(x)
barplot(x, xlab="Tipo de câmbio", ylab="Frequência absoluta",
        col=c("seagreen", "yellowgreen"))
grep("green", colors(), value=TRUE)

pie(x, col=c("seagreen", "yellowgreen"), main="Tipo de câmbio")
## As cores representadas por nomes.
head(colors(), 10)

##-----------------------------------------------------------------------------
## Gráficos de barras emplilhadas (stacked) e lado a lado.

x <- xtabs(~cambio+poten, data=dus)
x

## Barras empilhadas.
barplot(x, xlab="Potência", ylab="Frequência absoluta",
        col=c("seagreen", "yellowgreen"))
barplot(t(x), xlab="Tipo de câmbio", ylab="Frequência absoluta",
        col=c("seagreen", "yellowgreen"))
legend("topleft", legend=c("1.6","2.0"), fill=c("seagreen", "yellowgreen"))
## Barras lado a lado.
barplot(t(x), beside=TRUE,
        xlab="Tipo de câmbio", ylab="Frequência absoluta",
        col=c("seagreen", "yellowgreen"))
legend("topleft", legend=c("1.6","2.0"), fill=c("seagreen", "yellowgreen"))
##-----------------------------------------------------------------------------
## Gráficos de mosaico.

mosaicplot(x, xlab="Tipo de câmbio", ylab="Potência")
mosaicplot(t(x), ylab="Tipo de câmbio", xlab="Potência")
x <- xtabs(~cor+poten, data=dus); x
mosaicplot(x, xlab="Cor", ylab="Potência")
x <- xtabs(~novo+poten, data=dus); x

## Não dependência entre as variáveis.
mosaicplot(x, xlab="Condição", ylab="Potência",
           col=c("#009054","#900039"))
## Pode-se especificar cores com a trinca RGB (red, green, blue),
## pode-se usar o padrão hexadecimal html para cores.

## Visite estes sites para pegar cores.
## browseURL("http://www.w3schools.com/html/html_colors.asp")
## browseURL("http://html-color-codes.info/")

##-----------------------------------------------------------------------------
## Histograma.

hist(dus$valor)
hist(dus$valor, xlab="Preço de venda (R$)",
     ylab="Frequência absoluta", col="orange")
## Se breaks é um escalar então entende-se que é uma *sugestão* para o
## número de clases.
hist(dus$valor, breaks=15,
     xlab="Preço de venda (R$)",
     ylab="Frequência absoluta", col="orange")
## Se breaks é um vetor então entende-se que são os limites para
## classificação dos valores.
hist(dus$valor, breaks=seq(35000, 75000, 2500),
     xlab="Preço de venda (R$)",
     ylab="Frequência absoluta", col="#7700B7",
     sub="Amplitude de classe de R$ 2500")
## Gráfico onde a altura é a densidade e não a frequência.
hist(dus$valor, prob=TRUE, breaks=seq(35000, 75000, 2500),
     xlab="Preço de venda (R$)",
     ylab="Frequência absoluta", col="#7700B7",
     sub="Amplitude de classe de R$ 2500")
## Esse gráfico tem que a soma da área dos retângulos somam 1 pois o
## produto da amplitude pela densidade é a frequência relativa e a soma
## das frequência relativas é 1.

hist(dus$valor, prob=TRUE, seq(35000, 75000, 2000),
     xlab="Preço de venda (R$)", 
     ylab="Frequência absoluta", col="#6E0039",
     sub="Amplitude de classe de R$ 2500")
rug(dus$valor) ## Faz risquinhos no eixo x.
## Com domínio do R se pode fazer gráficos espetaculares, como por
## exemplo esse com variação da tonalidade.

ht <- hist(dus$valor, seq(35000, 75000, 2000))
nc <- length(ht$mids)             ## Número de classes.
ac <- diff(ht$breaks[1:2])        ## Amplitude de classe.
ma <- mean(dus$valor)             ## Média da amostra.
md <- median(dus$valor)           ## Mediana da amostra.
qts <- fivenum(dus$valor)[c(2,4)] ## 1Q e 3Q da amostra.
modal <- which.max(ht$counts)     ## Classe modal.
modal <- list(x=ht$mids[modal], y=ht$counts[modal])

colseq <- rgb(red=0.25, blue=0.7,
              green=seq(0.1, 0.9, length.out=nc))

plot(ht, col=colseq, ylim=c(0, modal$y+strheight("1")),
     xlab="Preço de venda (R$)",
     ylab="Frequência absoluta",
     sub=paste("Amplitude de classe de R$", ac),
     main=NULL, border="gray50")
text(x=modal$x, y=modal$y, labels=modal$y, pos=3)
rug(dus$valor)
arrows(ma, 0, ma, modal$y/3, code=1, length=0.15)
text(ma, modal$y/3, labels=paste("Média:", round(ma,2)), pos=3)
arrows(md, 0, md, modal$y/6, code=1, length=0.15)
text(ma, modal$y/6, labels=paste("Mediana:", round(md,1)),
     pos=ifelse(md<ma, 2, 4))
box()
##-----------------------------------------------------------------------------

den <- density(dus$valor)
str(den)

plot(den)
modal <- which.max(den$y)
modal <- list(x=den$x[modal], y=den$y[modal])

plot(den, type="n", xlab="Preço de venda (R$)", ylab="Densidade",
     ylim=c(0, modal$y+strheight("1")), main="",
     sub=paste("Bandwidth:", round(den$bw,3)))
with(den, polygon(x, y, col="gray90"))
with(modal, segments(x, 0, x, y, col=2))
with(modal, text(x, y, labels=round(x, 2), pos=3))
arrows(ma, 0, ma, modal$y/3, code=1, length=0.15)
text(ma, modal$y/3, labels=paste("Média:", round(ma,2)), pos=3)
arrows(md, 0, md, modal$y/6, code=1, length=0.15)
text(ma, modal$y/6, labels=paste("Mediana:", round(md,1)),
     pos=ifelse(md<ma, 2, 4))
rug(dus$valor)
y <- ecdf(dus$valor)
plot(y)
plot(y, xlab="Preço de venda (R$)",
     ylab="Frequência relativa acumulada",
     cex=NA, verticals=TRUE, main=NULL)

## Destacando a frequência de veículos com preço de 50 à 60 mil.
lim <- c(50000,60000)
ptbl <- prop.table(table(cut(dus$valor,
                             breaks=c(-Inf,lim,Inf))))
cs <- cumsum(ptbl)[seq_along(lim)]

plot(y, xlab="Preço de venda (R$)",
     ylab="Frequência relativa acumulada",
     cex=NA, verticals=TRUE, main=NULL)
segments(lim, 0, lim, cs, lty=2)
segments(lim, cs, par()$usr[3], cs, lty=2)
arrows(lim[1], cs[1], lim[1], cs[2], code=3, length=0.15)
text(lim[1], median(cs), labels=round(ptbl[2], 4),
     srt=90, adj=c(0.5,-0.5))
rug(dus$valor)
##-----------------------------------------------------------------------------

plot(valor~km, data=dus)
plot(valor~km, data=dus,
     xlab="Distância percorrida (km)",
     ylab="Preço de venda (R$)")

## Adicionar uma linha de tendência suave.
plot(valor~km, data=dus,
     xlab="Distância percorrida (km)",
     ylab="Preço de venda (R$)")
with(dus, lines(lowess(x=km, y=valor), lwd=2))
## Usar cores diferentes para identificar o tipo de câmbio.
plot(valor~km, data=dus, col=c(2,4)[dus$cambio], pch=19,
     xlab="Distância percorrida (km)",
     ylab="Preço de venda (R$)")
with(subset(dus, cambio=="AUTOMÁTICO"),
     lines(lowess(x=km, y=valor), col=2))
with(subset(dus, cambio=="MANUAL"),
     lines(lowess(x=km, y=valor), col=4))
legend("topright", lty=1, col=c(2,4),
       legend=levels(dus$cambio), bty="n")
##-----------------------------------------------------------------------------

## boxplot(valor~ano, data=dus)
## boxplot(valor~cor, data=dus)
boxplot(valor~cat, data=dus)
levels(dus$cat)

levels(dus$cat) <- c("?", "Dynamique", "Expression",
                     "Tech Road I", "Tech Road II")

boxplot(valor~cat, data=dus,
        xlab="Modelo", ylab="Preço de venda (R$)")
## Larguras proporcionais à raiz da quantidade em cada grupo.
pal <- c("#583882","#35165F","#43256C","#705199","#8A71AA")
boxplot(valor~cat, data=dus, varwidth=TRUE, pars=list(boxwex=1.25),
        col=pal, xlab="Modelo", ylab="Preço de venda (R$)")
## Um bom lugar para se montar palletas de cores.
## "http://paletton.com/"
## "https://kuler.adobe.com/create/color-wheel/"

Fazer gráficos é muito divertido