Você está na página 1de 114

R para cientistas sociais

Jakson Alves de Aquino


U NIVERSIDADE F EDERAL DO C EAR jaa@ufc.br

Fortaleza - CE 17 de abril de 2010

Sumrio

Apresentao

I
2

Uso bsico do R
Primeiros passos 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Apresentao do R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iniciando e nalizando o R . . . . . . . . . . . . . . . . . . . . . . . . . . . . Obtendo ajuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Criando, destruindo, salvando objetos . . . . . . . . . . . . . . . . . . . . . . Tipos de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores matemticos e lgicos . . . . . . . . . . . . . . . . . . . . . . . . Usando um editor de textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Milhares de funes em milhares de pacotes . . . . . . . . . . . . . . . . . . .

11
13 13 13 14 15 18 18 20 20 21 21 23 24 27 27 29 29 31 31 32 33

Vetores, matrizes, listas 3.1 3.2 3.3 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Carregar banco de dados existente 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivos sav . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivos csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivos xls, ods e mdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo com colunas de largura xa . . . . . . . . . . . . . . . . . . . . . . . Tabelas em html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Soluo de problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 5

SUMRIO Variveis com letras maisculas nos nomes . . . . . . . . . . . . . . . Espaos excedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . Necessidade de codicar variveis . . . . . . . . . . . . . . . . . . . . Codicao de caracteres errada . . . . . . . . . . . . . . . . . . . . . Converso entre numeric, factor e character . . . . . . . . . . . . . . . Converso de datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . Carregar bancos de grandes dimenses . . . . . . . . . . . . . . . . . Variveis categricas de arquivo sav lidas incorretamente . . . . . . . . Interesse em renomear colunas . . . . . . . . . . . . . . . . . . . . . . 33 33 33 34 34 35 35 36 37 39 39 41 41 42 45 46 47 47 48 49 51 51 52 53 54 56 59 63 63 64 67 68

Manipulando bancos de dados 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 Visualizao dos dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extrair subconjunto dos dados . . . . . . . . . . . . . . . . . . . . . . . . . . Ordenar um banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualizao grca de variveis . . . . . . . . . . . . . . . . . . . . . . . . . Recodicar variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Criar varivel categrica a partir de varivel numrica . . . . . . . . . . . . . . Apagar variveis existentes e acrescentar novas . . . . . . . . . . . . . . . . . Reunir dois bancos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . Reformatar banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.10 Atributos de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Anlise descritiva 6.1 6.2 6.3 6.4 6.5 6.6 7 Anexar variveis de um banco de dados rea de trabalho . . . . . . . . . . . Construo de ndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uma varivel numrica e outra categrica . . . . . . . . . . . . . . . . . . . . Duas variveis categricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . Duas variveis numricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sries temporais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Qui-quadrado e regresso 7.1 7.2 7.3 7.4 Qui-Quadrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regresso linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Procedimento step wise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regresso logstica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO 7.5 Outros tipos de anlise de dados . . . . . . . . . . . . . . . . . . . . . . . . .

3 69

II
8

Tpicos especiais
Grcos 8.1 8.2 8.3 8.4 8.5 Ttulo, subttulo e rtulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicionar pontos, linhas, polgonos, textos . . . . . . . . . . . . . . . . . . . . Parmetros globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Legendas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71
73 73 74 74 76 80 81 81 82 83 84 84

Produo de relatrios 9.1 9.2 9.3 9.4 9.5 Resultado em texto plano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa de bits versus grco vetorial . . . . . . . . . . . . . . . . . . . . . . . Insero de grcos em relatrios . . . . . . . . . . . . . . . . . . . . . . . . Incluso de tabelas em relatrios . . . . . . . . . . . . . . . . . . . . . . . . . odfWeave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

III

Tpicos especiais

87
89 89 89 90 90 92 93 95 99 107 109 113

10 Programao 10.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Blocos entre chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Execuo condicional de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . 10.4 Famlia de funes apply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5 Loops for e while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.6 Manipulao de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Mapas 12 Anlise de redes sociais Glossrio ndice Remissivo Referncias Bibliogrcas

SUMRIO

Lista de Figuras
4.1 5.1 5.2 5.3 5.4 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 Exemplo de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . Eleitos e no eleitos para o Senado em 2006 . . . . . . . . . . . . . . . . . . . Exemplo de diagrama em caixa . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de histograma melhorado . . . . . . . . . . . . . . . . . . . . . . . . rea de trabalho antes e depois de attach(b) . . . . . . . . . . . . . . . . . Diagramas em caixa: percepo da corrupo segundo a Regio . . . . . . . . Grco de densidade condicional: regies segundo a percepo de corrupo . Grco mosaico: religio e sexo do indivduo . . . . . . . . . . . . . . . . . . Grco mosaico: religio e sexo do indivduo (II) . . . . . . . . . . . . . . . . Grco de interao: sexo, escolaridade e votos vlidos . . . . . . . . . . . . . Diagrama de disperso: votao segundo os gastos de campanha . . . . . . . . Diagramas em caixa: votao segundo os gastos de campanha . . . . . . . . . Grco mosaico: votao segundo os gastos de campanha . . . . . . . . . . . 27 42 43 44 45 51 54 55 56 57 58 59 60 60 61 61 65 67 75 78 79 80 82 96

6.10 Sries temporais: latrocnios e furtos em So Paulo . . . . . . . . . . . . . . . 6.11 Sries temporais: latrocnios e furtos em So Paulo (II) . . . . . . . . . . . . . 7.1 7.2 8.1 8.2 8.3 8.4 9.1 Correlao entre duas variveis numricas . . . . . . . . . . . . . . . . . . . . Grcos de diagnstico de um modelo de regresso . . . . . . . . . . . . . . . Ferramentas de desenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grco de barras de varivel com rtulos longos . . . . . . . . . . . . . . . . . Grco de barras de varivel com rtulos longos (II) . . . . . . . . . . . . . . Exemplos de legendas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de Bitmap em tamanho natural e ampliado . . . . . . . . . . . . . . .

11.1 Exemplo de mapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

