Professional Documents
Culture Documents
o
0 5 10 15 20
0
.
0
0
0
.
0
5
0
.
1
0
0
.
1
5
Alm de melhorarmos a aparncia do grco, utilizamos o argu-
mento probability para substituir a apresentao das frequncias em
valores absolutos por valores relativos. Os candidatos que declaram
no possuir bens caramisolados na barra mais esquerda, e Ronaldo
5.5. RECODIFICAR VARIVEIS 65
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
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 en-
trevistado 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" e "NR", correspondendo, respectivamente, a No sabe e No
respondeu:
x <- as.factor(c("Sim", "No", "NR", "No", "NS", "No", "Sim", "Sim"))
summary(x)
# No NR NS Sim
# 3 1 1 3
Se quisermos tratar "NS" e "NR" como valores omissos (missing
values), poderamos faz-lo da seguinte forma:
NA
x[x == "NS" | x == "NR"] <- NA
summary(x)
# No NR NS Sim NA's
# 3 0 0 3 2
x <- droplevels(x)
summary(x)
# No Sim NA's
# 3 3 2
Os valores entre colchetes na primeira linha do cdigo acima,
como o leitor j est habituado, fazem uma seleo dos ndices de x.
5.5. RECODIFICAR VARIVEIS 66
Mas h vrias novidades nessa linha. Observe que o smbolo NA, em-
bora constitudo por duas letras, no est entre aspas. O valor NA que
est sendo atribudo a alguns dos valores de x temumsignicado espe-
cial para o R: not available, ou seja, valor ausente. Vimos, na seo 2.6
(p. 14), os signicados 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 condi-
o lgica OU. Assim, o cdigo dentro dos colchetes pode ser lido como:
VERDADEIRO se x for igual a "NS" ou x igual a "NR"; FALSO se x no for
igual a nenhum dos dois valores. Ou seja, o valor NA ser atribudo a
todos os elementos do vetor x que corresponderem s categorias No
sabe, No respondeu.
A funo droplevels() tem o objetivo de eliminar, da varivel
categrica, os levels vazios, no caso, "NS" e "NR".
No cdigo acima, modicamos a prpria varivel, mas em outras
ocasies precisamos criar uma nova varivel, como no exemplo abaixo,
em que a funo recode(), do pacote memisc, utilizada para reco-
dicar a varivel Partido poltico em 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 lana-
ramcandidatura prpria Presidncia da Repblica em2006 e que em
2008 estavam na base aliada do Governo Federal; como Intermedi-
rios, aqueles que lanaram candidatura prpria, mas em 2008 estavam
na base aliada do Governo; nalmente, como pertencentes Oposi-
o, aqueles que lanaram candidatura prpria e faziam oposio ao
Governo em 2008.
5.6. CRIAR VARIVEL CATEGRICA A PARTIR DE VARIVEL NUMRICA 67
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 pes-
soas relativamente jovens, quanto maior a idade, em mdia, maior a
escolaridade. Entretanto, pessoas umpouco mais velhas passaramsua
juventude num 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. Emcasos como esses, pode ser melhor converter
a varivel numrica numa varivel categrica antes de continuar a an-
lise 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
No h problema se os pontos de corte mnimo e mximo estive-
rempara almdos 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 ELIMINAR VARIVEIS EXISTENTES E ACRESCENTAR NOVAS
Quandoatribumos umnovovalor a uma varivel, comoj zemos
vrias vezes nas sees anteriores, na verdade, estamos destruindo a
varivel antiga e criando uma nova. Mas se a inteno for realmente
eliminar uma varivel de um banco de dados, basta lhe atribuir o valor
NULL. Attulode exemplo, digite names(sen)antes e depois doseguinte
comando e compare os resultados:
5.8. REUNIR DOIS BANCOS DE DADOS 68
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
b1 <- data.frame(uf = c("RS", "SC", "PR"), idh = c(0.83, 0.84, 0.82))
b2 <- data.frame(UF = c("PR", "SC", "RS"), pop = c(10.3, 5.9, 10.6))
poderemos reuni-los num nico banco de dados com o comando mer-
ge(b1, b2). Opr-requisito para o correto funcionamento de merge()
que a varivel chave para fuso esteja presente com o mesmo nome
nos dois bancos. No exemplo em questo, para a comparao das
chaves realizada por merge() ser possvel, teremos que renomear uma
das variveis chave para que os nomes quem exatamente iguais e
converter as colunas correspondentes Unidade da Federao de
factor para character:
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.82 10.3
# 2 RS 0.83 10.6
# 3 SC 0.84 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 des-
necessrio usar merge(), sendo suciente utilizar cbind(). Em outro
cenrio, se os dois bancos de dados contivessem exatamente as mes-
mas 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().
5.9. REFORMATAR BANCO DE DADOS 69
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 estoemcolunas diferentes -
quemna mesma coluna, mas emlinhas diferentes. No exemplo abaixo,
criamos um banco com dados sobre a populao de alguns pases em
trs anos diferentes e, emseguida, usamos a funo reshape() para re-
formatar 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. Oargumento 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)
b3 <- data.frame(pais, ano, populacao)
b3
# 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
reshape(b3, timevar = "ano", idvar = "pais", direction = "wide")
# pais populacao.1960 populacao.1980 populacao.2000
# 1 Brasil 71695 122958 175553
# 4 Bulgria 7867 8844 7818
# 7 ndia 445857 687029 1002708
Noexemploseguinte, zemos ocontrrio, reformatamos umbanco
de dados de modo a ter as informaes arranjadas no formato mais
comprido. Oargumento varying indica quais colunas no formato largo
correspondem a uma nica varivel no formato comprido. Aps a
5.10. ATRIBUTOS DE OBJETOS 70
reformatao do banco, os nomes das linhas caram longos e com
informao redudante, e, por isso, usamos a funo rownames() para
modic-los:
pais <- c("Brasil", "Bulgria", "ndia")
pop.1960 <- c(71695, 7867, 445857)
pop.1980 <- c(122958, 8844, 687029)
pop.2000 <- c(175553, 7818, 1002708)
b5 <- data.frame(pais, pop.1960, pop.1980, pop.2000)
b5
# pais pop.1960 pop.1980 pop.2000
# 1 Brasil 71695 122958 175553
# 2 Bulgria 7867 8844 7818
# 3 ndia 445857 687029 1002708
b6 <- reshape(b5, idvar = "pais", timevar = "ano", direction = "long",
varying = c("pop.1960", "pop.1980", "pop.2000"))
b6
# pais ano pop
# Brasil.1960 Brasil 1960 71695
# Bulgria.1960 Bulgria 1960 7867
# ndia.1960 ndia 1960 445857
# Brasil.1980 Brasil 1980 122958
# Bulgria.1980 Bulgria 1980 8844
# ndia.1980 ndia 1980 687029
# Brasil.2000 Brasil 2000 175553
# Bulgria.2000 Bulgria 2000 7818
# ndia.2000 ndia 2000 1002708
rownames(b6) <- 1:9
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 dezenas de variveis e no lembramos o que
exatamente cada uma delas representa.
1
Para acrescentar um atributo
1
Entre as funes presentes no pacote Hmisc, temos label(), que acrescenta o
atributo label a um objeto, e spss.get(), que atribui automaticamente rtulos s
5.10. ATRIBUTOS DE OBJETOS 71
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"
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"
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 umvetor do tipo integer
com alguns atributos adicionais: levels e class.
A possibilidade de atribuio de caractersticas arbitrrias a qual-
quer 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 atribu-
tos 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, quando se pretende acres-
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.
5.10. ATRIBUTOS DE OBJETOS 72
centar rtulos ou outros atributos s variveis de um banco de dados,
recomendvel que isso seja feito 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 tambmo banco de dados, pois, geralmente, mais rpido carre-
gar o banco de dados j manipulado e salvo no formato RData do que
executar novamente todo o script de manipulao dos 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 VARIVEIS DE UM BANCO DE DADOS NA 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. A funo attach()
permite fazer referncia a uma varivel de um banco de dados direta-
mente, sem o prexo b$. Ao digitarmos attach(b), o R faz cpias das
variveis de b que, embora no sejam exibidas pela funo ls(), po-
demser acessadas pelas demais funes. A Figura 6.1 (prxima pgina)
uma representao grca do processo.
O inconveniente de usar attach() durante o processo de mani-
pulao 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.
73
6.1. VARIVEIS DE UM BANCO DE DADOS NA REA DE TRABALHO 74
FIGURA 6.1: rea de trabalho antes e depois de attach(b)
Antes
Depois
b b
v1 v2
v3 v4
v5 v6
v1 v2
v3 v4
v5 v6
v1 v2
v3 v4
v5
v6
Nas primeiras sees deste captulo, utilizaremos umsubconjunto
do banco de dados da Pesquisa Social Brasileira de 2002. O primeiro
passo , pois, carregar o banco de dados:
load("pesb2002.RData")
A Tabela 6.1 reproduz o nome de algumas variveis e seus respec-
tivos rtulos, conforme o livro de cdigos da PESB 2002.
Tabela 6.1: Algumas variveis da PESB 2002 e seus respectivos rtulos
Var. Rtulo
q2 Regio do Pas
q66 Pedir a um amigo que trabalha no servio pblico para ajudar a
tirar um documento mais rpido do que no tempo normal :
q68 Um funcionrio pblico receber um presente de Natal de uma
empresa que ele ajudou a ganhar um contrato do governo :
q78 Algum consegue um emprstimo do governo, mas que demora
muito a sair. Como ele tem um parente no governo, conseguir
liberar o emprstimo mais rpido :
q105 Atitude que a empregada domstica deveria ter se a patroa diz que
ela pode assistir televiso na sala junto com ela
q511 Religio
q531 Sexo
q546 Renda familiar - faixas
q660 Peso nal para desproporcionalidade amostral e diferenas
sciodemogrcas
Para facilitar o nosso trabalho, vamos renomear as variveis do
nosso subconjunto da PESB 2002 com nomes mais signicativos do
6.2. CONSTRUO DE NDICES 75
que os originais. Para evitar erros de digitao na produo do novo
vetor comnomes, usaremos o comando dput(names(pesb)) para pro-
duzir um cdigo que podemos copiar e editar, modicando os nomes
conforme nosso interesse:
dput(names(pesb))
# c("q2", "q531", "q511", "q546", "q66", "q68", "q78", "q105",
# "q660")
names(pesb) <- c("regiao", "sexo", "religiao", "rendafam", "docrapido",
"natal", "emprestimo", "atitude", "peso")
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 par-
tir 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 classi-
car como favor, jeitinho ou corrupo. As trs que Almeida (2007)
aponta como as que obtiveramrespostas 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 docra-
pido, natal e emprestimo. As trs, claro, tm as mesmas categorias:
levels(pesb$docrapido)
# [1] "Favor" "Mais favor do que jeitinho"
# [3] "Mais jeitinho do que favor" "Jeitinho"
# [5] "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho"
# [7] "Corrupo" "NR"
# [9] "NS"
6.2. CONSTRUO DE NDICES 76
levels(pesb$emprestimo)
# [1] "Favor" "Mais favor do que jeitinho"
# [3] "Mais jeitinho do que favor" "Jeitinho"
# [5] "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho"
# [7] "Corrupo" "NR"
# [9] "NS"
levels(pesb$natal)
# [1] "Favor" "Mais favor do que jeitinho"
# [3] "Mais jeitinho do que favor" "Jeitinho"
# [5] "Mais jeitinho do que corrupo" "Mais corrupo do que jeitinho"
# [7] "Corrupo" "NR"
# [9] "NS"
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 empres-
timo para construir um ndice de percepo da corrupo, ipc (no
presente no livro de Almeida). Entretanto, antes da construo do
ndice, vamos eliminar, das variveis, as respostas NS e NR:
pesb$emprestimo[pesb$emprestimo == "NS" |
pesb$emprestimo == "NR"] <- NA
pesb$docrapido[pesb$docrapido == "NS" | pesb$docrapido == "NR"] <- NA
pesb$natal[pesb$natal == "NS" | pesb$natal == "NR"] <- NA
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"
summary(pesb$ipc)
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
# 0.0 6.0 11.0 10.1 14.0 18.0 206
Nas seo seguinte teremos oportunidade de utilizar o ndice. O
atributo label adicionado ao objeto ipc ser utilizado pela funo
6.3. UMA VARIVEL NUMRICA E OUTRA CATEGRICA 77
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, mas, antes de fazer essa comparao, vamos usar a fun-
o levels() para abreviar os nomes das regies e, assim, melhorar a
aparncia da tabela e do grco que sero produzidos:
levels(pesb$regiao)
# [1] "Centro-Oeste" "Nordeste" "Norte" "Sudeste"
# [5] "Sul"
levels(pesb$regiao) <- c("CO", "NE", "N", "SE", "S")
A comparao de mdia pode ser feita com a funo compmeans()
do pacote descr. A funo produz umobjeto que, ao ser impresso, pro-
duz umatabelacomas mdias e, aoser plotado, produz umconjuntode
diagramas de caixa. A seguir, utilizamos a funo compmeans(), tendo
por argumentos o ndice de percepo 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 (va-
rivel Q660 no banco original do CIS, peso em nosso subconjunto dos
dados), o que torna mais acurada a descrio das caractersticas da
populao:
1
compm <- compmeans(pesb$ipc, pesb$regiao, pesb$peso)
compm
# Valor mdio de "ndice de percepo de corrupo" segundo
# "Estrato-Regio do Pas"
# Mdia N Desv. Pd.
# CO 10.960 149 4.402
1
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.
6.3. UMA VARIVEL NUMRICA E OUTRA CATEGRICA 78
# NE 8.705 580 4.895
# N 10.717 106 4.372
# SE 11.047 1005 4.159
# S 10.993 351 4.317
# Total 10.397 2191 4.528
Na tabela de comparaode mdias acima, temos ovalor mdiodo
ipc segundo a Regio, o nmero de indivduos entrevistados em cada
Regio (N), e o desvio padro do ipc dos indivduos segundo a Regio.
Ao plotarmos o objeto resultante da funo compmeans(), obtemos o
conjunto de diagramas de caixa mostrados na Figura 6.2. Nesta gura,
a largura das caixas proporcional ao nmero de entrevistados na
pesquisa.
plot(compm, ylab = "Percepo de corrupo", xlab = "Regio do Pas")
FIGURA 6.2: Diagramas em caixa: percepo da corrupo segundo a Regio
CO NE N SE S
5
1
0
1
5
Regio do Pas
P
e
r
c
e
p
o
d
e
c
o
r
r
u
p
o
As pessoas das regies com ipc mais alto, em mdia, interpretam
em maior proporo as situaes apresentadas como casos de corrup-
o (algo negativo) do que de jeitinho (algo aceitvel) ou favor (algo
positivo), e suponho que elas se sentiro mais inibidas empraticar atos
semelhantes do que aquelas que consideram que as situaes repre-
sentam casos de jeitinho ou favor. Na Figura 6.3, temos um grco de
densidade condicional tambm ilustrando a relao entre percepo
6.4. DUAS VARIVEIS CATEGRICAS 79
da corrupo e Regio de moradia dos entrevistados. Os nordestinos
constituemmais da metade dos que tmbaixa percepo de corrupo
e so menos de 20% dos que tm a mais alta percepo de corrupo.
b <- pesb[is.na(pesb$ipc) == FALSE, c("ipc", "regiao")]
cdplot(b$ipc, b$regiao, xlab = "IPC", ylab = "Regio",
border = "black")
FIGURA 6.3: Grco de densidade condicional: proporo de entrevistados de cada
Regio segundo a percepo de corrupo
IPC
R
e
g
i
o
5 10 15
C
O
N
E
N
S
E
S
6.4 DUAS VARIVEIS CATEGRICAS
Para saber se existe alguma correlao entre duas variveis ca-
tegricas, podemos fazer uma tabela cruzada e produzir um grco
comas duas variveis. As funes que fazemisso 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)
#
# Feminino Masculino
# Ateu 1 6
# Budista 1 1
# Candombl 3 5
6.4. DUAS VARIVEIS CATEGRICAS 80
# Catlica 902 772
# Esprita kardecista 47 23
# Evanglica no-pentecostal 66 42
# Evanglica pentecostal 167 92
# Judaica 1 0
# Mormon, Adventista, Testemunha de Jeov 30 19
# No tem religio 57 75
# NR 3 1
# NS 4 3
# Santo Daime, Esotrica, Outras 13 12
# Seisho-N-I, Messinica 5 4
# Umbanda 5 4
plot(pesb$religiao, pesb$sexo, xlab = "Religio", ylab = "Sexo")
FIGURA 6.4: Grco mosaico: religio e sexo do indivduo
Religio
S
e
x
o
Ateu Catlica Esprita kardecista NR
F
e
m
i
n
i
n
o
M
a
s
c
u
l
i
n
o
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
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, reu-
nindo algumas categorias e eliminando outras:
library(memisc)
pesb$rlg <- recode(pesb$religiao,
"Evanglica" <- c("Mormon, Adventista, Testemunha de Jeov",
"Evanglica no-pentecostal",
"Evanglica pentecostal"),
6.4. DUAS VARIVEIS CATEGRICAS 81
"Catlica" <- "Catlica",
"Nenhuma" <- c("Ateu", "No tem religio"))
Aforma mais fcil de fazer isso utilizando crosstab(), do pacote
descr que, almde aceitar umvetor de pesos como argumento, produz
um objeto que, ao ser impresso, imprime na tela uma tabela e, ao ser
plotado, produz um mosaicplot. Temos, abaixo, a tabela produzida
pela funo crosstab() e, em seguida, o grco (Figura 6.5):
2
ct <- crosstab(pesb$rlg, pesb$sexo, pesb$peso)
ct
# Contedo das clulas
# |-------------------------|
# | Contagem |
# |-------------------------|
#
# ==========================================
# pesb$sexo
# pesb$rlg Feminino Masculino Total
# ------------------------------------------
# Evanglica 231 152 383
# ------------------------------------------
# Catlica 872 811 1683
# ------------------------------------------
# Nenhuma 54 88 142
# ------------------------------------------
# Total 1157 1051 2208
# ==========================================
2
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.
6.4. DUAS VARIVEIS CATEGRICAS 82
plot(ct, xlab = "Religio", ylab = "Sexo")
FIGURA 6.5: Grco mosaico: religio e sexo do indivduo (II)
Religio
S
e
x
o
Evanglica Catlica Nenhuma
F
e
m
i
n
i
n
o
M
a
s
c
u
l
i
n
o
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 sup.")
Em seguida, na Figura 6.6, produzimos um grco de interao
que permite perceber a relao entre duas variveis categricas e uma
numrica. Entre as pessoas com escolaridade alta, a mdia do percen-
tual de votos vlidos maior para as mulheres, mas entre as pessoas
com escolaridade baixa ocorre o contrrio.
interaction.plot(sen$sexo, sen$escola.superior, sen$p.valido,
xlab = "Sexo", ylab = "% mdio de votos vlidos",
trace.label = "Escolaridade", lty = 1:2)
6.5. DUAS VARIVEIS NUMRICAS 83
FIGURA 6.6: Grco de interao: sexo, escolaridade e votos vlidos
5
1
0
1
5
Sexo
%
m
d
i
o
d
e
v
o
t
o
s
v
l
i
d
o
s
Feminino Masculino
Escolaridade
Superior
No sup.
6.5 DUAS VARIVEIS NUMRICAS
A abordagem mais adequada para vericar a existncia de corre-
lao entre duas variveis numricas a anlise de regresso, como
veremos no captulo 7. Se o pblico leitor no tiver conhecimento de
estatstica suciente para interpretar uma tabela com os resultados
de uma anlise de regresso, o que podemos fazer produzir um gr-
co 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 recebe-
ram 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 anli-
ses, 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(o) ser logartmica(s).
Para produzir um grco de disperso entre duas variveis nu-
mricas, basta utilizar a funo plot(), fornecendo as duas variveis
como argumento. A funo reconhecer que as duas variveis so nu-
mricas 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.
3
3
A manipulao de parmetros grcos ser abordada no Captulo 8.
6.5. DUAS VARIVEIS NUMRICAS 84
options(scipen = 1000)
plot(sen$vgasto, sen$votos, log = "xy", xlab = "Gasto (R$)",
ylab = "Votao")
FIGURA 6.7: Diagrama de disperso: votao segundo os gastos de campanha
5000 50000 500000 5000000
1
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
Gasto (R$)
V
o
t
a
o
possvel perceber uma maior densidade dos pontos nas interse-
es 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. Oque ainda pode-
mos fazer nos limites dapropostadeste 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
emcategrica pode ser feita coma 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 = TRUE)
sen$votac <- cut(sen$votos, c(0, 14000, 230000, 10000000),
labels = c("Baixa", "Mdia", "Alta"),
ordered
_
result = TRUE)
Criadas as novas variveis categricas, podemos agora usar comp-
means(). A tabela produzida pode ser vista a seguir, assim como o
6.5. DUAS VARIVEIS NUMRICAS 85
grco resultante pode ser visto na Figura 6.8. O argumento log = "y"
torna logartmica a apresentao dos valores no eixo y.
vg <- compmeans(sen$votos, sen$gastos)
vg
# Valor mdio de "sen$votos" segundo "sen$gastos"
# Mdia N Desv. Pd.
# Baixo 12709 84 26287
# Mdio 269561 52 462881
# Alto 1049986 66 1652811
# Total 417742 202 1069372
plot(vg, ylab = "Votao", xlab = "Gasto declarado", log = "y")
FIGURA 6.8: Diagramas em caixa: votao segundo os gastos de campanha
Baixo Mdio Alto
1
e
+
0
3
1
e
+
0
5
1
e
+
0
7
Gasto declarado
V
o
t
a
o
Tambm podemos apresentar uma tabela cruzada com as duas
novas variveis categricas:
ct2 <- crosstab(sen$gastos, sen$votac)
ct2
# Contedo das clulas
# |-------------------------|
# | Contagem |
# |-------------------------|
#
# ==========================================
# sen$votac
# sen$gastos Baixa Mdia Alta Total
6.5. DUAS VARIVEIS NUMRICAS 86
# ------------------------------------------
# Baixo 70 14 0 84
# ------------------------------------------
# Mdio 13 26 13 52
# ------------------------------------------
# Alto 4 15 47 66
# ------------------------------------------
# Total 87 55 60 202
# ==========================================
Para evitar que o grco produzido por crosstab() apresente a
categoria Baixa votao na parte superior do grco e Alta votao
na parte inferior, acrescentaremos o argumento inv.y = TRUE (inverter
a ordem das categorias no eixo y). O resultado a Figura 6.9.
plot(ct2, xlab = "Gasto declarado", ylab = "Votao", inv.y = TRUE)
FIGURA 6.9: Grco mosaico: votao segundo os gastos de campanha
Gasto declarado
V
o
t
a
o
Baixo Mdio Alto
A
l
t
a
M
d
i
a
B
a
i
x
a
As guras 6.8 e 6.9 contm, respectivamente, diagramas em caixa
e um grco mosaico, e 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 senado-
res e, portanto, vamos remover o objeto sen da rea de trabalho:
6.6. SRIES TEMPORAIS 87
rm(sen)
6.6 SRIES TEMPORAIS
Usamos a funo ts() para converter um vetor numrico em ob-
jeto 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 tem-
porais, relativas ao nmero de ocorrncias de furtos consumados e
de latrocnios no Estado de So Paulo no perodo de 1997 a 2004.
4
O
nmero de furtos quase mil vezes maior do que o nmero de latroc-
nios 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.
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")
4
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.
6.6. SRIES TEMPORAIS 88
FIGURA 6.10: Sries temporais: latrocnios e furtos em So Paulo
Ano
N
d
e
o
c
o
r
r
n
c
i
a
s
1997 1998 1999 2000 2001 2002 2003 2004
3
0
0
4
0
0
5
0
0
6
0
0
7
0
0
Latrocnios
Furtos/1000
Para maiores detalhes sobre como trabalhar comsries temporais,
consulte Torgo (2006, p. 31 e ss.).
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. Faremos isto
neste captulo ao 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 Assis-
tir TV na sala, mas pegar uma cadeira na cozinha, Assistir TV no seu
quarto, Sentar no sof junto da patroa e assistir TV com ela. Mas, antes,
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
atitude[atitude == "NR" | atitude == "NS"] <- NA
atitude <- droplevels(atitude)
dput(levels(atitude))
# c("Assistir TV na sala, mas pegar uma cadeira na cozinha",
# "Assistir TV no seu quarto",
# "Sentar no sof junto da patroa e assistir TV com ela")
89
7.1. QUI-QUADRADO 90
levels(atitude) <- c("Pegar cadeira", "Assistir no quarto",
"Sentar no sof")
library(gdata)
atitude <- reorder(atitude, new.order = c(2, 1, 3))
library(memisc)
rendafam <- recode(factor(pesb$q546),
"Baixa" <- c("Sem renda", "At R$ 200,00", "De R$ 201,00 a 600,00"),
"Mdia" <- c("De R$ 601,00 a 1000,00", "De R$ 1001,00 a 2000,00"),
"Alta" <- c("De R$ 2001,00 a 4000,00", "Mais de R$ 4001,00"))
Vamos agora passar para a funo crosstab() os argumentos
expected = TRUE, o que far a funo mostrar, no interior das clulas
da tabela, os valores esperados no caso de ausncia de correlao
entre as variveis, e chisq = TRUE para a realizao de um teste de
qui-quadrado.
library(descr)
crosstab(atitude, rendafam, peso, expected = TRUE,
chisq = TRUE, plot = FALSE)
# Contedo das clulas
# |-------------------------|
# | Contagem |
# | Valores esperados |
# |-------------------------|
#
# ===================================================
# rendafam
# atitude Baixa Mdia Alta Total
# ---------------------------------------------------
# Assistir no quarto 401 211 50 662
# 329.1 240.4 92.5
# ---------------------------------------------------
# Pegar cadeira 99 78 19 196
# 97.4 71.2 27.4
# ---------------------------------------------------
# Sentar no sof 553 480 227 1260
# 626.4 457.5 176.1
# ---------------------------------------------------
# Total 1053 769 296 2118
# ===================================================
#
# Estatsticas para todos os fatores da tabela
#
# Pearson's Chi-squared test
7.2. REGRESSO LINEAR 91
# ------------------------------------------------------------
# Qui
2
= 66.51 g.l. = 4 p = 1.237e-13
#
# Frequncia esperada mnima: 27.39
A estatstica p do teste de qui-quadrado 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,2 10
13
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 regressolinear noR, usamos a funo
lm(), que recebe como argumento obrigatrio a equao de regresso
no formato y x
1
+x
2
+x
3
+... +x
n
, onde y a varivel dependente
(necessariamente numrica) e cada varivel x
i
independente ou
explicativa (numrica ou categrica). 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 Median 3Q Max
# -4.696 -1.183 0.098 1.449 4.044
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -2.2955 0.9829 -2.34 0.021
*
# sen$log.vgasto 0.9486 0.0721 13.16 <2e-16
***
# ---
# Signif. codes: 0 '
***
' 0.001 '
**
' 0.01 '
*
' 0.05 '.' 0.1 ' ' 1
7.2. REGRESSO LINEAR 92
#
# Residual standard error: 1.85 on 200 degrees of freedom
# Multiple R-squared: 0.464,Adjusted R-squared: 0.461
# F-statistic: 173 on 1 and 200 DF, p-value: <2e-16
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 indepen-
dente para o valor da varivel dependente. O intercepto 2,30 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,30,
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 mos-
tram, 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
praticamente zero (<210
16
). A estatstica R
2
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 vari-
veis, possvel criar umgrcode dispersopara 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")
1
Ver, na p. 105, uma explicao sobre o uso da funo abline().
7.2. REGRESSO LINEAR 93
FIGURA 7.1: Correlao entre duas variveis numricas
10 12 14 16
6
8
1
0
1
2
1
4
1
6
Logaritmo dos gastos
L
o
g
a
r
i
t
m
o
d
o
s
v
o
t
o
s
A grande vantagem da anlise de regresso a possibilidade de
fazer anlise com muitas variveis independentes simultaneamente.
Antes, porm, de fazer uma nova anlise de regresso, vamos recodicar
escolanuma nova varivel instr(nvel de instruo) para reduzir
seu nmero de categorias e renomear as categorias de est.civil para
tornar os rtulos mais curtos:
library(memisc)
sen$instr <- recode(sen$escola,
"Baixo" <- c("L e Escreve", "Ensino Fundamental incompleto",
"Ensino Fundamental completo",
"Ensino Mdio incompleto", "Ensino Mdio completo"),
"Alto" <- c("Ensino Superior incompleto",
"Ensino Superior completo"))
levels(sen$est.civil) <- c("Casado", "Divorciado", "Separado",
"Solteiro", "Vivo")
Como argumento data =sen, a funo ir procurar no data.frame
senos objetos que noencontrar diretamente na rea de trabalho. Com
isso, torna-se dispensvel anexar o banco de dados antes da anlise
com attach() ou digitar sen$ repetidamente:
modelo2 <- lm(log.votos ~ log.vgasto + instr + idade + est.civil
+ sexo, data = sen)
summary(modelo2)
#
# Call:
7.2. REGRESSO LINEAR 94
# lm(formula = log.votos ~ log.vgasto + instr + idade + est.civil +
# sexo, data = sen)
#
# Residuals:
# Min 1Q Median 3Q Max
# -4.47 -1.21 0.10 1.35 3.97
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -2.2850 1.1166 -2.05 0.04208
*
# log.vgasto 0.8284 0.0746 11.10 < 2e-16
***
# instrAlto 1.0212 0.2953 3.46 0.00067
***
# idade 0.0351 0.0122 2.87 0.00455
**
# est.civilDivorciado -0.1741 0.3731 -0.47 0.64132
# est.civilSeparado -0.6436 0.4675 -1.38 0.17020
# est.civilSolteiro -0.6775 0.3983 -1.70 0.09054 .
# est.civilVivo -1.2384 0.5962 -2.08 0.03911
*
# sexoMasculino -0.9068 0.3625 -2.50 0.01320
*
# ---
# Signif. codes: 0 '
***
' 0.001 '
**
' 0.01 '
*
' 0.05 '.' 0.1 ' ' 1
#
# Residual standard error: 1.74 on 193 degrees of freedom
# Multiple R-squared: 0.543,Adjusted R-squared: 0.524
# F-statistic: 28.7 on 8 and 193 DF, p-value: <2e-16
No modelo2, algumas variveis tm uma alta probabilidade de
estar apenas por acaso 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 in-
clua 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. Uma forma de re-
solver a baixa signicncia estatstica de algumas categorias da varivel
est.civil agrupar categorias.
Para avaliar a adequao de um modelo de regresso linear, po-
dem ser teis as funes predict() (para obter os valores preditos
pela equao de regresso) e 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:
7.2. REGRESSO LINEAR 95
head(cbind(sen$log.votos, predict(modelo2), residuals(modelo2)))
# [,1] [,2] [,3]
# 1 12.257 9.795 2.4612
# 2 9.937 9.810 0.1265
# 3 13.207 12.569 0.6386
# 4 13.742 13.584 0.1578
# 5 11.659 12.806 -1.1476
# 6 13.117 11.973 1.1435
Com a funo plot() podemos produzir vrios grcos de di-
agnstico do modelo. Na Figura 7.2, utilizamos o parmetro grco
mfrow para exibir quatro grcos numa nica gura.
2
plot(modelo2)
FIGURA 7.2: Grcos de diagnstico de um modelo de regresso
6 8 10 12 14
2
0
2
4
Fitted values
R
e
s
i
d
u
a
l
s
Residuals vs Fitted
22 105
24
3 2 1 0 1 2 3
2
0
1
2
Theoretical Quantiles
S
t
a
n
d
a
r
d
i
z
e
d
r
e
s
i
d
u
a
l
s
Normal QQ
22 105
159
6 8 10 12 14
0
.
0
0
.
5
1
.
0
1
.
5
Fitted values
S
t
a
n
d
a
r
d
i
z
e
d
r
e
s
i
d
u
a
l
s
ScaleLocation
22 105
159
0.00 0.05 0.10 0.15
1
0
1
2
Leverage
S
t
a
n
d
a
r
d
i
z
e
d
r
e
s
i
d
u
a
l
s
Cook's distance
Residuals vs Leverage
159
55
92
2
Ver Seo 8.4 para detalhes sobre o uso da funo par() e digite ?plot.lm para
maiores informaes sobre os grcos.
7.3. PROCEDIMENTO step wise 96
par(mfrow = c(1, 1))
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 a 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 regres-
so 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 + instr + idade + sexo,
# data = sen)
#
# Residuals:
# Min 1Q Median 3Q Max
# -4.628 -1.040 0.172 1.360 4.329
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -3.0875 1.0152 -3.04 0.00268
**
# log.vgasto 0.8600 0.0724 11.88 < 2e-16
***
# instrAlto 1.0305 0.2963 3.48 0.00062
***
# idade 0.0333 0.0118 2.81 0.00544
**
# sexoMasculino -0.6355 0.3490 -1.82 0.07011 .
# ---
# Signif. codes: 0 '
***
' 0.001 '
**
' 0.01 '
*
' 0.05 '.' 0.1 ' ' 1
#
# Residual standard error: 1.76 on 197 degrees of freedom
# Multiple R-squared: 0.526,Adjusted R-squared: 0.516
# F-statistic: 54.5 on 4 and 197 DF, p-value: <2e-16
Neste caso, se houvesse interesse em tentar manter a varivel es-
tado civil no modelo, uma alternativa ao uso de stepwise seria a redu-
o do nmero de categorias da varivel est.civil. Podemos ver, pelo
sumrio do modelo2, antes do procedimento step wise, que, emrelao
7.4. REGRESSO LOGSTICA 97
categoria Casado, todas as demais categorias tm impacto negativo
sobre a votao recebida pelo candidato. Vamos, portanto, criar uma
nova varivel, indicando simplesmente se o candidato casado ou no
e produzir um novo modelo de regresso:
sen$casado <- recode(sen$est.civil,
"No" <- c("Divorciado", "Solteiro", "Separado",
"Vivo"),
"Sim" <- "Casado")
modelo3 <- lm(log.votos ~ log.vgasto + instr + idade + casado + sexo,
data = sen)
summary(modelo3)
#
# Call:
# lm(formula = log.votos ~ log.vgasto + instr + idade + casado +
# sexo, data = sen)
#
# Residuals:
# Min 1Q Median 3Q Max
# -4.505 -1.216 0.105 1.329 4.019
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -2.9812 1.0072 -2.96 0.00346
**
# log.vgasto 0.8352 0.0727 11.49 < 2e-16
***
# instrAlto 1.0522 0.2938 3.58 0.00043
***
# idade 0.0330 0.0117 2.82 0.00536
**
# casadoSim 0.5538 0.2574 2.15 0.03265
*
# sexoMasculino -0.7603 0.3506 -2.17 0.03134
*
# ---
# Signif. codes: 0 '
***
' 0.001 '
**
' 0.01 '
*
' 0.05 '.' 0.1 ' ' 1
#
# Residual standard error: 1.74 on 196 degrees of freedom
# Multiple R-squared: 0.536,Adjusted R-squared: 0.525
# F-statistic: 45.4 on 5 and 196 DF, p-value: <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:
7.4. REGRESSO LOGSTICA 98
sen$eleito <- (sen$resultado == "Eleitos")
modelo4 <- glm(eleito ~ log.vgasto + idade, data = sen,
family = binomial(link = "logit"))
summary(modelo4)
#
# Call:
# glm(formula = eleito ~ log.vgasto + idade,
# family = binomial(link = "logit"),
# data = sen)
#
# Deviance Residuals:
# Min 1Q Median 3Q Max
# -1.5540 -0.5588 -0.2786 -0.0833 2.5112
#
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -18.4673 4.0218 -4.59 4.4e-06
***
# log.vgasto 0.9835 0.2598 3.79 0.00015
***
# idade 0.0442 0.0207 2.14 0.03250
*
# ---
# 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 on 201 degrees of freedom
# Residual deviance: 123.32 on 199 degrees of freedom
# AIC: 129.3
#
# Number of Fisher Scoring iterations: 6
No possvel calcular a estatstica R
2
para modelos de regresso
logsticos, mas a funo LogRegR2() do pacote descr calcula algumas
das estatsticas comumente utilizadas em substituio ao R
2
:
library(descr)
LogRegR2(modelo4)
# Qui
2
35.57
# Gl 2
# Sig. 1.887e-08
# ndice de Cox e Snell 0.1615
# ndice de Nagelkerke 0.2965
# R
2
de McFadden 0.2239
CAPTULO 8
GRFICOS
Neste captulo, veremos comomodicar ocomportamentopadro
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 fun-
es ou que o dispositivo seja explicitamente fechado com a funo
dev.off(). Os trs 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, (b) especicar
valores de argumentos da funo que ir gerar o grco e (c) acrescen-
tar novos elementos a grcos j criados. Na prtica, o procedimento
para produzir grcos consiste em:
1. Chamar a funo que ir produzir o grco sem especicar mui-
tos argumentos.
2. Se o grco no car comqualidade satisfatria para ser includo
num relatrio de pesquisa, executar novamente a funo, agora
especicando os valores de um maior nmero de argumentos.
3. Se isso ainda no for suciente para atingir o objetivo preten-
dido, modicar os parmetros globais da produo dos grcos
e executar a funo novamente.
99
8.1. TTULO, SUBTTULO E RTULOS 100
4. Adicionar elementos ao grco (texto, legenda, pontos, linhas,
desenhos etc.).
5. Repetir os passos 2, 3 e 4 at obter o resultado desejado.
Formas especcas de implementar esses procedimentos sero
apresentadas nas prximas sees.
A funo plot() genrica, ou seja, possui vrios mtodos para
objetos de classes diferentes. Isso signica que, ao chamarmos a fun-
o plot(), ela verica qual a classe do objeto que lhe foi passado
como argumento e chama o mtodo apropriado. Consequentemente,
para descobrir os argumentos que podem ser adicionados funo
plot() preciso ler no apenas a ajuda da prpria funo, mas tam-
bma ajuda do mtodo plot para o objeto que est sendo plotado. Por
exemplo, a funo freq(), do pacote descr, cria um objeto de classe
freqtable, e o pacote possui um mtodo plot para objetos dessa
classe. Assim, para obter informaes sobre esse mtodo, deve-se di-
gitar help(plot.freqtable). Por outro lado, a funo compmeans(),
embora tambm crie um grco, no possui um mtodo plot pr-
prio porque no acrescenta nenhum argumento especial funo
boxplot(), que chamada internamente. Assim, para conhecer os
argumentos especcos do grco criado por compmeans(), preciso
consultar a documentao da funo boxplot(). Para encontrar todas
as opes de congurao relacionadas produo de grcos no
R preciso consultar a documentao da funo que estiver sendo
utilizada e de vrias outras, entre elas:
?plot
?plot.default
?par
8.1 TTULO, SUBTTULO E RTULOS
Os argumentos mais comuns para a incluso de ttulos e rtu-
los nos grcos j foram utilizados nos captulos anteriores. Algumas
funes e alguns mtodos da funo plot() aceitam os argumentos
diretamente. Em outros casos, precisamos usar a funo title() para
8.2. CORES 101
adicionar os ttulos e rtulos aps produzir o contedo principal do
grco. Os principais argumentos para controlar ttulos e rtulos so:
main (ttulo principal), sub (subttulo), xlab (rtulos do eixo x) e ylab
(rtulos do eixo y).
Os argumentos acima, com ou sem a funo title(), foram uti-
lizados nos captulos anteriores e no h necessidade de apresentar
novos exemplos (veja no ndice Remissivo as pginas em que ocorrem
as palavras-chaves title, plot, boxplot, freq, crosstab, mosaicplot
etc.).
8.2 CORES
Existem vrias formas de fazer referncia a cores no R. At agora
utilizamos nomes, como red, green, yellow, e uma lista completa
dos nomes de cores conhecidos pelo R pode ser obtida com a funo
colors(). Podemos tambm criar cores personalizadas usando a fun-
o 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.40)
goiaba.semitrans <- rgb(0.94, 0.41, 0.40, alpha = 0.5)
vitamina <- rgb(red = c(0.87, 0.70), green = c(0.83, 0.77),
blue = c(0.71, 0.30), names = c("leite", "abacate"))
Outra forma de especicar cores utilizando o cdigo HTML cor-
respondente, ou seja, o smbolo # seguido dos valores vermelho, verde,
azul e (opcionalmente) opacidade, em notao hexadecimal, de 00 a
FF. Podemos utilizar outros programas, como gcolor2, gimp ou kco-
lorchooser, para criar ou capturar cores e obter seu cdigo HTML. No
exemplo abaixo, criamos mais uma cor e reunimos todas as cores cria-
das at agora num nico vetor:
uva <- "#AD4DA3"
salada <- c(vitamina, uva, goiaba, goiaba.semitrans)
8.3. ADICIONAR PONTOS, LINHAS, POLGONOS, TEXTOS 102
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 pa-
lheta 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" "magenta"
# [7] "yellow" "gray"
palette(salada)
palette()
# [1] "#DED4B5" "#B3C44D" "#AD4DA3" "#F06966" "#F0696680"
palette("default")
palette()
# [1] "black" "red" "green3" "blue" "cyan" "magenta"
# [7] "yellow" "gray"
Nas guras 11.1 e 11.2 (p. 136 e 138) 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 gr-
cas do Rproduz resultado satisfatrio, mas, emalgumas circunstncias,
podemos precisar adicionar mais elementos aos grcos, como textos,
pontos ou desenhos. Nesta seo, a incluso desses elementos em gr-
cos ser exemplicada pela produo do grco da Figura 8.1, cuja
montagem ser explicada passo a passo.
8.3. ADICIONAR PONTOS, LINHAS, POLGONOS, TEXTOS 103
FIGURA 8.1: Ferramentas de desenho
0.0 0.5 1.0 1.5 2.0
0
.
0
0
.
5
1
.
0
1
.
5
2
.
0
G G
G
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
esquerda direita
i
n
c
l
i
n
a
d
o
pequeno
grande
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.
8.3. ADICIONAR PONTOS, LINHAS, POLGONOS, TEXTOS 104
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 coordena-
das (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 coordena-
das, mas alinhamentos contrrios. O argumento offset dene quantos
caracteres o texto car distante das suas coordenadas, no caso de pos
ter sido utilizado.
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 queminclinados como argumento srt, cujo
valor deve ser fornecido em graus:
text(0.16, 0.6, labels = "inclinado", srt = 46)
Como j exemplicado, o argumento cex modica o tamanho da
letra. Isso ca mais claro com os textos pequeno e grande adicio-
nados 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 coordenadas 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")
8.4. PARMETROS GLOBAIS 105
possvel, ainda, com a funo abline(), adicionar linhas que
correspondem a uma funo de 1 grau. Os dois argumentos obriga-
trios so a coordenada y, quando x = 0, e a inclinao da linha (o
acrscimo em y para cada aumento de uma unidade em x):
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 o ltimo retn-
gulo desenhado se sobrepe parcialmente sobre os demais polgonos,
mas tem cor semitransparente:
polygon(c(0.3, 0.8, 0.5), c(1.7, 2.0, 1.2), col = goiaba)
rect(0, 1.5, 0.5, 2.0, col = vitamina["abacate"])
rect(0.2, 1.0, 1.0, 1.7, col = goiaba.semitrans)
8.4 PARMETROS GLOBAIS
Os grcos doRobedecema 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 oparmetroseja modicadopor nova chamada a par(), ouque
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 de caracteres (padro = 1.0).
cex.axis: valor para redimensionamento do texto dos eixos.
cex.lab: valor para redimensionamento dos rtulos dos eixos.
1
Veja a ajuda da funopara formas alternativas de especicar a linha a ser plotada.
Um uso comum a adio da linha de regresso a um grco de disperso entre duas
variveis numricas.
8.4. PARMETROS GLOBAIS 106
cex.main: valor para redimensionamento do ttulo principal.
cex.sub: valor para redimensionamento 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.
las: orientao dos rtulos dos eixos x e y (0 = rtulos sempre
paralelos aos eixos, 1 = sempre horizontais, 2 = sempre perpen-
diculares aos eixos, 3 = sempre verticais).
mai: vetor de nmeros especicando as margens do grco em
polegadas (baixo, esquerda, topo, direita).
mar: vetor de nmeros especicando as margens do grco em
linhas (baixo, esquerda, topo, direita).
mfcol, mfrow: vetor na forma c(nlinhas, ncolunas) especi-
cando 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 umnmero
inteiro ou por um caractere.
srt: rotao de textos em graus.
Para consultar ovalor de umparmetro, chamamos a funopar()
usando o nome do parmetro como argumento:
8.4. PARMETROS GLOBAIS 107
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 parme-
tros grcos, convm salvar os valores atuais para facilitar a sua restau-
rao 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))
Algumas funes repassam para par() parmetros grcos pas-
sados para elas como argumentos, mas outras no. Assim, em alguns
casos, no necessrio modicar os parmetros globalmente apenas
para alterar o resultado de umgrco, mas emoutros 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 (este , geralmente, o procedimento mais
rpido).
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 car-
regar 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 pri-
meira, mais simples, vamos apenas fazer umgrco de barras horizon-
tais. 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.
8.4. PARMETROS GLOBAIS 108
par(mar = c(2.1, 18.8, 2.1, 0.1), cex = 0.7)
plot(relig, main = "Religio", las = 1, horiz = TRUE)
FIGURA 8.2: Grco de barras de varivel com rtulos longos
Ateu
Budista
Candombl
Catlica
Esprita kardecista
Evanglica nopentecostal
Evanglica pentecostal
Judaica
Mormon, Adventista, Testemunha de Jeov
No tem religio
NR
NS
Santo Daime, Esotrica, Outras
SeishoNI, Messinica
Umbanda
Religio
0 500 1000 1500
O objetivo, na segunda verso do grco, manter as barras ver-
ticais. A soluo mais simples seria aumentar a margem inferior e,
analogamente ao que zemos no grco anterior, posicionar, perpen-
dicularmente ao eixo, as anotaes com os rtulos das categorias da
varivel. Mas, para facilitar a leitura dos rtulos, resolvemos posicion-
los diagonalmente, comona Figura 8.3. Para obter oresultadoesperado,
alm de redimensionar as margens, produzimos o grco sem os no-
mes das barras (names =FALSE). 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. Um dos
problemas que precisamos resolver foi o posicionamento de cada r-
tulo. Ovalor retornado pela funo plot(), nesse caso, o vetor como
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 15 vezes). Normalmente, a funo text() utilizada apenas
para acrescentar texto na regio interna dos grcos, e qualquer texto
8.4. PARMETROS GLOBAIS 109
que exceda essa regio truncado. Para que isso no ocorresse, 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(10.8, 2.1, 2.1, 0.1), cex = 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 = TRUE)
FIGURA 8.3: Grco de barras de varivel com rtulos longos (II)
Religio
0
5
0
0
1
0
0
0
1
5
0
0
A
t
e
u
B
u
d
i
s
t
a
C
a
n
d
o
m
b
l
C
a
t
l
i
c
a
E
s
p
r
i
t
a
k
a
r
d
e
c
i
s
t
a
E
v
a
n
g
l
i
c
a
n
p
e
n
t
e
c
o
s
t
a
l
E
v
a
n
g
l
i
c
a
p
e
n
t
e
c
o
s
t
a
l
J
u
d
a
i
c
a
M
o
r
m
o
n
,
A
d
v
e
n
t
i
s
t
a
,
T
e
s
t
e
m
u
n
h
a
d
e
J
e
o
v
o
t
e
m
r
e
l
i
g
i
o
N
R
N
S
S
a
n
t
o
D
a
i
m
e
,
E
s
o
t
r
i
c
a
,
O
u
t
r
a
s
S
e
i
s
h
o
,
M
e
s
s
i
n
i
c
a
U
m
b
a
n
d
a
Concluda a produo do grco, pode ser conveniente recongu-
rar os parmetros para os valores iniciais:
par(antigopar)
8.5. LEGENDAS 110
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 pre-
enchimento dos quadrados (ll), largura das linhas (lwd), presena
de ttulo (title), cor do ttulo (title.col), presena de caixa em torno 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 = "", col = "white")
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", title.col = "blue", horiz = TRUE,
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 = TRUE)
FIGURA 8.4: Exemplos de legendas
0.6 0.8 1.0 1.2 1.4
1
.
0
0
.
5
0
.
0
0
.
5
1
.
0
a
b
c
d
linha 1
linha 2
e
f
ttulo
g h i
j
k
l
m
o
p
q
r
s
t
u
v
CAPTULO 9
PRODUO DE
RELATRIOS
9.1 RESULTADO EM TEXTO PLANO
A forma mais simples de relatrio obtida pela execuo do script
utilizado para realizar as anlises dos dados de forma a produzir um
documento com a cpia do cdigo intercalada com os resultados
da execuo. 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 re-
sultados 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.
Antes de iniciarmos os procedimentos de produo de relatrios,
vamos carregar o banco de dados sobre os candidatos ao Senado em
2006 que ser utilizado durante o captulo:
111
9.1. RESULTADO EM TEXTO PLANO 112
load("senado2006.RData")
Em qualquer sistema operacional, possvel salvar os 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:
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 ana-
lise2006.txt, que ser criado na pasta ~/.
1
O redirecionamento dos
resultados nalizadocoma execuoda funosink(), semnenhum
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 signi-
cado de alguns caracteres. No caso, n passa a signicar nova linha.
Sem a incluso de \n, a primeira linha do resultado do comando ta-
ble(sexo, resultado) teria sido impressa ao lado do ttulo da tabela.
Um relatrio em texto plano, criado por R CMD BATCH ou pela fun-
o 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.
1
O signicado de / foi explicado na seo 2.4, tabelas 2.1 e 2.2.
9.2. MAPA DE BITS versus GRFICO VETORIAL 113
9.2 MAPA DE BITS versus GRFICO VETORIAL
Para apresentar os resultados numa publicao, basicamente
necessrioinserir guras e tabelas notexto. 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 divi-
dido 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 imagem 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, bemcomo 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 mantmsempre
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,
9.3. INSERO DE GRFICOS EM RELATRIOS 114
podendo torn-lo, em alguns casos, absurdamente grande e lento de
desenhar. Nesses casos, prefervel usar umgrco no formato bitmap.
Segue uma lista dos formatos mais comumente utilizados dentre
os que o R pode produzir:
svg: Formato vetorial. O LibreOfce consegue incluir imagens
nesse formato e esta geralmente ser a melhor opo. O arquivo
svgse tornar muitogrande se ogrcocontiver muitos milhares
de pontos e, neste caso, poder ser prefervel salv-lo no formato
png.
eps: Formato vetorial. Pode ser a melhor opo para insero
em documento do Word.
png: Formato bitmap com compresso, mas sem perda de qua-
lidade com a compresso. o formato mais adequado quando,
por algum motivo, no possvel usar um formato vetorial.
jpg: Formato bitmapcomcompresso e comperda de qualidade
devido compresso. o formato ideal para imagens complexas,
como fotos. Geralmente inadequado para grcos estatsticos.
pdf: Formato vetorial. Pode ser inserido em documentos produ-
zidos com L
A
T
E
X.
9.3 INSERO DE GRFICOS EM RELATRIOS
Como j comentado, para inserir grcos com qualidade satisfa-
tria no LibreOfce Writer, existem muitas opes. Uma delas salvar
o grco no formato svg. O primeiro argumento o nome do arquivo
que conter a gura. A largura (width) e a altura (height) do grco so
expressas em polegadas. O grco somente efetivamente gravado
em disco aps o comando dev.off() (resultados omitidos):
library(descr)
svg("civilXres.svg", height = 4, width = 6, onefile = FALSE)
par(xpd = TRUE)
crosstab(sen$resultado, sen$est.civil, las = 1, ylab = "Estado civil",
xlab = "Resultado")
dev.off()
9.4. R E MARKDOWN 115
Outra opo salvar o grco no formato png, escolhendo uma
resoluo alta (no nosso exemplo, res = 600), o que garantir boa qua-
lidade 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 obrigat-
rio). 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)
par(xpd = TRUE)
crosstab(sen$resultado, sen$est.civil, las = 1,
ylab = "Estado civil", xlab = "Resultado")
dev.off()
Para inserir a gura numdocumentode textodoLibreOfce Writer,
deve-se clicar no menu Inserir / Figura / De um arquivo... A informa-
o 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 dese-
jado da gura diretamente em pixels (resultados omitidos):
png("civilXres2.png", height = 500, width = 700)
crosstab(sen$resultado, sen$est.civil, las = 1,
ylab = "Estado civil", xlab = "Resultado")
dev.off()
9.4 R E MARKDOWN
Uma forma prtica de produzir relatrios de pesquisa com quali-
dade satisfatria pelo uso de arquivos do tipo Rmd, que combinam as
linguagens R e Markdown. Por serem arquivos de texto plano, podem
ser editados pelos mesmos editores utilizados para elaborar cdigo do
R, incluindo a possibilidade de enviar cdigo para o console, permi-
tindo test-lo. Isso torna a produo do relatrio dinmica, simultnea
9.4. R E MARKDOWN 116
realizao da anlise dos dados. O cdigo do R usado para gerar -
guras, tabelas e outros elementos do relatrio. O cdigo em linguagem
Markdown convertido em HTML e cdigo HTML existente no corpo
do texto ser preservado.
O cdigo do R deve ser precedido por uma linha no formato
```{r apelidodocodigo, opes}
e seguido por uma linha contendo apenas os smbolos ```, como no
exemplo abaixo:
```{r exemplo, echo=TRUE}
x <- 1:10
x
```
No documento processado, o trecho acima desapareceria, e em
seu lugar teramos:
x <- 1:10
x
# [1] 1 2 3 4 5 6 7 8 9 10
Na lista abaixo esto as principais opes para processamento
do cdigo, com os valores aceitos entre parnteses, sendo o primeiro
deles o valor padro:
2
echo (TRUE, FALSE): Dene se os comandos devem ser impres-
sos ou no.
results (markup, asis , hide): Dene como devem ser apre-
sentados os resultados produzidos, equivalentes ao que seria
impresso no console do R. Com a opo hide, nenhum resul-
tado includo no documento nal, e com a opo markup a
funo knit() inclui o resultado diretamente no documento
tex resultante, mas com o cuidado de adicionar um ambiente
2
A lista completa de opes est disponvel em http://yihui.name/knitr.
9.4. R E MARKDOWN 117
que torna o resultado semelhante ao que vemos no console do R.
Com a opo asis, o resultado bruto inserido no documento
sem nenhum cuidado especial, ou seja, o prprio resultado j
deve estar na linguagem Markdown ou HTML.
fig.width e fig.height: Referem-se, respectivamente, lar-
gura e altura em polegadas da gura que ser produzida pelo
trecho de cdigo.
dpi (72): Indica o nmero de pontos por polegada das guras.
O valor padro adequado para exibio em tela, mas para im-
presso recomendvel uma resoluo maior.
O cdigo abaixo inclui as opes echo = FALSE e results = hide e,
consequentemente, no incluir nada no documento nal. Entretanto
os valores de n e x sero computados e podero ser usados nos trechos
seguintes do documento:
```{r exemplo, echo=FALSE, results='hide'}
n <- 1:100
x <- mean(n)
```
Em qualquer lugar do texto, podemos acrescentar o cdigo `r x`,
onde x algum cdigo vlido do R que resulte na impresso de algum
texto. No nosso exemplo, o resultado seria: 50.5. O arquivo exemploR-
Markdown.Rmd contm exemplos de insero de gura, de tabela e de
uso de `r x` no corpo do texto.
A funo knit2html() converte um arquivo de extenso Rmd em
html. O arquivo html pode ser aberto num processador de texto como
o Libre Ofce ou o Microsoft Word. No Linux, possvel converter o do-
cumento html emodt se o Libre Ofce estiver instalado. Caso contrrio,
para ter maior liberdade de edio do contedo, pode ser necessrio
selecionar todo o contedo e colar em novo documento. Se a gura
car com tamanho incorreto, pode-se dar um duplo clique sobre ela e
clicar no boto Tamanho original da caixa de dilogo das propriedades
da imagem. Dica: no Libre Ofce, clique em Arquivo / Recarregar para
9.5. R E L
A
T
E
X 118
atualizar a visualizao do documento sempre que zer alteraes no
arquivo Rmd e gerar um novo odt.
library(knitr)
knit2html("exemploRMarkdown.Rmd", options = "")
# O comando seguinte funciona no Linux com Libre Office instalado,
# e no funciona se o Libre Office estiver aberto:
system("soffice --invisible --convert-to odt exemploRMarkdown.html")
LeiaatentamenteoarquivoexemploRMarkdown.Rmd, comparecom
o resultado produzido e experimente fazer alteraes para se acostu-
mar com os comandos.
9.5 R E L
A
T
E
X
A forma de produo de relatrios mais utilizada por usurios
avanados do R por meio de scripts combinando cdigo L
A
T
E
X com
cdigoRemarquivos que, usualmente, recebemextensoRnw. Usamos
o R para converter o arquivo Rnw num documento contendo apenas
cdigo L
A
T
E
X. O documento L
A
T
E
X pode, ento, ser convertido em pdf,
nalizando, assim, a produo do relatrio.
Alm da facilidade de integrao como R, o uso de L
A
T
E
X tem a van-
tagem de automatizar o processo de referncias cruzadas e referncias
bibliogrcas. A numerao de captulos, sees, tabelas e guras au-
tomtica, e a produo da bibliograa nal, de acordo com as normas
da ABNT, tambm automatizada: quando alguma referncia feita
a uma obra, a referncia bibliogrca completa automaticamente
adicionada bibliograa nal e, se for apagado o ltimo trecho do
texto contendo referncia a uma obra, a referncia na bibliograa nal
eliminada. Entretanto, foge do escopo deste livro ensinar o uso de
L
A
T
E
X. Nos prximos pargrafos, sero apresentados apenas os aspectos
mais importantes da integrao entre L
A
T
E
X e R.
Em documentos Rnw, o cdigo do R deve ser precedido por uma
linha no formato
<<apelidodocodigo,opes>>=
e seguido por uma linha contendo o smbolo @, como no exemplo
abaixo:
9.5. R E L
A
T
E
X 119
<<exemplo>>=
x <- 1:10
x
@
Existempelos menos duas formas de processar documentos desse
tipo para a produo de um relatrio no formato pdf: usando a funo
Sweave(), que faz parte da distribuio bsica do R, e usando a fun-
o knit(), do pacote knitr. A funo knit() foi desenvolvida mais
recentemente e tem inmeras vantagens em relao Sweave(). Por
isso, o arquivo exemploRnoweb.Rnw foi preparado para ser processado
pela funo knit(). Emdocumentos Rnw, a insero de cdigo do R no
corpo do texto feita com o cdigo \Sexpr{x}, onde x algum cdigo
vlido do R que resulta na impresso de algum texto. Assim como o ar-
quivo exemploRMarkdown.Rmd, o arquivo exemploRnoweb.Rnw contm
exemplos de insero de gura, de tabela e de uso de \Sexpr{}.
Para processar o documento, o procedimento :
library(knitr)
knit2pdf("exemploRnoweb.Rnw")
CAPTULO 10
TPICOS EM
PROGRAMAO
10.1 MANIPULAO DE TEXTO
A funo paste() usada para concatenar strings. Os elemen-
tos fornecidos como argumentos sero convertidos em character se
necessrio:
load("senado2006.RData")
paste("O banco de dados tem", nrow(sen), "linhas.")
# [1] "O banco de dados tem 202 linhas."
Por padro, a funo paste() concatena diferentes strings usando
um espao em branco como separador. Se no quisermos nenhum
espao entre as strings, tempos duas opes: denir o valor do argu-
mento sep como "" ou usar a funo paste0():
paste0("Mais homens do que mulheres se candidataram ao Senado (",
sum(sen$sexo == "Masculino"), "x",
sum(sen$sexo == "Feminino"), ").")
# [1] "Mais homens do que mulheres se candidataram ao Senado (172x30)."
Se os argumentos fornecidos a paste() forem vetores, o resultado
ser umvetor de strings, mas podemos usar o argumento collapse para
concatenar essas strings:
120
10.1. MANIPULAO DE TEXTO 121
numeros <- c(13, 45, 43)
candidatos <- c("Dilma", "Serra", "Marina")
paste(candidatos, numeros)
# [1] "Dilma 13" "Serra 45" "Marina 43"
paste(candidatos, numeros, sep = ", ", collapse = "; ")
# [1] "Dilma, 13; Serra, 45; Marina, 43"
Duas tarefas frequentemente importantes na manipulao de da-
dos so a localizao, e edio de texto. Para localizar um texto ou um
nmero especcos, podemos usar a funo grep(), a qual retorna
o(s) ndice(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:
palavras <- c("", "difcil", "achar", "uma", "agulha", "num",
"palheiro")
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. Am-
bas as funes recebemcomo argumentos o padro procurado, o texto
substituto e o vetor a ser modicado:
x <- c("abc abc abc", "abc abc abc")
sub("abc", "zz", x)
# [1] "zz abc abc" "zz abc abc"
gsub("abc", "zz", x)
# [1] "zz zz zz" "zz zz zz"
Na busca e substituio de strings, podemos usar expresses regu-
lares, ou seja, strings em que algumas sequncias de caracteres tm
signicado especial, como "\n" que j usamos vrias vezes para pro-
duzir quebra de linha. A seguir, veremos mais alguns exemplos.
Os smbolos ^ e $ tm signicado especial quando em expresses
regulares, signicando, respectivamente, incio e nal da string:
10.1. MANIPULAO DE TEXTO 122
x <- c("abcx", "xabc", "abc")
grep("^abc", x)
# [1] 1 3
sub("abc$", "zz", x)
# [1] "abcx" "xzz" "zz"
No cdigo acima, o comando usando a funo grep() no iden-
ticou o segundo elemento de x como correspondendo expresso
regular porque as letras abc no eram as trs primeiras letras da string,
e o comando usando a funo sub() no fez a substituio no primeiro
elemento de x porque as ltimas letras no eram abc.
O smbolo . signica qualquer caractere, e, do conjunto de strings
de quatro letras abaixo, somente sero substitudas aquelas em que a
primeira letra for a e ltima for d:
x <- c("abcd", "aaaa", "aefd", "bbbb")
sub("a..d", "zzzz", x)
# [1] "zzzz" "aaaa" "zzzz" "bbbb"
O smbolo
*
indica que o caractere precedente deve ser repetido
zero ou mais vezes:
sub("a
*
", "", x)
# [1] "bcd" "" "efd" "bbbb"
sub("b.
*
", "", x)
# [1] "a" "aaaa" "aefd" ""
Os smbolos [ e ] delimitam uma sequncia de caracteres a serem
identicados, podendo ser usado um hfen para dispensar a digitao
de valores intermedirios:
x <- "abcdefghijklmnopqrstuvwxyz"
gsub("[bf]", ".", x)
# [1] "a.cde.ghijklmnopqrstuvwxyz"
gsub("[b-f]", ".", x)
# [1] "a.....ghijklmnopqrstuvwxyz"
gsub("[b-fp-ry]", ".", x)
# [1] "a.....ghijklmno...stuvwx.z"
10.2. FUNES 123
No primeiro comando do cdigo acima, so identicadas apenas
as letras b e f, enquanto no segundo so identicadas as letras bcdef,
sendo substitudas na expresso regular por um hfen as letras cde (ou
seja, as letras que, por ordemalfabtica, esto entre b e f). Observe que
ponto no tem signicado especial porque ele no est no primeiro
argumento passado para a funo sub() e, portanto, no faz parte de
uma expresso regular.
Os smbolos ( e ) delimitam um grupo de caracteres que poder
ser utilizado numa substituio, sendo, ento, referenciado por \\n,
sendo n o nmero correspondente ao grupo:
x <- c("xcdab", "xghef", "xklij")
sub("x(..)(..)", "
*
\\2\\1", x)
# [1] "
*
abcd" "
*
efgh" "
*
ijkl"
No exemplo acima, especicamos que os trechos contendo um x,
seguido de quatro caracteres, sendo os dois primeiros parte do que de-
nimos como primeiro grupo e os outros dois parte do que denimos
como segundo grupo, deveriam ser substitudos por um
*
seguido do
segundo grupo e do primeiro grupo.
Vimos aqui apenas alguns exemplos ilustrativos das situaes
mais comuns de uso de expresses regulares. Para umtratamento mais
completo do tema, consulte a documentao do R sobre o assunto:
?regex
10.2 FUNES
Como j foi dito antes, 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, recomen-
dvel 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 hipote-
nusa(), que recebe como argumentos dois objetos, a e b (que devero
10.3. BLOCOS ENTRE CHAVES 124
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.000 6.403 7.810
Para criar uma funo, usamos o smbolo de atribuio <-, como
na criao de qualquer objeto. Em seguida a expresso function(){}.
Entre os parnteses 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.3 BLOCOS ENTRE CHAVES
Nafunoque nos serviude exemplonaseoanterior, ocdigoda
funo est entre chaves. As chaves delimitam as linhas de cdigo que
o R dever interpretar como parte da funo, e sero 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
A delimitao de trechos de cdigo entre chaves utilizada 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 til
acrescentar chaves para tornar a leitura do cdigo mais clara.
10.4. EXECUO CONDICIONAL DE CDIGO 125
10.4 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 parnteses. 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'
Uma fonte comum de confuso para iniciantes que os valores
NULL e NA no podem ser usados diretamente em testes lgicos, sendo
necessrio usar as funes is.null() e is.na(). Exemplos:
nada <- NULL
nada == NULL
# logical(0)
is.null(nada)
# [1] TRUE
ausente <- c(1, 0, 1, NA, 0, 0, 1)
ausente == NA
# [1] NA NA NA NA NA NA NA
is.na(ausente)
# [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE
10.5. FAMLIA DE FUNES apply 126
10.5 FAMLIA DE FUNES apply
As funes da famlia apply podem ser usadas para evitar o uso
dos loops que sero vistos na seo 10.7. 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 to-
das 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 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
terceiro argumento deve ser a funo a ser aplicada. O valor retornado
por apply() um vetor com os resultados da aplicao da funo for-
necida 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:
b <- data.frame(x = c(1, 2, 3, 4, 2, 1, 3, 2, 1),
y = c(4, 5, 3, 6, 3, 5, 4, 4, 3))
apply(b, 1, sum)
# [1] 5 7 6 10 5 6 7 6 4
apply(b, 2, sum)
# x y
# 19 37
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, sempre que possvel, 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
10.5. FAMLIA DE FUNES apply 127
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
No cdigo abaixo (resultados omitidos), usamos a funo sap-
ply() para descobrir quais colunas de um data.frame produzido pela
funo read.spss() do pacote foreign contm categorias (levels) du-
plicadas. Esse um problema comum quando usamos um banco de
dados do SPSS preparado por terceiros, como, por exemplo, o banco
de dados do Estudo Eleitoral Brasileiro de 2002 disponvel no Consrcio
de Informaes Sociais.
1
No caso do ESEB 2002, uma das colunas com
rtulos repetidos a Q5. Esta varivel contm os nomes dos munic-
pios em que a pesquisa foi realizada, entre os quais, dois tm o mesmo
nome: Santa Rita.
eseb <- read.spss("BD
_
CIS
_
0012
_
vFinal.sav")
lbtb <- attr(eseb, "label.table")
dup <- sapply(lbtb, function(x) sum(duplicated(x)))
dup[dup > 0]
dup <- sapply(lbtb, function(x) sum(duplicated(names(x))))
dup[dup > 0]
q5lev <- levels(eseb$Q5)
q5lev[duplicated(q5lev)]
1
http://www.cis.org.br.
10.5. FAMLIA DE FUNES apply 128
A funo tapply() uma das mais importantes para cientistas
sociais. Ela agrega os valores de umvetor numrico segundo os valores
de alguma varivel categrica e, ento, aplica a funo a cada agregado
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.70, 1.68, 1.73, 1.83, 1.60, 1.76)
tapply(estatura, sexo, mean)
# F M
# 1.670 1.763
Os exemplos apresentados at aqui contmapenas as formas mais
simples de usar as funes da famlia apply. Para todas elas, possvel
fornecer argumentos adicionais a serem passados funo a ser apli-
cada. Por exemplo, no cdigo a seguir, a primeira tentativa de calcular
a mdia falha para as mulheres porque existe umNA entre os valores de
estatura; na segunda tentativa, passamos o argumento na.rm = TRUE
para a funo mean() e o clculo realizado corretamente:
sexo <- c("M", "F", "F", "M", "F", "M")
estatura <- c(1.70, NA, 1.73, 1.83, 1.60, 1.76)
tapply(estatura, sexo, mean)
# F M
# NA 1.763
tapply(estatura, sexo, mean, na.rm = TRUE)
# F M
# 1.665 1.763
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 escolari-
dade:
10.5. FAMLIA DE FUNES apply 129
load("senado2006.RData")
tapply(sen$votos, sen[, c("escola", "sexo")], mean)
# sexo
# escola Feminino Masculino
# L e Escreve NA 1416.0
# Ensino Fundamental incompleto 834785 26924.5
# Ensino Fundamental completo NA 44556.9
# Ensino Mdio incompleto 7050 600.5
# Ensino Mdio completo 55509 159130.4
# Ensino Superior incompleto 27828 465331.1
# Ensino Superior completo 446720 529390.2
Algumas clulas da tabela esto preenchidas com NA porque no
havia nenhum candidato ao senado com a correspondente combina-
o 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 sub-
conjuntos so criados segundo as categorias das variveis categricas
fornecidas como argumentos para a funo. Exemplo:
aggregate(sen[, c("vgasto", "votos", "p.valido")],
sen[, c("escola", "sexo")], mean)
# escola sexo vgasto votos p.valido
# 1 Ensino Fundamental incompleto Feminino 1410000 834785.0 28.1870
# 2 Ensino Mdio incompleto Feminino 2000000 7050.0 0.0380
# 3 Ensino Mdio completo Feminino 941250 55508.8 1.0917
# 4 Ensino Superior incompleto Feminino 125000 27827.5 0.7585
# 5 Ensino Superior completo Feminino 2254091 446720.2 18.7605
# 6 L e Escreve Masculino 30000 1416.0 0.0250
# 7 Ensino Fundamental incompleto Masculino 1002500 26924.5 0.9375
# 8 Ensino Fundamental completo Masculino 1083571 44556.9 2.1624
# 9 Ensino Mdio incompleto Masculino 700000 600.5 0.2020
# 10 Ensino Mdio completo Masculino 1884828 159130.4 9.4845
# 11 Ensino Superior incompleto Masculino 1668214 465331.1 15.1171
# 12 Ensino Superior completo Masculino 2318761 529390.2 14.9489
10.6. STRSPLIT(), UNLIST() E DO.CALL() 130
Para perceber melhor a diferena entre aggregate() e tapply(),
compare os resultados do cdigo abaixo (resultados omitidos):
tapply(sen$votos, sen[, c("escola", "sexo")], mean)
aggregate(list(votos = sen$votos), sen[, c("escola", "sexo")], mean)
10.6 STRSPLIT(), UNLIST() E DO.CALL()
Ocasionalmente, pode ser necessrio partir uma string em peda-
os, o que pode ser feito com a funo strsplit(), que recebe como
argumentos a string a ser partida e uma string que ser utilizada para
identicar o separador. O resultado uma lista de strings. Imagine,
por exemplo, que obtivemos um texto contendo uma lista de nomes
de pessoas e suas respectivas idades e que queremos construir uma
matriz com duas colunas, uma para os nomes e outra para as idades.
O primeiro passo seria partir a string de modo a separar os nomes das
idades:
x <- c("Maria = 25", "Jos = 27", "Pedro = 3")
xs <- strsplit(x, " = ")
xs
# [[1]]
# [1] "Maria" "25"
#
# [[2]]
# [1] "Jos" "27"
#
# [[3]]
# [1] "Pedro" "3"
O prximo passo seria usar a funo do.call():
do.call("rbind", xs)
# [,1] [,2]
# [1,] "Maria" "25"
# [2,] "Jos" "27"
# [3,] "Pedro" "3"
A funo do.call() recebe como argumentos o nome de uma
funo e uma lista contendo os argumentos a serempassados funo.
10.7. LOOPS for E while 131
Cada elemento da lista passado para a funo como se fosse um
argumento, O cdigo acima, por exemplo, equivalente a:
rbind(xs[[1]], xs[[2]], xs[[3]])
# [,1] [,2]
# [1,] "Maria" "25"
# [2,] "Jos" "27"
# [3,] "Pedro" "3"
Se o objetivo fosse simplesmente criar um vetor concatenando
todos os valores (nomes e idades), poderamos usar a funo unlist()
ou, novamente, a funo do.call():
unlist(xs)
# [1] "Maria" "25" "Jos" "27" "Pedro" "3"
do.call("c", xs)
# [1] "Maria" "25" "Jos" "27" "Pedro" "3"
A funo unlist() genrica e possui vrios mtodos. O mtodo
padro tenta concatenar os elementos de uma lista convertendo-a
num vetor.
A propsito, a partir da lista xs, poderamos reconstituir o objeto
x com o seguinte comando:
sapply(xs, function(x) paste(x[1], "=", x[2]))
# [1] "Maria = 25" "Jos = 27" "Pedro = 3"
10.7 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 executado contiver mais de uma linha. O loop
while tem sintaxe semelhante da condio if, ou seja, escrevemos
entre os parnteses 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.7. LOOPS for E while 132
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.
O loop for tem uma sintaxe um pouco mais complexa porque o
cdigo entre parnteses 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 parnteses no loop for no precisa, necessariamente, ser
numrico. No exemplo seguinte, ele o vetor do tipo character criado
na seo 10.1:
for(i in palavras)
if(i == "agulha") cat("Achei!\n")
# Achei!
Por ser mais compacto, o loop for deve ser usado quando sabe-
mos 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.8. A FUNO SOURCE() 133
10.8 A FUNO SOURCE()
A funo source() executa os comandos existentes num script
do R. Um princpio bsico de programao evitar repetio de c-
digo. Ao colocarmos um trecho de cdigo que dever ser executado
repetidamente num arquivo separado, podemos facilmente inclui-lo
em outros scripts do R sem ter que copiar e colar o texto, com a vanta-
gem adicional de que se percebermos a necessidade de melhorar ou
modicar o cdigo, faremos isso em apenas um arquivo. Se zssemos
cpias do cdigo emcada novo script que produzssemos, seria preciso
repetir as modicaes em todos eles.
CAPTULO 11
MAPAS
Neste captulo, veremos como usar o Rpara criar mapas usando ar-
quivos 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 diretrio emque se encontramos arqui-
vos e a raiz comum dos nomes dos arquivos como argumento para a
funo readOGR(), do pacote rgdal. Afuno cria umobjeto contendo
os polgonos cujos permetros correspondem s unidades geogrcas
do mapa. As coordenadas x e y dos polgonos tm os mesmos valores,
respectivamente, da longitude e da latitude dos pontos do mapa. O
objeto criado pela funo readOGR() tambm inclui um data.frame
com informaes adicionais, e o mapa pode ser desenhado com a fun-
o plot(). No exemplo abaixo, criamos o objeto br contendo o mapa
do Brasil:
dir("mapa
_
BR")
# [1] "BRASIL.dbf" "BRASIL.shp" "BRASIL.shx"
library(rgdal)
br <- readOGR("mapa
_
BR", "BRASIL")
# OGR data source with driver: ESRI Shapefile
# Source: "mapa
_
BR", layer: "BRASIL"
# with 27 features and 3 fields
# Feature type: wkbPolygon with 2 dimensions
1
Ver, por exemplo, ftp://geoftp.ibge.gov.br/malhas
_
digitais. O mapa do
Brasil utilizado neste captulo foi obtido do stio http://www.gismaps.com.br/
divpol/divpol.htm em 05 de setembro de 2009.
134
MAPAS 135
summary(br)
# Object of class SpatialPolygonsDataFrame
# Coordinates:
# min max
# x -73.84 -34.858
# y -33.77 5.383
# 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<a0>: 1 NO:7
# AP : 1 Amazonas: 1 SE:4
# BA : 1 Bahia : 1 SU:3
# CE : 1 Cear<a0>: 1
# (Other):21 (Other) :21
O objeto br, criado com os comandos acima, uma lista de po-
lgonos, e cada linha do data.frame contm informaes sobre um
dos polgonos da lista. Como podemos observar pelo resultado de sum-
mary(), o data.frame deste mapa contm trs variveis, UF, ESTADO e
REGIAO. No utilizaremos a varivel ESTADO do data.frame, mas o lei-
tor interessado pode corrigir a codicao de caracteres dessa varivel
com a funo toUTF8(), do pacote descr:
library(descr)
br$ESTADO <- toUTF8(br$ESTADO, "IBM850")
O procedimento para produo de mapas consiste na colorizao
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")
2
Ver seo 8.2 para maiores informaes sobre o uso de cores.
MAPAS 136
FIGURA 11.1: Exemplo de mapa
Mapa poltico do Brasil
Objetos desse tipo no aceitam o parmetro main quando produ-
zindo 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 = TRUE)
idh <- idh[, c("UF", "ano05")]
names(idh) <- c("UF", "idh05")
Em seguida, teremos que fazer a juno dos dados do IDH com
o data.frame do objeto br contendo informaes no cartogrcas
sobre os polgonos do mapa. Para isso, usaremos a funo merge(),
mas, antes, vamos converter de factor para character as variveis UF
do mapa e do banco de dados com os IDHs. Isso permitir funo
merge() comparar as duas variveis que possuem os mesmos rtulos,
mas em sequncias diferentes:
MAPAS 137
idh$UF <- as.character(idh$UF)
br$UF <- as.character(br$UF)
br <- merge(br, idh)
Finalmente, vamos criar, com a funo cut(), uma varivel cate-
grica comfaixas 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$idhc05 <- cut(br$idh05, 4)
levels(br$idhc05)
# [1] "(0.677,0.726]" "(0.726,0.776]" "(0.776,0.825]" "(0.825,0.874]"
Assim como no mapa anterior, na Figura 11.2 colorimos as Unida-
des de Federao usando os levels de uma varivel categrica como
nmeros das cores da palheta. Para o posicionamento da legenda,
usamos coordenadas geogrcas de um ponto localizado numa das
reas em branco do mapa. Os valores apresentados na legenda so o
resultado do comando levels(idhc), digitado acima.
palette(c("#779999", "#99bbbb", "#bbdddd", "#ddffff"))
plot(br, col = br$idhc05)
title("IDH dos Estados Brasileiros em 2005")
legend(-74, -18, bty = "n", fill = 4:1,
legend = levels(br$idhc05)[4:1])
MAPAS 138
FIGURA 11.2: Exemplo de mapa (II)
IDH dos Estados Brasileiros em 2005
(0.825,0.874]
(0.776,0.825]
(0.726,0.776]
(0.677,0.726]
Poderamos acrescentar linhas, pontos ou texto ao mapa usando
as coordenadas de acidentes geogrcos, estradas ou cidades 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 empre-
gada comumdata.frame. Noexemplo, acrescentamos as abreviaturas
das unidades da federao ao mapa. Para tanto, utilizamos a funo
coordinates() para extrair do objeto ne uma matrix com as coorde-
nadas dos centroides dos polgonos. Os centroides correspondem s
coordenadas geogrcas do centro da unidade da federao.
MAPAS 139
ne <- br[br$REGIAO == "NE", ]
plot(ne, col = rainbow(9, 0.4))
text(coordinates(ne), as.character(ne$UF), cex = 0.7)
FIGURA 11.3: Mapa do Nordeste do Brasil
AL
BA
CE MA
PB
PE
PI
RN
SE
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 redes pequenas, e funes
capazes de lidar de modo eciente com redes grandes. 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,
Pedro --+ Francisco,
Paulo --+ Francisco +-- Cristina,
Maria +-- Manoel +-- Carlos,
Ana --+ Paulo --+ Carlos,
Manoel --+ Aline +-+ Sandra +-- Helena,
Paulo --+ Manoel +-- Ana,
Francisco --+ Maria
)
Afunograph.formula() recebe comoargumentos dois oumais
nomes de vrtices ligados pelos sinais - e + simbolizando arestas, em
que o sinal + representa a ponta da seta. possvel tambm fazer
140
ANLISE DE REDES SOCIAIS 141
a ligao usando apenas o smbolo - e, nesse caso, a rede ser no-
direcional. No necessrio o uso de aspas nos nomes dos vrtices se
eles no contiveremespaos embranco. Para visualizar a rede, usamos
plot(), como ilustrado na Figura 12.1.
plot(g)
FIGURA 12.1: Sociograma
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
A funo tkplot() permite escolher manualmente a posio dos
vrtices. Para tanto, deve-se criar umobjeto como resultado da funo
e utiliz-lo como argumento para a funo tkplot.getcoords(), que
somente deve ser chamada quando os vrtices tiverem sido manual-
mente posicionados. Depois de guardadas as coordenadas numobjeto,
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):
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 autom-
tico. Os objetos da classe igraph podem receber, por meio da funo
ANLISE DE REDES SOCIAIS 142
set.graph.attribute(), vrios atributos que sero, ento, utilizados
em todos os sociogramas produzidos. A funo recebe como argumen-
tos o objeto da classe igraph, o nome do atributo e o valor do atributo.
No exemplo anterior, estipulamos que o layout do grco seria deter-
minado pelas coordenadas dos vrtices denidas manualmente com
a funo tkplot().
Nocdigoabaixo, primeiramente, chamamos afunoset.seed()
com um valor qualquer para evitar que os grcos produzidos por
nosso script tenham layouts diferentes cada vez que o script for execu-
tado. Isso ocorreria porque o algoritmo de produo de layout faz uso
de nmeros pseudoaleatrios. Ao usar a funo set.seed(), garanti-
mos que os nmeros pseudoaleatrios 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 ob-
ter a lista de nomes, e a funo set.vertex.attribute() para deter-
minar que os rtulos dos vrtices devero ser os nomes. Outros atri-
butos 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 co-
lorir 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
ANLISE DE REDES SOCIAIS 143
de proximidade de um vrtice proporcional distncia mdia dele
para todos os outros vrtices, e o grau de intermediao indica o n-
mero de vezes em que um vrtice representa o caminho mais curto
entre dois outros vrtices. O grau de proximidade dos vrtices foi cal-
culada 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)
proxi <- closeness(g)
proxi.max <- max(proxi)
cores.p <- 5 - round(4
*
(proxi / proxi.max))
cores.p <- cores[cores.p]
inter <- betweenness(g)
inter.max <- max(inter)
cores.i <- 5 - round(4
*
(inter / 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. Oparmetro mar foi ajustado para
reduzir o espao do grco gasto com margens em branco.
par(mfrow = c(1, 2), mar = c(0, 0, 1, 2) + 0.1, cex = 0.7, xpd = TRUE)
plot(g, vertex.color = cores.p, main = "Proximidade")
par(mar = c(0, 1, 1, 1) + 0.1)
plot(g, vertex.color = cores.i, main = "Intermediao")
ANLISE DE REDES SOCIAIS 144
FIGURA 12.2: Sociogramas dos graus de centralidade e intermediao
Proximidade
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Intermediao
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
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 conta-
das 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 execut-lo, evitando interrupo
na execuo do script causada por erro de computao, 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
alfa, correspondendo centralidade alfa, somente sero executados
se alfa tiver sido criado. A centralidade alfa calculada considerando
no apenas o nmero de arestas que apontam para um vrtice, mas
tambm a centralidade dos vrtices 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).
central <- degree(g, mode = "in")
central.max <- max(central)
cores.c <- 5 - round(4
*
(central / central.max))
cores.c <- cores[cores.c]
try(alfa <- alpha.centrality(g, alpha = 0.5))
ANLISE DE REDES SOCIAIS 145
if(exists("alfa")){
alfa.min <- min(alfa)
if(alfa.min < 0)
alfa.min <- alfa.min
*
(-1)
alfa2 <- alfa + alfa.min
alfa2.max <- max(alfa2)
cores.a <- 5 - round(4
*
(alfa2 / alfa2.max))
cores.a <- cores[cores.a]
}
par(mfrow = c(1, 2), mar = c(0, 0, 1, 2) + 0.1, cex = 0.7, xpd = TRUE)
plot(g, vertex.color = cores.c, main = "Centralidade")
par(mar = c(0, 1, 1, 1) + 0.1)
if(exists("alfa"))
plot(g, vertex.color = cores.a, main = "Centralidade alfa")
FIGURA 12.3: Sociogramas dos graus de centralidade
Centralidade
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Centralidade alfa
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Outro procedimento frequentemente til a identicao dos
maiores cliques de uma rede, ou seja, dos maiores grupos de vrti-
ces mutuamente relacionados. Isso pode ser feito com a funo lar-
gest.cliques(), que recebe como argumento uma rede no direci-
onada. Como a rede que criamos direcionada, ser preciso antes
convert-la, usando a funo as.undirected(). A funo largest-
ANLISE DE REDES SOCIAIS 146
.cliques() retorna uma lista dos ndices dos vrtices pertencentes
aos maiores cliques.
g.undir <- as.undirected(g)
g.mc <- largest.cliques(g.undir)
g.mc
# [[1]]
# [1] 10 6 8
#
# [[2]]
# [1] 9 6 8
nomes[g.mc[[1]]]
# [1] "Ana" "Paulo" "Manoel"
Alm de localizar os maiores cliques, podemos usar as funes
walktrap.community(), spinglass.community() e outras para iden-
ticar automaticamente a existncia de possveis subgrupos na rede. A
primeira revela a existncia de comunidades dando passos aleatrios
a partir de cada umdos vrtices. Por isso, quanto maior o valor do argu-
mento steps, maior o nmero de membros considerados pertencentes
a cada comunidade. Ovalor correto depender de consideraes te-
ricas e metodolgicas a serem feitas pelo pesquisador. Nos exemplos a
seguir, usamos dois valores diferentes para comparar os resultados:
wtc <- membership(walktrap.community(g))
wtc12 <- membership(walktrap.community(g, steps = 12))
palette(c("red", "green", "lightblue", "darkgreen"))
par(mfrow = c(1, 2), mar = c(0, 0, 1, 2) + 0.1, cex = 0.7, xpd = TRUE)
plot(g, vertex.color = wtc)
par(mar = c(0, 1, 1, 1) + 0.1)
plot(g, vertex.color = wtc12)
ANLISE DE REDES SOCIAIS 147
FIGURA 12.4: Identicao de grupos I
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
A funo spinglass.community() permite especicar o nmero
mximo de grupos a serem detectados, spins, e permite ponderar os
vrtices (argumento weights). No exemplo a seguir, usamos os argu-
mentos mark.groups e mark.col para realar a comunidade detectada:
sgc <- membership(spinglass.community(g))
sgc2 <- membership(spinglass.community(g, spins = 2))
sgc.g <- list(grep("1", sgc), grep("2", sgc), grep("3", sgc))
palette(c("red", "green", "lightblue", "snow2", "beige", "wheat1"))
par(mfrow = c(1, 2), mar = c(0, 0, 1, 2) + 0.1, cex = 0.7, xpd = TRUE)
plot(g, vertex.color = sgc2)
par(mar = c(0, 1, 1, 1) + 0.1)
plot(g, vertex.color = sgc, mark.groups = sgc.g, mark.col = 6:4)
ANLISE DE REDES SOCIAIS 148
FIGURA 12.5: Identicao de grupos II
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Regina
Francisco
Maria
Sandra
Pedro
Paulo
Cristina
Manoel
Carlos
Ana
Aline
Helena
Como o grco da Figura 12.5 foi o ltimo do captulo, convm
chamar novamente a funo par() para recongurar os parmetros
grcos para os valores originais:
par(mfrow = c(1, 1), cex = 1.0, mar = c(5.1, 4.1, 4.1, 2.1))
Depois de ter calculado vrias mtricas dos indivduos na rede so-
cial 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:
gdf <- data.frame(nome = names(inter), inter, proxi, central, alfa,
wtc, sgc)
print(gdf, row.names = FALSE, digits = 3)
# nome inter proxi central alfa wtc sgc
# Regina 0.0 0.00901 0 1.00 2 2
# Francisco 3.5 0.00826 4 3.25 2 2
# Maria 0.0 0.00758 3 6.04 4 3
# Sandra 3.0 0.00909 2 3.71 1 3
# Pedro 0.0 0.00901 0 1.00 2 2
# Paulo 2.0 0.01429 1 1.50 3 1
# Cristina 0.0 0.00901 0 1.00 2 2
# Manoel 8.5 0.01000 3 3.12 3 1
# Carlos 0.0 0.01087 1 1.75 3 1
ANLISE DE REDES SOCIAIS 149
# Ana 0.0 0.01639 0 1.00 3 1
# Aline 4.0 0.00901 2 4.42 1 3
# Helena 0.0 0.00990 0 1.00 1 3
Se tivssemos outro data.frame com caractersticas dos indiv-
duos constituintes da rede, poderamos combinar os dois bancos de
dados com a funo merge() e realizar novas anlises estatsticas, des-
critivas (como as vistas no Captulo 6) ou inferenciais (como as do
Captulo 7).
Alm de calcular mtricas dos vrtices, tambm pode ser neces-
srio calcular mtricas globais da rede, principalmente quando se
pretende comparar as propriedades de vrias redes. Entre essas pro-
priedades, 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:
d <- data.frame("Mtrica" = c("Densidade", "Reciprocidade",
"Transitividade",
"Coef. de agrupamento (fraco)",
"Coef. de agrupamento (forte)"),
"Valor" = c(graph.density(g), reciprocity(g),
transitivity(g), no.clusters(g),
no.clusters(g, mode = "strong")))
print(d, row.names = FALSE, digits = 3)
# Mtrica Valor
# Densidade 0.121
# Reciprocidade 0.125
# Transitividade 0.171
# Coef. de agrupamento (fraco) 1.000
# Coef. de agrupamento (forte) 11.000
Opacote igraph tambmcontmfunes 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
ANLISE DE REDES SOCIAIS 150
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", "Pedro", "Sandra", "Paulo", "Francisco", "Manoel",
"Carlos", "Regina", "Ana", "Paulo", "Manoel", "Aline",
"Sandra", "Helena", "Manoel", "Ana")
B <- c("Francisco", "Maria", "Maria", "Francisco", "Cristina",
"Carlos", "Regina", "Cristina", "Paulo", "Carlos", "Aline",
"Sandra", "Helena", "Maria", "Ana", "Francisco")
g2 <- graph.edgelist(cbind(A, B))
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.
151
NDICE REMISSIVO
:, 21
<-, 9, 21, 124
?, 7
??, 8
$, 35, 38
%, 53
|, 66
Arcview, 134
break, 132
class, 71
dbf, 134
dpi, 117
echo, 116
else, 125
eps, 114
FALSE, 14, 20, 29
g.height, 117
g.width, 117
for, 131, 132
HTML, 101
html, 117
if, 131
jpg, 114
label, 70
levels, 65, 66, 71, 76, 102, 137
NA, 21, 6567, 125, 128, 129
next, 132
NULL, 67, 125
pdf, 114
PESB, 74
PNAD, 46, 53, 54
png, 114, 115
RData, 11, 39, 72
results, 116
Rmd, 115, 117
R classes
character, 14, 20, 22, 23, 25,
28, 29, 52, 53, 56, 68, 120,
132, 136
data.frame, 3641, 51, 5658,
60, 68, 73, 93, 126, 128,
129, 134136, 138, 148,
149
Date, 14, 52, 53
factor, 14, 2228, 39, 52, 56,
60, 68, 71, 136
freqtable, 100
152
NDICE REMISSIVO 153
igraph, 140142
integer, 71
list, 3438, 41, 129
logical, 14, 20, 22, 25, 29
matrix, 33, 37, 38, 57, 126
numeric, 13, 20, 22, 26, 28
ordered, 14, 52
table, 57
ts, 87
R funes
abline, 92, 105
aggregate, 129, 130
alpha.centrality, 144
apply, 126
apropos, 8
args, 5, 7
as.character, 28, 52, 136, 138
as.Date, 52, 53
as.factor, 23, 28, 65
as.logical, 29
as.numeric, 28
as.ordered, 52
as.POSIXct, 53
as.undirected, 145
attach, 73, 93
attr, 41, 71
attributes, 71
axis, 109
betweenness, 143
boxplot, 62, 99, 100
c, 21, 30
cat, 112, 125, 131, 132
cbind, 32, 33, 68
cdplot, 79
class, 24, 36, 58
closeness, 143
colnames, 33
colors, 101
compmeans, 77, 78, 83, 84,
100
coordinates, 138
crosstab, 81, 84, 86, 89, 90,
114
cut, 67, 84, 137
data.frame, 38, 73
degree, 144
demo, 8
descr, 51, 61, 70
detach, 73
dev.off, 99, 105, 114, 115
dim, 58, 136
dir, 12, 17
do.call, 130, 131
dput, 17, 27, 48, 75
droplevels, 66
example, 8
exists, 144
factor, 23, 50, 65
le.choose, 40
le.head, 43, 44, 46
fread, 54
freq, 60, 61, 100
fromUTF8, 51
function, 124
fwf2csv, 54
gdata, 49
get.vertex.attribute, 142
getwd, 12, 17
glm, 97
graph.density, 149
graph.edgelist, 150
graph.formula, 140, 142
grep, 54, 121, 122
gsub, 121
head, 56
heat.colors, 143
NDICE REMISSIVO 154
help, 7
help.search, 8
help.start, 5
hist, 6264, 99
history, 17
if, 125
install.packages, 18, 19
interaction.plot, 82
is.na, 125
is.null, 125
knit, 116, 118, 119
knit2html, 117, 118
label, 70, 71
lapply, 126, 127
largest.cliques, 145, 146
legend, 87, 110, 137
length, 24, 58
levels, 17, 25, 77, 89, 93, 137
library, 18, 49, 51, 61, 75, 134
lines, 104
lm, 91, 93
load, 11, 12, 39, 59, 74, 82,
107, 111, 128
log, 6, 16, 64, 91
LogRegR2, 98
ls, 10, 17, 73
max, 26
mdb.get, 46
mean, 26, 128
median, 26
merge, 68, 136, 149
min, 26
mode, 24
mosaicplot, 81
names, 17, 24, 30, 48, 67, 75
ncol, 58
no.clusters, 149
nrow, 58
order, 59, 136
ordered, 52
palette, 102, 135, 137
par, 95, 105107, 109, 115,
148
paste, 120
paste0, 120
plot, 60, 61, 79, 83, 92, 95, 99,
100, 103, 107110, 134,
135, 137, 138, 141143,
145147
png, 115
points, 103, 138
polygon, 105
postscript, 114
predict, 94
print, 10, 12
q, 4
quantile, 26
quit, 4
rainbow, 138
rbind, 32, 33, 68
read.dta, 39
read.fwf, 47, 53, 54
read.spss, 40, 42, 54, 127
read.table, 42, 44, 51, 52, 54,
56, 136
read.xls, 45
readLines, 47, 51, 54
readOGR, 134
reciprocity, 149
recode, 66, 80, 82, 89, 93
rect, 105
rep, 22, 47, 103
reshape, 69
residuals, 94
rgb, 101
rownames, 33, 70
NDICE REMISSIVO 155
RSiteSearch, 8
sapply, 126, 127
save, 11, 39, 72
seq, 22, 103
sessionInfo, 9
set.graph.attribute, 142
set.seed, 142
set.vertex.attribute, 142
setwd, 6, 12, 13, 17, 40
sink, 112
source, 133
spinglass.community, 146,
147
spss.get, 70
sqrt, 16, 124
step, 96
str, 17, 26
strsplit, 130
sub, 121123
sum, 26
summary, 17, 25, 26, 38, 43,
51, 60, 61, 63, 70, 93, 134,
135
Sweave, 119
system, 47
table, 79, 89, 112
tail, 56, 57
tapply, 128130
text, 92, 103, 104, 108, 109,
138
title, 100, 101, 135137
tkplot, 141, 142
tkplot.getcoords, 141
tolower, 48
toUTF8, 47, 51, 135
transitivity, 149
trim, 49
try, 144
ts, 87
ts.plot, 87
unlist, 131
vector, 20
walktrap.community, 146
writeLines, 51, 54
R pacotes
data.table, 54
descr, 19, 43, 51, 54, 60, 75,
77, 81, 98, 100, 135
foreign, 40, 127
gdata, 45, 49
Hmisc, 46, 70, 71
igraph, 140, 149
knitr, 119
memisc, 66, 89
Rcmdr, 19
rgdal, 134
sqldf, 54
sav2dat.sh, 54
shp, 134
shx, 134
svg, 114
tex, 116
TRUE, 14
while, 131, 132
BIBLIOGRAFIA
ALMEIDA, Alberto Carlos. A cabea do brasileiro. Rio de Janeiro:
Record, 2007.
AQUINO, Jakson Alves de et al. descr: Descriptive statistics. [S.l.],
2014. R package version 1.0.3. Disponvel em: <https://github.com-
/jalvesaq/descr>.
BARNIER, Julien. R pour les sociologues. [S.l.], dez. 2008. Version
provisoire.
BIVAND, Roger; KEITT, Tim; ROWLINGSON, Barry. rgdal: bindings for
the geospatial data abstraction library. [S.l.], 2014. R package version
0.8-16. Disponvel em: <http://CRAN.R-project.org/package=rgdal>.
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.
156
BIBLIOGRAFIA 157
CSRDI, Gbor; NEPUSZ, Tams. The igraph software package for
complex networkresearch. InterJournal, Complex Systems, Manuscript
Number 1695, 2006. Disponvel em: <http://igraph.sf.net>.
DOWLE, M et al. data.table: Extension of data.frame. [S.l.], 2014. R
package version 1.9.2. Disponvel em: <http://CRAN.R-project.org-
/package=data.table>.
ELFF, Martin. memisc: tools for management of survey data, graphics,
programming, statistics, and simulation. [S.l.], 2013. R package
version 0.96-9. Disponvel em: <http://CRAN.R-project.org-
/package=memisc>.
LANDEIRO, Victor Lemes. Introduo ao uso do programa R. Manaus,
2011.
RCore Team. R: ALanguage andEnvironment for Statistical Computing.
Vienna, Austria, 2014. Disponvel em: <http://www.R-project.org/>.
TORGO, Lus. Introduo programao em R. Porto, out. 2006.
WARNES, Gregory R. et al. gdata: Various R programming tools for
data manipulation. [S.l.], 2014. R package version 2.13.3. Disponvel
em: <http://CRAN.R-project.org/package=gdata>.
XIE, Yihui. knitr: a general-purpose package for dynamic report
generation in R. [S.l.], 2013. R package version 1.5. Disponvel em:
<http://yihui.name/knitr>.