terça-feira, 24 de abril de 2012

Gráficos com R e ggplot2

Olá pessoal, tudo certo? No post de hoje vamos fugir um pouco dos algoritmos e dar uma olhada em algo bastante importante para quem lida com análise de dados e estatística: como criar gráficos complexos e bonitos, de maneira rápida e fácil? A resposta: usando Linguagem R e o pacote ggplot2!

Como comentado no post sobre Tetris e algoritmos genéticos, R é uma linguagem de programação open source voltada para análise estatística e gráfica, sendo hoje em dia bastante utilizada por diversas empresas, incluindo Google, Pfizer, Merck, Bank of America, Shell, entre outras.

A idéia deste post é dar uma introdução prática a criação de gráficos em R, sem se preocupar com detalhes de arquitetura ou particularidades da linguagem. Para criar gráficos em R, temos basicamente três pacotes que já vem instalados por default:

  • graphics: Bastante útil para criar gráficos mais simples, como histogramas, box-plots, scatter plots, etc. A parte visual pode ser customizada facilmente, mas dependendo do grau de customização, pode ser um pouco trabalhoso.
  • grid: Este pacote serve mais como um framework de criação e customização dos gráficos, permitindo um controle maior sobre o desenho de primitivas. Ao menos que você queira criar o seu próprio framework, você não usará este pacote diretamente.
  • lattice: Usa o pacote grid para implementar um sistema superior ao graphics, permitindo a criação de gráficos mais complexos. Apesar das vantagens, extender esse pacote pode ser bastante trabalhoso.

Em resumo, o pacote graphics é bastante útil na criação e análise de gráficos mais comuns, enquanto o pacote lattice nos ajuda com gráficos mais complexos, do tipo trellis. Dependendo do grau de customização desejado (tanto no modelo quanto na parte visual), podemos ter bastante trabalho ao usar estes pacotes. É aí que entra o ggplot2...

O pacote ggplot2

ggplot2 foi criado justamente para resolver as limitações discutidas no tópico anterior. Além da parte visual muito superior (por default), ggplot2 oferece uma espécie de gramática dos gráficos, com a qual podemos desenvolver cada elemento do gráfico em camadas separadas, o que nos permite um controle total sobre a aparência do gráfico. Os exemplos desse post são baseados no livro ggplot2: Elegant Graphics for Data Analysis, cujo autor é o próprio desenvolvedor do ggplot2.

Após instalar o R, instalar o ggplot2 é bem fácil, basta digitar

  install.packages("ggplot2")
 
e aguardar a instalação (você precisa estar conectado).

Shine on your crazy diamond

Ao trabalhar com gráficos em ggplot2, podemos fornecer os dados como variáveis separadas, ou passar um data frame e especificar quais colunas serão utilizadas. A segunda opção é a recomendada, por ser mais clara e evitar alguns problemas que podem ocorrer, principalmente quando trabalhamos com diversos pacotes ao mesmo tempo (pesquise o conceito de environment em R para saber mais).

Para começar nossa análise, temos um data frame interessante chamado diamonds, localizado no pacote ggplot2. Observe algumas linhas deste dataset:

carat cut color clarity depthtable pricexyz
0.2IdealESI261.555.03263.953.982.43
0.2PremiumESI159.861.03263.893.842.31
0.3GoodJSI263.358.03354.344.352.75

De maneira simplificada:

  • Carat: é uma unidade de massa, onde 1 carat = 0.2 gramas. Obviamente, quanto maior o 'carat', mais valioso o diamante, mantendo as demais características constantes.
  • Cut: quanto melhor o corte, maior a parcela de luz que será refletida através do diamante, tornando-o mais valioso.
  • Color: A cor mais comum do diamante é o amarelo, e é uma das características mais difíceis de se avaliar. Varia de Z (levemente amarelo) a D (completamente transparente e extremamente valioso).
  • Clarity: representa a pureza interna do diamante. Obviamente, quanto menor o número de impurezas, maior o valor do diamante.
  • depth, table, x, y e z: são as dimensões do diamante, proporcionais ao volume.
As variáveis acima são conhecidas como os '4 C's do diamante'. Após essa humilde introdução ao mundo dos diamante, vamos ao que interessa.

Quick plot

Como comentado anteriormente, ggplot2 usa uma espécie de 'linguagem dos gráficos', o que nos permite trabalhar em camadas e obter uma customização total do gráfico. Por outro lado, ggplot2 nos oferece a função qplot, ou quick plot, que serve como 'atalho' para a criação de gráficos tradicionais. É exatamente essa função que vamos usar nos exemplos deste post.

