* [[bie5782:02_tutoriais:tutorial4:start|Tutorial]] * [[bie5782:01_curso_atual:exercicios4| Exercícios]] * [[bie5782:03_apostila:05-exploratoria| Apostila]] ====== 4. Tutoriais de Análise Exploratória de Dados ====== ===== Conferindo Data Frames ===== A primeira coisa que temos que fazer quando criamos um objeto de dados é verificá-lo cuidadosamente em busca de erros e incoerências. Neste tutorial simulamos duas situações bem comuns: variáveis de fatores com códigos errados e valores ''NA'' que na verdade são zeros. Vamos usar uma planilha com dados fictícios, que você baixa [[:dados::dados-aves|aqui]]. Lendo a planilha com ''read.table'' ou ''read.csv2'' aves.c <- read.table("aves_cerrado.csv", row.names=1, header=T, sep=";", dec=",", as.is=T) aves.c <- read.csv2("aves_cerrado.csv", row.names=1, as.is=T) Verificação inicial do // data frame// head(aves.c) tail(aves.c) str(aves.c) summary(aves.c) Com isso já vemos um problema: os NAs são de fato observações faltantes? Verificando a planilha descobrimos que na verdade são pontos em que não houve avistamento. Portanto, o valor correto é zero Quais são os registros com este problema? Vamos verificar para os urubus aves.c[aves.c$urubu==NA,] Isto não funciona. O teste lógico Para NA é feito pela função ''is.na'': is.na(aves.c) is.na(aves.c$urubu) Que retorna um vetor lógico que usamos para indexar o data frame ou um de seus vetores: aves.c[is.na(aves.c$urubu),] aves.c[is.na(aves.c$urubu)|is.na(aves.c$carcara)|is.na(aves.c$seriema),] Vamos guardar este pedaço da planilha num objeto temporário temp1 <- aves.c[is.na(aves.c$urubu)|is.na(aves.c$carcara)|is.na(aves.c$seriema),] E agora vamos corrigir estes valores, que pode ser feito de três maneiras: aves.c$urubu[is.na(aves.c$urubu)] <- 0 aves.c[is.na(aves.c$urubu),2] <- 0 aves.c[is.na(aves.c[,2]), 2] <- 0 Continuando, para as outras aves: aves.c$carcara[is.na(aves.c$carcara)] <- 0 aves.c$seriema[is.na(aves.c$seriema)] <- 0 Deu certo? Vamos verificar, comparando linhas que agora são zero com o pedaço antigo do objeto que guardamos: aves.c[aves.c$urubu==0|aves.c$carcara==0|aves.c$seriema==0,] temp1 Agora vamos verificar os valores da coluna que será um fator table(aves.c$fisionomia) Há um erro de digitação no código de fisionomia de uma parcela. Corrigindo: aves.c$fisionomia[aves.c$fisionomia=="ce"] <- "Ce" table(aves.c$fisionomia) Convertendo para fator, que ordenamos da fisionomia mais aberta para a menos: aves.c$fisionomia <- factor(aves.c$fisionomia, levels=c("CL","CC","Ce")) Ufa! Verificando tudo novamente: str(aves.c) summary(aves.c) Parece que agora está ok. ===== Média, Mediana e Quantis ===== Vamos usar o mesmo arquivo do tutorial anterior para explorar as estatísticas descritivas básicas. Começando pela média, e mediana: mean(aves.c[,2:4]) Este comando ainda funciona, mas está "condenado" (//deprecated//) desde a verão 2.14.0. Em versões posteriores ele irá gerar um erro. Use a maneira recomendada pelo aviso, que é aplicar as funções a cada elemento do //data frame//, que é uma lista: sapply(aves.c[,2:4],mean) sapply(aves.c[,2:4],median) No caso de //data frames// você consegue o mesmo com a função ''apply'', indicando no segundo argumento a margem a aplicar a função (1 para linhas e 2 para colunas): apply(aves.c[,2:4],2,median) Calcule também a média truncada: apply(aves.c[,2:4], 2, mean, trim=0.1) Há muita diferença entre essas três medidas de tendência central? Como você as explicaria? Agora calcule os quantis para o número de avistamentos de urubus. O padrão da função ''quantile'' são quartis, como na função ''summary'': quantile(aves.c$urubu) ## O mesmo que o retornado pelo summary summary(aves.c$urubu) Mas você pode mudar para qualquer quantil: quantile(aves.c$urubu, probs= seq(from=0,to=1,by=0.1)) Por fim, obtenha quartis, médias e medianas de uma vez para todas as variáveis, com o comando: summary(aves.c[,2:4]) ===== Exploração de uma Variável Categórica ===== Vamos usar um conjunto de dados de um inventário de árvores, que você baixa [[:dados:dados-caixeta| aqui]]. Leia com atenção a descrição deste conjunto de dados. Vamos explorar a variável categórica nome da espécie, com a função ''table'': caixeta <- read.csv("caixeta.csv", as.is=T) names(caixeta) table(caixeta$especie) Qual a diferença no resultado se usamos o comando abaixo? sort(table(caixeta$especie), decreasing=T) O resultado da função ''table'' pode ser fornecido à função de gráficos de barras: barplot(sort(table(caixeta$especie), decreasing=T)) barplot(table(caixeta$local)) ===== Gráficos para uma Variável ===== Voltando ao objeto criado no tutorial [[bie5782:02_tutoriais:tutorial4:start#Conferindo Data Frames]], vamos criar em uma só página os quatro gráficos básicos de diagnóstico de uma variável numérica, para o número de avistamentos de urubus: par(mfrow=c(2,2)) boxplot(aves.c$urubu) hist(aves.c$urubu) plot(density(aves.c$urubu)) stripchart(aves.c$urubu, method="stack") par(mfrow=c(1,1)) O que acontece se você omite a primeira linha? E a última? ===== Variações do Histograma ===== Voltando ao objeto criado no tutorial [[:bie5782:02_tutoriais:tutorial4:start#conferindo_data_frames|Conferindo Data Frames]], vamos fazer algumas variações de histogramas do número de avistamentos de urubus: Você pode acrescentar marcas (traços) indicando a posição de cada observação no eixo x. ## Histograma com os valores (funcao rug) hist(aves.c$urubu) rug(jitter(aves.c$urubu)) O que acontece se você omite a função ''jitter'' neste caso? Por que? Agora vamos fazer um histograma re-escalonado de modo que as áreas das barras somem um. Com isto, podemos sobrepor ao histograma um ajuste não paramétrico de densidade probabilística, que também mantém área um: hist(aves.c$urubu, prob=T) lines( density(aves.c$urubu),col="blue" ) Também sobre este histograma podemos sobrepor a curva normal. Para os parâmetros da normal, usamos a média e o desvio-padrão da amostra. hist(aves.c$urubu, prob=T) curve(expr = dnorm(x,mean=mean(aves.c$urubu),sd=sd(aves.c$urubu)),add=T, col="red") Por fim, vamos sobrepor a curva empírica de densidade probabilística com a curva normal: plot(density(aves.c$urubu),col="blue", ylim=c(0,0.08)) curve(expr = dnorm(x,mean=mean(aves.c$urubu),sd=sd(aves.c$urubu)),add=T, col="red") O que estes gráficos revelam sobre a distribuição do número de avistamentos de urubus neste estudo fictício? ===== table e aggregate ===== Usaremos o objeto ''caixeta'' criado no tutorial [[:bie5782:02_tutoriais:tutorial4:start#exploracao_de_uma_variavel_categorica|Exploração de uma Variável Categórica]]. A relação entre duas ou mais variáveis categóricas pode ser explorada com tabelas cruzadas, por exemplo: table(caixeta$especie,caixeta$local) Quando temos uma variavel categórica (fator) e uma numérica, as funções ''aggregate'' e ''tapply'' são muito úteis. A função ''aggregate'' é o equivalente das tabelas dinâmicas das planilhas eletrônicas. Por exemplo, para obter do objeto ''caixeta'' um //data frame// com a altura média dos fustes de cada espécie de árvore por local você executa o comando: caixeta.alt <- aggregate(caixeta$h, by=list(local=caixeta$local,especie=caixeta$especie), FUN=mean) Consulte a ajuda da função ''aggregate'' e experimente outras combinações de fatores e funções, com este conjunto de dados. ===== xtabs ===== Crie um objeto com este [[:dados::dados-titanic|arquivo]] e faça as seguintes tabulações: xtabs(Freq~Sex+Survived, data=Titanic.df) prop.table(xtabs(Freq~Sex+Survived, data=Titanic.df), margin=1) xtabs(Freq~Class+Survived, data=Titanic.df) prop.table(xtabs(Freq~Class+Survived, data=Titanic.df), margin=1) Por que usamos a função ''xtabs'' neste caso e não a função ''table''? P.ex: table(Titanic.df$Sex,Titanic.df$Survived) ===== Fórmula Estatística em Gráficos ===== A função ''xtabs'' (tutorial anterior) usa a notação de fórmula estatística do R, que é: variável dependente ~ variáveis preditoras Esta notação foi criada para os modelos estatísticos, como a regressão linear, mas foi estendida para vários gráficos no R. Experimente os comandos abaixo em que esta notação é usada: boxplot(urubu~fisionomia, data=aves.c) plot(seriema~urubu, data=aves.c, subset=fisionomia=="Ce") plot(seriema~urubu, data=aves.c, subset=fisionomia=="CC") plot(seriema~urubu, data=aves.c, subset=fisionomia!="CL") Que tipo de padrão ou diferenças estes gráficos podem revelar? Esta fórmula pode ainda incluir um fator condicionante, que aplica a relação proposta dentro de cada nível dos condicionais: variável dependente ~ variáveis preditoras | variáveis condicionantes O pacote ''lattice'' implementa esta idéia para gráficos: library(lattice) xyplot(seriema~urubu|fisionomia, data= aves.c) Qual a diferença entre este gráfico e os três últimos obtidos com os comandos anteriores? ===== O quarteto de Anscombe ===== O pacote ''datasets'' tem vários conjuntos de dados que se tornaram clássicos da estatística. Vamos analisar um dos mais usados para treino de análises exploratórias. Como o R já carrega o ''datasets'' por padrão, precisamos apenas fazer uma cópia do objeto para nossa área de trabalho ((isto não é estritamente necessário, mas facilita.)): data(anscombe)#carrega para a area de trabalho ls() #agora o objeto está no workspace Este objeto é composto de 4 pares de variáveis, nomeadas ''x1'' a ''x4'' (variáveis independentes ou preditoras) e ''y1'' a ''y4'' (variáveis dependentes ou resposta): names(anscombe) Compare as médias de cada uma das variáveis. Para isto, use a função ''apply'' para aplicar a função ''mean'' a cada coluna((argumento ''MARGIN=2'')) deste data frame: apply(anscombe[1:4], MARGIN=2, FUN=mean) apply(anscombe[5:8], 2, mean) Faça o mesmo para obter as variâncias: apply(anscombe[1:4], 2, var) apply(anscombe[5:8], 2, var) A pergunta principal para este conjunto de dados é se há relação entre cada variável ''x'' e ''y''. Isso pode ser testado com o [[http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient|coeficiente de correlação de Pearson]], que vai de zero (nenhuma correlação) a um (positivo ou negativo, correlação perfeita). with(anscombe,cor(x1,y1)) with(anscombe,cor(x2,y2)) with(anscombe,cor(x3,y3)) with(anscombe,cor(x4,y4)) O que se pode concluir até aqui? Faça os gráficos de dispersão: par(mfrow=c(2,2)) # 4 graficos em uma janela plot(y1~x1, data=anscombe) plot(y2~x2, data=anscombe) plot(y3~x3, data=anscombe) plot(y4~x4, data=anscombe) par(mfrow=c(1,1)) Você pode acrescentar as linhas de regressão linear ((descreve o valor esperado de uma variável dependente como uma função linear de uma variável independente, veja na unidade sobre [[bie5782:03_apostila:06-modelos|modelos lineares]] )): par(mfrow=c(2,2)) # 4 graficos em uma janela plot(y1~x1, data=anscombe, xlim=range(anscombe[,1:4]),ylim=range(anscombe[,5:8])) abline(lm(y1~x1, data=anscombe)) plot(y2~x2, data=anscombe, xlim=range(anscombe[,1:4]),ylim=range(anscombe[,5:8])) abline(lm(y2~x2, data=anscombe)) plot(y3~x3, data=anscombe, xlim=range(anscombe[,1:4]),ylim=range(anscombe[,5:8])) abline(lm(y3~x3, data=anscombe)) plot(y4~x4, data=anscombe, xlim=range(anscombe[,1:4]),ylim=range(anscombe[,5:8])) abline(lm(y4~x4, data=anscombe)) par(mfrow=c(1,1)) Este conjunto de dados foi criado pelo estatístico Frank Anscombe para demonstrar a importância da análise visual de dados, veja [[http://en.wikipedia.org/wiki/Anscombe's_quartet|aqui]]. ===== Leia mais sobre análise exploratória de dados ===== Artigo com um protocolo de análise exploratória de dados: *[[http://onlinelibrary.wiley.com/doi/10.1111/j.2041-210X.2009.00001.x/pdf]] Capítulo do livro "Analysing Ecological Data" sobre análise exploratória de dados: *{{:bie5782:02_tutoriais:tutorial4:zuur_cap_4_exploration_statistics.pdf|}}