Tutorial: Manipulação e Análise de Dados em R

Esse é um pequeno tutorial para quem não tem muita familiriadade com o R. O foco é entender o que o R é capaz de fazer, mas não deixar de fora as explicações estatísticas (ainda que sejam breves). Se você nunca abriu o R, recomendo que passe primeiro por Primeiros passos no R (Studio) e em seguida volte aqui.

Bom, agora que você já tem o R e o RStudio instalados na sua máquina, é hora de aprender alguns procedimentos básicos. Para esse pequeno tutorial utilizaremos os dados de chickWeight que já estão no R. Esse dataset contém quatro campos: peso, tempo, identificação da galinha e dieta. Primeiro vamos visualizar os dados:

## carregando dados
data("chickWeight");
View(chickWeight);

chickWeight1

Se em outra situação os dados estiverem em algum arquivo de outro formato qualquer (.xls, .csv, etc.), você pode aprender a importá-los: Carregando / Importando seus dados no R

Três notas importantes dessas primeiras linhas de código escritas acima: no R deve ser utilizado o ‘#’ para fazer comentários; o uso de ponto e vírgula é opcional; o comando View() abre uma nova aba com a tabela sendo utilizada.

Uma alternativa ao View() é o head(). A única diferença é que o head() vai mostrar somente as primeiras linhas. De qualquer forma, ambos servem apenas para o usuário saber o que há no dataset.

Caso esteja confuso e queira saber o que cada função faz exatamente basta digitar “?” seguido do nome da função. No 4º quadrante aparecerá a explicação:

chickWeight6

Agora que a tabela já está aberta, você pode ver que temos um conjunto de dados com informações de galinhas e suas respectivas dietas ao longo do tempo. Os campos são melhor explicados neste link, de forma resumida temos as seguintes colunas:

  • Weight: Peso em gramas da galinha;
  • Time: Número de dias desde o nascimento até o momento em que a medida foi tirada;
  • Chick: Identificador único para cada galinha;
  • Diet: Identificador de um dos 4 tipos de dieta.

Ao abrirmos a tabela utilizando o View(), podemos ver 4 campos numéricos. Porém, veja que os dois últimos campos servem apenas para separar os grupos – poderíamos trocar as dietas 1, 2, 3 e 4 por A, B, C e D, por exemplo – e não indicam um tipo de medida. Esse tipo de variável deve possuir classe factor.

Vamos investigar quais as classes de cada campo utilizando a função lapply:

lapply(ChickWeight, class);

chickWeight2

Como você pode ver, as classes são exatamente o que esperávamos (as primeiras duas colunas são numéricas e as duas últimas são fatores) e os dados estão prontos para serem trabalhados.

Nossos dados parecem estar organizados e fáceis de ler. Caso você queira, por exemplo, ler os dados ordenados de acordo com a dieta, utilize order:

ChickWeight[order(ChickWeight$Diet),]

Para renomear uma coluna, basta utilizar colnames seguido da posição da coluna:

colnames(ChickWeight)[1] = "peso";

Para mudar todos os nomes das colunas:

colnames(ChickWeight)[] = c("peso", "tempo", "galinha","dieta");
head(ChickWeight);

chickweight_colnames

Como exercício, retorne os nomes ao conteúdo original.

Vamos supor que esse seja nosso primeiro experimento e que no futuro tudo será consolidado em uma única base. Para identificar a galinha em cada experimento, criaremos uma coluna chamada id que terá a informação do identificador da galinha e a letra correspondente ao experimento (nesse caso A). Para fazer isto, basta utilizar sprintf() com a string que deseja combinar seguida de %d:

ChickWeight$id = NA;
ChickWeight$id = sprintf("A%d",ChickWeight$Chick);

Você pode verificar rapidamente o resultado com View(ChickWeight) ou head(ChickWeight):

chickweight_newcolumn

Agora que já arrumamos nossa tabela da forma como queríamos, vamos obter um resumo estatístico geral dos dados da tabela:

summary(ChickWeight);

chickWeight3

Como podemos ver, o resumo estatístico oferece algumas estatísticas importantes como a média e a mediana para variáveis quantitativas. Para os casos dos fatores, como o tipo de dieta, podemos ver como os grupos estão distribuídos (e.g. temos 220 galinhas na dieta 1).

Como estamos trabalhando com espaços de tempo diferentes, é interessante também observar o peso médio ao longo do tempo:

aggregate(weight ~ Time, data = ChickWeight, FUN = mean);

chickWeight4

Ou o peso médio de acordo com a dieta:

aggregate(weight ~ Diet, data = ChickWeight, FUN = mean);

chickWeight5
Ambos foram obtidos com a função aggregate() que divide os dados em subgrupos e calcula o resumo estatístico declarado em FUN.

Outra forma de obter esse resumo estatístico é através da função tapply():

tapply(ChickWeight$weight,ChickWeight$Diet,mean);
tapply(ChickWeight$weight,ChickWeight$Diet,median);

Podemos ver que quanto mais o tempo decorre, maior o peso. Adicionalmente, a dieta 4 parece também parece engordar as galinhas.

Agora, vamos visualizar os dados. Começando com a distribuição do peso:

hist(ChickWeight$weight, col='blue',main="Histograma do Peso");

chickweight_peso

Podemos ver que a curva é assimétrica à direita. Isto quer dizer que os valores mais frequentes são menores do que a média. Para se ter uma noção intuitiva, essa curva é geralmente uma boa representação da distribuição salarial de muitas regiões do mundo. Com alguns poucos ganhando milhões, a média acaba não sendo uma representação do que a maioria recebe. Veja também que em nossa distribuição a moda é menor que a mediana. Se você ainda tem dúvidas desses conceitos, leia Estatística DescritivaVisualizando seus dados: Histograma.