Scatter plots

Como primeiro exemplo, vamos investigar a relação entre o preço e o carat dos diamantes:

  qplot(carat, price, data = diamonds)
 
ou
  qplot(x = carat, y = price, data = diamonds, geom = 'point')
 
Ao investigar a assinatura da função (veja ?qplot), temos uma extensa lista de argumentos, vamos analisar os mais importantes:
  • x: A coluna do data frame que será plotada no eixo x.
  • y: A coluna do data frame que será plotada no eixo y.
  • data: O data frame utilizado para extrair as variáveis especificadas.
  • geom: Define o tipo de gráfico. Repare que nesse caso não precisamos especificar geom = 'point', pois ggplot2 usa 'point' como default quando fornecemos x e y. No caso de fornecermos somente x, ggplot2 usa 'histogram' como gráfico default.
Repare também que ao passar argumentos em R, podemos nomeá-los ou não. Quando seguimos a ordem definida na função, não é necessária nomear, mas quando não sabemos ou não temos certeza deste ordem, é sempre boa prática passar os nomes. No primeiro caso acima, x e y são os 2 primeiros argumentos, então não precisamos nomear (consulte o help com ?qplot).

As técnicas de manipulação de dados usadas em R se aplicam normalmente. Por exemplo, podemos observar a relação entre o carat e o volume dos diamantes:

  qplot(carat, x * y * z, data = diamonds, ylab = 'volume')
 

Além do básico

Os exemplos anteriores são bastante simples, vamos tentar algo que mostre as vantagens do ggplot2. O dataset diamonds é muito grande, vamos usar uma amostra aleatória deste dataset:

  nlinhas = 500
  diamantes.amostra = diamonds[sample(nrow(diamonds), nlinhas), ]
 
Suponha agora que precisamos plotar preço x carat, mas queremos que diamantes com cores diferentes sejam plotados com cores diferentes. Usando ggplot2, basta fazer
  qplot(carat, price, data = diamantes.amostra, colour = color)  
 
e obtemos o gráfico acima. Repare no argumento colour = color, ou seja, separamos a cor de cada ponto (atributo colour) de acordo com a coluna 'color' do dataset. Da mesma maneira, podemos plotar cada ponto com um símbolo diferente, de acordo com o corte do diamante (coluna 'cut'):
  qplot(carat, price, data = diamantes.amostra, shape = cut)  
 
Nesse caso especificamos shape = cut, ou seja, o formato de cada ponto varia de acordo com a coluna 'cut' do dataset.

Combinando geometrias

O valor do atributo geoms pode ser uma combinação de valores, desde que a combinação faça sentido. Observe o exemplo abaixo, onde adicionamos uma regressão aos pontos:

  qplot(carat, price, data = diamantes.amostra, geom = c('point', 'smooth'))
 
Podemos especificar o método usado na regressão utilizando o atributo method. Para um regressão linear, basta especificar
  qplot(carat, price, data = diamantes.amostra, geom = c('point', 'smooth'), method = 'lm')
 

Histogramas e gráficos de densidade

Ao omitir o valor de y, qplot utiliza por padrão a geom 'histogram'. Veja o exemplo abaixo:

  qplot(carat, data = diamonds, geom = 'histogram', colour = color)
 
Aqui especificamos a coluna 'color' para enriquecer o histograma. Poderíamos ter usado 'fill' ao invés de 'colour', o que mudaria a cor de preenchimento das barras. Outro parâmetro importante no histograma é o binwidth, que controle o intervalo das classes. Você pode especificar um valor para binwidth, ou aceitar o default. Veja o mesmo gráfico usando binwidth = 0.01:
  qplot(carat, data = diamonds, geom = 'histogram', colour = color, binwidth = 0.01)
 
É importante testar esse atributo, pois padrões interessantes podem ser revelados ao se variar o intervalo das classes.

Gráficos de densidade são uma alternativa interessante aos histogramas, bastando mudar a geometria:

  qplot(carat, data = diamonds, geom = 'density', colour = color)
 
Da mesma maneira, podemos controlar a suavidade da curva, desta vez com o atributo adjust. Veja o mesmo gráfico com adjust = 0.01:
  qplot(carat, data = diamonds, geom = 'density', colour = color, adjust = 0.01)
 

Os exemplos acima são uma pequena amostra das capacidades do ggplot2, certamente teremos mais posts sobre o assunto. Fique ligado, e até mais!

Um comentário: