Figura 20 - Gráfico de pizza com valores
Gráficos de Barras
Gráficos de barras podem ser produzidos com a função barplot. Vamos continuar usando o conjunto de dados produzido na seção anterior: dados. Na forma mais básica, a função recebe como argumento uma coluna ou vetor: > barplot(dados$Murder)
Figura 21 - Gráfico de barras
Novamente fica claro que precisamos aperfeiçoar nosso gráfico. Primeiramente adicionamos rótulos para os eixos usando xlab e ylab, e o argumento main para adicionar um título para o gráfico. Para nomear as barras de acordo com o respectivo estado, usamos o argumento name com a função row.names, de forma semelhante ao que fizemos com o gráfico de pizza. > barplot( dados$Murder, name=row.names(dados), main="Assassinatos por Estado", xlab="Estados", ylab="Assassinatos por 100 mil hab.")
Figura 22 - Gráfico de barras com rótulos e título
O problema agora é que o R automaticamente corta o nome dos estados para evitar sobreposição. O Ideal neste caso é organizar os rótulos verticalmente, isso pode ser obtido através do argumento las com valor 2, o valor 3 irá colocar na vertical também o eixo y. Porém, com os rótulos na vertical, precisamos remover o label do eixo x ou haverá uma sobreposição com os nomes dos estados: > barplot( dados$Murder, name=row.names(dados), main="Assassinatos por Estado", ylab="Assassinatos por 100 mil hab.",las=2)
Figura 23 - Gráfico de barras com títulos na vertical
7. Estruturas de Programação
O R possui um amplo conjunto de estruturas tradicionais de linguagens de programação: decisão, laços, tratamento de erros, funções etc. Pela minha experiência, no R estas estruturas são mais uteis em scripts para execução em lote do que em análises ah hoc, porém, mesmo que você não vá produzir scripts, precisará criar um laço em algum momento. Estruturas Condicionais
If permite avaliar uma condição e executar uma expressão se a condição for verdadeira. Sua forma básica pode ser vista no exemplo abaixo: > a <- 1 > b <- 5 > if (a
É claro que podemos ter uma seção else: > if (a
Na condição podemos usar qualquer operador lógico suportados pelo R e já estudados, como | (ou) , & (E) ou == (igual). > if (a>0 & a<=1) print("verdadeiro") [1] "verdadeiro"
Outro elemento a ser conhecido são as chaves. No R, ele tem como função agrupar um conjunto de expressões que pertencem a um mesmo bloco, por exemplo, se temos diversas expressões a serem executadas se uma condição é verdadeira, agrupamentos todas entre a abertura e o fechamento das chaves. O mesmo se aplica a outros tipos de estruturas como laços e funções, que estudaremos a seguir. Observe o exemplo: + > if (a>0 & a<=1) + { + print("verdadeiro") + print("Mais uma
função") + } else + { + print("falso") + print("Mais uma função") + }
Laços
Entre as estruturas de repetição, também conhecidas como laços, estão disponíveis as mais usuais: repeat, while e for. Também estão disponíveis as funções break e next. Break interrompe o laço. Next faz com o laço execute uma próxima vez, o que pode não fazer sentido já que o laço normalmente vai executar novamente ao chegar ao fim da estrutura. Porém, em alguns problemas algorítmicos, queremos abreviar a repetição se alguma condição se tornar verdadeira. Vamos a alguns exemplos. Abaixo, repeat é executado até que a variável “a” seja igual a 5. Dentro da estrutura do laço, delimitado pelas chaves, ocorre um teste para verificar se o valor foi atingido, e em caso verdadeiro, aborta o laço, caso contrário, o laço seria “infinito”. No bloco else, o valor do objeto “a” é impresso. > a<-0 > repeat { + if (a == 5) break else + a<-a+1 + print(a) } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5
A estrutura while repete enquanto a condição expressa no argumento a seguir seja verdadeira, desta forma não há necessidade de usar break quando chegar a hora de interromper o laço. Neste exemplo, executamos a mesma tarefa do exemplo anterior: > while (a < 5) { + a <- a + 1; + print(a) } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5
A função for é também interessante, ela permite percorrer um conjunto de valores, atribuindo o mesmo a uma variável. O laço encerra automaticamente quando os valores se esgotarem. No exemplo abaixo, percorremos a primeira coluna do conjunto de dados women, nativo do R, e em seguida imprimimos o valor: > for (i in women[,1]) print(i) [1] 58 [1] 59 [1] 60 [1] 61 [1] 62 [1] 63 [1] 64 [1] 65 [1] 66 [1] 67 [1] 68 [1] 69 [1] 70 [1] 71 [1] 72
Criando Funções
Funções são blocos de códigos cujo objetivo principal é reutilização. Um exemplo de função? Na verdade tudo o que estudamos durante o documento são implantações de funções. No exemplo abaixo, temos o código da função sd, nativa do R, para cálculo do desvio padrão: function (x, na.rm = FALSE) { if (is.matrix(x)) { msg <- "sd() is deprecated.\n Use apply(*, 2, sd) instead."
warning(paste(msg, collapse = ""), call. =
FALSE, domain = NA)
apply(x, 2, sd, na.rm =
na.rm)
}
else if (is.vector(x))
sqrt(var(x,
na.rm = na.rm)) else if (is.data.frame(x)) { "sd() is deprecated.\n Use sapply(*, sd) instead."
warning(paste(msg, collapse = ""), call. =
FALSE, domain = NA) na.rm)
msg <-
}
sapply(x, sd, na.rm =
else sqrt(var(as.vector(x), na.rm = na.rm)) }
Criar sua própria função é simples, você vai precisar definir os argumentos e as expressões da função. Por padrão, no R a função retorna o valor da última linha, portanto, você pode, mas precisa chamar a função return. Caso você opte por usar return, qualquer valor produzido após a chamada será ignorado. A função exemplo abaixo é para avaliar se um número é par. Ela então recebe um argumento e retorna verdadeiro ou falso. A maneira clássica de calcular se um número é par é calculando o seu módulo, se o resultado é zero, o numero é par. No R, o operador módulo é representado por %%. Nossa função deve testar se o módulo do valor é igual à zero, o resultado deste teste é um valor booleano: > par = function(x){ + + x%%2 == 0 + + }
Pronto, agora é só chamar a função passando um valor como parâmetro: > par(10) [1] TRUE > par(5) [1] FALSE
Porém, talvez nem tudo saia como planejado. Podemos querer que nossa função aceite apenas números inteiros. O R possui algumas funções de mensagens, que servem para notificar o usuário sobre alguma coisa que está acontecendo dentro da função. Stop causa a parada da função, warning e message exibem a mensagem porém a execução da função continua. Vamos agora então mudar a função, de forma que se o valor passado como parâmetro não for inteiro, seja exibido um aviso, porém a execução da função continua. Para testar o valor usamos uma estrutura de condição seguido de
is.integer, função que retorna um valor booleano de teste de inteiro. Recordando, exclamação é o operador NOT: > par = function(x){ + if (! is.integer(x)) warning("Valor não inteiro") + x%%2 == 0 + } > par(2)
Vamos testar nossa função. Já estudamos que o operador L determina que um valor seja inteiro, caso contrário, ele será tratado como numérico. Na primeira chamada da função, o argumento é 2L, por isso a função retorna TRUE sem qualquer mensagem. Na segunda chamada, o argumento é 2, a função é executada e a mensagem de aviso é exibida: > par(2L) [1] TRUE > par(2) [1] TRUE Mensagens de aviso perdidas: In par(2) : Valor não inteiro
Como tratar o outro caso, do argumento ser um caractere? Existem algumas alternativas. A primeira é testar o argumento e chamar a função stop, que exibe a mensagem e interrompe a execução da função. Também o R possui a implementação da tradicional dobradinha try/Catch e finnaly. Para saber mais consulte a ajuda do R.
8. Pacotes e Produtos Adicionais Indispensáveis
Nesta seção vamos explorar alguns recursos indispensáveis para um usuário de R. Todos são projetos open source como o R. RStudio
RStudio é a IDE para R mais popular e, no meu ponto de vista, a mais robusta. O RStudio facilita o processo de programação com diversos recursos tanto na linha de comando como visuais. Por exemplo, o recurso de auto completar (IntelliSense) disponíveis em IDEs de ambiente de programação também esta disponível no RStudio. Para quem é novo nestes ambientes, o recurso de auto completar sugere o código a ser utilizado depois da digitação dos primeiros caracteres. É excelente para poupar tempo e reduzir erros de sintaxe. Para usar o auto completar, digite os primeiros caracteres da expressão, tecle Tab ou Ctrl+espaço, navege na lista de sugestões usando as setas, quando atingir a linha desejada, tecle Enter.
Figura 24 - RStudio
Outro recurso importante na linha de comando é que a todo parantese ou colchetes aberto é imediatamente e automáticamente fechado. O RStudio também dispoe de diversas janelas auxiliares. A janela workspace mostra os objetos carregados em memória. Esta janela é atualizada em tempo real, se você criar um objeto, a janela é atualizada, se você remover um
objeto, usando a função rm por exemplo, a janela é atualizada. Se você carregar um objeto tabular, o R vai lista-lo na janela workspace com uma pequeno icone de grade ao lado, ao clicar no icone, o R exibe em nova janela auxiliar os dados no formato de uma tabela, semelhante a uma planilha:
Figura 25 - Janelas auxiliares do RStudio
A janela history exibe um historico de comandos, exatamente como a função history já estudada. O RStudio possui ainda janelas para exibir o diretório de trabalho, gráficos produzidos com o diferencial que todos os gráficos da sessão podem ser acessados (no RGui eles são sobrepostos por padrão), uma janela de ajuda e ainda a janela Packages. A Janela packages é interessantíssima, ela exibe todos os pacotes instalados no R. Os pacotes carregaos estão assinalados através de uma caixa de seleção. Também neste caso o processo é interativo, ao carregar ou descarregar pacotes, a janela é atualizada imediatamente.
Figura 26 - Detalhes da janela packages do RStudio
Do ponto de vista de importação de arquivos, o RStudio implementa um ambiente mais amigável e menos susceptível a erros, já que os parâmetros podem ser definidos visualmente e um template do data frame resultante é exibido ainda antes da importação:
Figura 27 - Tela de importação de dados do RStudio
O RStudio também permite a implementação de projetos. Novamente, o conceito é analágo a projetos em uma IDE de software: Um projeto para uma análise de regressão para o RH, outro projeto de analise exploratória para a contabilidade, etc. Cada projeto tem seu próprio diretório de trabalho, histórico, código fonte etc. RCommander
O RCommander é outra IDE para R, com uma proposta um pouco diferente: Esta IDE implementa telas para as principais funções utilizadas no R. Diferente do RStudio que é instalado através de um instalador próprio, o RCommander é instalado através de uma instalação normal de pacotes, usando a função install.packages. O pacote possui muitas dependências e a instalação pode levar alguns minutos. É importante definir o parâmetro dependencies como verdadeiro para que todas as dependências sejam instaladas automaticamente: > install.packages( "Rcmdr", dependencies=TRUE)
Ao carregar o pacote usando a função lybrary, uma mensagem pode solicitar a instalação do pacote XLConnect. Clique em Sim. > library(Rcmdr)
Figura 28 - Erro de instalação de pacote no RCommander
Após a instalação, a IDE do RCommander é exibida:
Figura 29 - IDE do RCommander
O funcionamento do RCommander é um pouco peculiar. Na janela superior, anela do script, digitam-se comandos, porém, a execução não ocorre ao teclar enter: é preciso clicar em Submeter e o código deve estar selecionado. Na janela de resultados são exibidas as saídas dos comandos. Porém o melhor do RCommander é quando temos um conjunto de dados ativo: neste momento, diversas funções estatísticas passam a estar disponíveis através de anelas. Vamos ver como funciona. Com o RCommander aberto, vamos ativar a visão nativa do R woman. Clique em Dados, Conjunto de dados em pacotes, Ler dados de pacote “attachado”:
Figura 30 - Ativar dados no menu do RCommander
Em pacote, selecione datasets (duplo clique), em conjunto de dados selecione women novamente com um duplo clique, e clique em OK:
Figura 31 - Seleção de dados de pacote do RCommander
Neste momento women passa a ser o conjunto de dados ativo, indicado na tela principal em Conjunto de dados. Podemos agora executar funções estatísticas ou plotar gráficos sobre estes dados. Por exemplo, podemos fazer um teste de correlação entre a altura e peso das observações destes dados, como já fizemos em capítulo passado usando funções na linha de comando. Para tal, selecione Estatísticas, Resumos, Teste de Correlação:
Figura 32 - Teste de correlação no RCommander
Selecione as duas variáveis, neste caso heigh e weight. Mantenha os outros parâmetros sem alteração e clique em Ok:
Figura 33 - Argumentos de teste de correlação do RCommander
O resultado traz o comando executado e o resultado, ambos na janela de resultados. Observe uma correlação quase perfeita. > cor.test( women$height, women$weight, alternative="two.sided", method="pearson") data:
Pearson's product-moment correlation women$height and women$weight
t = 37.8553, df = 13, p-value = 1.088e-14 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.9860970 0.9985447 sample estimates:
cor 0.9954948
Com este exemplo fica claro o objetivo do RCommander: ele prove interfaces amigáveis e nos bastidores ele constrói e executa a expressão, diferentemente do RStudio, cujo principal objetivo é facilitar o uso do R na linha de comando. Você vai encontrar informações http://www.rcommander.com/ .
sobre
o
RCommander
em
Rattle
Rattle, acrônimo para R Analytical Tool To Learn Easily, assim como o RCommander, se propõe a fornecer uma interface gráfica para o R, porém, neste caso, para funções de Mineração de Dados. O Rattle também é instalado a partir de um pacote e executado a partir da linha de comando do
R. Para instalar o Rattle, utilize a função install.packages, com o parâmetro dependencies definido como verdadeiro. > install.packages( "rattle", dependencies=TRUE)
O Rattle instala uma grande quantidade de pacotes, por isso, a instalação pode levar alguns minutos. Para executa-lo, primeiro carregue o pacote, em seguida, execute a função rattle. > library(rattle) > rattle()
O Rattle é apresentado através de uma série de guias. As guias seguem uma ordem lógica do processo usual de mineração de dados. Algumas etapas são obrigatórias, outras opcionais.
Figura 34 - IDE do Rattle
A seguir veremos um pequeno tutorial do uso da ferramenta. Inicialmente vamos obter os dados para minerar. A interface permite obter
dados de diversas fontes. Para nosso exemplo, vamos usar dados nativos do R, para isso, marque a opção Library, na caixa de combinação que surgir selecione íris:datasets:Edgar Anderson’s Iris Data. Clique em Execute. O Rattle carrega os dados. Observe que para cada coluna, é definido o tipo do dado, e se a mesma é uma informação de entrada ou se é o objetivo (target) da análise. Neste caso, o Rattle automaticamente detectou Species como target. Em Partition você pode definir o percentual de seus dados que será utilizado para treino, validação e teste. Para este exemplo, vamos usar 70% para treino e 30% para testes:
Figura 35 - Guia dados no Rattle
A guia Explore serve para conhecermos o conjunto de dados, nela estão disponíveis operações como Sumario, distribuição, correlação etc. Seguindo o nosso exemplo, executamos a operação sumario. Para variáveis categóricas, Species neste exemplo, temos os níveis. Para variáveis numéricas o comando nos traz as mesmas informações da execução da função sumario sobre os dados:
Figura 36 - Guia explore no Rattle
Seguindo o exemplo, vamos agora a guia Model. Vamos usar o modelo de Árvores de Decisão, marcado como padrão no Rattle. Inicialmente, como os parâmetros padrão, clicamos em executar. O Rattle traz um sumário da execução:
Figura 37 - Guia model no Rattle
Em seguida clicamos em Rules para ver as regras usadas na árvore de decisão.
Figura 38 - Regras do Modelo no Rattle
Clicamos então em Draw para ter uma representação gráfica da árvore:
Figura 39 - Representação gráfica de árvore
Por fim, podemos avaliar a performance da análise. Mantemos marcada a opção Error Matrix. Apenas o modelo Tree estará disponível porque foi o único utilizado. Em data, mantemos marcada a opção Testing. Clicamos em executar. O Rattle traz a matriz de erro em valores absolutos e percentuais. Podemos observar que no nosso modelo, 7% das observações de species versicolor foram classificadas como virginica:
Figura 40 - Guia Evaluate no Rattle
Para mais informações sobre o Rattle, acesse http://rattle.togaware.com/. Bioconductor
Bioconductor é um projeto com mais de 600 pacotes para R voltado a analise de dados genéticos. Ao contrário da maioria dos pacotes para R que são mantidos no CRAN, você vai achar os pacotes do Bioconductor no próprio site do projeto, http://www.bioconductor.org/. R-Forge
R-Forge é uma plataforma de desenvolvimento de pacotes e software relacionados ao R, oferecendo controle de versão, mailing list, controle de bugs etc. Normalmente os pactes no R-Forge estão em desenvolvimento são mantidos no R-Forge e depois disponibilizados no CRAN. RODBC
Conectar diretamente a um banco de dados relacional é com certeza uma tarefa obrigatória. Mesmo havendo meios de exportar e importar dados em
formato texto, por exemplo, acessar dados diretamente em um banco de dados torna o processo mais rápido e seguro. A palavra segura pode soar um pouco ambígua, mas o significado aqui não se refere à segurança da informação no sentido de acesso não autorizado, também não está no contexto de integridade da informação, pois, normalmente, uma conexão a uma fonte de dados para fins analíticos não é feita em uma base de dados de produção e se for, este acesso normalmente dará aos usuários apenas os privilégios necessários às operações em curso – ao menos é o que se espera. A segurança aqui diz respeito ao risco de perda de informações durantes processos de importação, e principalmente exportação, que são minimizados através de um acesso direto a uma base de dados. O R possui diversos pacotes para acesso a banco de dados, como RMySQL, ROracle, RJDBC e RODBC. Nesta seção vamos estudar o RODBC por ser o mais genérico, e nos prover acesso a qualquer fonte de dados quando existir um drive ODBC disponível. ODBC, Open Database Connectivity Connectivity)) é um paa d rã p rãoo a be berr to p ar araa a ce cess ssoo a d ad adoo s. Primeiramente precisamos instalar o pacote RODBC > install.packages( "RODBC", dependencies=TRUE)
É preciso ter configurado uma fonte ODBC em seu sistema operacional. Como esta atividade não esta relacionada ao aprendizado de R, vamos supor que você já tenha esta fonte. No exemplo abaixo, a fonte de dados criada no OBDC se chama VENDAS. A primeira linha abre uma conexão com a fonte de dados VENDAS. Na segunda linha, a função sqlQuery executa uma instrução SQL sobre a fonte de dados, fazendo um simples selecionar tudo sobre a tabela BUDGET. O retorno é atribuído a um data frame Orcamento. Por fim, executamos a função head para visualizar as primeiras linhas da tabela conectada: > Conexao <- odbcConnect ( "VENDAS" ) > Orcamento <- sqlQuery( Conexao, "select * from BUDGET") > head(orcamento)
Erro em head(orcamento) : objeto 'orcamento' não encontrado > head(Orcamento) ID_BUDGET ID_SALESPERSON ID_CUSTOMER 1 1 01-12 2 01-14 3 01-29 4 02-10 5 02-14 6 02-25
DATE
AMOUNT 38
VALIDITY 53 2011-01-07
389.98 2011-
2
45
267 2011-01-09
29.95 2011-
3
24
484 2011-01-24
595.08 2011-
4
22
180 2011-02-05 2472.45 2011-
5
36
15 2011-02-09 1818.62 2011-
6
1
79 2011-02-20
324.95 2011-
Ggplot2
Ggplot2 é um pacote de visualização de dados popular e indispensável, e que pode tranquilamente substituir os pacotes nativos de visualização do R. Por estar em um capítulo sobre adicionais, está claro que o pacote não é nativo do R e precisa ser instalado. O processo de instalação é simples, como o de qualquer outro pacote: > install.packages( "ggplot2" , dependencies=TRUE)
Também como qualquer pacote que não é carregado automaticamente, ggplot2 precisa ser carregado > library(ggplot2)
Vamos produzir um exemplo usando o conjunto de dados nativo do R Orange. Inicialmente observamos os primeiro registros do conjunto de dados: > head(Orange) Tree age circumference 1 1 118 30
2 3 4 5 6
1 484 1 664 1 1004 1 1231 1 1372
58 87 115 120 142
Neste caso, vamos usar um gráfico de dispersão usando as colunas circunferência - circumference - e a idade – age – de Orange, porém, queremos que cada ponto do gráfico seja colorido de acordo com a árvore aonde a medição foi feita, definido através da coluna Tree. No exemplo abaixo, os dois primeiros argumentos definem as dados a serem plotados no gráfico, o segundo argumento a fonte de dados, o argumento color, define que queremos colorir os pontos através da coluna Tree. > qplot(age, circumference, data = Orange, color = Tree)
Figura 41 - Gráfico de dispersão produzido com ggplot2