Outra forma de visualização é através do gráfico de dispersão:

plot(ChickWeight$weight, main="Graf. de Dispersao de Peso");

chickweight_scatterplot

Você pode alterar o formato que você deseja que seja utilizado para marcar cada ponto com a função pch e renomear os eixos com xlab e ylab:

plot(ChickWeight$weight,pch=3, xlab="Peso")

chickweight_scatter2

Veja que os gráficos de dispersão pouco dizem sobre os nossos dados. Como precisamos levar em consideração o tempo e a dieta da galinha, vamos plotar um gráfico diferente utilizando o pacote ggplot2:


library(ggplot2);
ggplot(ChickWeight, mapping = aes(x = Time, y = weight, color = Diet) )+geom_point();

chickWeight

Podemos ver a variação do peso das galinhas ao longo do tempo para as diferentes dietas. Utilizando a função ggplot(), declaramos primeiro nosso conjunto de dados (ChickWeight) e em seguida as variáveis da análise: o eixo x (Time), o eixo y (weight) e os subgrupos que serão identificados pelas diferentes cores (Diet). Como queremos um gráfico de dispersão, utilizamos “+ geom_point”. É possível também fazer outros tipos de gráficos, como por exemplo gráfico de linhas (+geom_lines). Você pode ver todas as possibilidades digitando geom_ e apertando a tecla tab.

Aparentemente, há correlação positiva entre o tempo decorrido e o peso. Ou seja, quanto mais dias decorridos, maior o peso. Podemos confirmar essa hipótese utilizando a função cor():

cor.test(ChickWeight$Time, ChickWeight$weight);

A correlação de 0.8371017 indica uma forte relação linear entre as duas variáveis. Aumento nos valores de peso são acompanhados de aumentos nos valores de tempo, e o mesmo vale para redução. Importante lembrar que isso não significa que uma das variáveis esteja causando a alteração nos valores da outra variável. E também não significa que quando a correlação for zero as variáveis não tenham relação entre si (e.g.: y = x * x).

Para finalizar, podemos tentar estimar uma equação para predizer o peso de uma galinha com base em sua dieta. Se acreditamos que a relação entre peso e dieta é linear (você conseguiria representar a relação entre as duas por uma reta), podemos utilizar uma regressão linear:

regressao = lm(weight ~ Diet, data=ChickWeight);
summary(regressao);

chickWeight7

Todos os coeficiente são estatisticamente significativos. Em outras palavras, podemos rejeitar a hipótese nula – que nesse caso seria que a variável independente (Diet2, Diet3 ou Diet4) não teria efeito sobre a variável dependente (peso).

Essa equação implica que se tivéssemos, por exemplo, uma galinha cuja Diet2 tenha valor 1, Diet3 valor 0 e Diet4 valor 0, seu peso estimado seria 102.645+19.971*1 = 122.616.

É possível perceber que o intercepto tem um impacto maior que as outras variáveis, mas também que o peso aumenta de forma diferente de acordo com cada dieta. O R-quadrado ainda é baixo, indicando que a equação explica somente 0.05 da variação do peso.

Como o tempo parece impactar também o peso, podemos tentar fazer uma regressão com tempo e dieta:

regressao = lm(weight ~ Diet + Time, data=ChickWeight);
summary(regressao);

chickWeight8

Temos nessa segunda regressão que a variável tempo também é significativa. Para cada unidade de tempo acrescida, há um aumento de aproximadamente 8.7 gramas no peso. O R-quadrado aumentou significativamente também, de 0.05 para 0.74 na segunda regressão. De acordo com esses números, a variação do peso de uma galinha nesse experimento seria sido causada principalmente pelo tempo decorrido desde que iniciou-se a dieta.

Em toda regressão linear é importante analisar os resíduos, que nada mais são do que a diferença entre o valor observado e o valor predito pela regressão. Os resíduos precisam ter um comportamento aleatório e esperança zero. Essa análise pode ser feita graficamente:

plot(regressao, pch=16, which=1)

ChickWeightResiduals

Como podemos ver, os valores não possuem uma distribuição semelhante ao longo do tempo. Para pesos maiores, os erros são maiores. Isso está em desacordo com as premissas da OLS – leia mais sobre o assunto em Resíduos de Uma Regressão Linear no R. Nos resta como alternativas utilizar outra técnica de modelagem ou adicionar outras características das galinhas, como idade ou algum outro fator biológico identificável (aí já vai para a área biológica e eu não consigo opinar muito).

Mais sobre análise de uma regressão linear pode ser encontrado em: Regressão Linear Simples – Parte 1, Regressão Linear Simples – Parte 2, Regressão Linear Simples – Parte 3 e Análise dos Resíduos de uma Regressão Linear.

Você pode explorar outras manipulações em: Substituindo missing pela média no R, Dica rápida: Excluindo colunas no R, Excluindo linhas missing no R, Excluindo linhas de uma tabela no R.

PS.: Se você é realmente MUITO novo na área, pode ser que você se depare com um banco de dados relacional (diversas tabelas com informações distintas que se conversam por um campo chave) e queira unir as diferentes bases utilizando o R. Sim, é possível você trazer informações de diferentes tabelas para formar uma tabela final com todos os dados relevantes. Mas não é usual utilizar o R, nem recomendado. Para isso, ferramentas como o SQL (ou o próprio SAS) são muito mais eficientes. Se quiser praticar manipulações de dados com o SAS, acesse Programação em SAS.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s