LISTA DE FIGURAS 11.2 Exemplo de mapa (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Mapa do Nordeste do Brasil . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 98

12.1 Sociograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 12.2 Sociogramas dos graus de centralidade e intermediao . . . . . . . . . . . . . 102 12.3 Sociogramas dos graus de centralidade . . . . . . . . . . . . . . . . . . . . . . 103 12.4 Identicao de grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Lista de Tabelas
2.1 2.2 2.3 7.1 Localizao de pastas no Linux . . . . . . . . . . . . . . . . . . . . . . . . . . Localizao de pastas no Windows XP . . . . . . . . . . . . . . . . . . . . . . Operadores matemticos e lgicos . . . . . . . . . . . . . . . . . . . . . . . . Tipos de anlise e funes correspondentes . . . . . . . . . . . . . . . . . . . 17 17 19 69

LISTA DE TABELAS

Captulo 1 Apresentao
O R um software livre de estatstica que funciona em diversos sistemas operacionais: GNU Linux, Microsoft Windows, Mac OS X e outros. O aprendizado do R difcil no incio devido necessidade de se adaptar sua lgica de funcionamento, se acostumar com a estrutura dos seus arquivos de ajuda e memorizar alguns comandos bsicos. preciso bastante perseverana e motivao para aprender os comandos bsicos e disposio para ler as pginas de ajuda e os manuais. Entretanto, depois de um certo tempo, ele possibilita que se trabalhe com grande produtividade e, o que mais importante, eccia. No encontrei textos semelhantes em portugus e nem mesmo em ingls. H um livro em francs, disponvel na internet, intitulado R pour les sociologues, de Barnier (2008). Este livro deve ser lido de uma maneira que no habitual para cientistas sociais. No basta fazer uma ou duas leituras, reetir e discutir sobre o assunto com os colegas. preciso fazer uma leitura no apenas reproduzindo os comandos no R, mas imaginando e testando alteraes nos comandos para comparar com os resultados originais. Em seguida, preciso enfrentar alguma situao real de pesquisa e reler as sees que trazem solues para os problemas que forem surgindo. Muitas vezes, entretanto, a soluo estar no uso criativo dos comandos vistos ao longo do livro e no em uma seo especca. Alm disso, o leitor deve sempre ler o arquivo de ajuda de cada funo porque a maioria delas possui argumentos adicionais que no utilizaremos neste livro mas so teis em situaes diversas. A minha pretenso com este livro no era de escrever um manual completo de uso do R, mas apenas, em meio ao multiplicidade de pacotes e funes disponveis para o R, indicar caminhos a seguir. Ao longo do texto, fao referncia a programas de escritrio do OpenOfce, mas as informaes, com alguns ajustes, tambm so vlidas para os programas da Microsoft, que, atualmente, possuem uma maior fatia do mercado. Assim, instrues dirigidas a usurios do OpenOfce Writer podem ser seguidas, sem muitas diculdades, por usurios do Microsoft Word e as informaes referentes ao OpenOfce Calc so geralmente vlidas para o Microsoft Excel. O livro foi escrito e o cdigo foi testado em ambiente Linux, mas o funcionamento do R praticamente igual em todas as plataformas e, portanto, isso no dever ser motivo de diculdade adicional para usurios de outros sistemas operacionais. Sou grato aos alunos de Cincias Sociais do Departamento de Cincias que no segundo semestre de 2009 embarcaram na aventura de fazer uma disciplina cujo livro didtico estava comeando a ser escrito, em especial monitora da disciplina, Gabriella Maria Lima Bezerra, que encontrou vrias passagens pouco claras ao longo do texto. Sou grato tambm a Milton (milton ruser) vrias sugestes de melhoria aos grcos.

10

CAPTULO 1. APRESENTAO

Parte I Uso bsico do R

11

Captulo 2 Primeiros passos


2.1 Apresentao do R

O R possui uma enorme quantidade de procedimentos estatsticos em milhares de pacotes livremente disponveis na internet e que podem ser carregados opcionalmente. Softwares comerciais com interface grca so usualmente mais fceis de usar, mas possuem apenas algumas dezenas de funes acessveis com o mouse, sendo preciso comprar mdulos adicionais para executar funes extras. Com o R possvel criar e manter disponveis na rea de trabalho vrios tipos de objetos. Isso permite grande exibilidade e rapidez, mas tem um preo: todos os objetos cam carregados na memria e algumas operaes realizam a criao automtica de vrios objetos, tornando mais complexa a tarefa de se trabalhar com bancos de dados muito grandes. Existem dezenas de interfaces para o R. Algumas exigem a memorizao de numerosos comandos; outras oferecem uma interface com vrios botes e itens de menu clicveis. Para ambiente Linux, alguns editores de texto so o gedit (editor de texto padro do GNOME) com o plugin rgedit e o kate (editor de texto para KDE), o Vim com o plugin vim-r-plugin2, e o Emacs com ESS. Em todos os casos, o procedimento bsico consiste em editar o cdigo no editor e enviar os comandos para o console do R. Gedit e Kate so de uso simples, mas no possuem tantos recursos para facilitar a edio do cdigo quanto o Vim ou o Emacs. Mas o Vim e o Emacs so de uso mais complexo e, para us-los, preciso dedicar algum tempo aprendizagem de seus comandos.

2.2

Iniciando e nalizando o R

No Linux, o R pode ser iniciado num terminal, digitando-se a letra R. O R um programa de linha de comando, ou seja, aberto o R, precisamos digitar algum texto no Console e pressionar a tecla Enter para enviar a linha para o interpretador do R. Todos os comandos terminam com (). Quando quiser fechar o R, utilize o comando quit(). O R lhe perguntar se quer salvar a rea de trabalho. Escolha sim se quiser continuar o trabalho da prxima vez que abrir o R na mesma pasta. Os objetos criados sero salvos no arquivo .RData e o histrico de todos os comandos digitados no arquivo .Rhistory. Se quiser sair sem salvar a rea de trabalho e o histrico, escolha no. O comando quit() possui uma verso mais curta q(): 13

14
> q()

CAPTULO 2. PRIMEIROS PASSOS

Neste livro, os comandos a serem digitados no Console do R esto precedidos por > . Se um comando for muito longo e precisar de mais de uma linha para ser exibido, a segunda e as demais linhas sero precedidas pelo smbolo +. Se o leitor estiver copiando os comandos deste livro, dever no incluir esses smbolos no seu cdigo. A maioria dos comandos pode receber um ou mais argumentos para execuo. O comando q(), por exemplo, pode receber o argumento save de modo que pode-se executar:
> q(save = "no")

Com o comando executado desta forma, estamos dizendo ao R que ele deve sair e que o valor do argumento save no, ou seja, estamos dizendo que no queremos salvar os objetos da rea de trabalho.

2.3

Obtendo ajuda

O manual completo do R e dos pacotes adicionais instalados pode ser acessado com a funo help.start(). Mas h vrias outras formas de se obter ajuda no uso do R. Uma delas pela chamada funo args(), que lista os argumentos recebidos por uma funo, como no exemplo abaixo:
> args(quit) function (save = "default", status = 0, runLast = TRUE) NULL

O comando args(quit) nos informa que quit() uma funo que recebe como argumentos, a informao se a rea de trabalho deve ou no ser salva, qual valor o R deve retornar para o sistema (0 signica nenhum problema) e se a funo .Last() deve ser executada. Cada argumento separado do outro por uma vrgula. Alguns argumentos de alguns comandos so opcionais; outros so obrigatrios e, se no forem fornecidos, os comandos no funcionaro. Em alguns casos, os argumentos possuem valores pr-denidos que sero utilizado se no indicarmos explicitamente algo diferente; em outros, os argumentos no possuem valores prdenidos e a funo ter um comportamento diferente com e sem a presena dos argumentos. No caso da funo args(), o argumento package ter valor nulo (NULL) se no for fornecido explicitamente. Raramente possvel saber quais argumentos so obrigatrios e quais so opcionais apenas observando o resultado de args(). No caso, o nico argumento obrigatrio o primeiro. Os parmetros que no tm algum valor atribudo so reconhecidos pelo R pela posio em que se encontram na lista de argumentos. No caso da funo args(), o argumento topic o nico que no tem valor pr-denido e deve ser o primeiro a ser fornecido. A presena de . . . na lista de argumentos de algumas funes signica que a funo chamar alguma outra durante a sua execuo e os argumentos fornecidos que no forem reconhecidos como prprios da funo chamada sero repassados para a segunda funo. O comando args() til quando j conhecemos a funo e precisamos apenas de uma ajuda para lembrar dos seus argumentos. Se precisarmos saber o signicado de cada argumento, o tipo de objeto retornado pela funo, e maiores detalhes sobre o seu uso, usamos a funo help() ou, na sua verso mais sucinta, ?:
> help(demo) > ?quit

2.4. CRIANDO, DESTRUINDO, SALVANDO OBJETOS

15

Quando no lembramos do nome exato de um comando, podemos obter uma lista de todos os comandos existentes que tenham um determinado texto como parte de seu nome com a funo apropos():
> apropos("csv") [1] "read.csv" "read.csv2" "write.csv" "write.csv2"

Se realmente no conhecemos a funo que precisamos, podemos fazer uma busca de texto mais completa, no nome da funo e na sua descrio, usando help.search() ou sua forma abreviada, ??:
> help.search("install") > ??network

Se isso no for suciente para localizar o comando que precisamos, a penltima opo ser fazer uma busca na internet. Isso pode ser feito a partir do prprio R se o computador estiver conectado internet:
> RSiteSearch("social network analysis")

O arquivo de ajuda de algumas funes inclui uma seo de exemplos. Para que esses exemplos sejam executados automaticamente, utilize a funo example(), fornecendo como argumento o nome da funo cujos exemplos se deseja ver, como abaixo:
> example("ls")

Por m, alguns pacotes incluem cdigos de demonstrao, como a prpria mensagem de saudao do R informa. Digite demo() para obter uma lista dos cdigos de demonstrao disponveis. Se, por exemplo, quiser ver demonstraes de grcos, digite:
> demo("graphics")

Como o leitor j percebeu, uma limitao do sistema de ajuda do R que todos os termos de busca devem ser digitados em ingls. A ltima opo ser pedir ajuda em algum frum ou lista de discusso sobre R. Se resolver fazer isso, procure fornecer algum cdigo ilustrando o seu problema e algumas informaes sobre o seu sistema se desconar que o problema pode ser especco da sua verso do R ou do sistema operacional. Para tanto, o comando sessionInfo() poder ser til.

2.4

Criando, destruindo, salvando objetos

Objetos so criados no R por meio do smbolo de atribuio <-. Por exemplo, para criar o objeto x com valor prximo ao de , devemos digitar:
> x <- 3.1415926

Observe que o separador de decimais o ponto, mesmo que o R esteja sendo executado num ambiente em portugus. Para listar os objetos existentes na rea de trabalho do R, usamos o comando ls():
> ls()

16
[1] "x"

CAPTULO 2. PRIMEIROS PASSOS

O comando print() imprime o objeto que lhe for passado como parmetro, mas se simplesmente digitarmos o nome do objeto e pressionarmos Enter obteremos o mesmo resultado porque o comportamento padro do R chamar a funo print() quando lhe passado o nome de um objeto pela linha de comando:
> print(x) [1] 3,141593 > x [1] 3,141593

A vantagem de usar o comando print() explicitamente a possibilidade de personalizar o resultado, usando, por exemplo, o parmetro digits:
> print(x, digits = 3) [1] 3,14

Observe que o resultado do comando print() acima, chamado implcita ou explicitamente, tem sempre adicionado [1] antes do valor de x. Isso ocorre porque o R sempre cria vetores e o objeto x um vetor de comprimento 1. O nmero 1 entre colchetes indica o ndice inicial do vetor numrico x. Para criar uma sequncia de nmeros, podemos usar o operador :, como abaixo:
> x <- 5:60 > x [1] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [25] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [49] 53 54 55 56 57 58 59 60

O antigo objeto x foi destrudo e o novo objeto um vetor com 60 algarismos. A coluna de nmeros entre colchetes indica qual o ndice do primeiro nmero da linha. Uma dica importante a de sempre usar a tecla Tab para completar o nome de objetos e de arquivos existentes no disco. Este procedimento acelera e evita erros na digitao dos comandos. Experimente digitar let Tab Enter . O resultado dever ser:
> letters [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" [19] "s" "t" "u" "v" "w" "x" "y" "z"

Outra dica importante usar as setas e sempre que precisar corrigir e reenviar comandos j digitados. Para salvar um objeto, usamos a funo save(), fornecendo como parmetros os objetos a serem salvos e o nome do arquivo. Por conveno, objetos do R so salvos com a extenso RData. Assim, para salvarmos o nosso objeto x, mas note que o R no adiciona a extenso automaticamente. Precisamos digit-la explicitamente:
> save(x, file = "x.RData")

Para carregar na rea de trabalho um objeto salvo anteriormente com o comando save(), usamos load():
> load("x.RData")

2.4. CRIANDO, DESTRUINDO, SALVANDO OBJETOS

17

Como em muitos comandos do R, se no houver nenhum erro na execuo, nenhuma mensagem impressa na tela, mas, a funo load() retorna invisivelmente um vetor de caracteres com os nomes dos objetos presentes na rea de trabalho carregada. Para vermos essa lista, podemos usar a funo print() para imprimir na tela o resultado da funo load():
> print(load("x.RData")) [1] "x"

Os objetos sero salvos na pasta de trabalho atual. Para saber em qual pasta o R est atualmente procurando e salvando arquivos e para saber quais os arquivos e pastas esto nesta pasta, digite:
> getwd() > dir()

getwd() uma forma abreviada de dizer get working directory (me diga qual a pasta de trabalho atual). Para congurar uma pasta diferente deve-se usar setwd(). As tabelas 2.1 e 2.2 listam trs importantes pastas do Linux e do Windows XP, o que deve facilitar o uso do setwd() por aqueles pouco familiarizados com a visualizao do sistema de arquivos em modo texto. Nas duas tabelas, supe-se a existncia de um usurio chamado estudante. Tabela 2.1: Localizao de pastas no Linux Nome fantasia Localizao real Pasta pessoal /home/estudante ou ~/ rea de trabalho /home/estudante/Desktop Pendrive /media/RotuloDoPendrive Tabela 2.2: Localizao de pastas no Windows XP Nome fantasia Localizao real Pasta pessoal Meus documentos ou ~/ rea de trabalho C:/Documents and Settings/estudante/Desktop ou ~/../Desktop Pendrive F:/ (ou outra letra) Tanto no Linux quanto no Windows a pasta pessoal pode ser abreviada pelo smbolo ~. Para saber qual pasta o R considera como pasta pessoal no seu sistema operacional digite:
> setwd("~") > getwd()

Embora no Windows seja usual o uso de uma barra invertida, \ para delimitar pastas e arquivos, no R o uso da barra normal, / recomendado porque com ela possvel usar a tecla Tab para completar nomes de arquivos e os scripts caro mais facilmente portveis de um sistema operacional para outro. Note, entretanto, que os nomes de arquivos e pastas no ser mais completado aps a ocorrncia de algum espao em branco no nome de uma pasta. Por isso, recomendvel que se evite o uso de espaos em branco ao nomear arquivos e pastas a serem usados com o R. Para este curso, sugiro que o arquivo com os bancos de dados a serem usados neste texto seja descompactado na pasta pessoal, "~/". Assim, em qualquer sistema operacional, o primeiro comando a ser digitado ao iniciar o R seria:
> setwd("~/RparaCS-dados")

18

CAPTULO 2. PRIMEIROS PASSOS

2.5

Tipos de variveis

Durante uma anlise de dados, precisamos lidar com diferentes tipos de variveis. A seguir esto listados os tipos mais comuns, com o nome utilizado no R para se referir a eles entre parntesis:

Numricas (numeric): Nmeros inteiros ou reais, como idade, renda, nmero de lhos. Datas (Date): So um tipo especial de varivel numrica. Categricas (factor): Variveis qualitativas, ou seja, caractersticas dos indivduos para as quais no possvel atribuir um valor numrico como sexo, religio, estado civil, opinio sobre algum tema. possvel agrupar os indivduos em categorias e contar quantos indivduos pertencem a cada categoria, mas se, por exemplo, um indivduo arma ser catlico e outro, protestante, no podemos, com base nessas armaes considerar um mais religioso do que o outro. Categricas ordenveis (ordered): Tipo de varivel categrica cujas categorias podem ser hierarquizveis, como grau de escolaridade, alguns tipos de respostas a perguntas de questionrio. Se pergunta Qual o papel do governo?, as opes de resposta forem O governo deve mandar em tudo, O governo deve controlar algumas muitas coisas e No precisamos de governo, poderamos considerar aqueles que optaram pela primeira opo adeptos de uma ideologia mais estatizante do que aqueles que escolheram a terceira opo. Texto (character): Caractersticas puramente individuais que no podem ser utilizadas para categorizar os indivduos. Geralmente aparecem nos bancos de dados apenas para ajudar em anlises qualitativas e no estatsticas. Exemplo: o nome dos candidatos em um banco de dados de resultados eleitorais. Em alguns casos, os textos so passveis de categorizao, como as respostas a uma pergunta aberta. Neste caso, seria preciso manualmente recodicar as respostas abertas numa nova varivel contendo um nmero limitado de categorias. Booleanas (logical): Variveis cujos valores podem ser VERDADEIRO ou FALSO; no R, TRUE ou FALSE.

2.6

Operadores matemticos e lgicos

Um software de estatstica no poderia deixar de ser capaz de fazer operaes matemticas e lgicas. A Tabela 2.3 apresenta os principais operadores matemticos e lgicos usados no R. Aprendemos o signicado dos operadores lgicos > e < no ensino fundamental, mas alguns operadores lgicos do R devem ser novidade para muitos leitores. Observe que o smbolo == tem signicado diferente do smbolo = utilizado para atribuir valores a argumentos de funes.

2.6. OPERADORES MATEMTICOS E LGICOS Tabela 2.3: Operadores matemticos e lgicos Operador + / * ^ > < Signicado soma subtrao diviso multiplicao exponenciao MAIOR QUE MENOR QUE Operador >= <= & | == ! != Signicado MAIOR OU IGUAL A MENOR OU IGUAL A E OU IGUAL A NO DIFERENTE DE

19

O cdigo abaixo apresenta os resultados de algumas operaes matemticas para ilustrar o uso dos operadores. Os operadores * e / tm precedncia sobre os operadores + e -, ou seja, normalmente, multiplicaes e divises so realizadas antes de somas e subtraes. Para alterar esse comportamento, preciso escrever as operaes de menor prioridade entre parntesis:
> 9/3 [1] 3 > 2 * 3 [1] 6 > 4^2 [1] 16 > (3 + 1) * (6 - 1)^2 [1] 100 > 3 + 1 * 6 - 1^2 [1] 8 > (1 + (2 * 3)) * 5 [1] 35

Note que, ao contrrio dos clculos que aprendemos a fazer manualmente no Ensino Fundamental, no se usa colchetes e chaves nas operaes matemticas. Quando necessrio, usa-se vrios grupos de parntesis aninhados. Colchetes e chaves tm outros usos na linguagem R. Os colchetes so usados para selecionar ndices de vetores e matrizes, tabelas e data.frames e as chaves so usadas para delimitar blocos de programao. Nas operaes lgicas, tambm utilizamos parntesis para isolar operaes ou para tornar o cdigo mais legvel. Observe nos exemplos abaixo que o resultado de um teste lgico sempre uma varivel booleana:
> 3 > 2 [1] TRUE > 5 < 2 [1] FALSE > 2 == 2 [1] TRUE > 2 != 2 [1] FALSE > (6 > 5) & (7 > 8) [1] FALSE > (6 > 5) | (7 > 8) [1] TRUE

Para a extrao da raiz quadrada e clculo do logaritmo natural utilizamos, respectivamente, as funes sqrt() e log():
> sqrt(16) + log(1) [1] 4

20

CAPTULO 2. PRIMEIROS PASSOS

2.7

Usando um editor de textos

Usualmente, se trabalha no R produzindo scripts, ou seja, arquivos de texto plano contendo uma sequncia de comandos. Os scripts do R so convencionalmente salvos com a extenso .R. A grande vantagem do uso de scripts a possibilidade de repetir toda a anlise dos dados em poucos segundos aps a descoberta e correo de algum erro ou esquecimento no procedimento seguido durante a anlise. A maneira recomendada de se trabalhar com o R escrever os comandos no diretamente no Console do R, mas sim no Editor, enviando-os para o Console com o atalho de teclado prprio para isso. recomendvel que trs janelas, do Console do R, do Editor e dos Grcos, sejam arranjadas de modo a permanecerem visveis simultaneamente. Isso facilita a visualizao dos resultados dos comandos enviados do Editor, o que fundamental para perceber e corrigir erros no cdigo. Em alguns momentos, til escrever comandos diretamente no Console, principalmente aqueles utilizados para explorar os dados antes de analis-los. O Console pode ser visto como um local para rascunhos e experimentaes, enquanto no se chega forma denitiva dos comandos que produziro um relatrio de pesquisa. Se quiser ver uma lista dos comandos digitados (para copiar e colar no editor) utilize o comando history(). Observe que qualquer texto aps o caractere # ignorado pelo R e esta caracterstica utilizada para inserir comentrios no script que ajudaro o pesquisador a entender o prprio cdigo se precisar retornar a ele alguns meses aps t-lo escrito.

2.8

Milhares de funes em milhares de pacotes

O R iniciado com pouco mais de 2000 funes e outros objetos na memria e milhares de outras funes, para as mais diversas tarefas, podem ser adicionadas por meio de pacotes (packages) disponveis livremente na internet.1 Ningum precisa de todas as funes do R; neste livro, utilizaremos em torno de 120. Para instalar um novo pacote, utilize a funo install.packages() e para carregar na memria um pacote j instalado, library(). No Linux, e em verses recentes do Windows, o R dever ser executado com privilgios de administrador para que os pacotes quem disponveis para todos os usurios do sistema. No exemplo abaixo, o pacote descr instalado e, em seguida, suas funes so disponibilizadas:
> install.packages("descr") > library(descr)

O comportamento padro da funo install.packages() obter a ltima verso do pacote na internet e prosseguir com a instalao. Se voc quiser instalar um pacote a partir do arquivo zip (Windows) ou tar.gz (Linux), ter que fornecer o nome completo do arquivo, como no exemplo:
> install.packages("~/R/pacoteInexistente_1.0.tar.gz")

O comando a seguir instala a maioria dos pacotes que sero usados neste livro:
> install.packages(c("descr", "memisc", "XML", "gdata", "igraph", + "maptools", "odfWeave", "sqldf")) Acesse o site http://www.r-project.org/ para ver a lista de pacotes disponveis, todos acompanhados de uma descrio e do manual de referncia.
1

Captulo 3 Vetores, matrizes, listas


3.1 Vetores

Vimos na seo 2.4 que mesmo quando atribumos um nico valor numrico ou textual a um objeto, o R, na verdade, cria um vetor de nmeros ou de textos com comprimento 1. Para criar um vetor, podemos usar a funo vector(). A funo recebe como argumentos mode (modo) e length (comprimento). O primeiro argumento uma varivel do tipo character informando o tipo de vetor a ser criado o qual pode ser, entre outros, logical, numeric e character. O segundo argumento o comprimento do vetor. Vetores do tipo character so inicializados com strings vazias; do tipo numeric, com zeros; e logical, com FALSEs:
> vector(mode = [1] "" "" "" "" > vector(mode = [1] 0 0 0 0 0 0 > vector(mode = [1] FALSE FALSE "character", length = 5) "" "numeric", length = 7) 0 "logical", length = 4) FALSE FALSE

A funo bsica para criar vetores com valores pr-determinados c() abreviatura de concatenate:
> c(1, 3, 5, 7, 11, 17) [1] 1 3 5 7 11 17 > c("Marx", "Weber", "Durkheim") [1] "Marx" "Weber" "Durkheim" > c(1, "Texto", 7, "Outro texto") [1] "1" "Texto" "7"

"Outro texto"

Se o vetor a ser criado for uma sequncia de nmeros inteiros, podemos usar o operador : como nos exemplos abaixo:
> 1:4 [1] 1 2 3 4 > 3:9 [1] 3 4 5 6 7 8 9 > 10:1 [1] 10 9 8 7 6

Para outros tipos de sequncias existe a funo seq(), a qual pode ser invocada de diversas formas, sendo uma delas com os argumentos from, to e by, como nos exemplos abaixo:

21

22
> seq(1, 10, 2) [1] 1 3 5 7 9 > seq(3, 5, 0.5) [1] 3.0 3.5 4.0 4.5 5.0

CAPTULO 3. VETORES, MATRIZES, LISTAS

Nmeros so impressos na tela sem aspas enquanto textos so limitados por aspas. Como todos os elementos de um vetor obrigatoriamente pertencem a uma mesma classe, se misturarmos nmeros e texto no mesmo vetor, os nmeros sero convertidos em texto e impressos entre aspas, como no objeto z a seguir:
> x <- c(1, 3, 5, 7, 11, 17) > y <- c("Marx", "Weber", "Durkheim") > z <- c(1, "Texto", 7, "Outro texto")

Para saber a qual classe pertence um objeto usamos a funo class():


> c(class(x), class(y), class(z)) [1] "numeric" "character" "character"

Outro comando til para criar vetores rep(), que deve receber pelo menos dois argumentos: o valor a ser repetido e o nmero de repeties:
> rep("texto", 5) [1] "texto" "texto" "texto" "texto" "texto" > rep(3, 7) [1] 3 3 3 3 3 3 3 > rep(c(1, 2, 3), 4) [1] 1 2 3 1 2 3 1 2 3 1 2 3

Para saber o nmero de elementos de um vetor usamos a funo length():


> x <- c(2, 3, 4, 7, 3, 5, 1) > length(x) [1] 7

Podemos acessar elementos de um vetor por meio de ndices entre colchetes, como nos exemplos abaixo:
> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9) > y <- c(9, 8, 7, 6, 5, 4, 3, 2, 1) > z <- c("a", "b", "c", "d", "e", "f", "g", "h", "i") > x[3] [1] 3 > y[2] [1] 8

Para selecionar mais de um elemento, deve-se colocar entre colchetes um vetor com os ndices dos elementos de interesse. O cdigo seguinte seleciona os elementos 1, 3 e 5:
> x[c(1, 3, 5)] [1] 1 3 5

Observe que permitido usar funes dentro dos colchetes. No caso, em algumas linhas de comando, usamos a j conhecida funo c(), mas qualquer cdigo que produza um vetor de nmeros inteiros ou de valores lgicos pode ser utilizado para produzir o vetor de ndices, como nos exemplos seguintes:

3.2. MATRIZES
> z[1:4] [1] "a" "b" "c" "d" > a <- (y < 5) > x[a] [1] 6 7 8 9 > y[a] [1] 4 3 2 1

23

Uma caracterstica importante dos vetores no R que seus elementos podem receber nomes por meio da funo names(). No cdigo seguinte usamos os textos criados no vetor z como nomes de x:
> > a 1 names(x) <- z x b c d e f g h i 2 3 4 5 6 7 8 9

Uma vez que os elementos do vetor possuem nomes, podemos usar os nomes no lugar de nmeros inteiros para acessar os valores do vetor. Exemplo:
> c 3 > b 2 x["c"]

x[c("b", "d", "g")] d g 4 7

3.2

Matrizes

Em algumas ocasies, podemos precisar de uma matriz e no de um vetor. Isso ocorre, por exemplo, quando estamos produzindo uma tabela. A funo matrix() produz uma matriz e recebe como argumentos opcionais data (os elementos que preenchero a matriz), nrow (o nmero de linhas), ncol (o nmero de colunas), dimnames (uma lista com os nomes das linhas e das colunas) e byrow (valor lgico informando se a matriz deve ser preenchida por linhas). Observe o exemplo abaixo:
> m <- matrix(c(13, 41, 42, 15, 23, 49, 40, 3), nrow = 4, ncol = 2, + dimnames = list(Resposta = c("Totalmente a favor", "A favor", + "Contra", "Totalmente contra"), Sexo = c("Feminino", + "Masculino"))) > m Sexo Resposta Feminino Masculino Totalmente a favor 13 23 A favor 41 49 Contra 42 40 Totalmente contra 15 3

Tambm podemos produzir matrizes combinando vetores com as funes cbind() juntar colunas ou rbind() juntar linhas:
> cbind(x, y)

24
x y 1 9 2 8 3 7 4 6 5 5 6 4 7 3 8 2 9 1 rbind(x, y) a b c d e f g h i x 1 2 3 4 5 6 7 8 9 y 9 8 7 6 5 4 3 2 1 a b c d e f g h i >

CAPTULO 3. VETORES, MATRIZES, LISTAS

Para acessar ou extrair dados de uma matrix, tambm podemos utilizar ndices como nos vetores. A diferena que agora so necessrios dois vetores de ndices, um para as linhas e outro para as colunas:
> m[3, 2] [1] 40 > m[c(1:2), 2] Totalmente a favor 23 > m["Contra", "Masculino"] [1] 40

A favor 49

3.3

Listas

Podemos agrupar vrios objetos num um nico objeto do tipo list. Criamos uma lista na seo 3.2 ao fornecer o argumento dimnames para a funo matrix(). Vrias funes do R retornam objetos do tipo list, sendo bastante til saber como esses objetos podem ser criados e como seus elementos podem ser acessados. No exemplo abaixo, criamos uma list contendo trs vetores:
> numeros <- c(1, 2, 3) > lista <- list(numeros, letras = c("a", "b", "c", "d"), c(TRUE, + FALSE)) > lista [[1]] [1] 1 2 3 $letras [1] "a" "b" "c" "d" [[3]] [1] TRUE FALSE

No cdigo acima, os elementos foram adicionados list de trs formas diferentes e, como podemos ver pela impresso da lista na tela, somente o segundo elemento tem um nome, letras. Os demais elementos da lista esto sem nome, mas podem ser acessados pela sua posio na lista. Para acessar um elemento de uma list, devemos digitar o nome da list seguido do smbolo $ e do nome do elemento ou, entre colchetes o seu nome ou o nmero da sua posio, como nos exemplos abaixo:

3.3. LISTAS
> lista$letras [1] "a" "b" "c" "d" > lista["letras"] $letras [1] "a" "b" "c" "d" > lista[["letras"]] [1] "a" "b" "c" "d" > lista[3] [[1]] [1] TRUE FALSE > lista[[3]] [1] TRUE FALSE

25

Quando estamos trabalhando com listas, retornado um valor diferente conforme sejam usados o smbolo $ ou colchetes duplicados ou colchetes simples. Com o uso do $ ou dos colchetes duplicados, retornado o elemento componente da lista. Com o uso de colchetes simples, retornado uma lista com os elementos selecionados. Conra:
> c(class(lista["letras"]), class(lista[["letras"]]), class(lista$letras)) [1] "list" "character" "character"

Com o uso de colchetes simples, podemos selecionar simultaneamente vrios elementos de uma list:
> lista[c(1, 3)] [[1]] [1] 1 2 3 [[2]] [1] TRUE FALSE

26

CAPTULO 3. VETORES, MATRIZES, LISTAS

Captulo 4 Carregar banco de dados existente


4.1 Introduo

Bancos de dados para anlises quantitativas nas cincias sociais consistem, tipicamente, em dados em formato tabular onde cada coluna representa uma caracterstica varivel de muitos casos. Os casos podem ser indivduos, organizaes, pases, etc, e todas as informaes sobre cada caso cam numa mesma linha. A Figura 4.1 mostra o contedo de um pequeno banco de dados ctcio registrado num arquivo de texto plano, com apenas cinco casos (pessoas entrevistadas) e trs variveis (sexo, idade e estado.civil):
sexo Masculino Feminino Feminino Masculino Feminino idade 40 37 17 13 10 estado.civil casado casado solteiro solteiro solteiro

1 2 3 4 5

Figura 4.1: Exemplo de banco de dados No R, os objetos capazes de guardar informaes tabulares presentes em bancos de dados como os da Figura 4.1 so os data.frames. Um data.frame constitudo pela concatenao de vrias colunas em uma nica list. Assim como uma matrix, todas as colunas de um data.frame tm que ter o mesmo nmero de elementos, mas, ao contrrio de uma matrix, um data.frame pode conter colunas de tipos diferentes, com variveis numricas, categricas, booleanas, etc. Uma forma de criar e visualizar no prprio R o banco de dados acima seria:1
> > > > > sexo <- c("Masculino", "Feminino", "Feminino", "Masculino", "Feminino") idade <- c(40, 37, 17, 13, 10) estado.civil <- c("casado", "casado", "solteiro", "solteiro", "solteiro") b <- data.frame(sexo, idade, estado.civil) b sexo idade estado.civil 1 Masculino 40 casado 2 Feminino 37 casado O R no possui funes adequadas para a entrada de uma grande quantidade de dados. Para esse propsito, melhor utilizar algum outro software, como o OpenOfce Calc com a opo de Janela / Congelar, ou criando um formulrio para entrada de dados no OpenOfce Base.
1

27

28
3 Feminino 4 Masculino 5 Feminino 17 13 10

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE


solteiro solteiro solteiro

Para fazer referncia a uma coluna de um data.frame, digitamos o nome do banco de dados seguido pelo smbolo $ e pelo nome da coluna. Para ver um sumrio dos dados de uma das colunas:
> summary(b$estado.civil) casado solteiro 2 3

Todas as operaes vlidas para vetores tambm podem ser aplicadas s colunas de um data.frame. Exemplo:
> b$estado.civil[3] <- "casado" > summary(b$estado.civil) casado solteiro 3 2

Como todos os objetos do R, data.frames devem ser salvos em arquivos com extenso RData, usando save(), e carregados com load(). Os procedimentos expostos neste captulo se aplicam a bancos de dados salvos por outros programas. Se o leitor tiver necessidade de utilizar um banco de dados preparado por outra pessoa e tiver oportunidade de escolher o tipo de arquivo a ser utilizado a melhor opo seria um arquivo RData com todas as variveis categricas j rotuladas. A segunda melhor opo seria um arquivo csv salvo com os rtulos das variveis categricas e no com nmeros que ainda teriam que ser transformados em factors. A terceira opo seria um banco de dados no formato sav, o formato utilizado pelo SPSS porque eles geralmente j esto com todas as variveis categricas rotuladas e com poucos problemas a serem corrigidos. Por m, um arquivo csv cujas variveis categricas ainda precisam ser rotuladas. Nos procedimentos das prximas sees, sero trabalhados os arquivos iniciados com o prexo bd_. Eles contm dados dos candidatos a senador nas eleies de 2006 salvos em diferentes formatos.2 Alguns dos arquivos possuem dados que aos serem carregados no R j estaro prontos para serem utilizados em anlises estatsticas. Outros, depois de carregados, ainda precisaro ser manipulados. No conjunto, os diferentes bancos exemplicam as situaes mais comuns com as quais os cientistas sociais se deparam ao ter que utilizar um banco de dados preparado por outra pessoa ou instituio.3 O leitor deve car atento para a distino entre processador e editor de texto. O editor permite modicar apenas o texto, propriamente; o processador aplica formatao especial, como negrito, itlico, alinhamento de pargrafos, etc... Para editar cdigo do R devemos usar um editor e no um processador de texto. Antes de iniciar o processo de carregamento, manipulao e anlise de um banco de dados, use o editor de textos de sua preferncia para criar um script novo onde registrar os comandos necessrios para atingir o seu objetivo. Um primeiro comando a ser executado e registrado a congurao da pasta onde salvou os arquivos como pasta de trabalho: setwd().
Os bancos de dados foram preparados a partir de dados ociais do TSE (http://www.tse.gov.br/ internet/eleicoes/resultado_2006.htm) complementados com informaes do banco de dados Eleies 2006: Candidatos ao Poder Legislativo no Brasil (BOLOGNESI; GOUVA; MIRADE, 2007). 3 Consulte a seo R Data Import/Export do manual do R para ver outras opes.
2

4.2. ARQUIVOS SAV

29

4.2

Arquivos sav

Arquivos sav, o formato nativo do SPSS, so arquivos binrios, o que signica que no podem ser visualizados em editores de texto. As especicaes do formato sav no so divulgadas pela SPSS Inc., mas os desenvolvedores de software livre, por meio de engenharia reversa, conseguiram elaborar algoritmos capazes de fazer a leitura da maioria dos arquivos salvos nesse formato, o que torna possvel seu carregamento no R. A funo para carregar arquivos sav read.spss(), do pacote foreign. O comportamento padro de read.spss() criar uma lista de objetos. Para que a lista seja automaticamente convertida num data.frame, devemos passar para a funo o argumento to.data.frame com o valor TRUE:
> library(foreign) > b <- read.spss("bd_exemplo.sav", to.data.frame = TRUE)

O data.frame criado incluir o atributo variable.labels com os rtulos das variveis utilizados no banco sav original. O valor desse atributo pode ser acessado com a funo attr():
> attr(b, "variable.labels") uf candidat partido "uf" "candidato" "partido" idade "idade" sexo resultad "sexo" "resultado"

Para maiores informaes sobre a funo attr(), veja a seo 5.10.

4.3

Arquivos csv

Arquivos do tipo csv, comma separated values,4 so arquivos de texto plano, podendo ser visualizados em editores de texto simples porque no contm qualquer formatao especial como negrito, itlico, cores, espaamento entre linhas, etc. . . 5 Apesar do nome, devido ao fato da vrgula ser um smbolo comum em textos, inclusive nos valores de variveis categricas, e, principalmente, por ser a vrgula o separador de decimais em alguns idiomas, como o portugus, na prtica, comum encontrar arquivos csv com os campos separados por ponto e vrgula, espaos e caracteres de tabulao. Para eliminar qualquer dvida sobre o tipo de valor de um campo, se numrico ou textual, costuma-se escrever os valores que devem ser tratados como texto entre aspas, simples ou duplas. Para se habituar a utilizar este tipo de arquivo no R, abra os arquivos bd_exemplo*.csv um por um, de acordo com os procedimentos apresentados a seguir. Para carregar um arquivo no formato csv, utilizamos a funo read.table(), mas, para usar a funo corretamente, precisamos saber algumas informaes, sendo as mais frequentemente necessrias: (1) qual caractere utilizado para separar os valores; (2) se os valores textuais esto limitados por aspas simples ou aspas duplas ou se no esto limitados por nenhum caractere especial; (3) se os nomes das variveis esto na primeira linha do arquivo. Para descobrirmos essas informaes, utilizaremos a funo file.head() do pacote descr para inspecionar as primeiras linhas de arquivos de texto, como o caso dos bancos de dados no formato csv:
Valores separados por vrgulas. por isso que uma planilha de clculo produzida no OpenOfce Calc ou no Microsoft Excel, ao ser salva como csv, perde toda informao sobre formatao das clulas e sobre frmulas utilizadas.
5 4

30

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE

> library(descr) > file.head("bd_exemplo1.csv") "uf" "candidato" "partido" "idade" "sexo" "resultado" "RO" "ACIR MARCOS GURGACZ" "PDT" 44 "Masculino" "No eleito" "ES" "AFONSO CEZAR CORADINE" "PSOL" 51 "Masculino" "No eleito" "DF" "AGNELO SANTOS QUEIROZ FILHO" "PC do B" 48 "Masculino" "No eleito" "SP" "ALDA MARCO ANTONIO" "PMDB" 62 "Feminino" "No eleito" "GO" "ALDO SILVA ARANTES" "PC do B" 68 "Masculino" "No eleito"

Como podemos ver pelo resultado da funo file.head(), a primeira linha do arquivo contm os nomes das variveis (ou seja, o arquivo possui um cabealho, ou header), os diferentes valores esto separados por um espao em branco, e os valores textuais esto limitados por aspas (quotation marks) duplas. Logo, o comando para abrir este arquivo ser:
> b <- read.table("bd_exemplo1.csv", header = TRUE, sep = " ", quote = '"')

Para carregar os demais arquivos csv, basta repetir o mesmo procedimento: inspecionar as primeiras linhas do arquivo com file.head() e, ento, fornecer os argumentos adequados para read.table().
> file.head("bd_exemplo2.csv") 'uf','candidato','partido','idade','sexo','resultado' 'RO','ACIR MARCOS GURGACZ','PDT',44,'Masculino','No eleito' 'ES','AFONSO CEZAR CORADINE','PSOL',51,'Masculino','No eleito' 'DF','AGNELO SANTOS QUEIROZ FILHO','PC do B',48,'Masculino','No eleito' 'SP','ALDA MARCO ANTONIO','PMDB',62,'Feminino','No eleito' 'GO','ALDO SILVA ARANTES','PC do B',68,'Masculino','No eleito' > b <- read.table("bd_exemplo2.csv", header = TRUE, sep = ",", quote = "'") > file.head("bd_exemplo3.csv") "uf";"candidato";"partido";"idade";"sexo";"resultado" "RO";"ACIR MARCOS GURGACZ";"PDT";44;"Masculino";"No eleito" "ES";"AFONSO CEZAR CORADINE";"PSOL";51;"Masculino";"No eleito" "DF";"AGNELO SANTOS QUEIROZ FILHO";"PC do B";48;"Masculino";"No eleito" "SP";"ALDA MARCO ANTONIO";"PMDB";62;"Feminino";"No eleito" "GO";"ALDO SILVA ARANTES";"PC do B";68;"Masculino";"No eleito" > b <- read.table("bd_exemplo3.csv", header = TRUE, sep = ";", quote = '"') > file.head("bd_exemplo4.csv") uf\tcandidato\tpartido\tidade\tsexo\tresultado RO\tACIR MARCOS GURGACZ\tPDT\t44\tMasculino\tNo eleito ES\tAFONSO CEZAR CORADINE\tPSOL\t51\tMasculino\tNo eleito DF\tAGNELO SANTOS QUEIROZ FILHO\tPC do B\t48\tMasculino\tNo eleito SP\tALDA MARCO ANTONIO\tPMDB\t62\tFeminino\tNo eleito GO\tALDO SILVA ARANTES\tPC do B\t68\tMasculino\tNo eleito > b <- read.table("bd_exemplo4.csv", header = TRUE, sep = "\t", quote = '')

No ltimo exemplo, o separador de valores o caractere de tabulao, o qual, por ser um caractere no imprimvel, no R, representado por \t. Aps carregar cada banco, para conferir se a operao foi realizada com sucesso, digite:
> summary(b) uf SP : 15 RJ : 11 MG : 10 RS : 10 DF : 9 MA : 9 (Other):138 sexo Feminino : 30 Masculino:172 candidato ACIR MARCOS GURGACZ : 1 AFONSO CEZAR CORADINE : 1 AGNELO SANTOS QUEIROZ FILHO: 1 ALDA MARCO ANTONIO : 1 ALDO SILVA ARANTES : 1 ALFREDO HELIO SIRKIS : 1 (Other) :196 resultado Eleito : 27 No eleito:175 partido PSOL : 17 PFL : 15 PDT : 14 PSDB : 13 PSTU : 13 PCB : 12 (Other):118 idade Min. :35.00 1st Qu.:44.00 Median :50.50 Mean :52.25 3rd Qu.:60.00 Max. :89.00

4.4. ARQUIVOS XLS, ODS E MDB

31

4.4

Arquivos xls, ods e mdb

Se os seus dados estiverem numa planilha do Microsoft Excel (xls) ou no Open Document Format (ods), abra o arquivo no OpenOfce Calc ou no Microsoft Excel e salve a planilha como arquivo to tipo csv. Os dados no formato csv podero ser carregados no R de acordo com os procedimentos explicados na seo 4.3. Existem funes para extrair dados de planilhas de clculo a partir do R sem a necessidade de converso manual para csv. Uma dessas funo read.xls() do pacote gdata. Um arquivo nomeado Arquivo.xls seria carregado no R com os comandos:
> library(gdata) > b <- read.xls("Arquivo.xls")

A funo read.xls() poder falhar no Linux se o arquivo xls contiver acentos nos nomes das colunas e se a codicao de caracteres no for UTF-8. Nesse caso, pode-se tentar o seguinte:6
> > > > > > > > library(gdata) library(descr) con <- xls2csv("Arquivo.xls") linhas <- toUTF8(readLines(con)) close(con) linhas <- textConnection(linhas) dados <- read.csv(linhas) close(linhas)

No cdigo acima, a funo xls2csv() converte o arquivo xls em csv. Em seguida, a funo readLines() usada para ler o arquivo e a funo toUTF8() converte o texto para a codicao UTF-8. Finalmente, o texto lido com a funo read.csv(), que pode ser vista como uma verso especial de read.table(). A funo textConnection() cria um tipo de conexo que pode ser lida pela funo read.csv() como se fosse um arquivo e a funo close() fecha essa conexo. Para carregar um banco de dados contido em arquivo do tipo mdb, do Microsoft Access, preciso utilizar a funo mdb.get() do pacote Hmisc. A funo mdb.get() depende de um conjunto de programas reunidos em mdb-tools.7 Na ausncia das mdb-tools, ser preciso usar o Microsoft Access ou o OpenOfce Base para abrir o arquivo mdb e manualmente exportar as tabelas para o formato csv.

4.5

Arquivo com colunas de largura xa

Arquivos com colunas de largura xa (xed width les, em ingls) eram mais comuns h algumas dcadas. Hoje, os arquivos desse tipo mais importantes para cientistas sociais brasileiros so provavelmente os bancos de dados das PNADs8 , realizadas anualmente pelo IBGE. Arquivos com colunas de largura xa so arquivos de texto plano, como arquivos csv, mas sem delimitadores de campo. Para carreg-los, preciso saber com antecedncia quantos caracteres ocupa cada varivel no banco de dados. Abrindo o arquivo bd_largurafixa.txt num editor de texto, encontramos:
No Windows, poder ser necessrio instalar ActivePerl ou outro interpretador da linguagem perl. Em muitas verses do Linux, as mdb-tools podem ser instaladas a partir do gerenciador de software do sistema operacional. Em alguns sistemas, deve ser instalado o pacote mdbtools-gmdb. 8 Abreviatura de Pesquisa Nacional por Amostragem de Domiclio
7 6

32

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE

21ACIR MARCOS GURGACZ 54422 8AFONSO CEZAR CORADINE 225122 [...] 20GERALDO JOS DA CMARA FERREIRA DE MELO197122 [...]

Vrias linhas foram omitidas da visualizao acima. Como podemos observar, a segunda varivel do banco o nome do candidato, e o maior deles possui 41 caracteres. O comando para abrir um arquivo deste tipo read.fwf(), tendo widths (larguras) como parmetro obrigatrio:
> b <- read.fwf("bd_largurafixa.txt", widths = c(2, 39, 2, 2, 1, 1), + colClasses = c("numeric", "character", rep("numeric", 4)))

O comando acima poder falhar se o arquivo contiver uma codicao de caracteres incompatvel com o sistema operacional. O caso mais frequente ser a necessidade de carregar no Linux um banco de dados criado com a codicao de caracteres utilizada no Windows. Neste caso, poderemos usar o programa recode para converter a codicao de caracteres do banco de Latin-1 para UTF-8, antes de carreg-lo:
> system("cat bd_largurafixa.txt | recode l1..utf8 > bd_lfx.utf8.txt") > b <- read.fwf("bd_lfx.utf8.txt", widths = c(2, 39, 2, 2, 1, 1), + colClasses = c("numeric", "character", rep("numeric", 4)))

No R, usamos a funo system() para executar programas externos. No exemplo, o programa cat lana para a sada padro do sistema o contedo do arquivo bd_largurafixa, o operador | faz com que essa sada se torne a entrada do programa recode e a sada do recode redirecionada pelo operador > para o arquivo bd_lfx.utf8.txt. Outra forma de converter a codicao de caracteres do arquivo seria por meio das funes readLines(), toUTF8() e writeLines(), analogamente ao exemplo da seo 4.7.4. Isso dispensaria a instalao do programa recode. O arquivo bd_largurafixa.txt no inclui os nomes das variveis e o R automaticamente atribuir nomes no formato V1 , V2 , . . . , Vn . Para renomear as variveis de um banco de dados, usamos o comando names():
> names(b) <- c("uf", "candidato", "partido", "idade", "sexo", "resultado")

As variveis categricas foram carregadas como nmeros e ser preciso codic-las. Veremos na seo 4.7.3 como resolver este tipo de problema.

4.6

Tabelas em html

Tabelas contidas em pginas de internet simples podem ser lidas com a funo readHTMLTable(), do pacote XML. A funo extrai as tabelas de uma pgina html, agrupando-as numa list. No exemplo abaixo, nos interessa a primeira (e nica) tabela da pgina da Wikipedia sobre pases que deixaram de existir:
> library(XML) > tabelas <- readHTMLTable("http://pt.wikipedia.org/wiki/Criptarquia") > tab <- tabelas[[1]]

A funo poder no conseguir extrair corretamente as tabelas se as pginas html utilizarem tabelas como elementos de diagramao ou se as tabelas forem complexas, contendo clulas que ocupam mais de uma coluna ou mais de uma linha.

4.7. SOLUO DE PROBLEMAS

33

4.7
4.7.1

Soluo de problemas
Variveis com letras maisculas nos nomes

perfeitamente vlido utilizar letras maisculas nos nomes dos objetos do R, mas quase todas as funes tm nomes iniciados com letras minsculas e o R faz distino entre maisculas e minsculas, tornando desconfortvel e confuso ter constantemente que alternar a caixa durante a digitao. A funo tolower() converte todas as letras de um vetor de caracteres em minsculas, e podemos usar o seguinte comando para converter os nomes das variveis de um banco de dados:
> names(b) <- tolower(names(b))

4.7.2

Espaos excedentes

Alguns bancos de dados trazem variveis do tipo texto ou os valores de variveis categricas com espaos em branco adicionais para completar uma largura pr-denida pelo programa em que o banco de dados foi gerado. Esses espaos podem ser eliminados com a funo trim(), do pacote gdata. possvel fornecer um data.frame como argumento para a funo, o que implicar na remoo dos espaos desnecessrios de todas as variveis que os contenham. Segue um exemplo simples do uso da funo trim():
> library(gdata) > trim("pouco texto, muito espao [1] "pouco texto, muito espao" ")

4.7.3

Necessidade de codicar variveis

O arquivo bd_semrotulos.csv, possui caractere separador de campos, mas, assim como os arquivos de colunas de largura xa, no inclui os nomes das variveis na primeira linha e as variveis categricas receberam nmeros no lugar dos rtulos. comum encontrar arquivos com essas caractersticas porque alguns programas de estatstica no convertem automaticamente variveis com valores textuais em variveis categricas. Nesses programas, preciso carregar nmeros que, depois, sero convertidos em categorias. Outro motivo para usar nmeros no lugar de texto representando categorias por economia de espao em disco, o que especialmente importante em bancos de dados grandes. Para carregar bd_semrotulos.csv, siga os procedimentos da seo 4.3. Observe que o argumento header para a funo read.table() dever ser FALSE. Aberto o arquivo, use o comando names() para renomear as variveis, como zemos na seo 4.5. Para codicar variveis numricas como categricas, preciso conhecer a correspondncia entre os nmeros e as categorias que representam.9 O comando para criar um vetor de variveis categricas (chamados de factors na linguagem R), factor(), sendo levels (nveis) o vetor dos nmeros utilizados para representar as categorias e labels o vetor dos rtulos representados. Assim, para codicar as trs variveis categricas do banco de dados, devemos utilizar o seguinte cdigo:
9

O prprio fornecedor dos dados deve disponibilizar uma tabela com a correspondncia entre os valores.

34
> + > + > + + + + > + + + + +

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE

b$sexo <- factor(b$sexo, levels = c(1, 2), labels = c("Masculino", "Feminino")) b$resultado <- factor(b$resultado, levels = c(1, 2), labels = c("Eleito", "No Eleito")) b$uf <- factor(b$uf, levels = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27), labels=c("AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MT", "MS", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SE", "SP", "TO")) b$partido <- factor(b$partido, levels = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29), labels = c("PAN", "PCB", "PC do B", "PCO", "PDT", "PFL", "PHS", "PL", "PMDB", "PMN", "PP", "PPS", "PRB", "PRONA", "PRP", "PRTB", "PSB", "PSC", "PSDB", "PSDC", "PSL", "PSOL", "PSTU", "PT", "PTB", "PTC", "PT do B", "PTN", "PV"))

Use o comando summary() para conferir se o banco est corretamente codicado.

4.7.4

Codicao de caracteres errada

No Linux, utiliza-se UTF-8 para codicao de caracteres, enquanto no Windows utilizada a codicao WINDOWS-1252. Com UTF-8, possvel incluir caracteres de qualquer idioma num arquivo de texto plano, mas um texto produzido em texto plano (sem nenhuma formatao especial) em ambiente Linux no ser corretamente exibido em ambiente Windows. Por exemplo, a palavra ao, codicada em UTF-8, seria exibida no Windows como ao, e, codicada em WINDOWS-1252, seria exibida no Linux como a\xe7\xe3o. Alm disso, quando o ambiente for UTF-8, algumas funes do R falharo se a codicao utilizada for outra, sendo, portanto, necessrio converter a codicao dos objetos antes de usar essas funes. Isso pode ser feito com as funes toUTF8() e fromUTF8() (para e de UTF-8, respectivamente), do pacote descr. Essas funes convertem vetores ou bancos de dados inteiros de uma codicao para outra. O cdigo abaixo exemplica como a funo fromUTF8() pode ser usada para converter um script do R escrito em UTF-8 para o WINDOWS-1252:
> > > > library(descr) linhas <- readLines("RparaCS.R") linhas <- fromUTF8(linhas) writeLines(linhas, "RparaCS-win.R")

As funes fromUTF8() e toUTF8() podem receber um data.frame como argumento. Nesse caso, os nomes de todas as variveis e os rtulos de todas as variveis categricas sero convertidos de uma codicao para outra. Se um banco de dados for originrio do Windows, como a maioria dos bancos no formato do SPSS, experimente convert-lo para UTF-8 logo aps carreg-lo no Linux, pois at mesmo a funo summary() pode falhar se a codicao estiver errada. A funo read.table() possui o argumento encoding, sendo possvel denir qual a codicao de caracteres utilizada no arquivo contendo os dados a serem carregados. No Linux, para carregar um arquivo preparado para Windows, deve-se usar encoding = "latin1".

4.7.5

Converso entre numeric, factor e character

Nem sempre as variveis de um banco de dados esto classicadas como deveriam. No banco de dados que estamos utilizando, a varivel candidato foi automaticamente classicada

4.7. SOLUO DE PROBLEMAS

35

como factor pela funo read.table(), o que no faz sentido porque no temos inteno de usar o nomes das pessoas para categoriz-las. Mesmo que houvesse algum nome repetido, seria apenas uma coincidncia, sem nenhum valor estatstico para uma pesquisa na rea de poltica. A varivel candidato deve ser tratada como texto e deve, portanto ser convertida em character. Os nomes das funes para converso de objetos de um tipo em outro tm o formato as.classeDeDestino. Assim, comando para que precisamos :
> b$candidato <- as.character(b$candidato)

A classe correta para variveis categricas que podem ser consideradas ordenveis ordered. Nem sempre variveis categricas aparentemente ordenveis devem ser classicadas como ordered. A varivel idade, por exemplo, se convertida em categrica, em geral, no dever ser convertida em ordered porque muitas das caractersticas dos indivduos atingem intensidade mxima ou mnima durante a adultidade e no durante a infncia ou velhice. Uma varivel muito comum, a escolaridade, por outro lado, ca mais corretamente classicada como ordered do simplesmente que como factor. Para converter uma varivel em ordered, utilizamos a funo ordered() ou as.ordered().

4.7.6

Converso de datas

Alguns bancos de dados possuem datas como variveis. Essas variveis podem ser lidas pelo R como se fossem texto para, em seguida, serem convertidas em objetos da classe Date. A funo para converter de character para data as.Date(). No exemplo abaixo, so criados dois pequenos vetores com apenas duas datas cada na forma de texto. O vetores so, em seguida convertidos para Date, o que permite a realizao de operaes algbricas:
> ini <- c("03/05/96", "17/08/97") > fim <- c("1997-27-01", "1999-14-03") > ini <- as.Date(ini, format = "%d/%m/%y") > fim <- as.Date(fim, format = "%Y-%d-%m") > fim - ini Time differences in days [1] 269 574

O argumento format consiste na repetio dos caracteres que no representam a data propriamente e na indicao das unidades de tempo na mesma sequncia em que se encontram no objeto de tipo character. Cada unidade de tempo indicada por uma letra precedida pelo smbolo %. Consulte a ajuda da funo as.Date() para saber quais letras representam quais unidades. Se as datas tiverem origem num banco do tipo sav, do SPSS, a varivel poder consistir num vetor de nmeros inteiros informando quantos segundo se passaram desde o dia 14 de outubro de 1582. Uma varivel deste tipo poder ser convertida para o formato utilizado pelo R com o seguinte comando:
> x <- as.Date(as.POSIXct(x, origin = "1582-10-14"))

4.7.7

Carregar bancos de grandes dimenses

A forma mais rpida de carregar os dados de um arquivo de texto com colunas de largura xa, como os das PNADs, converter o arquivo para csv usando a funo fwf2csv() do

36

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE

pacote descr e usar o read.table() do R com a opo buffersize=500 para limitar o uso de memria. Se o banco de dados for demasiadamente grande e a memria disponvel no computador no for suciente para o uso da funo read.table(), uma soluo poder ser o uso da funo read.csv.sql(), do pacote sqldf, como no exemplo hipottico a seguir:
> library(sqldf) > b <- read.csv.sql("pnad2008.csv", header = T, sep = "\t")

Se o arquivo for do tipo sav (SPSS), pode-se usar o script sav2dat.sh.10 Este script usa o pspp11 para criar um arquivo de texto plano com colunas de largura xa e outro arquivo com as informaes necessrias para a elaborao de um script do R que carregar o banco de dados e codicar as variveis categricas. O World Values Survey,12 um exemplo de banco de dados que, com a capacidade dos computadores pessoais atuais, dicilmente poder ser aberto diretamente com a funo spss.read(). O banco distribudo como um arquivo sav de 302 MB compactado no formato zip (46 MB) e contm dados de dezenas de pases, incluindo o Brasil. Uma particularidade das PNADs antigas que as linhas de pessoas e domiclios encontramse mescladas num mesmo arquivo. Uma soluo ser dividir o arquivo em dois usando o awk, um programa que provavelmente estar instalado em qualquer distribuio do Linux. O seguinte comando, digitado no R, permitiria extrair do banco de dados da PNAD de 1976 os registros relativos s pessoas:
> system("awk -F '' '{if($11 == 2) {print $0}}' PNAD76BR.DAT > pessoas.txt")

Os argumentos passados para o awk podem ser lidos da seguinte forma: (a) no existem separadores de campo (-F ), (b) se o campo nmero 11, ou seja, o 11 caractere, for 2, imprima a linha inteira do arquivo PNAD76BR.DAT e redirecione os resultados para o arquivo pessoas.txt.13

4.7.8

Variveis categricas de arquivo sav lidas incorretamente

A funo read.spss() do pacote foreign somente l corretamente variveis categricas que tenham utilizado nmeros inteiros como substrato. Variveis criadas no SPSS pela atribuio de rtulos a nmeros reais podero ter algumas categorias eliminadas. Ao ler o arquivo, read.spss() emitir o aviso: There were x warnings (use warnings() to see them). Com o comando warnings(), veremos File contains duplicate label for value x.y for variable X. A soluo importar o banco de dados sem aproveitar os rtulos das variveis categricas,
> b <- read.spss("bd_exemplo.sav", use.value.labels = F, to.data.frame = T)

e, em seguida, codicar as variveis categricas, conforme descrito na seo 4.7.7. De uma maneira geral, se houver problemas no carregamento de um banco de dados do SPSS, a soluo poder ser o uso do j mencionado script sav2dat.sh.
Disponvel em http://jalvesaq.googlepages.com/sav2dat.html. Ver http://www.gnu.org/software/pspp/. 12 Disponvel em http://www.worldvaluessurvey.org/services/index.html. 13 Para maiores informaes sobre o awk, num terminal do Linux, digite man awk.
11 10

4.7. SOLUO DE PROBLEMAS

37

4.7.9

Interesse em renomear colunas

J vimos na seo 4.5 como usar a funo names() para obter um vetor com os nomes das variveis de um banco de dados e para renomear essas variveis. Mas h uma funo que especialmente til quando queremos renomear as colunas de um banco de dados com muitas variveis. Trata-se de dput(), uma funo que produz um texto representando o objeto que lhe passado como argumento. Algumas vezes, este texto suciente para recriar o objeto e a ideia copiar o resultado de dput() para o Editor de texto e l substituir os nomes das variveis:
> dput(names(b)) c("uf", "candidato", "partido", "idade", "sexo", "resultado")

38

CAPTULO 4. CARREGAR BANCO DE DADOS EXISTENTE

Captulo 5 Manipulando bancos de dados


Usualmente, a maior parte do trabalho de anlise est na manipulao do banco de dados e no propriamente na elaborao de modelos analticos. Mesmo que o banco de dados esteja com todas as variveis categricas codicadas, ainda podem ser necessrios vrios ajustes. Neste captulo, veremos vrias das tarefas comumente enfrentadas por um cientista social na fase de preparao de um banco de dados para anlise, mas antes de comear a manipular os dados, preciso conhec-los bem. Por isso, algumas sees deste captulos tratam da descrio dos diferentes tipos de dados. No esquea de registrar num script os comandos necessrios para a adequada manipulao do banco de dados.

5.1

Visualizao dos dados

No R, no vemos os dados permanentemente, como numa planilha de clculo e em alguns softwares de estatstica. No seria mesmo fcil de visualizar o contedo dos objetos presentes na rea de trabalho do R porque eles no so apenas dados tabulares; podem ser texto, vetores de diversos tamanho, tabelas, funes, listas de objetos, etc. Alm disso, pode no ser desprezvel o custo computacional de atualizar a exibio na tela dos valores do banco de dados que esto sendo manipulados. Assim, para conhecer o contedo dos objetos, preciso, por meio de comandos, dizer ao R o que queremos. Para visualizar alguns desses comandos em ao, carregue o banco de dados bd_exemplo1.csv utilizado no captulo anterior, congurando o nome do banco para b. Digite:
> b <- read.table("bd_exemplo1.csv", header = T, sep = "", quote = "\"")

Antes de iniciar a visualizao dos dados, convm converter a varivel candidato de factor para character, conforme explicado na seo 4.7.5:
> b$candidato <- as.character(b$candidato)

Com o banco j carregado, digite e observe o resultado dos seguintes comandos:


> head(b, n = 3) uf candidato partido idade sexo resultado 1 RO ACIR MARCOS GURGACZ PDT 44 Masculino No eleito 2 ES AFONSO CEZAR CORADINE PSOL 51 Masculino No eleito 3 DF AGNELO SANTOS QUEIROZ FILHO PC do B 48 Masculino No eleito

39

40

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

> tail(b, n = 3) uf candidato partido idade sexo resultado 200 PB WALTER AMORIM DE ARAJO PRTB 52 Masculino No eleito 201 TO WEDER MARCIO DA SILVA SANTOS PSDC 35 Masculino No eleito 202 PI ZILTON VICENTE DUARTE JUNIOR PSOL 37 Masculino No eleito

O comando head() imprime no Console os seis primeiros valores do objeto que lhe passado como argumento. Se esse objeto for um data.frame, ele imprime as seis primeiras linhas de todas as colunas. O nmero de valores ou linhas a ser impresso pode ser controlado pelo parmetro n. O comando tail() imprime os seis ltimos valores ou linhas. Veremos a seguir vrias outras formas de selecionar e exibir linhas e colunas especcas. Para escolher uma linha especca, por exemplo, a 26, podemos digitar:
> b[26, ] uf candidato partido idade sexo resultado 26 AP CELISA PENNA MELO CAPELARI PSOL 37 Feminino No eleito

De acordo com o sistema de ndices do R, podemos fazer referncia a um elemento de um data.frame, de uma matrix ou de uma table indicando entre colchetes, respectivamente, o nmero da linha e o da coluna do elemento. No exemplo acima, no indicamos a coluna, e, por isso, todas foram impressas. possvel tambm selecionar vrias linhas ou colunas simultaneamente e usar os nomes das linhas ou das colunas ao invs dos seus ndices e imprimir fora da sequncia em que se encontram no banco de dados, como nos exemplos abaixo (resultados dos comandos omitidos):
> > > > > > b[1:10, ] b[10:1, 1:3] b[c(1, 2, 3, 4), c(1, 2, 3)] b[c(4, 2, 1, 3), c(2, 3, 1)] b[20:30, "candidato"] b[1:10, c("partido", "resultado")]

possvel utilizar ndices negativos para no imprimir linhas ou colunas (resultados omitidos):
> b[1:10, -1] > b[c(1, 3, 5), -c(5, 3, 1)]

Tambm podemos utilizar condies lgicas para selecionar os ndices das linhas a serem impressas. Nesse caso, a condio da coluna deve retorna os ndices que correspondem linha e, por isso, deve ocupar o primeiro campo entre colchetes (resultados omitidos):
> > > > b[b$uf == b[b$idade b[b$uf == b[b$uf == "CE", c(2, 3, 6)] > 80, c(1, 2, 4)] "AP" & b$sexo == "Feminino", 1:4] "RJ" | b$uf == "SP", 1:3]

A Tabela 2.3 (19) explica o signica de cada smbolo. E, claro, para visualizar o banco de dados inteiro, basta digitar b (ou b[,] ou, ainda, b[]), mas no faa isso se o banco for muito grande, com dezenas de colunas e milhares de linhas. Para saber o nmero de linhas e de colunas de um data.frame, use o comando dim(), abreviatura de dimensions. Tambm possvel obter o nmero de colunas com comando length(), fornecendo o data.frame como parmetro. Para saber o nmero de linhas, poderamos fornecer uma das variveis como parmetro, uma vez que todas as variveis tm o mesmo comprimento:

5.2. EXTRAIR SUBCONJUNTO DOS DADOS


> dim(b) [1] 202 6 > c(length(b$resultado), length(b)) [1] 202 6

41

Tambm pode ser importante saber qual a classe das diferentes variveis de um banco de dados porque s vezes uma anlise falha devido varivel estar classicada de modo errado. Estar habituado s diferentes classes de objetos facilitar o entendimento das mensagens de erro e a consequente correo dos problemas. Para isso, podemos usar o comando class().

5.2

Extrair subconjunto dos dados

A partir de agora, utilizaremos uma verso mais completa do banco com dados dos candidatos ao Senado em 2006. Para tanto, carregue a rea de trabalho senado2006.RData:
> load("senado2006.RData")

Quando no se precisa de todas as variveis de um banco de dados, recomendvel a criao de um novo banco contendo apenas um subconjunto dos dados. possvel extrair um subconjunto com a seleo de ndices de linhas e colunas, como visto na seo 5.1, mas a forma mais apropriada de se fazer isso usando o comando subset(), que recebe como parmetros o banco de dados original, a condio de seleo e um vetor com os nomes das colunas a serem selecionadas (consulte a ajuda do comando para ver formas alternativas de us-lo). No exemplo abaixo, ser criado um novo banco de dados, contendo apenas as linhas do banco original cujo valor da varivel uf Cear, sendo selecionadas apenas as variveis nome, partido e votos:
> ce <- subset(sen, uf == "CE", select = c("candidato", "partido", "votos")) > ce candidato partido votos 16 ANTONIO FERNANDES DA SILVA FILHO PSDC 3640 74 INCIO FRANCISCO DE ASSIS NUNES ARRUDA PC do B 1912663 139 MARIA NAIR FERNANDES SILVA PDT 39327 149 MORONI BING TORGAN PFL 1680362 172 RAIMUNDO PEREIRA DE CASTRO PSTU 18545 193 TARCSIO LEITO DE CARVALHO PCB 6084

O smbolo == tem signicado diferente do smbolo = utilizado para atribuir valores a argumentos de funes e o segundo argumento fornecido funo signica VERDADEIRO se uf for igual a Cear e FALSO em todos os outros casos. Quando usamos a funo subset(), no necessrio acrescentar o smbolo $ antes dos nomes das variveis.

5.3

Ordenar um banco de dados

Em algumas ocasies pode ser necessrio ordenar um banco de dados. A forma de fazer isso no R usar a funo order() para criar um vetor de ndices ordenados de acordo com algum critrio e, em seguida, atribuir a um objeto o banco original reordenado pelo vetor. Por exemplo, para reordenar o banco ce criado na seo anterior pelo nmero decrescente de votos recebidos, podemos usar o seguinte cdigo:

42

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

> idx <- order(ce$votos, decreasing = TRUE) > ce <- ce[idx, ] > ce candidato partido votos 74 INCIO FRANCISCO DE ASSIS NUNES ARRUDA PC do B 1912663 149 MORONI BING TORGAN PFL 1680362 139 MARIA NAIR FERNANDES SILVA PDT 39327 172 RAIMUNDO PEREIRA DE CASTRO PSTU 18545 193 TARCSIO LEITO DE CARVALHO PCB 6084 16 ANTONIO FERNANDES DA SILVA FILHO PSDC 3640

5.4

Visualizao grca de variveis

Como j vimos em outras sees, para obter um sumrio de um objeto temos o comando summary(), que tanto pode ser aplicado a uma das colunas de um banco de dados quanto ao data.frame completo. O sumrio apenas numrico, mas a visualizao de uma varivel num grco muitas vezes mais informativa. O comando bsico para produzir grcos no R plot(), o qual determina o tipo de grco a ser produzido conforme a classe do objeto que lhe passado como argumento. Por exemplo, com uma varivel categrica, ou seja, um objeto da classe factor, produzido um grco de barras (gura no includa):
> plot(sen$resultado)

Com a funo freq(), do pacote descr, simultaneamente produzida uma tabela de frequncia e um grco de barras. Entre os argumentos da funo est a escolha do tipo de apresentao das quantidades das categorias por meio de nmeros absolutos ou relativos. No exemplo da Figura 5.4, optou-se pelo uso de valores percentuais:
> library(descr) > freq(sen$resultado, y.axis = "percent") sen$resultado Frequncia Percentual Eleito 27 13.37 No eleito 175 86.63 Total 202 100.00
80 0 20 40 60

Eleito

No eleito

Figura 5.1: Eleitos e no eleitos para o Senado em 2006

5.4. VISUALIZAO GRFICA DE VARIVEIS

43

Para variveis numricas, a funo summary() nos fornece o valor mnimo, o 1 quartil, a mediana, a mdia, o 3 quartil e o valor mximo. Uma ferramenta til para visualizao das caractersticas de uma varivel numrica o diagrama em caixa e bigodes (boxplot), o qual permite visualizar quase todas as informaes exibidas pela funo summary(). Ele revela, ainda, a existncia de valores extremos ou atpicos (outliers).
> summary(sen$idade) Min. 1st Qu. 35.00 44.00 Median 50.50 Mean 3rd Qu. 52.25 60.00 Max. 89.00

90

> boxplot(sen$idade)

60

70

80

max Ls

valor atpico

Q3 IIQ min Q2 Q1

Figura 5.2: Exemplo de diagrama em caixa Na Figura 5.2, a base da caixa do diagrama representa o primeiro quartil, Q1 , a linha central representa a mediana, Q2 , e o topo da caixa, o terceiro quartil, Q3 . A distncia entre Q3 e Q1 o intervalo interquartil, IIQ. O limite do bigode inferior do diagrama, Li , invisvel no grco, calculado como Q1 (1,5 IIQ) e o limite superior, Ls = Q3 + (1,5IIQ). Os valores que estiverem abaixo do limite inferior ou acima do limite superior so considerados atpicos. No caso da idade dos candidatos ao Senado em 2006, no h nenhum valor abaixo de Li , o que faz sentido, pois a Constituio do Brasil no permite a candidatura ao Senado de pessoas muito jovens, com menos de 35 anos. O valor mnimo, min, est acima de Li e o nico valor atpico, acima de Ls , a idade de 89 anos de uma candidata eleita pelo Rio Grande do Sul. Outro grco muito importante para a visualizao de variveis numricas o histograma. No histograma, o vetor de nmeros subdividido em classes de valores e as barras representam a frequncia dos valores em cada classe. Na Figura 5.3 temos um grco produzido por hist(): O histograma da Figura 5.3 tem uma srie de problemas que precisam ser corrigidos. O mais srio deles que quase todos os candidatos esto na classe inferior de posse de bens. Vericando o resultado de
> summary(sen$bens) Min. 0 1st Qu. 24580 Median 167000 Mean 3566000 3rd Qu. Max. 697800 492600000

percebemos que o valor mnimo de sen$bens 0 e o mximo de 492 milhes. A funo hist() dividiu esse intervalo em dez partes iguais; a primeira faixa, de 0 a 50 milhes, inclui todos, menos um candidato:
> sen[sen$bens > 5e+07, c("candidato", "uf", "partido")] candidato uf partido 183 RONALDO CEZAR COELHO RJ PSDB

40

50

44
> hist(sen$bens)

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

Histogram of sen$bens
200 Frequency 0 0e+00 50 100 150

1e+08

2e+08

3e+08

4e+08

5e+08

sen$bens

Figura 5.3: Exemplo de histograma Isso explica porque o histograma cou to deformado, com apenas uma grande barra esquerda e uma diminuta, quase invisvel, barra direita: a barra da esquerda representa 221 candidatos e a barra da direita apenas um. Em sociedades com alto ndice de desigualdade social, a riqueza no s mal distribuda como a distribuio no linear, mas geomtrica. Por isso, comumente, utilizamos o logaritmo da renda em anlises estatsticas. Assim, antes de produzir um novo grco, vamos criar uma nova varivel:
> sen$log.bens <- log(sen$bens)

No cdigo acima, acrescentamos uma varivel ao banco de dados atribuindo um vetor a um nome de varivel inexistente no banco. O grco da Figura 5.3 tambm tem problemas estticos. Algumas das caractersticas denidas automaticamente pela funo hist() cariam mais apropriadas se denidas manualmente, como o ttulo principal, os rtulos dos eixos, e a cor das barras. Para melhorar, o grco, podemos passar para hist() os argumentos main, xlab, ylab e col, cujos signicados sero esclarecidos pela Figura 5.4. Alm de melhorarmos a aparncia do grco, utilizamos o argumento probability para substituir a apresentao das frequncias em valores absolutos por valores relativos. Ronaldo Cezar Coelho continua solitrio na barra mais direita do histograma, mas o restante do grco possui uma forma de sino, tpica de uma distribuio normal. Chamamos de log-normal a uma distribuio cujo logaritmo se assemelha a uma distribuio normal.

5.5. RECODIFICAR VARIVEIS

45

> hist(sen$log.bens, main = "Logaritmo dos Bens Declarados (R$) dos Candidatos ao Sena + ylab = "Proporo", xlab = "Logaritmo dos Bens", col = "lightgray", + probability = TRUE)

Logaritmo dos Bens Declarados (R$) dos Candidatos ao Senado

Proporo

0.00

0.05

0.10

0.15

0.20

10

12

14

16

18

20

Logaritmo dos Bens

Figura 5.4: Exemplo de histograma melhorado

5.5

Recodicar variveis

Quando so aplicados questionrios, muitas questes cam sem receber resposta de boa parte dos entrevistados. Em alguns casos, a pergunta no se aplica ao indivduo, em outros, o entrevistado, por algum motivo, preferiu no responder pergunta e, nalmente, o entrevistado pode no saber responder pergunta. Antes de realizar a anlise dos dados pode ser necessrio recodicar as variveis para que as anlises posteriores sejam bem sucedidas. Digamos que uma determinada varivel categrica x tenha entre seus levels os valores NS, NR e NA, correspondendo respectivamente a No Sabe, No Respondeu e No se Aplica, e gostaramos de tratar todas elas como valores omissos (missing values). O comando para fazer isso seria:
> x[x == "NS" | x == "NR" | x == "NA"] <- NA > x <- factor(x)

Os valores entre colchetes na primeira linha do cdigo acima, como o leitor j est habituado, fazem uma seleo dos ndices de x. Mas h vrias novidades nessa linha. Observe que o smbolo NA, embora constitudo por duas letras, no est entre aspas. O valor NA que est sendo atribudo a alguns dos valores de x tem um signicado especial para o R: not available,

46

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

ou seja, valor ausente. Vimos na seo 2.6 (p. 18 os signicado dos smbolos lgicos utilizados no cdigo acima. ; na primeira parte do cdigo entre colchetes, ele signica VERDADEIRO se x for igual a NS e FALSO se no for. O smbolo | signica a condio lgica OU. Assim, o cdigo dentro dos colchetes pode ser lido como: VERDADEIRO se x for igual a NS ou x igual a NR ou x igual NS; FALSO se x no for igual a nenhum dos trs valores. Ou seja, o valor NA ser atribudo a todos os elementos do vetor x que corresponderem s categorias No Sabe, No Respondeu ou No se Aplica. O comando factor(x) tem o objetivo de eliminar da varivel categrica os levels vazios; no caso, NS, NR e NA. No cdigo hipottico acima, modicamos a prpria varivel, mas, em outras ocasies, precisamos criar uma nova varivel. No exemplo abaixo, a funo recode() do pacote memisc utilizada para recodicar a varivel Partido poltico em uma Posicionamento em relao ao Governo Federal.
> library(memisc) > sen$pos <- recode(sen$partido, + "Situao" <- c("PT", "PMDB", "PSB", "PV", "PTB", "PC do B", "PP", + "PRTB", "PL", "PMN", "PT do B", "PAN", "PSC", "PTC", + "PHS", "PTN", "PRB", "PRONA"), + "Intermedirio" <- c("PCB", "PDT", "PRP", "PSDC", "PSL"), + "Oposio" <- c("PSDB", "PFL", "PPS", "PSOL", "PSTU", "PCO")) > summary(sen$pos) Situao Intermedirio Oposio 81 50 71

Foram classicados na Situao aqueles partidos que no lanaram candidatura prpria Presidncia da Repblica e que em 2008 estavam na base aliada do Governo Federal; como Intermedirios aqueles lanaram candidatura prpria, mas em 2008 estavam na base aliada do Governo; nalmente, como pertencentes Oposio aqueles que lanaram candidatura prpria e faziam oposio ao Governo em 2008.

5.6

Criar varivel categrica a partir de varivel numrica

Em alguns casos, uma varivel embora numrica, no tem efeito sempre positivo ou negativo sobre outra varivel. A idade, por exemplo, uma caracterstica quanticvel dos indivduos que pode exercer inuncia sobre outras caractersticas de modo complexo. Para pessoas relativamente jovens, quanto maior a idade, em mdia, maior a escolaridade. Entretanto, pessoas um pouco mais velhas passaram sua juventude em um perodo em que o acesso escola era menos comum e, por isso, a partir de uma certa idade, quanto maior a idade, em mdia, menor a escolaridade. Em casos como esses, pode ser melhor converter a varivel numrica numa varivel categrica antes de continuar a anlise dos dados. Isso pode ser feito com o comando cut(), fornecendo-lhe como argumentos a varivel numrica, um vetor com os valores de corte mnimo, intermedirios e mximo, e, opcionalmente, um vetor com os rtulos, como no exemplo:
> sen$faixa.etaria <- cut(sen$idade, c(0, 44, 65, 90), + labels = c("Jovem", "Experiente", "Idoso")) > summary(sen$faixa.etaria) Jovem Experiente Idoso 56 120 26

5.7. APAGAR VARIVEIS EXISTENTES E ACRESCENTAR NOVAS

47

No h problema se os pontos de corte mnimo e mximo estiverem para alm dos valores mnimo e mximo da varivel numrica. Por outro lado, se o ponto de corte mnimo for superior ao valor mnimo da varivel numrica ou se o ponto de corte mximo for inferior ao valor mximo, sero introduzidos NAs no novo vetor. Observe que o nmero de rtulos das categorias igual ao nmero de pontos de corte 1.

5.7

Apagar variveis existentes e acrescentar novas

Quando atribumos um novo valor a uma varivel, como j zemos vrias vezes nas sees anteriores, na verdade, estamos destruindo a varivel antiga e criando uma nova. Mas se a inteno for realmente apagar uma varivel de um banco de dados, basta lhe atribuir o valor NULL. A ttulo de exemplo, digite names(sen) antes e depois do seguinte comando e compare os resultados:
> sen$p.valido <- NULL

5.8

Reunir dois bancos de dados

Para reunir dois bancos de dados utilizamos a funo merge(). Por exemplo, se tivermos um data.frame b1 contendo o valor do IDH dos Estados do Sul do Brasil para o ano de 2005 e um data.frame b2 contendo a populao estimada desses mesmos Estados, em milhes, para 2007, poderemos reuni-los num nico banco de dados com o comando merge(b1, b2). O pr-requisito para o correto funcionamento de merge() que a varivel chave para fuso esteja presente com o mesmo nome nos dois bancos. No exemplo abaixo, tivemos que converter as colunas correspondentes Unidade da Federao de factor para character para a comparao das chaves realizada por merge() ser possvel e tivemos que renomear uma das variveis chave para que os nomes cassem exatamente iguais:
> > > > > > > > > > uf <- c("RS", "SC", "PR") idh <- c(0.832, 0.84, 0.82) b1 <- data.frame(uf, idh) UF <- c("PR", "SC", "RS") pop <- c(10.3, 5.9, 10.6) b2 <- data.frame(UF, pop) names(b2) <- c("uf", "pop") b1$uf <- as.character(b1$uf) b2$uf <- as.character(b2$uf) merge(b1, b2)

uf idh pop 1 PR 0.820 10.3 2 RS 0.832 10.6 3 SC 0.840 5.9

Note que se as variveis uf e UF fossem exatamente iguais, ou seja, se as unidades da federao estivessem na mesma ordem, seria desnecessrio usar merge(), sendo suciente utilizar cbind(). Em outro cenrio, se os dois bancos de dados contivessem exatamente as mesmas variveis, e na mesma ordem, poderamos estar interessados em acrescentar novas linhas (casos) ao banco e no novas colunas. Nesse caso, o comando apropriado seria rbind().

48

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

5.9

Reformatar banco de dados

A funo reshape() reformata um banco de dados de modo que medies diferentes de uma varivel que estejam em linhas diferentes tornem-se diferentes colunas de uma mesma linha ou, o contrrio, que medies diferentes de uma varivel que esto em colunas diferentes quem na mesma colunas, mas em linhas diferentes. No exemplo abaixo, criamos um banco com dados sobre a populao de alguns pases em trs anos diferentes e, em seguida, usamos a funo reshape() para reformatar o banco de dados. O argumento timevar indica qual varivel contm informao sobre o momento da observao e o argumento idvar indica qual varivel deve ser usada como chave para reformatar o banco de dados. O argumento direction indica se queremos reformatar o banco de dados de modo a torn-lo mais largo ou mais comprido:
> > > + > > pais <- c(rep("Brasil", 3), rep("Bulgria", 3), rep("ndia", 3)) ano <- rep(c(1960, 1980, 2000), 3) populacao <- c(71695, 122958, 175553, 7867, 8844, 7818, 445857, 687029, 1002708) b <- data.frame(pais, ano, populacao) b

pais ano populacao 1 Brasil 1960 71695 2 Brasil 1980 122958 3 Brasil 2000 175553 4 Bulgria 1960 7867 5 Bulgria 1980 8844 6 Bulgria 2000 7818 7 ndia 1960 445857 8 ndia 1980 687029 9 ndia 2000 1002708 > b2 <- reshape(b, timevar = "ano", idvar = "pais", direction = "wide") > b2 pais populacao.1960 populacao.1980 populacao.2000 1 Brasil 71695 122958 175553 4 Bulgria 7867 8844 7818 7 ndia 445857 687029 1002708

No prximo exemplo, fazemos o contrrio, reformatamos um banco de dados de modo a ter as informaes arranjadas no formato mais comprido. O argumento varying indica quais colunas no formato largo correspondem a uma nica varivel no formato comprido. Aps a reformatao do banco, os nomes das linhas caram inadequados, e, por isso, usamos a funo rownames() para corrigi-los:
> > > > > > pais <- c("Brasil", "Bulgria", "ndia") pop.1960 <- c(71695, 7867, 445857) pop.1980 <- c(122958, 8844, 687029) pop.2000 <- c(175553, 7818, 1002708) b <- data.frame(pais, pop.1960, pop.1980, pop.2000) b

pais pop.1960 pop.1980 pop.2000 1 Brasil 71695 122958 175553 2 Bulgria 7867 8844 7818 3 ndia 445857 687029 1002708 > b2 <- reshape(b, idvar = "pais", timevar = "ano", varying = c("pop.1960", + "pop.1980", "pop.2000"), direction = "long") > b2

5.10. ATRIBUTOS DE OBJETOS


pais Brasil.1960 Brasil Bulgria.1960 Bulgria ndia.1960 ndia Brasil.1980 Brasil Bulgria.1980 Bulgria ndia.1980 ndia Brasil.2000 Brasil Bulgria.2000 Bulgria ndia.2000 ndia > rownames(b2) <- 1:9 ano pop 1960 71695 1960 7867 1960 445857 1980 122958 1980 8844 1980 687029 2000 175553 2000 7818 2000 1002708

49

5.10

Atributos de objetos

Ao contrrio do SPSS, em que todas as variveis de um banco de dados possuem um rtulo descritivo, os objetos no R no possuem esses rtulos, mas podemos acrescent-los manualmente. A funo descr() verica se o objeto possui o atributo label e o imprime antes de chamar a funo summary(). Isso bastante til quando temos um banco de dados com dezena de variveis e no lembramos o que exatamente cada uma delas representa.1 Para acrescentar um atributo a um objeto, usamos o comando attr(). O mesmo comando permite obter o valor de um atributo e o comando attributes() lista todos os atributos de um objeto. Seguem alguns exemplos que utilizam os comandos mencionados:
> class(sen$sexo) [1] "factor" > attr(sen$sexo, "label") NULL > attr(sen$sexo, "label") <- "Sexo do candidato" > attr(sen$sexo, "Observao") <- "Sexo diferente de sexualidade" > descr(sen$sexo) sen$sexo - Sexo do candidato Feminino Masculino 30 172 > attributes(sen$sexo) $levels [1] "Feminino" "Masculino" $class [1] "factor" $label [1] "Sexo do candidato" $Observao [1] "Sexo diferente de sexualidade"

Como ca claro pelo resultado do comando attributes(), os objetos no R armazenam muitas informaes como atributos. Um objeto do tipo factor, por exemplo, apenas um vetor do tipo integer com alguns atributos adicionais: levels e class.
Entre as funes presentes no pacote Hmisc, temos label(), que acrescenta o atributo label a um objeto, spss.get(), que atribui automaticamente rtulos s variveis de um banco de dados importado do SPSS. A funo label(), entretanto, muda a classe do objeto, o que pode causar problemas de compatibilidade com funes de outros pacotes. Por isso, neste livro, no usaremos o pacote Hmisc.
1

50

CAPTULO 5. MANIPULANDO BANCOS DE DADOS

A possibilidade de atribuio de caractersticas arbitrrias a qualquer objeto, combinada com a possibilidade de criar novas classes e atribu-las aos objetos, uma das caractersticas da linguagem R que lhe proporcionam grande exibilidade e poder. Entretanto, os atributos de um objeto so perdidos quando ele transformado de um tipo em outro, o que frequentemente precisamos fazer durante a fase de manipulao do banco de dados. Por isso, se desejar acrescentar rtulos ou outros atributos s variveis de um banco de dados, recomendvel que o faa como ltima etapa da manipulao. Concluda a manipulao do banco de dados, salve o script que escreveu durante essa fase do processo de anlise de dados. Ele ser necessrio se for percebida alguma falha na manipulao dos dados. Nesse caso, bastar fazer a correo no script e execut-lo novamente. Salve tambm o banco de dados:
> save(sen, file = "senado2006.novo.RData")

Captulo 6 Anlise descritiva


Neste captulo, veremos as anlises que podem ser feitas sem o uso de tcnicas avanadas de estatstica. Elas so muito teis para a explorao inicial do banco de dados e podemos ter que nos limitar a elas quando vamos apresentar um relatrio de pesquisa para um pblico leigo em estatstica.

6.1

Anexar variveis de um banco de dados rea de trabalho

At aqui, sempre que precisamos fazer referncia a uma varivel de um banco de dados, usamos a notao b$v, onde b representa um data.frame e v uma de suas colunas ou variveis, mas a funo attach() permite fazer referncia a uma varivel de um banco de dados diretamente, sem o prexo b$. Ao digitarmos attach(b), o R faz cpias das variveis de b que, embora no sejam exibidas pela funo ls(), podem ser acessadas pelas demais funes. A Figura 6.1 uma representao grca do processo: b v1 v3 v5 v2 v4 v6 v1 v3 v5 b v2 v4 v6 v5 v6 v3 v4

v1

v2

Antes

Depois

Figura 6.1: rea de trabalho antes e depois de attach(b) O inconveniente de usar attach() durante o processo de manipulao dos dados decorre do fato de alteraes nos objetos anexados rea de trabalho no se reetirem nas variveis do data.frame() e vice-versa. Seria preciso usar constantemente a funo detach() para desanexar os objetos anexados pela ltima chamada a attach(). Como isso causa frequente de confuso entre iniciantes, evitaremos o uso de attach() neste livro. 51

52

CAPTULO 6. ANLISE DESCRITIVA

Nas primeiras sees deste captulo, utilizaremos um subconjunto do banco de dados da Pesquisa Social Brasileira de 2002. O primeiro passo , pois, carregar o banco de dados:1
> load("pesb2002.RData")

Para facilitar o nosso trabalho durante o captulo, vamos renomear as variveis do nosso subconjunto da PESB com nomes mais signicativos do que os originais:
> dput(names(pesb)) c("q2", "q531", "q660", "q66", "q68", "q78", "q105", "q511", "q546") > names(pesb) <- c("regiao", "sexo", "peso", "docrapido", "natal", + "emprestimo", "atitude", "religiao", "rendafam")

Usaremos vrias funes do pacote descr. Por isso, vamos carreg-lo na memria do R:
> library(descr)

6.2

Construo de ndices

ndices so construdos pela computao de novas variveis a partir de variveis existentes. Eles so teis para condensar informaes que de outra forma seriam difceis de analisar. Na PESB, por exemplo, existem 19 perguntas sobre situaes que o entrevistado deve classicar como favor, jeitinho ou corrupo. As trs que Almeida (2007) aponta como as que obtiveram respostas mais variadas foram: (1) Pedir a um amigo que trabalha no servio pblico para ajudar a tirar um documento mais rpido do que o normal. (2) Um funcionrio pblico recebe um presente de Natal de uma empresa que ele ajudou a ganhar um contrato do governo. (3) Algum consegue um emprstimo do governo, mas que demora muito a sair. Como ela tem um parente no governo consegue liberar o emprstimo mais rpido. No nosso banco de dados, estas variveis esto nomeadas docrapido, natal e emprestimo. As trs, claro tm as mesmas categorias:
> levels(pesb$docrapido) [1] [3] [5] [7] [1] [3] [5] [7] [1] [3] [5] [7]
1

"Favor" "Mais favor do que jeitinho" "Mais jeitinho do que favor" "Jeitinho" "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho" "Corrupo" "Favor" "Mais favor do que jeitinho" "Mais jeitinho do que favor" "Jeitinho" "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho" "Corrupo" "Favor" "Mais favor do que jeitinho" "Mais jeitinho do que favor" "Jeitinho" "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho" "Corrupo" No Windows, se tiver diculdades para encontrar um arquivo, use a funo file.choose().

> levels(pesb$emprestimo)

> levels(pesb$natal)

6.3. UMA VARIVEL NUMRICA E OUTRA CATEGRICA

53

Mesmo utilizando apenas essas trs variveis, a quantidade de nmeros a serem visualizados em tabelas cruzadas tornaria difcil a interpretao dos dados. Em situaes como essas, til construir um ndice que sumarize as informaes de um conjunto de variveis. Assim, vamos utilizar da PESB as variveis docrapido, natal e emprestimo para construir um ndice de percepo da corrupo, ipc (no presente no livro de Almeida). O ndice ser simplesmente a soma dos levels das variveis (que variam de 1 a 7). Para que o ndice varie de 0 a 18 e no de 3 a 21, subtrairemos 3 da soma:

> pesb$ipc <- as.numeric(pesb$docrapido) + as.numeric(pesb$natal) + + as.numeric(pesb$emprestimo) - 3 > attr(pesb$ipc, "label") <- "ndice de percepo de corrupo" > table(pesb$ipc) 0 95 1 12 2 18 3 97 4 49 5 6 55 222 7 82 8 9 10 11 12 13 14 15 93 220 120 142 275 136 124 146 16 98 17 18 66 108

Nas seo seguinte teremos oportunidade de utilizar o ndice. O atributo label adicionado ao objeto ipc ser utilizado pela funo compmeans() para criar o ttulo da tabela impressa na tela (ver Figura 6.2).

6.3

Uma varivel numrica e outra categrica

Quando queremos saber a relao entre uma varivel numrica e outra categrica, a anlise descritiva mais adequada a comparao do valor mdio da varivel numrica segundo as diversas categorias da categrica. Essa anlise pode ser feita com a funo compmeans() do pacote descr que produz uma tabela com as mdias e um conjunto de diagramas de caixa. A gura 6.2 mostra o resultado de compmeans() tendo por argumentos o ndice de corrupo que criamos na seo 6.2 e a Regio do pas onde morava o entrevistado. Tambm forneceremos como argumento o peso do indivduo na amostra (varivel Q660 no banco original do CIS, peso em nosso subconjunto dos dados), o que torna mais acurada a descrio das caractersticas da populao.2 Antes de produzir o grco, os nomes das regies foram abreviados com a funo levels(). Na tabela de comparao de mdias da Figura 6.2, ns temos o valor mdio do ipc segundo a Regio, o nmero de indivduos entrevistados em cada Regio (N), e o desvio padro do ipc do indivduos segundo a Regio. As pessoas das regies com ipc mais alto, em mdia, interpretam em maior proporo as situaes apresentadas como casos de corrupo (algo negativo) do que de jeitinho (algo aceitvel) ou favor (algo positivo) e suponho que elas se sentiro mais inibidas em praticar atos semelhantes do que aquelas que consideram que as situaes representam casos de jeitinho ou favor. Ou seja, a hiptese de que quanto maior o ipc, menos comum a prtica de corrupo. Na Figura 6.3, temos um grco de densidade condicional tambm ilustrando a relao entre percepo da corrupo e regio de moradia dos entrevistados. Os nordestinos constituem mais da metade dos que tm baixa percepo de corrupo e menos de 20% dos que tm a mais alta percepo de corrupo.
Alguns programas de estatstica permitem denir uma varivel como o peso a ser utilizado nas anlises. No R isso no possvel, sendo necessrio fornecer o peso como argumento para cada uma das funes que incluem essa opo.
2

54

CAPTULO 6. ANLISE DESCRITIVA

> levels(pesb$regiao) <- c("N", "CO", "NE", "SE", "S") > compmeans(pesb$ipc, pesb$regiao, pesb$peso, ylab = "Percepo de corrupo", + xlab = "Regio do pas", col = "lightgray") Aviso: boxplot de valores ponderados no implementado ainda. Valor mdio de "ndice de percepo de corrupo" segundo "pesb$regiao" Mdia N Desv. Pd. N 10.717111 106 4.372350 CO 10.959567 149 4.401661 NE 8.705418 580 4.894689 SE 11.047238 1005 4.159193 S 10.993303 351 4.317077 Total 10.397203 2191 4.528028

Percepo de corrupo

10

15

CO

NE Regio do pas

SE

Figura 6.2: Diagramas em caixa: percepo da corrupo segundo a Regio

6.4

Duas variveis categricas

Para saber se existe alguma correlao entre duas variveis categricas, podemos fazer uma tabela cruzada e produzir um grco com as duas variveis. As funes que fazem isso so table() e plot() (ver Figura 6.4). Nesta seo, exemplicaremos como fazer anlise de duas variveis categricas vericando se diferentes religies atraem igualmente homens e mulheres.
> table(pesb$religiao, pesb$sexo) Mormon, Adventista, Testemunha de Jeov Evanglica pentecostal Evanglica no-pentecostal Candombl Umbanda Esprita kardecista Seisho-N-I, Messinica Catlica Judaica Budista Santo Daime, Esotrica, Outras Masculino Feminino 19 30 92 167 42 66 5 3 4 5 23 47 4 5 772 902 0 1 1 1 12 13

6.4. DUAS VARIVEIS CATEGRICAS


> b <- subset(pesb, is.na(ipc) == F, select = c("ipc", "regiao")) > cdplot(b$ipc, b$regiao, xlab = "IPC", ylab = "Regio")
1.0

55

SE

Regio

NE

CO

5 IPC

10

15

Figura 6.3: Grco de densidade condicional: regies segundo a percepo de corrupo


No tem religio Ateu 75 6 57 1

A tabela acima e a Figura 6.4 precisam de algumas melhorias. Um primeiro problema a ser resolvido a eliminao das categorias com pequeno nmero de casos. Vamos criar uma nova varivel, rlg, reunindo algumas categorias e eliminando outras:
> library(memisc) > pesb$rlg <- recode(pesb$religiao, + "Evanglica" <- c("Mormon, Adventista, Testemunha de Jeov", + "Evanglica no-pentecostal", "Evanglica pentecostal"), + "Catlica" <- "Catlica", + "Nenhuma" <- c("Ateu", "No tem religio"))

A forma mais fcil de fazer isso utilizando crosstab(), do pacote descr que, alm de aceitar um vetor de pesos como argumento, imprime na tela uma tabela e produz um mosaicplot.3 Nos prximos exemplos, usaremos os dados sobre candidatos ao Senado nas eleies de 2006. No cdigo abaixo, carregamos o banco de dados e recodicamos a varivel escolaridade de modo a reduzir seu nmero de categorias:
> load("senado2006.RData") > sen$escola.superior <- recode(sen$escola, "Superior" <- "Ensino Superior completo", + otherwise = "No superior")

Em seguida, na Figura 6.6, produzimos um grco de interao, o qual permite perceber a relao entre duas variveis categricas e uma numrica.
A funo crosstab() aceita vrios outros argumentos teis, mas eles tornam os resultados mais complexos, exigindo maior conhecimento estatstico do leitor, e, por isso, somente sero utilizados no Captulo 7.
3

0.0

0.2

0.4

0.6

0.8

56

CAPTULO 6. ANLISE DESCRITIVA

> plot(pesb$religiao, pesb$sexo, xlab = "Religio", ylab = "Sexo")


1.0 Feminino Sexo Masculino Mormon, Adventista, Testemunha de Jeov Catlica Religio Judaica

Figura 6.4: Grco mosaico: religio e sexo do indivduo

6.5

Duas variveis numricas

A abordagem mais adequada para vericar a existncia de correlao entre duas variveis numricas a anlise de regresso, como veremos no captulo 7. Se o pblico leitor no tiver conhecimentos de estatstica suciente para interpretar uma tabela com os resultados de uma anlise de regresso, o que podemos fazer produzir um grco de disperso das duas variveis. Para exemplicar, vericaremos a relao entre gasto de campanha e votao recebida. Utilizaremos um subconjunto dos dados, excluindo os candidatos que no receberam nenhum voto. Assim como a varivel renda no captulo anterior (ver Figura 5.4), as duas variveis tm distribuio mais prxima de uma log-normal do que de uma normal. Por isso, em algumas anlises, utilizaremos o logaritmo das variveis e na produo de grcos poderemos utilizar o argumento log para informar se a escala do eixo x e/ou do eixo y dever ser logartmica. Para produzir um grco de disperso entre duas variveis numricas, basta utilizar a funo plot(), fornecendo as duas variveis como argumento. A funo reconhecer que as duas variveis so numricas e chamar o mtodo adequado, como na Figura 6.7. Antes de chamarmos a funo compmeans(), modicamos o parmetro grco scipen para evitar o uso de notao cientca nos rtulos dos eixos do grco.4 possvel perceber uma maior densidade dos pontos nas intersees entre baixo gasto e baixa votao e entre alto gasto e alta votao, mas seria preciso fazer uma anlise de regresso para saber o valor exato dessa correlao e sua signicncia estatstica. O que ainda podemos fazer nos limites da proposta deste captulo converter as variveis em categricas e utilizar compmeans() e crosstab() para vericar a existncia de relao entre elas. A converso de uma varivel numrica em categrica pode ser feita com a funo cut(), como vimos na seo 5.6:
> sen$gastos <- cut(sen$vgasto, c(0, 760000, 2000000, 100000000), + labels = c("Baixo", "Mdio", "Alto"), ordered_result = T)
4

A manipulao de parmetros grcos ser abordada no Captulo 8.

0.0

0.2

0.4

0.6

0.8

6.5. DUAS VARIVEIS NUMRICAS


> crosstab(pesb$rlg, pesb$sexo, pesb$peso, col = c("gray90", "gray70"), + xlab = "Religio", ylab = "Sexo") Contedo das clulas |-------------------------| | Contagem | |-------------------------|

57

========================================== Masculino Feminino Total -----------------------------------------Evanglica 152 231 383 -----------------------------------------Catlica 811 872 1683 -----------------------------------------Nenhuma 88 54 142 -----------------------------------------Total 1051 1157 2208 ==========================================
Evanglica Catlica Nenhuma

Sexo
Feminino

Masculino

Religio

Figura 6.5: Grco mosaico: religio e sexo do indivduo (II)


> sen$votac <- cut(sen$votos, c(0, 14000, 230000, 10000000), + labels = c("Baixa", "Mdia", "Alta"), ordered_result = T)

Criadas as novas variveis categricas, podemos agora usar compmeans(), cujo resultado est na Figura 6.8. Tambm podemos apresentar uma tabela cruzada com as duas novas variveis categricas. Para evitar que o grco produzido por crosstab() apresente a categoria Baixa Votao na parte superior do grco e Alta Votao na parte inferior, no vamos produzir o grco imediatamente. Chamaremos a funo crosstab duas vezes. Na primeira, usaremos o argumento plot = F para inibir a produo do grco e utilizaremos a varivel votac apenas para produzir a tabela cruzada:
> crosstab(sen$gastos, sen$votac, plot = F) Contedo das clulas |-------------------------| | Contagem | |-------------------------|

58

CAPTULO 6. ANLISE DESCRITIVA

> interaction.plot(sen$sexo, sen$escola.superior, sen$p.valido, + xlab = "Sexo", ylab = "Mdia do % de votos vlidos", + trace.label = "Escolaridade", lty = 1:2)
Escolaridade Superior No superior 15 5 Feminino Sexo 10

Mdia do % de votos vlidos

Masculino

Figura 6.6: Grco de interao: sexo, escolaridade e votos vlidos

===================================== Baixa Mdia Alta Total ------------------------------------Baixo 70 14 0 84 ------------------------------------Mdio 13 26 13 52 ------------------------------------Alto 4 15 47 66 ------------------------------------Total 87 55 60 202 =====================================

Para produzir o grco da Figura 6.9, vamos criar um novo objeto, votac2, uma cpia de votac com a numerao interna dos levels invertida. As guras 6.8 e 6.9, contendo, respectivamente, diagramas em caixa e um grco mosaico, apresentam mais claramente a existncia de correlao entre gastos de campanha e votao do que o grco de disperso da Figura 6.7, sendo boas alternativas de apresentao visual dos dados quando se prefere no utilizar anlise de regresso para demonstrar a relao entre duas variveis numricas. Neste captulo, no vamos mais precisar dos dados sobre senadores:

> rm(sen)

6.6. SRIES TEMPORAIS


> options(scipen = 1000) > plot(sen$vgasto, sen$votos, log = "xy", xlab = "Gasto (R$)", + ylab = "Votao (R$)")
10000000
q q q q qq qq q q q qq q q q q qq q q q q q q q qq q q q q q q q q q qq q q q q q qq q q qq q q q q q q q q qq q q qq q q q q q q q q q q q q qq q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q qq q

59

Votao (R$)

100000

1000000

q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q q

10000

q q q q

q q q q

1000

5000

50000

500000 Gasto (R$)

5000000

Figura 6.7: Diagrama de disperso: votao segundo os gastos de campanha

6.6

Sries temporais

Usamos a funo ts() para converter um vetor numrico em objeto da classe ts, srie temporal. A funo recebe como argumentos obrigatrios o vetor de nmeros, e os parmetros de tempo inicial (start) e nal (end). No exemplo a seguir, criamos duas sries temporais, relativas ao nmero de ocorrncias de furtos consumados e de latrocnios no Estado de So Paulo no perodo de 1997 a 2004.5 O nmero de furtos quase mil vezes maior do que o nmero de latrocnios e, para melhor visualizao das duas variveis num nico grco, dividimos o nmero de furtos por 1000 no momento de criar a srie temporal.
> + > > > fur <- c(241026, 276326, 291701, 293900, 321086, 332379, 384004, 393153) lat <- c(451, 545, 722, 724, 653, 527, 540, 468) ts.fur <- ts(fur/1000, start = 1997, end = 2004) ts.lat <- ts(lat, start = 1997, end = 2004)

Grcos de sries temporais so criados pela funo ts.plot(), cujos primeiros argumentos devem ser objetos da classe ts, como no exemplo da Figura 6.10. Uma forma alternativa de apresentar os dados, sem a necessidade de dividir o nmero de furtos por 1000, seria produzir dois grcos separados, como no exemplo a seguir: Para maiores detalhes sobre como trabalhar com sries temporais, consulte Torgo (2006, p. 31 e ss.). Para a produo dos grcos das guras 6.10 e 6.11 passamos vrios parmetros para as funes ts.plot() e plot() e utilizamos funes que somente sero explicados no Captulo 8.
Dados disponibilizados pela Fundao Sistema Estadual de Anlise de Dados, SEADE, e pela Secretaria de Segurana Pblica do Estado de So Paulo, SSP/SP: http://www.seade.gov.br/projetos/ acervossp/imp.php.
5

60

CAPTULO 6. ANLISE DESCRITIVA

> compmeans(sen$votos, sen$gastos, ylab = "Votao", xlab = "Gastos", log = "y") Valor mdio de "sen$votos" segundo "sen$gastos" Mdia N Desv. Pd. Baixo 12709.49 84 26286.5 Mdio 269560.56 52 462881.1 Alto 1049985.74 66 1652811.3 Total 417741.61 202 1069372.4
10000000
q q q q q q q

1000000

q q q q q

100000

Votao

q q q q q q q q

1000

10000

Baixo

Mdio Gastos

Alto

Figura 6.8: Diagramas em caixa: votao segundo os gastos de campanha

> library(memisc) > sen$votac2 <- factor(sen$votac, levels = c("Alta", "Mdia", "Baixa")) > crosstab(sen$gastos, sen$votac2, ylab = "Votao", xlab = "Gastos", + col = c("gray90", "gray75", "gray60"))
Alta Baixo Mdio Alto

Votao
Baixa

Mdia

Gastos

Figura 6.9: Grco mosaico: votao segundo os gastos de campanha

6.6. SRIES TEMPORAIS

61

> ts.plot(ts.lat, ts.fur, lty = 1:2, ylab = "N de ocorrncias", + xlab = "Ano") > legend("topright", legend = c("Latrocnios", "Furtos 1000"), + lty = 1:2, bty = "n")

700

N de ocorrncias

Latrocnios Furtos 1000

300 1997

500

1998

1999

2000

2001

2002

2003

2004

Ano

Figura 6.10: Sries temporais: latrocnios e furtos em So Paulo

> > > > > + > > >

ts.fur <- ts(fur, start = 1997, end = 2004) ts.duas <- cbind(ts.lat, ts.fur) colnames(ts.duas) <- c("", "") par(las = 1) plot(ts.duas, col = "red", cex.axis = 0.8, xlab = "Ano", ylab = "", main = "") par(las = 0) text(1997, 348000, "Latrocnios", adj=c(0,0)) text(1997, 310000, "Furtos", adj=c(0,0))

700 650 600 550 500 450 350000 300000 250000

Latrocnios

Furtos

1997

1998

1999

2000

2001

2002

2003

2004

Ano

Figura 6.11: Sries temporais: latrocnios e furtos em So Paulo (II)

62

CAPTULO 6. ANLISE DESCRITIVA

Captulo 7 Qui-quadrado e regresso


7.1 Qui-Quadrado

Vimos no captulo 6 que a funo crosstab() pode ser utilizada no lugar da funo table() com algumas vantagens. Vamos agora passar o argumento chisq = TRUE para a funo crosstab(), o que a far realizar um teste de qui-quadrado. No exemplo abaixo, iremos cruzar as respostas dadas pergunta Atitude que a empregada domstica deveria ter se a patroa diz que ela pode assistir televiso na sala junto com ela, cujas opes de resposta foram Sentar no sof junto da patroa e assistir TV com ela, Assistir TV na sala, mas pegar uma cadeira na cozinha, Assistir TV no seu quarto. Para reduzir o espaamento horizontal ocupado pela tabela, usamos a funo levels() para abreviar os rtulos da varivel e, para obter resultados mais signicativos, reduzimos o nmero de categorias da varivel Renda familiar, recodicando-a com a funo recode() do pacote memisc:
> > > > + > > + + + > > load("pesb2002.RData") peso <- pesb$q660 atitude <- pesb$q105 levels(atitude) <- c("Sentar no sof", "Pegar cadeira", "Assistir no quarto") library(memisc) rendafam <- recode(factor(pesb$q546), "Alta" <- c("De R$ 2001,00 a 4000,00", "Mais de R$ 4001,00"), "Mdia" <- c("De R$ 601,00 a 1000,00", "De R$ 1001,00 a 2000,00"), "Baixa" <- c("Sem renda", "At R$ 200,00", "De R$ 201,00 a 600,00")) library(descr) crosstab(atitude, rendafam, peso, chisq = T) Contedo das clulas |-------------------------| | Contagem | | Valores esperados | |-------------------------|

=================================================== Alta Mdia Baixa Total --------------------------------------------------Sentar no sof 227 480 553 1260 176.1 457.5 626.4 --------------------------------------------------Pegar cadeira 19 78 99 196

63

64

CAPTULO 7. QUI-QUADRADO E REGRESSO

27.4 71.2 97.4 --------------------------------------------------Assistir no quarto 50 211 401 662 92.5 240.4 329.1 --------------------------------------------------Total 296 769 1053 2118 ===================================================

Estatsticas para todos os fatores da tabela Pearson's Chi-squared test -----------------------------------------------------------Qui2 = 66.50882 g.l. = 4 p = 1.237399e-13 Frequncia esperada mnima: 27.39188

Com o argumento chisq = TRUE, alm de calcular o 2 , a funo crosstab() tambm imprime, no interior das clulas da tabela, os valores esperados no caso de ausncia de correlao entre as variveis. A estatstica p indica a probabilidade da correlao encontrada ser um acaso de amostragem. No exemplo acima, o 2 foi de 66, o que para um grau de liberdade 4 implica numa probabilidade de 1,21012 de no haver nenhuma correlao entre as duas variveis ou de a correlao ter o sentido contrrio.

7.2

Regresso linear

Para realizar uma anlise de regresso linear no R, usamos a funo lm(), que recebe como argumento obrigatrio a equao de regresso no formato y x1 + x2 + x3 + ... + xn , onde y a varivel dependente (necessariamente numrica) e xn so as variveis independentes ou explicativas (numricas ou categricas). No exemplo abaixo, realizada uma anlise de regresso tendo como varivel dependente o logaritmo do nmero de votos recebidos pelos candidatos ao Senado em 2006 e como varivel independente o logaritmo do valor gasto na campanha:
> load("senado2006.RData") > sen$log.vgasto <- log(sen$vgasto) > sen$log.votos <- log(sen$votos) > modelo1 <- lm(sen$log.votos ~ sen$log.vgasto) > summary(modelo1) Call: lm(formula = sen$log.votos ~ sen$log.vgasto) Residuals: Min 1Q -4.69650 -1.18262 Coefficients: (Intercept) sen$log.vgasto --Signif. codes: Estimate Std. Error t value Pr(>|t|) -2.2955 0.9829 -2.335 0.0205 * 0.9486 0.0721 13.157 <2e-16 *** 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Median 0.09819

3Q 1.44920

Max 4.04421

Residual standard error: 1.853 on 200 degrees of freedom Multiple R-squared: 0.464, Adjusted R-squared: 0.4613 F-statistic: 173.1 on 1 and 200 DF, p-value: < 2.2e-16

7.2. REGRESSO LINEAR

65

As variveis so as mesmas utilizadas na seo 6.5, mas agora, com o sumrio do modelo de regresso, temos algumas informaes importantes para a interpretao dos resultados. A primeira coluna da tabela de coecientes contm os nomes das variveis. A segunda coluna contm a estimativa da contribuio de cada varivel independente para o valor da varivel dependente. O intercepto 2,29 indica que, teoricamente, se o logaritmo do gasto fosse zero (portanto, se o gasto fosse de R$ 1,00), o logaritmo do nmero de votos seria 2,29, o que obviamente impossvel, mas isso apenas uma extrapolao dos dados (o menor valor do logaritmo dos gastos 8,5). A estimativa da contribuio do logaritmo do gasto para o logaritmo dos votos de 0,95, ou seja, para cada unidade a mais no logaritmo dos gastos, o logaritmo dos votos aumenta em 0,95. As colunas seguintes mostram, para cada varivel independente, o erro padro, a estatstica t e a probabilidade de a contribuio da varivel independente para o valor da varivel dependente ser zero ou ter valor contrrio ao indicado pelo coeciente estimado. No exemplo acima, a probabilidade de o valor dos gastos no estar relacionado com o nmero de votos de 2,21016 . A estatstica R2 indica qual proporo da variao da varivel dependente pode ser explicada pelo modelo. No caso, 46% da variao do logaritmo dos votos pode ser explicada pelo logaritmo dos gastos. Quando a anlise de regresso realizada com apenas duas variveis, possvel criar um grco de disperso para visualizar a correlao entre as variveis e usar a funo abline() para adicionar a linha de regresso ao grco, como no exemplo da Figura 7.1.1
> plot(sen$log.votos ~ sen$log.vgasto, ylab = "Logaritmo dos votos", + xlab = "Logaritmo dos gastos") > abline(modelo1, col = "red")

16

q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q

10

q q q q q qq q q

q q q q q q q q q q q qq q q q qq q q q qq q q

q q q q q q qq

q q q qq qqq q q q q qq q q q q q q q qq q q q qqq q q q q qq qq q q q q q q q q q q qq q q q q q q q qq q q q q q q q qq q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q

Logaritmo dos votos

12

14

10

12

14

16

Logaritmo dos gastos

Figura 7.1: Correlao entre duas variveis numricas A grande vantagem da anlise de regresso a possibilidade de fazer anlise multivariada, como no exemplo a seguir. Com o argumento data = sen, a funo ir procurar no data.frame sen os objetos que no encontrar diretamente na rea de trabalho. Com isso, torna-se dispensvel anexar o banco de dados antes da anlise com attach() ou digitar sen$ repetidamente:
> library(memisc) > sen$escolaridade <- recode(sen$escola, + "Baixa" <- c("L e Escreve", "Ensino Fundamental incompleto",
1

Ver na p. 8.3 uma explicao do uso da funo abline().

66

CAPTULO 7. QUI-QUADRADO E REGRESSO

+ "Ensino Fundamental completo", "Ensino Mdio incompleto", + "Ensino Mdio completo"), + "Alta" <- c("Ensino Superior incompleto", "Ensino Superior completo")) > modelo2 <- lm(log.votos ~ log.vgasto + escolaridade + idade + est.civil + sexo, + data = sen) > summary(modelo2) Call: lm(formula = log.votos ~ log.vgasto + escolaridade + idade + est.civil + sexo, data = sen) Residuals: Min 1Q -4.47010 -1.20799 Coefficients: (Intercept) log.vgasto escolaridadeAlta idade est.civilDivorciado(a) est.civilSeparado(a) judicialmente est.civilSolteiro(a) est.civilVivo(a) sexoMasculino --Signif. codes: 0 *** 0.001 ** Estimate Std. Error t value Pr(>|t|) -2.28499 1.11662 -2.046 0.04208 * 0.82839 0.07463 11.100 < 2e-16 *** 1.02123 0.29532 3.458 0.00067 *** 0.03506 0.01221 2.871 0.00455 ** -0.17406 0.37305 -0.467 0.64132 -0.64361 0.46750 -1.377 0.17020 -0.67752 0.39830 -1.701 0.09054 . -1.23841 0.59621 -2.077 0.03911 * -0.90684 0.36254 -2.501 0.01320 * 0.01 * 0.05 . 0.1 1

Median 0.09994

3Q 1.34737

Max 3.96605

Residual standard error: 1.742 on 193 degrees of freedom Multiple R-squared: 0.5431, Adjusted R-squared: 0.5242 F-statistic: 28.68 on 8 and 193 DF, p-value: < 2.2e-16

Algumas variveis tm uma alta probabilidade de estarem apenas por acaso de amostragem correlacionadas com a varivel dependente, como algumas das categorias da varivel estado civil, que possuem valor p > 0,05. recomendvel que um modelo de regresso no inclua variveis com correlaes estatisticamente pouco signicativas como essas. Ao construir um modelo de regresso, somente devem ser adicionadas variveis cuja correlao com a varivel dependente elevada e, principalmente, teoricamente explicvel. Para avaliar a adequao de um modelo de regresso linear, podem ser uteis as funes predict() (para obter os valores preditos pela equao de regresso), residuals() (para obter os resduos). O comando a seguir, por exemplo, permite comparar alguns dos valores da varivel dependente com os valores preditos e os resduos:
> head(cbind(sen$log.votos, predict(modelo2), residuals(modelo2))) [,1] [,2] [,3] 1 12.25653 9.795291 2.4612419 2 9.93668 9.810183 0.1264975 3 13.20728 12.568722 0.6385578 4 13.74206 13.584275 0.1577814 5 11.65866 12.806240 -1.1475793 6 13.11666 11.973200 1.1434587

Com a funo plot() podemos produzir vrios grcos de diagnstico do modelo. Na Figura 7.2, utilizamos o parmetro grco mfrow para exibir quatro grcos numa nica gura.2
Ver Seo 8.4 para detalhes sobre o uso da funo par() e digite ?plot.lm para maiores informaes sobre os grcos.
2

7.3. PROCEDIMENTO STEP WISE


> par(mfrow = c(2, 2)) > plot(modelo2) > par(mfrow = c(1, 1))

67

Residuals vs Fitted
q q q q q q q qq q qq q q q q q q q q qq qq q q q qqqqq q q q qq q q q q q q q qqq qq qq q q q q q q qq q q qq q q q qq qq q qq qq qqqq q q q q q q q q qq q q qq q q q qq q q q q q q q q qq q qq q q qq q q q q q q q q q q qq q q q q q q q q q qq qqq q q q q q q qq q q q q q qq q qq q q q q q q qq q q q qq q q q q qq q q q q q q 105 q 22 24 q q q q

Normal QQ
Standardized residuals
q q qq qq q q q qq qq qq qq qqq qqq qqq qqq qq q qq q qq qq q q q q qq q q q q qq qq q q q qq qq q q q q q qq q q q q q q q q qq qq qq q qq q q q qq q q q q qq qq qq q q q q q q 159 q 105 qq q q 22 q

Residuals

4 2

10

12

14

Fitted values

Theoretical Quantiles

ScaleLocation
Standardized residuals
22 q 105 q q 159 q q qq q q q q qq q q q q q q q q qq q qq q q q q q q qqq q qq q q q q q q qq qq q qq q qq q q qq qq qq q q q q qq q q q q qq q q q qq q q qq q q q qqqqq q qqqq q q q q q q q qq qq q q q qq q q q q qq q q q q q q qq qq q q qq q q q q q q q qq q q q q qq q q q q q qq q q qq q q q qq q q q q q qq q q q q q q q q q q q q q q q q q q q q
q

Residuals vs Leverage
Standardized residuals
q q 92 q q 55 q q q q q qqq q q q q qq q qq q qqqq q qq q q qq q q q q q q q q q q qq q q qqqqq q q q q q q q q q qq q q q q q q qqq q q q q q q qqq qq q qqq q q q qqqqq q qq q q q q q qqqq q q qq q q q q q q q q q q qq qq q q q q q q qq q q qq qq q q q qq q q q qq q q q q qq q q qq q q q qq q q q q q q q qq q q q qq q q q q q q q q 159 q q

1.5

1.0

0.5

1 0

0.0

10

12

14

Cook's distance 0.05 0.10

0.00

0.15

Fitted values

Leverage

Figura 7.2: Grcos de diagnstico de um modelo de regresso

7.3

Procedimento step wise

Uma forma automtica de eliminar do modelo as variveis pouco signicativas por meio da funo step(), que repetidamente testa a incluso e retirada de variveis do modelo, mantendo somente aquelas com maior contribuio para a sua signicncia estatstica. O argumento trace = 0 inibe a impresso na tela dos passos de remoo e incluso de variveis. Compare o sumrio do ltimo modelo de regresso da seo anterior com o do modelo obtido com o uso da funo step():
> summary(step(modelo2, trace = 0)) Call: lm(formula = log.votos ~ log.vgasto + escolaridade + idade + sexo, data = sen) Residuals: Min 1Q -4.6280 -1.0404 Coefficients:

Median 0.1716

3Q 1.3601

Max 4.3287

68

CAPTULO 7. QUI-QUADRADO E REGRESSO

Estimate Std. Error t value Pr(>|t|) (Intercept) -3.08745 1.01517 -3.041 0.002676 ** log.vgasto 0.86001 0.07240 11.878 < 2e-16 *** escolaridadeAlta 1.03055 0.29627 3.478 0.000621 *** idade 0.03329 0.01184 2.811 0.005441 ** sexoMasculino -0.63553 0.34899 -1.821 0.070115 . --Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1 Residual standard error: 1.757 on 197 degrees of freedom Multiple R-squared: 0.5255, Adjusted R-squared: 0.5159 F-statistic: 54.55 on 4 and 197 DF, p-value: < 2.2e-16

7.4

Regresso logstica

Para realizar uma regresso logstica com varivel categrica que possua apenas duas categorias como dependente, usa-se a funo glm() com o argumento family = binomial(link = "logit"), como no exemplo abaixo:
> eleito <- (sen$resultado == "Eleito") > modelo3 <- glm(eleito ~ log.vgasto + idade, data = sen, + family = binomial(link = "logit")) > summary(modelo3) Call: glm(formula = eleito ~ log.vgasto + idade, family = binomial(link = "logit"), data = sen) Deviance Residuals: Min 1Q Median -1.55396 -0.55878 -0.27858 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -18.46727 4.02185 -4.592 4.4e-06 *** log.vgasto 0.98354 0.25983 3.785 0.000153 *** idade 0.04421 0.02067 2.138 0.032502 * --Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 158.89 Residual deviance: 123.32 AIC: 129.32 on 201 on 199 degrees of freedom degrees of freedom

3Q -0.08332

Max 2.51121

Number of Fisher Scoring iterations: 6

No possvel calcular a estatstica R2 para modelos de regresso logsticos, mas a funo LogRegR2() do pacote descr calcula algumas das estatsticas comumente utilizadas em substituio ao R2 :
> library(descr) > LogRegR2(modelo3) Qui2 35.57142 Gl 2 Sig. 1.886969e-08 ndice de Cox & Snell 0.1614626 ndice de Nagelkerke 0.2964782 R2 de McFadden 0.2238747

7.5. OUTROS TIPOS DE ANLISE DE DADOS

69

7.5

Outros tipos de anlise de dados

Existem diversas funes distribudas em vrios pacotes que permitem a realizao de muitos outros tipos de anlises, alm da anlise de regresso. A Tabela 7.1 mostra uma pequena lista funes apropriadas para a cada tipo de anlise (com o nome do pacote entre colchetes). Algumas das funes so do pacote stats a qual est entre os pacotes bsicos carregados por padro pelo R. A lista duplamente incompleta: existem muitos tipos de anlise no listados e para alguns tipos de anlise seria possvel listar outras funes de outros pacotes que tambm realizam o procedimento. Tabela 7.1: Tipos de anlise e funes correspondentes Anlise Trajetria Discriminante Fatorial Componentes principais Modelos hierrquicos Funo [Biblioteca] sem() [sem], path.analysis() [agricolae] lda() [MASS], mda() [mda] factanal() [stats] princomp() [stats] lmer() [lme4]

70

CAPTULO 7. QUI-QUADRADO E REGRESSO

Parte II Tpicos especiais

71

Captulo 8 Grcos
Neste captulo, veremos como modicar o comportamento padro do R ao criar grcos e como adicionar novos elementos a grcos j criados. Os grcos so criados por funes especcas, muitas das quais j foram vistas nos captulos anteriores. Aps a chamada funo principal, como plot(), boxplot() ou hist(), o dispositivo do grco continua aberto para receber novos elementos at que seja feita uma nova chamada a uma dessas funes ou que o dispositivo seja explicitamente fechado com a funo dev.off(). Os dois procedimentos bsicos para produzir grcos com caractersticas especiais so: (a) modicar parmetros globais seguidos pelo R na criao de grcos antes da criao do grco e (b) acrescentar novos elementos a grcos j criados. Formas especcas de implementar esses dois procedimentos gerais sero apresentadas nas prximas sees.

8.1

Ttulo, subttulo e rtulos

Os argumentos mais comuns para a incluso de ttulos e rtulos nos grcos j foram utilizados nos captulos anteriores. Algumas funes e alguns mtodos da funo plot() aceitam os argumentos diretamente. Em outros casos, precisamos a funo title() para adicionar os ttulos e rtulos aps grafar o contedo principal do grco. Os principais argumentos para controlar ttulos e rtulos so:

main: ttulo principal. sub: subttulo. xlab: rtulos do eixo x. ylab: rtulos do eixo y.

Os argumentos acima, com ou sem a funo title() foram utilizados nos captulos anteriores e no h necessidade apresentar novos exemplos (veja no ndice Remissivo as pginas em que ocorrem as palavras-chaves title, plot, boxplot, freq, crosstab, mosaicplot, etc.). 73

74

CAPTULO 8. GRFICOS

8.2

Cores

Existem vrias formas de fazer referncia a cores no R. At agora utilizamos nomes, como red, green, yellow. Para obter a lista completa dos nomes de cores conhecidos pelo R, digite colors(). Podemos tambm criar cores personalizadas usando a funo rgb() que recebe como argumentos as quantidades de vermelho (red), verde (green) e azul (blue) e, opcionalmente, o grau de opacidade (alpha). Os valores devem ser nmeros reais entre 0 e 1. Tambm possvel especicar vetores e, nesse caso, acrescentar um argumento com os nomes das cores resultantes. Exemplos:
> goiaba <- rgb(0.94, 0.41, 0.4) > goiaba.semitrans <- rgb(0.94, 0.41, 0.4, alpha = 0.5) > vitamina <- rgb(red = c(0.87, 0.7), green = c(0.83, 0.77), blue = c(0.71, + 0.3), names = c("leite", "abacate"))

Outra forma de especicar cores utilizando o cdigo HTML correspondente, ou seja, o smbolo # seguido dos valores vermelho, verde, azul e (opcionalmente) opacidade, em valores hexadecimais de 0 a FF. Podemos utilizar outros programas, como gimp ou kcolorchooser, para criar cores e obter seu cdigo HTML. No exemplo abaixo, criamos mais uma cor e reunimos todas as cores criadas at agora num nico vetor:
> uva <- "#AD4DA3" > salada <- c(vitamina, uva, goiaba, goiaba.semitrans)

Uma terceira forma de fazer referncia a uma cor pelo seu ndice na palheta de cores do R, cujos valores podem ser obtidos chamando-se a funo palette() sem nenhum argumento. Por padro, a palheta possui oito cores, mas podemos modic-la chamando a funo palette() com um novo vetor de cores. Para voltar palheta padro, passamos o argumento "default" para a funo:
> palette() [1] "black" "red" "green3" "blue" "cyan" [8] "gray" > palette(salada) > palette() [1] "#DED4B5" "#B3C44D" "#AD4DA3" "#F06966" > palette("default") > palette() [1] "black" "red" "green3" "blue" "cyan" [8] "gray"

"magenta" "yellow"

"#F0696680"

"magenta" "yellow"

Nas guras 11.1 e 11.2 (p. 96 e 97) modicamos as cores da palheta para colorir o grco com os levels de variveis categricas.

8.3

Adicionar pontos, linhas, polgonos, textos

Na maioria das vezes, o comportamento padro das funes grcas do R produz resultado satisfatrio, mas, em algumas circunstncias, podemos precisar adicionar mais elementos aos grcos, como textos, pontos ou desenhos. Nesta seo, a incluso desses elementos em grcos ser exemplicada pela produo do grco da Figura 8.1, cuja montagem ser explicada passo a passo.

8.3. ADICIONAR PONTOS, LINHAS, POLGONOS, TEXTOS

75

2.0

grande
1.5
pequeno

1.0

ad lin inc
q

0.5

esquerda 0.0
q
0 1 2 3 4 5 6 7 8 9

direita
q q
17 18 19
q

q
10 11 12

q
13 14 15

16

20

0.0

0.5

1.0

1.5

2.0

Figura 8.1: Ferramentas de desenho O primeiro passo ser criar um grco com bastante espao vazio, o que possibilitar a adio de elementos sem sobreposio. Vamos produzir um grco de disperso com apenas dois pontos, situados nas coordenadas (0, 0) e (2, 2). Aumentaremos o limite inferior do eixo y, que normalmente seria apenas um pouco alm dos limites de y. Com isso, teremos um espao vazio que utilizaremos para acrescentar pontos e texto:
> plot(c(0, 2), c(0, 2), ylim = c(-0.4, 2.05), xlab = "", ylab = "")

O R possui 21 caracteres diferentes numerados de 0 a 20 que podem ser usados para plotar pontos em grcos. A escolha do ponto feita pela escolha de um valor numrico para o argumento pch. Com o cdigo abaixo, acrescentamos os 21 pontos acompanhados de 21 rtulos, correspondentes aos nmeros dos pontos. Usamos as funes seq() e rep() para produzir, respectivamente, as coordenadas x e y dos pontos e dos textos. Os pontos, na verdade, so caracteres, e foram escalonados para carem 20% maiores do que o normal (cex = 1.2). Os rtulos, argumento labels da funo text(), por sua vez, foram reduzidos para 70% do tamanho normal.
> points(seq(0, 2, 0.1), rep(-0.18, 21), cex = 1.2, pch = 0:20) > text(seq(0, 2, 0.1), rep(-0.36, 21), cex = 0.7, labels = 0:20)

Normalmente, pontos e textos so posicionados no centro das coordenadas fornecidas, mas, com o argumento pos, podemos denir que o texto car abaixo, esquerda, acima ou direita das coordenadas (cujos valores correspondentes so, respectivamente, 1, 2, 3 e 4). Isso til se precisamos alinhar uma sequncia de rtulos. No cdigo abaixo, os textos esquerda e direita possuem as mesmas coordenadas, mas alinhamentos contrrios. O argumento offset dene quantos caracteres o texto car distante das suas coordenadas, no caso de pos ter sido utilizado.

76

CAPTULO 8. GRFICOS

> points(1.5, 0.2) > text(1.5, 0.2, labels = c("esquerda", "direita"), pos = c(2, 4), + offset = 1, col = c("red", "blue"))

Os textos normalmente so plotados na posio horizontal, mas podemos denir que eles quem inclinados com o argumento srt, cujo valor deve ser fornecido em graus:
> text(0.16, 0.6, labels = "inclinado", srt = 38)

Como j exemplicado, o argumento cex modica o tamanho da letra. Isso ca mais claro com os textos pequeno e grande adicionados ao grco:
> text(c(1.75, 1.25), c(1.25, 1.75), labels = c("pequeno", "grande"), + cex = c(0.7, 1.3))

Para adicionar linhas, usamos a funo lines(), que recebe como argumentos obrigatrios vetores com as coordenas x e y. Neste exemplo, usamos as linhas para produzir uma grade cinza:
> lines(c(0, 0, 2, 2, 0), c(0, 2, 2, 0, 0), col = "gray") > lines(c(1, 1), c(0, 2), col = "gray") > lines(c(0, 2), c(1, 1), col = "gray")

possvel, ainda, com a funo abline(), adicionar linhas que correspondem a uma funo de 1 grau. Os dois argumentos obrigatrios so a coordenada x em que ocorre a interseo e a inclinao da linha, expressa como a razo entre y e x para cada seguimento da linha:1
> abline(0, 0.5, col = "brown") > abline(0, 1, col = uva) > abline(0, 2, col = "red")

Podemos, por m, desenhar polgonos. No exemplo abaixo, so desenhados dois retngulos e um tringulo. Note que um dos retngulos tem cor semitransparente:
> polygon(c(0.3, 0.8, 0.5), c(1.7, 2, 1.2), col = goiaba) > rect(0, 1.5, 0.5, 2, col = vitamina["abacate"]) > rect(0.2, 1, 1, 1.7, col = goiaba.semitrans)

8.4

Parmetros globais

Os grcos do R obedecem a certos parmetros globais que podem ser modicados por meio da funo par(). A alterao do valor de qualquer um desses parmetros afetar todos os grcos produzidos at que o parmetro seja modicado por nova chamada par() ou que o dispositivo grco seja fechado com dev.off(). A ajuda da funo lista e explica todos os parmetros mas, a seguir, apresento os mais comumente utilizados: bg: cor de fundo do grco. cex: valor para redimensionamento das fontes (padro = 1.0).
Veja a ajuda da funo para formas alternativas de especicar a linha a ser plotada. Um uso comum da funo abline() a adio da linha de regresso a um grco de disperso entre duas variveis numricas.
1

8.4. PARMETROS GLOBAIS cex.axis: valor para redimensionamento das fontes dos eixos. cex.lab: valor para redimensionamento das fontes dos rtulos dos eixos. cex.main: valor para redimensionamento das fontes do ttulo principal. cex.sub: valor para redimensionamento das fontes do subttulo. col: vetor das cores a serem utilizadas nos grcos. col.axis: cor das anotaes nos eixos. col.lab: cor dos rtulos dos eixos. col.main: cor do ttulo principal. col.sub: cor do subttulo. fg: cor de frente do grco.

77

las: orientao dos rtulos dos eixo x e y (0 = sempre paralelo aos eixos, 1 = sempre horizontais, 2 = sempre perpendiculares aos eixos, 3 = sempre verticais). mai: vetor de nmeros especicando as marges do grco em polegadas (baixo, esquerda, topo, direita). mar: vetor de nmeros especicando as marges do grco em linhas (baixo, esquerda, topo, direita). mfcol, mfrow: vetor na forma c(nlinhas, ncolunas) especicando quantos grcos sero desenhados por dispositivo. new: dene se o prximo grco deve considerar que est sendo produzido num dispositivo novo e, portanto, no precisa limpar o dispositivo antes de ser desenhado (padro = FALSE); se o valor for TRUE, o grco anterior no ser apagado. pch: tipo de ponto a ser desenhado, especicado por um nmero inteiro ou por um caractere. srt: rotao de textos em graus. Para consultar o valor de um parmetro, chamamos a funo par() usando o nome do parmetro como argumento:
> par("mar") [1] 5.1 4.1 4.1 2.1

Para modicar um parmetro, digitamos um comando na forma: par(nome.do.parmetro = valor), mas antes de modicar parmetros grcos, convm salvar os valores atuais para facilitar a sua restaurao aps a produo do grco que precisa de parmetros especiais. Para isso, chamamos par() com o argumento no.readonly = TRUE:
> antigopar <- par(no.readonly = TRUE) > par(mar = c(5.1, 4.1, 4.1, 2.1))

78

CAPTULO 8. GRFICOS

Algumas funes repassam para par() parmetros grcos passados para elas como argumentos, mas outras no. Assim, em alguns casos, no necessrio modicar os parmetros globalmente apenas para alterar o resultado de um grco, mas em outros isso necessrio. Alm disso, nem todos os parmetros podem ser modicados dessa forma; alguns somente podem ser alterados pela funo par(). Para sabermos se uma funo ou no capaz de alterar temporariamente os parmetros globais da produo de grcos, temos duas alternativas: ler a documentao de par() e da funo que produz o grco ou usar o mtodo da tentativa e erro. A seguir, um exemplo de grco produzido aps manipulao dos parmetros. A necessidade de manipular os parmetros decorrente do fato de algumas das categorias da varivel religio, da PESB, terem rtulos demasiadamente longos. Antes de fazer os grcos, vamos carregar o banco de dados e criar uma cpia da varivel que nos interessa:
> load("pesb2002.RData") > relig <- pesb$q511

Agora, vamos fazer o grco de duas formas diferentes. Na primeira, mais simples, vamos apenas fazer um grco de barras horizontais. Os ajustes necessrios nos parmetros sero a largura da margem esquerda e o tamanho da fonte utilizada nas anotaes do eixo y. O resultado est na Figura 8.2.
> par(mar = c(3.5, 13, 4.1, 0.1), cex.axis = 0.7) > plot(relig, main = "Religio", las = 1, horiz = T)

Religio
Ateu No tem religio Santo Daime, Esotrica, Outras Budista Judaica Catlica SeishoNI, Messinica Esprita kardecista Umbanda Candombl Evanglica nopentecostal Evanglica pentecostal Mormon, Adventista, Testemunha de Jeov

500

1000

1500

Figura 8.2: Grco de barras de varivel com rtulos longos O objetivo na segunda verso do grco manter as barras verticais. A soluo mais simples seria aumentar a margem inferior e, analogamente ao que zemos no grco anterior, posicionar perpendicularmente ao eixo as anotaes com os rtulos das categorias da varivel. Mas, para facilitar a leitura dos rtulos, resolvemos posicion-los diagonalmente, como na Figura 8.3. Para obter o resultado esperado, alm de redimensionar as margens, produzimos o

8.4. PARMETROS GLOBAIS

79

grco sem os nomes das barras (names = F). Depois, usamos a funo text() para acrescentar as anotaes do eixo x com a fonte reduzida (cex = 0.7), e com vrios outros argumentos para obter o efeito desejado. Uma dos problemas que precisamos resolver foi o posicionamento de cada rtulo. O valor retornado pela funo plot(), nesse caso, o vetor com o posicionamento no eixo x da extremidade esquerda das barras. Assim, utilizamos o resultado da funo para posicionar os rtulos da barra (somando 0,5 para compensar a largura das barras). Todos os rtulos tm a mesma coordenada no eixo y, -100 (lembre-se que o R recicla um vetor quantas vezes for necessrio; nesse caso, o valor -100 ser repetido 13 vezes). Normalmente, a funo text() utilizada apenas para acrescentar texto na regio interna dos grcos e qualquer texto que exceda essa regio truncado. Para que isso no ocorra, usamos o argumento xpd = TRUE. Tambm usamos os argumentos pos, para alinhar todos os rtulos direita, e srt, para inclinar os rtulos.
> > > > par(mar = c(9, 7, 5.1, 2.1), cex.axis = 0.7) rotulos <- levels(relig) bx <- plot(relig, main = "Religio", names = FALSE) + 0.5 text(bx, -100, labels = rotulos, pos = 2, cex = 0.7, srt = 45, xpd = T)

Religio

te m u Ev an nha Ev g de an lic Je g a ov lic pe a nt n ec o os pe ta l nt ec os C ta an l do m bl Es U Se m p is ba rit ho nd a N ka a rd ec I ,M is ta es si n ic a C at Sa l nt ic a o D Ju ai da m ic e, a Es Bu ot di r st ic a a, N O o ut ra te m s re lig i o

500

1000

1500

or

m on

,A

dv en

tis

ta

Concluda a produo do grco, devemos recongurar os parmetros para os valores iniciais:


> par(antigopar)

,T es

Figura 8.3: Grco de barras de varivel com rtulos longos (II)

At

eu

80

CAPTULO 8. GRFICOS

8.5

Legendas

Para acrescentar uma legenda a um grco, utilizamos a funo legend(). A Figura 8.4 ilustra como colocar legendas num grco, controlando os parmetros: posicionamento da legenda (por meio de palavra-chave ou pelas coordenadas x e y), cor das linhas ou dos smbolos, (col), tipo de linha (lty), tipo de smbolo (pch), cor de preenchimento dos quadrados (ll), largura das linhas (lwd), presena de ttulo (title), cor do ttulo (title.col), presena de limite da legenda (bty), cor de fundo da legenda (bg) e diviso da legenda em colunas (ncol).
> > > > + > > + > > + > + par(mar = c(2.1, 2.1, 1.1, 4.1)) plot(0, xlab = "", ylab = "") legend("bottom", legend = c("a", "b", "c", "d"), fill = 1:4, ncol = 2) legend("bottomleft", legend = c("linha 1", "linha 2"), col = c(2, 4), lty = 1, pch = c(1, 4), bg = "yellow") legend("bottomright", legend = c("e", "f"), lwd = c(1, 4), lty = 1) legend("top", legend = c("g", "h", "i"), title = "ttulo", horiz = T, title.col = "blue", fill = c("cyan", "lightgreen", "yellow")) legend("topleft", legend = c("j", "k", "l", "m", "o", "p"), lty = 1:6) legend("topright", legend = c("q", "r", "s", "t", "u", "v"), col = 1:6, pch = 1:6, bty= "n") legend(1.45, 1.05, legend = c("x", "y", "z"), fill = 2:5, bty = "n", xpd = T)

1.0

j k l m o p

ttulo g h i

q r s t u v

x y z

0.0

0.5

0.5

1.0

linha 1 linha 2 0.8

a b 1.0

c d 1.2

e f 1.4

0.6

Figura 8.4: Exemplos de legendas

Captulo 9 Produo de relatrios


9.1 Resultado em texto plano

A forma mais simples de relatrio consiste no script utilizado para realizar as anlises acompanhado dos resultados. No Linux, um documento desse tipo pode ser obtido executando-se o seguinte comando num terminal: R CMD BATCH script.R onde script.R o script contendo os comandos necessrios para a anlise. O comando criar o arquivo script.Rout, contendo uma cpia dos comandos executados precedidos por > e seguidos pelos resultados tal como teriam sido impressos na tela numa seo interativa do R. Os grcos que seriam exibidos numa seo interativa so salvos no arquivo Rplots.pdf. Em qualquer sistema operacional, possvel salvar o resultados dos comandos num arquivo usando a funo sink(). Os resultados no sero acompanhados dos comandos, mas pode-se acrescentar comentrios usando a funo cat(), como no exemplo a seguir:
> > > > > load("senado2006.RData") sink("~/analise2006.txt") cat("Tabela cruzada: Sexo dos candidatos X Resultado da eleio\n") table(sen$sexo, sen$resultado) sink()

Aps o comando sink("~/analise2006.txt"), os resultados, ao invs de impressos na tela, sero redirecionados para o arquivo analise2006.txt, que ser criado na pasta ~/.1 O redirecionamento dos resultados nalizado com a execuo da funo sink() sem nenhum argumento. No exemplo acima, o contedo do arquivo seria:
Tabela cruzada: Sexo dos candidatos X Resultado da eleio resultado sexo Eleito No eleito Feminino 4 26 Masculino 23 149

Observe que o ttulo que demos tabela no inclui os caracteres \n. Isso ocorre porque o smbolo \ em strings torna especial o signicado de alguns caracteres. No caso, n passa
1

O signicado de / foi explicado na seo 2.4, tabelas 2.1 e 2.2

81

82

CAPTULO 9. PRODUO DE RELATRIOS

a signicar nova linha. Sem a incluso de \n, a primeira linha do resultado do comando table(sexo, resultado) teria sido impressa ao lado do ttulo da tabela. Um relatrio em texto plano, criado por R CMD BATCH ou pela funo sink() satisfatrio apenas como um relatrio preliminar para o prprio pesquisador. Para apresentar os resultados da pesquisa numa publicao, impressa ou eletrnica, preciso utilizar outros recursos, explorados nas sees seguintes.

9.2

Mapa de bits versus grco vetorial

Para apresentar os resultados numa publicao, basicamente, necessrio inserir guras e tabelas no texto. Nesta seo, veremos como inserir guras em documentos de processadores de texto. Existem dois tipos bsicos de guras: mapas de bits e grcos vetoriais escalonveis. Um mapa de bits um espao retangular dividido em clulas; cada clula pode ter uma cor e grau de transparncia especcos. Normalmente, as clulas tm tamanhos sucientemente pequenos para serem invisveis isoladamente a olho nu, mas quando sofrem ampliao, se tornam visveis e a gura ca com um aspecto grosseiro, como ilustrado pela Figura 9.1.

Figura 9.1: Exemplo de Bitmap em tamanho natural e ampliado

Figuras na forma de mapas de bits ocupam muito espao em disco e, por isso, costumam ser comprimidas por meio de diferentes algoritmos. Alguns desses algoritmos causam perda de informao; outros no. Geralmente, a melhor alternativa o uso de grcos vetoriais, que contm informaes sobre as coordenadas nas quais devem ser traados linhas, pontos, bem como a espessura das linhas e dos pontos, e informaes sobre em quais coordenadas escrever textos e com qual fonte. Cabe ao programa que visualiza o grco desenh-lo. Por ser redesenhada a cada ampliao ou reduo, a gura se mantm sempre com qualidade em qualquer nvel de zoom e com qualquer resoluo de impresso. A nica desvantagem de um grco vetorial quando a gura inclui milhares de pontos, linhas ou textos superpostos. Embora os pontos, linhas e textos das camadas inferiores no estejam visveis no resultado nal, a informao sobre eles estar presente no arquivo, podendo torn-lo, em alguns casos, absurdamente grande e lento de desenhar. Nesses casos, prefervel usar um grco no formato bitmap. Segue uma lista dos formatos mais comumente utilizados dentre os que o R pode produzir: png: Formato bitmap com compresso mas sem perda de qualidade com a compresso. o formato mais adequado quando, por algum motivo, no possvel usar um formato vetorial.

9.3. INSERO DE GRFICOS EM RELATRIOS

83

jpg: Formato bitmap com compresso e com perda de qualidade devido compresso. o formato ideal para imagens complexas, como fotos. Geralmente inadequado para grcos estatsticos. eps: Formato vetorial. O OpenOfce e o Word conseguem incluir imagens nesse formato. Embora seja produzido um bitmap de baixa qualidade para a pr visualizao no prprio processador de texto, o arquivo original utilizado na impresso, o que garante qualidade satisfatria.
A pdf: Formato vetorial. Pode ser inserido em documentos produzidos com LTEX.

svg: Formato vetorial. Pode ser manualmente editado com o programa inkscape e, em seguida, convertido para eps.

9.3

Insero de grcos em relatrios

Para inserir grcos com qualidade satisfatria no OpenOfce Writer ou no Microsoft Word, existem muitas opes. Uma delas salvar o grco no formato postscript. O primeiro argumento o nome do arquivo que conter a gura, a largura (width) e a altura (height) do grco so expressas em polegadas e, para que a gura seja corretamente reconhecida pelo processador de texto, obrigatrio o uso dos argumentos horizontal = TRUE, onele = FALSE e paper = special. O grco somente efetivamente gravado em disco aps o comando dev.off() (resultados omitidos):
> > + > > library(descr) postscript("civilXres.eps", height = 4, width = 6, horizontal = FALSE, onefile = FALSE, paper = "special") crosstab(sen$resultado, sen$est.civil, las = 1) dev.off()

Outra opo salvar o grco no formato png, escolhendo uma resoluo alta (no nosso exemplo, res = 600), o que garantir boa qualidade de impresso. Normalmente, a altura e a largura de guras png so expressas em pixels, mas podemos express-las em centmetros se usarmos o argumento units = cm (neste caso, o uso de res obrigatrio). No exemplo abaixo, o R calcular o tamanho em pixels da gura que, impressa nas dimenses 10x15 cm ter 600 pontos por polegada (resultados omitidos):
> png("civilXres.png", height = 10, width = 15, units = "cm", res = 600) > crosstab(sen$resultado, sen$est.civil, las = 1) > dev.off()

Para inserir a gura num documento de texto do OpenOfce Writer, deve-se clicar no menu Inserir / Figura / De um arquivo.... A informao sobre a resoluo da gura (pontos por polegada) armazenada no arquivo png e, no momento da insero, o Writer reconhecer o tamanho correto, no sendo necessrio fazer manualmente qualquer redimensionamento. Se a gura se destinar a uma pgina de internet, no deveremos usar os argumentos units e res, e deveremos informar o tamanho desejado da gura diretamente em pixels (resultados omitidos):
> png("civilXres2.png", height = 500, width = 700) > crosstab(sen$resultado, sen$est.civil, las = 1) > dev.off()

84

CAPTULO 9. PRODUO DE RELATRIOS

9.4

Incluso de tabelas em relatrios

Para incluir no OpenOfce Writer uma tabela ou objeto que possa ser convertido em tabela, podemos usar a funo toHTML() do pacote ASAtable para converter a tabela num documento html.2 Depois, basta copiar a tabela do navegador de internet que ser aberto automaticamente e colar no Writer. Segue um exemplo:
> tab <- crosstab(resultado, est.civil, plot = F) > library(ASAtable) > toHTML(tab$t, file = "tab.html", append = F, lang = "pt", + caption = "Digitar aqui o TTULO da tabela", + note = "Fonte dos dados. Outras notas. Notas especficas")

Ainda ser necessrio personalizar a formatao da tabela.

9.5

odfWeave

Uma forma alternativa de produzir relatrio com o OpenOfce consiste em inserir cdigo do R no documento e, depois, processar o arquivo de modo a ter os resultados do cdigo, guras e tabelas, inseridos automaticamente no documento nal. Para tanto, preciso que o cdigo do R esteja precedido por uma linha no formato <<apelidodocodigo,opes>>= e seguido por uma linha contendo o smbolo @, como no exemplo abaixo: <<exemplo>>= x <- 1:10 x @ No documento processado, o trecho acima desapareceria e em seu lugar teramos:
> x <- 1:10 > x [1] 1 2 3

9 10

Na lista abaixo esto as principais opes para processamento do cdigo, com os valores aceitos entre parntesis e o valor padro em negrito: echo: Dene se os comandos devem ser impressos ou no (TRUE, FALSE). results: Dene o que fazer com ou qual o tipo de resultados produzidos (verbatim, hide, xml). Com a opo hide, nenhum resultado includo no documento nal e com a opo xml a funo odfWeave() inclui resultado diretamente no cdigo fonte do documento do Writer. Usamos a opo xml quando queremos incluir uma tabela ou inserir uma gura produzida em bloco de cdigo anterior. eval: Dene se o cdigo deve ser processado (TRUE, FALSE).
O pacote ASAtable est disponvel em http://r-forge.r-project.org/R/?group_id=328 e pode ser instalado com o comando: install.packages("ASAtable", repos="http://R-Forge.R-project.org")
2

9.5. ODFWEAVE

85

fig: Informa funo odfWeave() se est sendo produzida uma gura a ser automaticamente inserida no documento (TRUE, FALSE). width: Largura desejada para a gura (em polegadas). height: Altura desejada para a gura (em polegadas). O cdigo abaixo inclui as opes echo = FALSE e results = hide, consequentemente, no incluir nada no documento nal. Entretanto o valor de x ser computado e poder ser usado nos trechos seguintes do documento: <<exemplo, echo=FALSE, results=hide>>= mx <- mean(x) @ Em qualquer lugar do texto, podemos acrescentar o cdigo \Sexpr{x}, onde x algum cdigo vlido do R que resulte na impresso de algum texto. O arquivo exemploWeave.odt contm exemplos de insero de gura, de tabela e de uso de \Sexpr{}. Para produzir o documento nal, a partir do R, executamos os comandos:
> library(odfWeave) > odfWeave("exemploWeave.odt", "resultadoWeave.odt")
3

Leia atentamente o arquivo exemploWeave.odt compare com o arquivo resultadoWeave.odt produzido pelo R e experimente fazer algumas alteraes para se acostumar com os comandos. Outras formas de usar e congurar a funo odfWeave() encontram-se na documentao do pacote e nos arquivos de exemplo que o acompanham.4

No Windows, poder ser necessrio instalar os programas zip e unzip. Para tanto, uma opo baixar os programas Zip e Unzip de http://gnuwin32.sourceforge.net/packages.html, instalar ou descompactar os programas e, por m, copiar os arquivos zip.exe, unzip.exe e bzip2.dll para a pasta C:\Windows\System32 ou usar a funo odfWeaveControl(). 4 Existe incompatibilidade entre as funes dos pacotes R2HTML e odfWeave, no sendo ter os dois carregados na memria simultaneamente.

86

CAPTULO 9. PRODUO DE RELATRIOS

Parte III Tpicos especiais

87

Captulo 10 Programao
10.1 Funes

Um princpio que deve sempre ser seguido quando se escreve um script ou cdigo de algum programa o de se evitar repeties de cdigo. Sempre que houver a necessidade de se repetir o mesmo cdigo em diferentes partes de um script, recomendvel a criao de uma funo que execute a tarefa desejada. Assim, se for encontrado algum erro no cdigo, ser suciente fazer a correo num nico lugar. O cdigo do exemplo abaixo cria a funo hipotenusa() que recebe como argumentos dois objetos, a e b (que devero corresponder ao comprimento dos catetos de um tringulo retngulo), e retorna um terceiro valor, h, a hipotenusa calculada:
> hipotenusa <- function(a, b) { + h <- sqrt(a^2 + b^2) + h + } > hipotenusa(4, 3) [1] 5 > hipotenusa(c(4, 5, 6), c(3, 4, 5)) [1] 5.000000 6.403124 7.810250

Para criar uma funo, usamos o smbolo de atribuio <-, como na criao de qualquer objeto. Em seguida a expresso function(){}. Entre os parntesis devem ser indicados os argumentos que a funo receber e, entre as chaves, dever estar o cdigo a ser executado pela funo. Se a ltima linha da funo contiver um objeto, como no exemplo acima, ele ser retornado para a rea de trabalho do R.

10.2

Blocos entre chaves

Na funo que nos serviu de exemplo na seo anterior, o cdigo da funo est entre chaves. As chaves delimitam as linhas de cdigo que o R dever interpretar como parte da funo e so desnecessrias se o cdigo a ser executado contiver apenas uma linha. Por exemplo, o cdigo acima poderia ser reescrito como:
> hipotenusa <- function(a, b) sqrt(a^2 + b^2) > hipotenusa(4, 3) [1] 5

89

90

CAPTULO 10. PROGRAMAO

A delimitao de trechos de cdigo entre chaves utilizadas em diversas circunstncias, como na execuo condicional de parte do cdigo e na execuo de loops, como veremos nas sees seguintes. Embora o uso de chaves seja obrigatrio apenas quando o trecho do cdigo a ser executado contiver mais de uma linha, s vezes, tambm pode ser til acrescentar chaves para tornar a leitura do cdigo mais clara.

10.3

Execuo condicional de cdigo

Para executar parte do cdigo somente se determinada condio for verdadeira, utilizamos o comando if(), incluindo a condio a ser testada entre os parntesis. Se houve algum cdigo alternativo a ser executado no caso da condio ser falsa, podemos informar isso para o R com o comando else. Para se familiarizar com o comando if(), execute o cdigo abaixo com diferentes valores para os objetos a e b:
> a <- 1 > b <- 2 > if (a > b) { + cat("'a' maior do que 'b'\n") + } else { + if (b > a) + cat("'b' maior do que 'a'\n") + else cat("'a' e 'b' tm o mesmo valor\n") + } 'b' maior do que 'a'

10.4

Famlia de funes apply

As funes da famlia apply podem ser usadas para evitar o uso dos loops que sero vistos na seo seguinte. No R, a execuo de loops extremamente lenta e, geralmente, a realizao da mesma tarefa com as funes da famlia apply dezenas de vezes mais rpida. A funo apply() aplica uma funo a todas as linhas ou a todas as colunas de uma matrix ou data.frame. O primeiro argumento a ser passado para a funo apply() deve ser uma matrix ou um data.frame; o terceiro argumento dever ser a funo a ser aplicada; o segundo argumento deve ser o nmero 1 ou o nmero 2, indicando se a funo do terceiro argumento dever ser aplicada, respectivamente, s linhas ou s colunas da matrix ou data.frame. O valor retornado por apply() um vetor com os resultados da aplicao da funo fornecida como terceiro argumento. No exemplo seguinte, criamos um data.frame com dois vetores de nmeros e usamos a funo apply() para calcular a soma dos valores das linhas e, em seguida, a soma dos valores das colunas:
> x <- c(1, 2, 3, 4, 2, 1, 3, 2, 1) > y <- c(4, 5, 3, 6, 3, 5, 4, 4, 3) > b <- data.frame(x, y) > apply(b, 1, sum) [1] 5 7 6 10 5 6 7 6 4 > apply(b, 2, sum) x y 19 37

10.4. FAMLIA DE FUNES APPLY

91

As funes lapply() e sapply() aplicam uma funo a uma lista de objetos. A diferena entre elas que a primeira retorna uma nova lista e a segunda um vetor ou matriz. No cdigo abaixo, criamos uma lista de dois vetores e, em seguida, calculamos o valor mdio dos valores dos dois vetores:
> lista <- list(a = c(3, 5, 1), b = c(8, 8, 2, 7)) > lapply(lista, mean) $a [1] 3 $b [1] 6.25 > sapply(lista, mean) a b 3.00 6.25

A funo a ser aplicada por qualquer uma das funes da famlia apply no precisa existir previamente, podendo at mesmo ser criada dentro da prpria chamada a uma das funes apply. No exemplo seguinte, chamamos a funo lapply() com uma funo simples que adiciona o valor 1 ao objeto recebido como argumento:
> lapply(lista, function(x) { + x + 1 + }) $a [1] 4 6 2 $b [1] 9 9 3 8

A funo tapply() uma das mais importantes para cientistas sociais. Ela agrega os valores de um vetor numrico segundo os valores de alguma varivel categrica e, ento, aplica a funo a cada trecho do vetor numrico. A funo recebe como argumentos obrigatrios, a varivel numrica, a varivel categrica e a funo a ser aplicada. No exemplo a seguir, calculamos a estatura mdia de algumas pessoas segundo o sexo:
> sexo <- c("M", "F", "F", "M", "F", "M") > estatura <- c(1.7, 1.68, 1.73, 1.83, 1.6, 1.76) > tapply(estatura, sexo, mean) F M 1.670000 1.763333

Os exemplos apresentados at aqui contm apenas as formas mais simples de usar as funes da famlia apply. Para todas elas, possvel fornecer argumentos adicionais a serem passados funo a ser aplicada. Por exemplo, no cdigo a seguir, a primeira tentativa de calcular a mdia falha para as mulheres porque existe um NA entre os valores de estatura; na segunda tentativa, passamos o argumento na.rm = T para a funo mean() e o clculo realizado corretamente:
> sexo <- c("M", "F", "F", "M", "F", "M") > estatura <- c(1.7, NA, 1.73, 1.83, 1.6, 1.76) > tapply(estatura, sexo, mean) F M NA 1.763333 > tapply(estatura, sexo, mean, na.rm = T)

92
F M 1.665000 1.763333

CAPTULO 10. PROGRAMAO

No prximo exemplo com a funo tapply(), ao invs de passar como argumento uma varivel categrica, passamos um data.frame com duas variveis categricas que devero ser utilizadas para agregar os valores numricos antes de aplicar a funo mean(). O resultado uma matriz de valores mdios de votao segundo o sexo e a escolaridade:
> load("senado2006.RData") > tapply(sen$votos, sen[, c("escola", "sexo")], mean) sexo escola Feminino Masculino L e Escreve NA 1416.00 Ensino Fundamental incompleto 834785.00 26924.50 Ensino Fundamental completo NA 44556.86 Ensino Mdio incompleto 7050.00 600.50 Ensino Mdio completo 55508.75 159130.41 Ensino Superior incompleto 27827.50 465331.07 Ensino Superior completo 446720.23 529390.21

Algumas clulas da tabela esto preenchidas com NA porque no havia nenhum candidato ao senado com a correspondente combinao de caractersticas. A funo aggregate(), embora no tenha apply em seu nome, pertence mesma famlia das demais funes vistas nesta seo. Ela semelhante tapply(), aplicando uma funo a subconjuntos de um banco de dados e retornando uma tabela com os resultados. A funo aggregate() recebe como argumentos obrigatrios uma list de variveis numricas, uma list de variveis categricas e a funo a ser aplicada (lembre-se que um data.frame uma list). Os subconjuntos so criados segundo as categorias das variveis categoricas fornecidas como argumentos para a funo. Exemplo:
> aggregate(sen[, c("vgasto", "votos", "p.valido")], + sen[, c("escola", "sexo")], mean) escola sexo vgasto votos 1 Ensino Fundamental incompleto Feminino 1410000 834785.00 2 Ensino Mdio incompleto Feminino 2000000 7050.00 3 Ensino Mdio completo Feminino 941250 55508.75 4 Ensino Superior incompleto Feminino 125000 27827.50 5 Ensino Superior completo Feminino 2254091 446720.23 6 L e Escreve Masculino 30000 1416.00 7 Ensino Fundamental incompleto Masculino 1002500 26924.50 8 Ensino Fundamental completo Masculino 1083571 44556.86 9 Ensino Mdio incompleto Masculino 700000 600.50 10 Ensino Mdio completo Masculino 1884828 159130.41 11 Ensino Superior incompleto Masculino 1668214 465331.07 12 Ensino Superior completo Masculino 2318761 529390.21

p.valido 28.187000 0.038000 1.091750 0.758500 18.760545 0.025000 0.937500 2.162429 0.202000 9.484483 15.117071 14.948923

10.5

Loops for e while

Os loops for e while permitem executar repetidamente uma sequncia de comandos. Como sempre, o uso de chaves obrigatrio apenas se o cdigo a ser executador contiver mais de uma linha. O loop while tem syntax semelhante da condio if, ou seja, escrevemos entre os partesis a condio a ser testada e o cdigo ser executado enquanto o teste resultar verdadeiro. O cdigo seguinte exemplica o uso do loop while:

10.6. MANIPULAO DE TEXTO


> i <- 1 > fim <- 4 > while (i < fim) { + i <- i + 1 + if (i < fim) + cat("circulando\n") + else cat("Esta a ltima volta\n") + } circulando circulando Esta a ltima volta

93

O loop for tem uma sintax um pouco mais complexa porque o cdigo entre parntesis no apenas testa a condio: ele cria o objeto a ser testado. No exemplo a seguir, o objeto i criado e seu valor incrementado de acordo com os valores do vetor 1:10. Ou seja, o loop executado 10 vezes e cada novo valor de i somado a j:
> j <- 0 > for (i in 1:10) j <- j + i > j [1] 55

O vetor que especica os valores a serem assumidos pelo objeto criado entre parntesis no loop for no precisa, necessariamente, ser numrico. No exemplo seguinte, ele um vetor do tipo character:
> palavras <- c("", "difcil", "encontrar", "uma", "agulha", + "num", "palheiro") > for (i in palavras) if (i == "agulha") cat("Achei!\n") Achei!

Por se mais compacto, o loop for deve ser usado quando sabemos com antecedncia o nmero de vezes que o cdigo dever ser executado. Se essa informao no for conhecida, ser necessrio o uso do loop while. ainda possvel usar os comandos next e break no interior de loops para interromper a sua execuo e, respectivamente, reiniciar o loop ou sair dele.

10.6

Manipulao de texto

Uma tarefa frequentemente importante na manipulao de dados e que ainda no foi abordada neste livro a localizao e edio de texto. Para localizar um texto ou um nmero especcos, podemos usar a funo grep(), a qual retorna o(s) ndices(s) de um vetor em que um determinado texto pode ser encontrado. A funo recebe como argumentos o padro procurado e um vetor com textos ou nmeros, como no exemplo a seguir:
> grep("agulha", palavras) [1] 5

Para fazer substituies em textos, podemos usar a funo sub() se o objetivo for substituir apenas a primeira ocorrncia do padro procurado e gsub() se quisermos substituir todas as ocorrncias. Ambas as funes recebem como argumentos o padro procurado, o texto substituto e o vetor a ser modicado:

94
> x <- c("a a a", "ab ab ab", "abc abc abc") > sub("a", "z", x) [1] "z a a" "zb ab ab" "zbc abc abc" > gsub("a", "z", x) [1] "z z z" "zb zb zb" "zbc zbc zbc"

CAPTULO 10. PROGRAMAO

Neste captulo, vimos apenas os elementos bsicos de programao em R, acompanhados de exemplos simples. Para explicaes mais detalhadas sobre como programar em R, e para exemplos mais sosticados, recomendo a leitura de Torgo (2006, cap. 3).

Captulo 11 Mapas
Neste captulo, veremos como usar o R para criar usando arquivos no formato Arcview, facilmente encontrveis na internet.1 Para carregar um mapa no R preciso obter os arquivos com extenso shp, shx e dbf, devendo-se passar o nome do arquivo shp como argumento para a funo readShapePoly(), do pacote maptools.. A funo cria um objeto contendo os polgonos cujos permetros correspondem s unidades geogrcas do mapa. As coordenadas x e y dos polgonos tem os mesmos valores, respectivamente, da longitude e da latitude dos pontos do mapa. O objeto criado pela funo readShapePoly() tambm inclui um data.frame com informaes adicionais e o mapa pode ser desenhado com a funo plot(). No exemplo abaixo, criamos o objeto br contendo o mapa do Brasil:
> library(maptools) > br <- readShapePoly("mapa_BR/BRASIL.shp") > summary(br) Object of class SpatialPolygonsDataFrame Coordinates: min max x -73.83943 -34.85810 y -33.77086 5.38289 Is projected: NA proj4string : [NA] Data attributes: UF ESTADO REGIAO AC : 1 Acre : 1 CO:4 AL : 1 Alagoas : 1 NE:9 AM : 1 Amap\xa0: 1 NO:7 AP : 1 Amazonas: 1 SE:4 BA : 1 Bahia : 1 SU:3 CE : 1 Cear\xa0: 1 (Other):21 (Other) :21

O objeto br, criado com os comandos acima, uma lista de polgonos e cada linha do data.frame contm informaes sobre um dos polgonos da lista. Como podemos observar pelo resultado de summary(), o data.frame deste mapa contm trs variveis, UF, ESTADO e REGIAO. No utilizaremos a varivel ESTADO do data.frame, mas o leitor interessando pode corrigir a codicao de caracteres dessa varivel com a funo toUTF8(), do pacote descr:
Ver, por exemplo, ftp://geoftp.ibge.gov.br/mapas/malhas_digitais. O mapa do Brasil utilizado neste captulo foi obtido do site http://www.gismaps.com.br/divpol/divpol.htm em 05 de setembro de 2009.
1

95

96
> library(descr) > br$ESTADO <- toUTF8(br$ESTADO, "IBM850")

CAPTULO 11. MAPAS

O procedimento para produo de mapas consiste no colorimento dos polgonos de acordo com algum critrio. No exemplo da Figura 11.1, utilizamos a varivel REGIAO do prprio mapa para colori-lo:2
> palette(c("#ccddff", "#ffddcc", "#ccffcc", "#ffffcc", "#ccffff")) > plot(br, col = br$REGIAO) > title("Mapa poltico do Brasil")

Mapa poltico do Brasil

Figura 11.1: Exemplo de mapa Objetos desse tipo no aceitam o parmetro main quando produzindo um grco. Por isso, tivemos que usar title() para adicionar o ttulo principal. O prximo mapa ser colorido de acordo com o IDH estadual calculado pelo PNUD para o ano de 2005 (CEPAL; PNUD; OIT, 2008) (coluna ano05). O primeiro passo para produzir o grco ser carregar um banco de dados com o IDH estadual:
> idh <- read.table("IDH_Brasil.csv", sep = "\t", header = T) > idh <- subset(idh, T, select = c("UF", "ano05")) > names(idh) <- c("UF", "idh05")

Em seguida, usaremos a funo attr() para extrair do objeto br o banco de dados com informaes sobre os polgonos do mapa. Antes de acrescentarmos ao banco de dados os valores do IDH, iremos criar um ndice cujos valores iro de 1 ao nmero de unidades da federao, correspondendo, portanto, ao posicionamento das Unidades da Federao no objeto br (vetor indice). Em seguida, vamos converter de factor para character a varivel UF do novo banco e a varivel UF do banco de dados com os IDHs. Isso permitir funo merge() comparar as duas variveis, que possuem os mesmos rtulos, mas em sequncias diferentes.
2

Ver seo 8.2 para maiores informaes sobre o uso de cores.

97 Por m, utilizaremos a funo merge() para reunir os dados originais do mapa com obanco de dados contendo os valores do IDH e reordenaremos o banco segundo o ndice que criamos:
> > > > > > br.dados <- attr(br, "data") br.dados$indice <- 1:dim(br.dados)[1] idh$UF <- as.character(idh$UF) br.dados$UF <- as.character(br.dados$UF) br.dados <- merge(br.dados, idh) br.dados <- br.dados[order(br.dados$indice), ]

Finalmente, vamos criar com a funo cut() uma varivel categrica com faixas de valores de IDH, idhc, que ser usada para colorir o mapa. Deixamos para a funo cut() a tarefa de determinar os pontos de corte ao dividir o IDH em quatro intervalos:
> br.dados$idhc05 <- cut(br.dados$idh05, 4) > summary(br.dados$idhc05) (0.677,0.726] (0.726,0.776] (0.776,0.825] (0.825,0.874] 6 7 9 5

Assim como no mapa anterior, na Figura 11.2 colorimos as Unidades de Federao usando os levels de uma varivel categrica como nmeros das cores da palheta. A legenda foi posicionada manualmente, usando como referncia os valores de r1 e r2 do objeto br. Esses valores correspondem, respectivamente, longitude e latitude, e so tambm os limites mnimo e mximo do plano cartesiano em que o mapa foi desenhado. Os valores apresentados na legenda so o resultado do comando summary(idhc), digitado acima.
> > > > > + palette(c("#779999", "#99bbbb", "#bbdddd", "#ddffff")) attr(br, "data") <- br.dados plot(br, col = br$idhc05) title("IDH dos Estados Brasileiros em 2005") legend(-74, -18, bty = "n", fill = 4:1, cex = 0.8, legend = levels(br$idhc05)[4:1])

IDH dos Estados Brasileiros em 2005

(0.825,0.874] (0.776,0.825] (0.726,0.776] (0.677,0.726]

Figura 11.2: Exemplo de mapa (II)

98

CAPTULO 11. MAPAS

Poderamos acrescentar linhas, pontos ou texto ao mapa usando as coordenadas de acidentes geogrcos, cidades ou estradas como valores para os eixos x e y. Por exemplo, as coordenadas geogrcas de Fortaleza e Manaus so, respectivamente, 03 43 01 S, 38 32 34 O e 03 08 07 S, 60 01 34 O. Para adicion-las ao mapa (resultado omitido):
> points(c(-38.33, -60.03), c(-3.82, -3.14), pch = 23, cex = 0.6, + col = "red", bg = "yellow") > text(c(-38.33, -60.03), c(-3.82, -3.14), pos = c(4, 2), cex = 0.6, + labels = c("Fortaleza", "Manaus"))

Como mostra a Figura 11.3, um subconjunto dos polgonos de um mapa pode ser selecionado pelo uso de sintaxe anloga empregada com um data.frame. No exemplo, acrescentamos as abreviaturas das unidades da federao ao mapa. Para tanto, extramos do objeto ne os polgonos constituintes do mapa (ne.plgns) e extramos os centroides dos polgonos (ne.cntr). Os centroides so vetores numricos com dois elementos, x e y, correspondentes s coordenadas geogrcas do centro da unidade da federao e so armazenados nos polgonos num atributos do tipo Slot e podem ser extrados com a funo slot(). O objeto ne.cntr , portanto, uma lista desses vetores. Para, nalmente, acrescentar os rtulos das unidades da federao ao mapa, extramos dessa lista apenas os elementos correspondentes longitude, ne.x, e latitude, ne.y, e fornecemos esses vetores como argumentos funo text().
> > > > > > > ne <- br[br$REGIAO == "NE", ] plot(ne, col = rainbow(9, 0.4)) ne.plgns <- attr(ne, "polygons") ne.cntr <- lapply(ne.plgns, slot, "labpt") ne.x <- sapply(ne.cntr, function(x) x[1]) ne.y <- sapply(ne.cntr, function(x) x[2]) text(ne.x, ne.y, as.character(ne$UF), cex = 0.6)

MA

CE RN PB PE AL SE

PI

BA

Figura 11.3: Mapa do Nordeste do Brasil

Captulo 12 Anlise de redes sociais


Existem vrios pacotes do R voltados para anlise de redes sociais. Neste captulo, veremos o uso bsico do igraph, que possui funes de uso bastante intuitivo para a criao de pequenas redes e funes capazes de lidar de modo eciente com redes grandes. Um cuidado adicional necessrio com as funes do igraph a correo dos ndices dos vrtices dos grcos: o igraph utiliza a sintaxe da linguagem C e inicia os ndices em 0, enquanto o ndice inicial no R 1. Assim, vez por outra, pode ser necessrio acrescentar 1 a um vetor de vrtices produzidos pelas funes do igraph. Uma forma de criar um objeto de classe igraph, representando uma rede social, pelo uso da funo graph.formula(), como exemplicado no cdigo abaixo:
> > + + + + + + + + + + library(igraph) g <- graph.formula( Regina --+ Francisco, Maria +-- Sandra, Jos --+ Francisco, Paulo --+ Francisco +-- Cristina, Maria +-- Manoel +-- Carlos, Ana --+ Paulo --+ Carlos, Manoel --+ Lcia +-+ Sandra +-- Helena, Paulo --+ Manoel +-- Ana, Francisco --+ Maria )

A funo graph.formula() recebe como argumentos dois ou mais nomes de vrtices ligados pelos sinais - e + simbolizando arestas, em que o sinal + representa a ponta da seta. possvel tambm fazer a ligao usando apenas os sinais - e, nesse caso, a rede ser nodirecional. No necessrio o uso de aspas nos nomes dos vrtices se eles no contiverem espaos em branco. Para visualizar a rede, usamos plot(), como ilustrado na Figura 12.1. Por padro, o sociograma produzido tem os vrtices distribudos aleatoriamente, o que diculta a visualizao das relaes entre os elementos do grco. A funo tkplot() permite escolher manualmente a posio dos vrtices. Para tanto, deve-se criar um objeto com o resultado da funo e utiliz-lo como argumento para a funo tkplot.getcoords(), que somente deve ser chamada quando os vrtices tiverem sido manualmente posicionados. Depois de guardadas as coordenadas num objeto, a janela do grco interativo pode ser fechada. No exemplo abaixo, a referncia ao grco foi salva no objeto (tkp e as coordenadas no objeto g.coord (resultados omitidos):

99

100
> plot(g)

CAPTULO 12. ANLISE DE REDES SOCIAIS

11 q

0 q 3 q 1 q 7 q 4 q 2 q

10 q

9 q

q
6

8 q

5 q

Figura 12.1: Sociograma


> tkp <- tkplot(g) > g.coord <- tkplot.getcoords(tkp) > g <- set.graph.attribute(g, "layout", value = g.coord)

Raramente ser conveniente posicionar os vrtices manualmente. O mais prtico estabelecer o layout do sociograma de modo automtico. Os objetos da classe igraph podem receber, por meio da funo set.graph.attribute(), vrios atributos que sero, ento, utilizados em todos os sociogramas produzidos. A funo recebe como argumentos o objeto da classe igraph, o nome do atributo e o valor do atributo. No exemplo anterior, estipulamos que o layout do grco seria determinado pelas coordenadas dos vrtices denidas manualmente com a funo tkplot(). No cdigo abaixo, primeiramente, chamamos a funo set.seed() com algum valor qualquer para evitar que os grcos produzidos por nosso script tenham layouts diferentes cada vez que o script for executado. Isso ocorreria porque o algoritmo de produo de layout faz uso de nmeros pseudo aleatrios. Ao usar a funo set.seed(), garantimos que os nmeros pseudo aleatrios sero produzidos sempre na mesma sequncia.
> set.seed(333) > g <- set.graph.attribute(g, "layout", + value=layout.fruchterman.reingold(g))

Os comandos executados abaixo acrescentam outros atributos teis para a produo dos sociogramas. Por padro, a funo plot utiliza os ndices dos vrtices como rtulos, mas, ao criar a rede com a funo graph.formula(), os nomes foram armazenados no atributo name. Assim, utilizamos a funo get.vertex.attribute() para obter a lista de nomes e a funo set.vertex.attribute() para determinar que os rtulos dos vrtices devero

101 ser os nomes. Outros atributos que acrescentamos foram o tamanho dos vrtices, a distncia entre os vrtices e os seus rtulos e o tamanho das pontas das arestas:
> > > > > nomes <- get.vertex.attribute(g, "name") g <- set.vertex.attribute(g, "label", value = nomes) g <- set.vertex.attribute(g, "size", value = 6) g <- set.vertex.attribute(g, "label.dist", value = 0.7) g <- set.edge.attribute(g, "arrow.size", value = 0.5)

Outra alterao que faremos nos sociogramas seguintes ser colorir os vrtices de acordo com alguma caracterstica dos indivduos. Na Figura 12.2, os vrtices esto coloridos de acordo com o grau de proximidade e de intermediao dos indivduos na rede social. O grau de proximidade de um vrtice proporcional distncia mdia dele para todos os outros vrtices e o grau de intermediao indica o nmero vezes que um vrtice representa o caminho mais curto entre dois outros vrtices. O grau de proximidade dos vrtices foi calculada com a funo closeness() e o grau de intermediao com betweenness(). Para colorir os vrtices, usamos as cores produzidas pela funo heat.colors(), mas na ordem inversa: quanto maior a mtrica de centralidade, mais prxima do vermelho a cor utilizada:
> > > > > > > > > cores <- heat.colors(5) g.proxi <- closeness(g) g.proxi.max <- max(g.proxi) cores.p <- 5 - round(4 * (g.proxi/g.proxi.max)) cores.p <- cores[cores.p] g.inter <- betweenness(g) g.inter.max <- max(g.inter) cores.i <- 5 - round(4 * (g.inter/g.inter.max)) cores.i <- cores[cores.i]

Na Figura 12.2, para colocar os dois sociogramas lado a lado no mesmo grco, usamos o parmetro grco mfrow e para reduzir o tamanho da fonte, o parmetro cex. O parmetro mar foi ajustado para reduzir o espao do grco gasto com margens em branco. No cdigo a seguir, so calculadas a centralidade e a centralidade alfa dos indivduos. No clculo da centralidade, passamos o argumento mode = in para a funo degree() para que somente fossem contadas as arestas que apontam para o vrtice. O clculo da centralidade alfa de Bonacich realizado pela funo alpha.centrality() pode falhar para algumas redes e valores de alpha. Por isso, usamos a funo try(), que testa o cdigo antes de executlo, evitando erros no script e a funo exists() que retorna TRUE se o objeto cujo nome lhe foi passado como argumento existir. Os procedimentos seguintes que utilizam o objeto g.alfa, correspondendo centralidade alfa, somente sero executados se tiver sido criado.A centralidade alfa calculada considerando no apenas o nmero de arestas que apontam para um vrtice, mas tambm a centralidade dos vrtice onde se originam as arestas. O argumento alpha indica a importncia relativa de fatores endgenos versus fatores exgenos na determinao da centralidade (CSRDI; NEPUSZ, 2006).
> > > > > > + + + g.central <- degree(g, mode = "in") g.central.max <- max(g.central) cores.c <- 5 - round(4 * (g.central/g.central.max)) cores.c <- cores[cores.c] try(g.alfa <- alpha.centrality(g, alpha = 0.5)) if (exists("g.alfa")) { g.alfa.min <- min(g.alfa) if (g.alfa.min < 0) g.alfa.min <- g.alfa.min * (-1)

102

CAPTULO 12. ANLISE DE REDES SOCIAIS

> par(mfrow = c(1, 2), cex = 0.7, mar = c(0.1, 0.1, 1.1, 0.4)) > plot(g, vertex.color = cores.p, main = "Proximidade") > plot(g, vertex.color = cores.i, main = "Intermediao")

Proximidade

Intermediao

Carlos q Ana q Manoel q Maria q Lcia q Sandra q Paulo q

Jos q

Carlos q Cristina Ana q q Manoel q Regina q Lcia q Sandra q Maria q Paulo q

Jos q

Francisco q

Francisco q

Cristina q

Regina q

Helena q

Helena q

Figura 12.2: Sociogramas dos graus de centralidade e intermediao


+ + + + + } g.alfa2 <- g.alfa + g.alfa.min g.alfa2.max <- max(g.alfa2) cores.a <- 5 - round(4 * (g.alfa2/g.alfa2.max)) cores.a <- cores[cores.a]

Outro procedimento frequentemente til a identicao dos maiores cliques de uma rede, ou seja, dos maiores grupos de vrtices mutuamente relacionados. Isso pode ser feito com a funo largest.cliques(), que recebe como argumento uma rede no direcionada. Como a rede que criamos direcionada, ser preciso antes convert-la, usando a funo as.undirected(). A funo largest.cliques() retorna uma lista dos ndices dos vrtices pertencentes aos maiores cliques, mas, como podemos observar pela comparao dos sociogramas com a impresso dos nomes do primeiro clique, necessrio adicionar 1 ao vetor porque a funo retorna ndice iniciando em 0 e os ndices do R iniciam em 1, como j explicado. Para adicionar o valor 1 a todos os ndices dos cliques simultaneamente, utilizamos a funo lapply(), vista no captulo 10.
> g.undir <- as.undirected(g) > g.mc <- largest.cliques(g.undir) > g.mc [[1]] [1] 5 7 8 [[2]] [1] 5 7 9 > nomes[g.mc[[1]]] [1] "Jos" "Cristina" "Manoel" > g.mc <- lapply(g.mc, function(x) x + 1) > nomes[g.mc[[1]]] [1] "Paulo" "Manoel" "Carlos"

103
> par(mfrow = c(1, 2), cex = 0.7, mar = c(0.1, 0.1, 1.1, 0.4)) > plot(g, vertex.color=cores.c, main = "Centralidade") > if(exists("g.alfa")) + plot(g, vertex.color=cores.a, main = "Centralidade alfa")

Centralidade

Centralidade alfa

Carlos q Ana q Manoel q Maria q Lcia q Sandra q Paulo q

Jos q

Carlos q Cristina Ana q q Manoel q Regina q Lcia q Sandra q Maria q Paulo q

Jos q

Francisco q

Francisco q

Cristina q

Regina q

Helena q

Helena q

Figura 12.3: Sociogramas dos graus de centralidade Alm de localizar os maiores cliques, podemos usar as funes walktrap.community e community.to.membership() para identicar automaticamente a existncia de possveis subgrupos na rede. Essas funes revelam a existncia de comunidades dando passos aleatrios a partir de cada um dos vrtices. Por isso, quanto maior o valor do argumento steps, maior o nmero de membros considerados pertencentes a cada comunidade. O valor correto depender de consideraes tericas e metodolgicas a serem feitas pelo pesquisador. No exemplo abaixo, usamos os valores 6 e 10 e, mais uma vez, precisamos adicionar o valor 1 aos resultados para podermos posteriormente associ-los aos nomes dos indivduos pertencentes rede:
> > > > > wtc <- walktrap.community(g) g.comunidd <- community.to.membership(g, wtc$merges, steps = 6) g.memb6 <- g.comunidd$membership + 1 g.comunidd <- community.to.membership(g, wtc$merges, steps = 10) g.memb10 <- g.comunidd$membership + 1

Como o grco da Figura 12.4 ser o ltimo do captulo, convm, aps a produo do grco, chamar novamente a funo par() para recongurar os parmetros grcos para os valores originais. Depois de ter calculado vrias mtricas dos indivduos nas rede social que nos serviu de exemplo e de ter identicado as comunidades s quais pertencem os vrtices, podemos criar um data.frame contendo todas essas variveis, como no cdigo abaixo:
> b <- data.frame(nomes, g.inter, g.proxi, g.central, g.alfa, g.memb6, + g.memb10) > names(b) <- c("pessoa", "intermed", "proximidd", "central", "alfa", + "comunidd1", "comunidd2") > print(b, digits = 3)

104
> + > > > >

CAPTULO 12. ANLISE DE REDES SOCIAIS

palette(c("red", "green", "lightblue", "darkgreen", "yellow", "magenta")) par(mfrow = c(1, 2), cex = 0.7, mar = c(0.1, 0.1, 1.1, 0.4)) plot(g, vertex.color = g.memb6, main = "steps = 6") plot(g, vertex.color = g.memb10, main = "steps = 10") par(mfrow = c(1, 1), cex = 1, mar = c(5.1, 4.1, 4.1, 2.1))

steps = 6

steps = 10

Carlos q Ana q Manoel q Maria q Lcia q Sandra q Paulo q

Jos q

Carlos q Cristina Ana q q Manoel q Regina q Lcia q Sandra q Maria q Paulo q

Jos q

Francisco q

Francisco q

Cristina q

Regina q

Helena q

Helena q

Figura 12.4: Identicao de grupos


pessoa intermed proximidd central alfa comunidd1 comunidd2 1 Regina 0.0 0.379 0 1.00 1 2 2 Francisco 3.5 0.579 4 3.25 1 2 3 Maria 0.0 0.579 3 6.04 4 1 4 Sandra 3.0 0.440 2 3.71 3 1 5 Jos 0.0 0.379 0 1.00 5 2 6 Paulo 2.0 0.524 1 1.50 2 1 7 Cristina 0.0 0.379 0 1.00 1 2 8 Manoel 8.5 0.524 3 3.12 2 1 9 Carlos 0.0 0.423 1 1.75 2 1 10 Ana 0.0 0.423 0 1.00 2 1 11 Lcia 4.0 0.407 2 4.42 3 1 12 Helena 0.0 0.314 0 1.00 6 1

Se tivssemos outro data.frame com caractersticas dos indivduos constituintes da rede, poderamos combinar os dois bancos de dados com a funo merge() e realizar novas anlises estatsticas, descritivas (como as vistas no Captulo 6) ou inferenciais (como as do Captulo 7). O pacote igraph tambm contm funes para criar redes a partir de matrizes de adjacncia, vetores de ndices ou vetores de nomes, que podero ser muito teis quando importando redes elaboradas em outros programas ou criando redes a partir de dados j existentes. Por exemplo, a rede que utilizamos neste captulo poderia ter sido criada da seguinte forma:
> A <- c("Regina", "Jos", "Sandra", "Paulo", "Francisco", "Manoel", + "Carlos", "Regina", "Ana", "Paulo", "Manoel", "Lcia", "Sandra", + "Helena", "Manoel", "Ana") > B <- c("Francisco", "Maria", "Maria", "Francisco", "Cristina",

105
+ "Carlos", "Regina", "Cristina", "Paulo", "Carlos", "Lcia", + "Sandra", "Helena", "Maria", "Ana", "Francisco") > g2 <- graph.edgelist(cbind(A, B))

Alm de calcular mtricas dos vrtices, tambm pode ser necessrio calcular mtricas globais da rede, principalmente quando se pretende comparar as propriedades de vrias redes. Entre essas propriedades, esto a razo entre o nmero de ligaes entre os vrtices da rede e o nmero teoricamente possvel de ligaes (densidade), a proporo de pares recprocos em relao a todos os pares de vrtices entre os quais h alguma aresta (reciprocidade), a probabilidade de dois vrtices quaisquer que so conectados ao mesmo vrtice estarem eles prprios conectados (transitividade ou coeciente de agrupamento) e o nmero de agrupamentos. Esta ltima propriedade pode ser calculada considerando ou no a reciprocidade das relaes:
> graph.density(g) [1] 0.1212121 > reciprocity(g) [1] 0.06666667 > transitivity(g) [1] 0.1714286 > no.clusters(g) [1] 1 > no.clusters(g, mode = "strong") [1] 11

106

CAPTULO 12. ANLISE DE REDES SOCIAIS

Glossrio
arrow: seta. blue: azul. bottom: cho. choose: escolher. cut: cortar. data: dados. device: dispositivo. directory: diretrio, pasta. end: m. foreign: estrangeiro. frame: quadro. green: verde. header: cabealho. head: cabea. heat: calor. height: altura. hide: escoder. label: rtulo. left: esquerda. length: comprimento. level: nvel. library: biblioteca. load: carregar. lower: letra minscula. mode: modo. print: imprimir. read: ler. record: registro, campo. red: vermelho. right: direita. script: texto, cdigo, sequncia de comandos. search: pesquisar. set: congurar. shape: forma, moldar, dar forma. size: tamanho. sink: afundar. start: incio. step: dar um passo. table: tabela. tail: cauda. top: topo. true: verdadeiro. wide: largo. width: largura. working: de trabalho.

107

108

CAPTULO 12. ANLISE DE REDES SOCIAIS

ndice Remissivo
?, 14 ??, 15 abline, 65, 76 aggregate, 92 agricolae, 69 alpha.centrality, 101 apply, 90 apropos, 15 Arcview, 95 args, 14 as.character, 35, 97, 98 as.Date, 35 as.ordered, 35 as.POSIXct, 35 as.undirected, 102 ASAtable, 84 attach, 51, 65 attr, 29, 49, 96, 98 attributes, 49 awk, 36 axis, 79 betweenness, 101 boxplot, 43, 73 break, 93 c, 21, 22 cat, 81, 90, 92, 93 cbind, 23, 47 cdplot, 53 character, 18, 39, 47, 93, 96 class, 22, 25, 41, 49 close, 31 closeness, 101 colors, 74 community.to.membership, 103 compmeans, 53, 56, 57 crosstab, 5557, 63, 64, 83, 84 csv, 2831 cut, 46, 56, 97 Date, 18 degree, 101 demo, 15 descr, 20, 29, 34, 42, 49, 52, 53, 55, 68, 95 detach, 51 dev.off, 73, 76, 83 dim, 40, 97 dir, 17 dput, 37, 52 else, 90 eps, 83 example, 15 exists, 101 factanal, 69 factor, 18, 28, 33, 39, 45, 47, 49, 96 FALSE, 18 le.choose, 52 le.head, 29, 30 for, 92, 93 foreign, 29 freq, 42 fromUTF8, 34 function, 89 fwf2csv, 35 gdata, 31, 33 get.vertex.attribute, 100 getwd, 17 glm, 68 graph.density, 105 graph.edgelist, 104 graph.formula, 99, 100 grep, 93 gsub, 93

head, 39, 40 heat.colors, 101 help, 14 help.search, 15 help.start, 14 data.frame, 2729, 47, 51, 90, 92, 95, 98, 103, hist, 43, 44, 73 history, 20 104 109

110 Hmisc, 31 IBGE, 31 if, 90, 92 igraph, 99, 100, 104 inkscape, 83 install.packages, 20 interaction.plot, 55 jpg, 83 label, 49 lapply, 91, 102 largest.cliques, 102 lda, 69 legend, 61, 80, 97 length, 22, 40 letters, 16 levels, 49, 53, 58, 63, 74, 97 library, 20, 33, 34, 42, 52, 84, 85, 95 lines, 76 list, 24, 25, 27 lm, 64, 65 lme4, 69 lmer, 69 load, 16, 17, 28, 41, 52, 55, 78, 81, 92 log, 19, 44, 64 logical, 18 LogRegR2, 68 ls, 15, 51 maptools, 95 MASS, 69 matrix, 23, 24, 27, 90 mda, 69 mdb.get, 31 mean, 91, 92 memisc, 46, 63 merge, 47, 96, 97, 104 mosaicplot, 55 NA, 45 names, 23, 32, 33, 37, 47, 52 next, 93 no.clusters, 105 NULL, 47 numeric, 18 odfWeave, 84, 85 odfWeaveControl, 85 ods, 31 order, 41, 97 ordered, 18, 35

NDICE REMISSIVO

palette, 74, 96, 97 par, 66, 7679, 103 path.analysis, 69 pdf, 83 PESB, 52 plot, 42, 54, 56, 59, 65, 66, 73, 75, 7880, 95 100, 102104 PNAD, 31, 35, 36 png, 82, 83 points, 75, 98 polygon, 76 postscript, 83 predict, 66 princomp, 69 print, 16, 17 pspp, 36 q, 13, 14 quit, 13, 14 R2HTML, 85 rainbow, 98 rbind, 23, 47 RData, 16, 28 read.csv, 31 read.csv.sql, 36 read.fwf, 32 read.spss, 29, 36 read.table, 2931, 3336, 39, 96 read.xls, 31 readHTMLTable, 32 readLines, 31, 32, 34 readShapePoly, 95 reciprocity, 105 recode, 32, 46, 55, 63 rect, 76 rep, 22, 32, 75 reshape, 48 residuals, 66 rgb, 74 rownames, 48 RSiteSearch, 15 sapply, 91, 98 sav, 28, 29 sav2dat.sh, 36 save, 16, 28, 50 sem, 69 seq, 21, 75 sessionInfo, 15

NDICE REMISSIVO set.graph.attribute, 100 set.seed, 100 set.vertex.attribute, 100 setwd, 17, 28 sink, 81, 82 slot, 98 SPSS, 28, 29, 3436, 49 spss.get, 49 spss.read, 36 sqldf, 36 sqrt, 19, 89 stats, 69 step, 67 sub, 93 subset, 41 summary, 28, 30, 34, 42, 43, 49, 65, 95, 97 svg, 83 system, 32 table, 54, 63, 81 tail, 39, 40 tapply, 91, 92 text, 61, 65, 75, 76, 79, 98 textConnection, 31 title, 73, 96, 97 tkplot, 99, 100 tkplot.getcoords, 99 toHTML, 84 tolower, 33 toUTF8, 31, 32, 34, 95 transitivity, 105 trim, 33 TRUE, 18 try, 101 ts, 59 ts.plot, 59 vector, 21 walktrap.community, 103 warnings, 36 while, 92, 93 writeLines, 32, 34 xls, 31 xls2csv, 31 XML, 32

111

112

NDICE REMISSIVO

Referncias Bibliogrcas
ALMEIDA, Alberto Carlos. A cabea do brasileiro. Rio de Janeiro: Record, 2007. BARNIER, Julien. R pour les sociologues. [S.l.], dez. 2008. Version provisoire. BOLOGNESI, Bruno; GOUVA, Jlio; MIRADE, Angel. Eleies 2006: Candidatos ao poder legislativo no brasil (banco de dados). In: Consrcio de Informaes Sociais. Curitiba: Ncleo de Pesquisa em Sociologia Poltica Brasileira, 2007. Disponvel em: <http://www.cis.org.br>. Acesso em: 12/082009. CEPAL; PNUD; OIT. ndice de Desenvolvimento Humano (idh), Brasil, regies e estados, 1991-2005. In: CEPAL; PNUD; OIT (Ed.). Emprego, Desenvolvimento Humano e Trabalho Decente: A Experincia Brasileira Recente. [s.n.], 2008. Disponvel em: <http://www.cepal.org/brasil/noticias/noticias/3/34013/EmpregoDesenvHumanoTrabDecente.pdf>. Acesso em: 10/04/2009. CSRDI, Gbor; NEPUSZ, Tams. The igraph software package for complex network research. InterJournal, Complex Systems, Manuscript Number 1695, 2006. Disponvel em: <http://igraph.sf.net>. R Development Core Team. R: A Language and Environment for Statistical Computing. Vienna, Austria, 2009. ISBN 3-900051-07-0. Disponvel em: <http://www.R-project.org>. TORGO, Lus. Introduo programao em R. Porto, out. 2006.

113