A partir dos dados da Tabela 2.1, construiremos tabelas de dupla-entrada para Grau de instrução x região de procedência.
Inicialmente mostraremos como calcular tabelas cruzadas (ou de dupla entrada) diretamente através das funções já existentes no R. Em seguida, utilizaremos a biblioteca gmodels, que contém a função CrossTable, que permite calcular tabelas de contingência de uma maneira mais direta.
Para construir tabela de contingência, utilizaremos a função table. Agora, temos duas variáveis(ao invés de apenas uma, como fizemos no capítulo 1), uma para as colunas e outra para as linhas.
attach(tab2_1)
tab4_2<-table(reg_procedencia,grau_instrucao)
tab4_2
## grau_instrucao
## reg_procedencia ensino fundamental ensino médio superior
## capital 4 5 2
## interior 3 7 2
## outra 5 6 2
Para calcular as marginais, utilizaremos a função margin.table.
Total_linha<-margin.table(tab4_2,2) # O argumento 2 define a marginal da linha
Total_coluna<-margin.table(tab4_2,1) # O argumento 1 define a marginal da coluna
tab4_2_<-rbind(cbind(tab4_2,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_2_)[[1]][4]<-"Total_linha"
tab4_2_
## ensino fundamental ensino médio superior Total_coluna
## capital 4 5 2 11
## interior 3 7 2 12
## outra 5 6 2 13
## Total_linha 12 18 6 36
| ensino fundamental | ensino médio | superior | Total_coluna | |
|---|---|---|---|---|
| capital | 4 | 5 | 2 | 11 |
| interior | 3 | 7 | 2 | 12 |
| outra | 5 | 6 | 2 | 13 |
| Total_linha | 12 | 18 | 6 | 36 |
Uma outra maneira é utilizar o comando apply, que aplica, repedidamente uma função FUN às colunas(quando MARGIN=1) ou linhas(MARGIN=2) de uma matriz.
Total_linha<-apply(tab4_2, MARGIN=2, FUN=sum)
Total_coluna<-apply(tab4_2, MARGIN=1, FUN=sum)
tab4_2_<-rbind(cbind(tab4_2,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_2_)[[1]][4]<-"Total_linha"
tab4_3<-prop.table(tab4_2)
tab4_3
## grau_instrucao
## reg_procedencia ensino fundamental ensino médio superior
## capital 0.111111 0.138889 0.055556
## interior 0.083333 0.194444 0.055556
## outra 0.138889 0.166667 0.055556
Total_linha<-margin.table(tab4_3,2)
Total_coluna<-margin.table(tab4_3,1)
tab4_3_<-rbind(cbind(tab4_3,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_3_)[[1]][4]<-"Total_linha"
tab4_3_
## ensino fundamental ensino médio superior Total_coluna
## capital 0.111111 0.13889 0.055556 0.30556
## interior 0.083333 0.19444 0.055556 0.33333
## outra 0.138889 0.16667 0.055556 0.36111
## Total_linha 0.333333 0.50000 0.166667 1.00000
| ensino fundamental | ensino médio | superior | Total_coluna | |
|---|---|---|---|---|
| capital | 11.11 | 13.89 | 5.56 | 30.56 |
| interior | 8.33 | 19.44 | 5.56 | 33.33 |
| outra | 13.89 | 16.67 | 5.56 | 36.11 |
| Total_linha | 33.33 | 50.00 | 16.67 | 100.00 |
tab4_4<-prop.table(tab4_2,2)
tab4_4
## grau_instrucao
## reg_procedencia ensino fundamental ensino médio superior
## capital 0.33333 0.27778 0.33333
## interior 0.25000 0.38889 0.33333
## outra 0.41667 0.33333 0.33333
Total_linha<-margin.table(tab4_4,2)
Total_coluna<-margin.table(tab4_2,1)/sum(margin.table(tab4_2,1))
tab4_4_<-rbind(cbind(tab4_4,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_4_)[[1]][4]<-"Total_linha"
tab4_4_
## ensino fundamental ensino médio superior Total_coluna
## capital 0.33333 0.27778 0.33333 0.30556
## interior 0.25000 0.38889 0.33333 0.33333
## outra 0.41667 0.33333 0.33333 0.36111
## Total_linha 1.00000 1.00000 1.00000 1.00000
| ensino fundamental | ensino médio | superior | Total_coluna | |
|---|---|---|---|---|
| capital | 33.33 | 27.78 | 33.33 | 30.56 |
| interior | 25.00 | 38.89 | 33.33 | 33.33 |
| outra | 41.67 | 33.33 | 33.33 | 36.11 |
| Total_linha | 100.00 | 100.00 | 100.00 | 100.00 |
Estas mesmas tabelas podem ser construídas a partir da biblioteca gmodels com a função CrossTable:
library(gmodels)
#Tabela 4.2
CrossTable(reg_procedencia,grau_instrucao,
prop.r=FALSE, # Se TRUE, entao retorna as proporções nas linhas
prop.c=FALSE, # Se TRUE, entao retorna as proporções nas colunas
prop.t=FALSE, # Se TRUE, entao retorna as proporções em relação ao total
prop.chisq=FALSE # Se TRUE, entao retorna a contribuição de cada casela para a estatística de Qui-quadrado
)
##
##
## Cell Contents
## |-------------------------|
## | N |
## |-------------------------|
##
##
## Total Observations in Table: 36
##
##
## | grau_instrucao
## reg_procedencia | ensino fundamental | ensino médio | superior | Row Total |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## capital | 4 | 5 | 2 | 11 |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## interior | 3 | 7 | 2 | 12 |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## outra | 5 | 6 | 2 | 13 |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## Column Total | 12 | 18 | 6 | 36 |
## ----------------|--------------------|--------------------|--------------------|--------------------|
##
##
#Tabela 4.3
CrossTable(reg_procedencia,grau_instrucao,prop.r=FALSE, prop.c=FALSE,
prop.t=TRUE, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 36
##
##
## | grau_instrucao
## reg_procedencia | ensino fundamental | ensino médio | superior | Row Total |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## capital | 4 | 5 | 2 | 11 |
## | 0.111 | 0.139 | 0.056 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## interior | 3 | 7 | 2 | 12 |
## | 0.083 | 0.194 | 0.056 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## outra | 5 | 6 | 2 | 13 |
## | 0.139 | 0.167 | 0.056 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## Column Total | 12 | 18 | 6 | 36 |
## ----------------|--------------------|--------------------|--------------------|--------------------|
##
##
#Tabela 4.4
CrossTable(reg_procedencia,grau_instrucao,prop.r=FALSE, prop.c=TRUE,
prop.t=FALSE, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Col Total |
## |-------------------------|
##
##
## Total Observations in Table: 36
##
##
## | grau_instrucao
## reg_procedencia | ensino fundamental | ensino médio | superior | Row Total |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## capital | 4 | 5 | 2 | 11 |
## | 0.333 | 0.278 | 0.333 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## interior | 3 | 7 | 2 | 12 |
## | 0.250 | 0.389 | 0.333 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## outra | 5 | 6 | 2 | 13 |
## | 0.417 | 0.333 | 0.333 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
## Column Total | 12 | 18 | 6 | 36 |
## | 0.333 | 0.500 | 0.167 | |
## ----------------|--------------------|--------------------|--------------------|--------------------|
##
##
Introduziremos agora a construção de gráficos a partir do pacote ggplot2. Este pacote proporciona gráficos com maiores recursos gráficos e possui uma sintaxe diferente da usual para a construção de gráficos. As opções para a impressão dos gráficos funcionam na forma de camadas aditivas ao gráfico, que são “somadas” à figura que está sendo desenhada. Para construir o gráfico de barras empilhadas somando 100%, utilizaremos também outras duas bibliotecas auxiliares, que são a scales e reshape2.
library(ggplot2)
library(scales)
library(reshape2)
ggplot(melt(tab4_2_[1:3,],value.name = "contagem",
varnames = c("reg_procedencia","grau_instrucao") ))+ ## `melt` empilha os dados no formato necessário para o ggplot
aes(x=grau_instrucao,y=contagem,fill=reg_procedencia) + ## Variáveis a serem plotadas.
geom_bar(stat="identity", position = "fill") + ## Define o gráfico de barras percentual empilhado
scale_fill_brewer(name="Região de\n Procedência")+ ## Opções do preenchimento do gráfico (label e paleta de cores)
scale_y_continuous(labels = percent_format()) + ## Formato do eixo Y em porcentagem
theme_bw()+ ## Define a cor do fundo do gráfico: neste caso, branco
#theme(legend.position="bottom") + ## Define a posição da legenda abaixo do gráfico
#ggtitle("Figura 4.1: Distribuição da região de procedência por grau de instrução")+
xlab("Grau de Instrução") + ylab("") ## Define os `labels` dos eixos
Figura 4.1: Distribuição da região de procedência por grau de instrução.
## 4.3 Associação entre Variáveis Qualitativas
Neste exemplo queremos verificar se existe associação entre sexo e carreira escolhida por 200 alunos de Economia e Administração.
tab4_5<-as.table(matrix(c(85,55,35,25),ncol=2))
dimnames(tab4_5)[[1]] = c("Economia", "Administração")
dimnames(tab4_5)[[2]] = c("Masculino", "Feminino")
tab4_5
## Masculino Feminino
## Economia 85 35
## Administração 55 25
Total_linha<-margin.table(tab4_5,2)
Total_coluna<-margin.table(tab4_5,1)
tab4_5_<-rbind(cbind(tab4_5,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_5_)[[1]][3]<-"Total_linha"
| Masculino | Feminino | Total_coluna | |
|---|---|---|---|
| Economia | 85 | 35 | 120 |
| Administração | 55 | 25 | 80 |
| Total_linha | 140 | 60 | 200 |
Contruída da mesma forma que a Tabela 4.4.
tab4_6<-prop.table(tab4_5,2)
tab4_6
## Masculino Feminino
## Economia 0.60714 0.58333
## Administração 0.39286 0.41667
Total_linha<-margin.table(tab4_6,2)
Total_coluna<-margin.table(tab4_6,1)/sum(margin.table(tab4_6,1))
tab4_6_<-rbind(cbind(tab4_6,Total_coluna),c(Total_linha, sum(Total_coluna)))
dimnames(tab4_6_)[[1]][3]<-"Total_linha"
| Masculino | Feminino | Total_coluna | |
|---|---|---|---|
| Economia | 60.71 | 58.33 | 59.52 |
| Administração | 39.29 | 41.67 | 40.48 |
| Total_linha | 100.00 | 100.00 | 100.00 |
Inicialmente, utilizaremos o comando rep, que gera réplicas do objeto inserido, para recriar o banco de dados original:
# Construindo os dados do exemplo:
dados.tab4_7<-data.frame(rbind(
matrix(rep(c("1.Masculino","1.Física"),times=100),ncol=2,byrow=T),
matrix(rep(c("2.Feminino","1.Física"),times=20),ncol=2,byrow=T),
matrix(rep(c("1.Masculino","2.Ciências Sociais"),times=40),ncol=2,byrow=T),
matrix(rep(c("2.Feminino","2.Ciências Sociais"),times=40),ncol=2,byrow=T)))
colnames(dados.tab4_7)<-c("sexo","curso")
Para calcular a Tabela 4.7, utilizaremos novamente a função CrossTable:
CrossTable(dados.tab4_7$curso,dados.tab4_7$sexo,prop.r=FALSE, prop.c=TRUE,
prop.t=FALSE, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Col Total |
## |-------------------------|
##
##
## Total Observations in Table: 200
##
##
## | dados.tab4_7$sexo
## dados.tab4_7$curso | 1.Masculino | 2.Feminino | Row Total |
## -------------------|-------------|-------------|-------------|
## 1.Física | 100 | 20 | 120 |
## | 0.714 | 0.333 | |
## -------------------|-------------|-------------|-------------|
## 2.Ciências Sociais | 40 | 40 | 80 |
## | 0.286 | 0.667 | |
## -------------------|-------------|-------------|-------------|
## Column Total | 140 | 60 | 200 |
## | 0.700 | 0.300 | |
## -------------------|-------------|-------------|-------------|
##
##
# Construindo os dados do exemplo:
dados.tab4_8<-data.frame(rbind(
matrix(rep(c("1.Consumidor","1.São Paulo"),times=214),ncol=2,byrow=T),
matrix(rep(c("1.Consumidor","2.Paraná"),times=51),ncol=2,byrow=T),
matrix(rep(c("1.Consumidor","3.Rio G. do Sul"),times=111),ncol=2,byrow=T),
matrix(rep(c("2.Produtor","1.São Paulo"),times=237),ncol=2,byrow=T),
matrix(rep(c("2.Produtor","2.Paraná"),times=102),ncol=2,byrow=T),
matrix(rep(c("2.Produtor","3.Rio G. do Sul"),times=304),ncol=2,byrow=T),
matrix(rep(c("3.Escola","1.São Paulo"),times=78),ncol=2,byrow=T),
matrix(rep(c("3.Escola","2.Paraná"),times=126),ncol=2,byrow=T),
matrix(rep(c("3.Escola","3.Rio G. do Sul"),times=139),ncol=2,byrow=T),
matrix(rep(c("4.Outras","1.São Paulo"),times=119),ncol=2,byrow=T),
matrix(rep(c("4.Outras","2.Paraná"),times=22),ncol=2,byrow=T),
matrix(rep(c("4.Outras","3.Rio G. do Sul"),times=48),ncol=2,byrow=T)))
colnames(dados.tab4_8)<-c("tipo_de_cooperativa","estado")
attach(dados.tab4_8)
Para construirmos as tabelas deste exemplo, utilizaremos novamente a função CrossTable. Basicamente, utilizaremos os comandos prop.r=TRUE,expected=TRUE,prop.chisq=TRUE e resid=TRUE para obter, respectivamente, as proporções nas linhas, os valores esperados supondo independência entre as variáveis, os valores das contribuições de cada casela para a estatística de qui-quadrado e os resíduos de cada casela.
CrossTable(estado,tipo_de_cooperativa,
prop.r=TRUE, prop.c=FALSE, prop.t=FALSE, prop.chisq=FALSE,
digits=2)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## |-------------------------|
##
##
## Total Observations in Table: 1551
##
##
## | tipo_de_cooperativa
## estado | 1.Consumidor | 2.Produtor | 3.Escola | 4.Outras | Row Total |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 1.São Paulo | 214 | 237 | 78 | 119 | 648 |
## | 0.33 | 0.37 | 0.12 | 0.18 | 0.42 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 2.Paraná | 51 | 102 | 126 | 22 | 301 |
## | 0.17 | 0.34 | 0.42 | 0.07 | 0.19 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 3.Rio G. do Sul | 111 | 304 | 139 | 48 | 602 |
## | 0.18 | 0.50 | 0.23 | 0.08 | 0.39 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## Column Total | 376 | 643 | 343 | 189 | 1551 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
##
##
CrossTable(estado,tipo_de_cooperativa,
prop.r=FALSE, prop.c=FALSE, prop.t=FALSE, prop.chisq=FALSE, expected=TRUE,
digits=0)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Expected N |
## |-------------------------|
##
##
## Total Observations in Table: 1551
##
##
## | tipo_de_cooperativa
## estado | 1.Consumidor | 2.Produtor | 3.Escola | 4.Outras | Row Total |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 1.São Paulo | 214 | 237 | 78 | 119 | 648 |
## | 157 | 269 | 143 | 79 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 2.Paraná | 51 | 102 | 126 | 22 | 301 |
## | 73 | 125 | 67 | 37 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 3.Rio G. do Sul | 111 | 304 | 139 | 48 | 602 |
## | 146 | 250 | 133 | 73 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## Column Total | 376 | 643 | 343 | 189 | 1551 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
##
##
## Statistics for All Table Factors
##
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 173.38 d.f. = 6 p = 8.6339e-35
##
##
##
CrossTable(estado,tipo_de_cooperativa,
prop.r=FALSE, prop.c=FALSE, prop.t=FALSE, resid=TRUE, prop.chisq=TRUE,
format="SPSS", digits=2)
##
## Cell Contents
## |-------------------------|
## | Count |
## | Chi-square contribution |
## | Residual |
## |-------------------------|
##
## Total Observations in Table: 1551
##
## | tipo_de_cooperativa
## estado | 1.Consumidor | 2.Produtor | 3.Escola | 4.Outras | Row Total |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 1.São Paulo | 214 | 237 | 78 | 119 | 648 |
## | 20.62 | 3.73 | 29.76 | 20.30 | |
## | 56.91 | -31.64 | -65.30 | 40.04 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 2.Paraná | 51 | 102 | 126 | 22 | 301 |
## | 6.61 | 4.16 | 53.07 | 5.87 | |
## | -21.97 | -22.79 | 59.43 | -14.68 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## 3.Rio G. do Sul | 111 | 304 | 139 | 48 | 602 |
## | 8.36 | 11.87 | 0.26 | 8.77 | |
## | -34.94 | 54.43 | 5.87 | -25.36 | |
## ----------------|--------------|--------------|--------------|--------------|--------------|
## Column Total | 376 | 643 | 343 | 189 | 1551 |
## ----------------|--------------|--------------|--------------|--------------|--------------|
##
##
O cálculo da estatística de Qui-quadrado, calculado a partir da fórmula:
\[ \frac{(o_i-e_i)^2}{e_i} \]
é apresentado de forma padrão na saída da Tabela 4.9. No entanto, é também possível calculá-lo da seguinte forma:
tab4_8<-table(estado,tipo_de_cooperativa)
testequi<-chisq.test(tab4_8)
testequi
##
## Pearson's Chi-squared test
##
## data: tab4_8
## X-squared = 173, df = 6, p-value <2e-16
As expressões (4.5) e (4.6) dadas respectivamente pelas fórmulas:
\[ C=\sqrt{\frac{\chi^2}{\chi^2+n}} \]
e
\[ T = \sqrt{\frac{\chi^2}{n(r-1)(s-1)}} \]
podem ser calculadas facilmente a partir dos resultados deste teste.
Para o Exemplo 4.3, estas quantidades são dadas por:
### (4.5) ###
C = sqrt(testequi$statistic/(testequi$statistic+1551))
round(C,digits=2) # Arredondando para duas casas decimais
## X-squared
## 0.32
### (4.6) ###
T = sqrt(testequi$statistic/(1551*(4-1)*(3-1)))
round(T,digits=2) # Arredondando para duas casas decimais
## X-squared
## 0.14
Dados do exemplo:
dados.ex4_4<-data.frame(agente=c("A","B","C","D","E","F","G","H","I","J"),
anos_servico=c(2,3,4,5,4,6,7,8,8,10),
n_clientes=c(48,50,56,52,43,60,62,58,64,72))
| agente | anos_servico | n_clientes |
|---|---|---|
| A | 2 | 48 |
| B | 3 | 50 |
| C | 4 | 56 |
| D | 5 | 52 |
| E | 4 | 43 |
| F | 6 | 60 |
| G | 7 | 62 |
| H | 8 | 58 |
| I | 8 | 64 |
| J | 10 | 72 |
attach(dados.ex4_4)
plot(dados.ex4_4$n_clientes,dados.ex4_4$anos_servico,pch=20, col="darkblue",
xlab="Anos de Serviço", ylab="Número de Clientes",cex=2)
Figura 4.2: Gráfico de dispersão para as variáveis X: anos de serviço e Y: número de clientes.
A Leitura dos dados contidos no arquivo “cd-brasil.csv” pode ser feita a partir da sintaxe a seguir:
cd_brasil<-read.table("cd-brasil.csv",h=T,skip=7,sep=";")
names(cd_brasil)
## [1] "regiao" "uf" "superficie" "pop_urbana" "pop_rural"
## [6] "total" "densidade"
attach(cd_brasil)
plot(pop_urbana,pop_rural,pch=20, col="darkblue",
xlab="População urbana",ylab="População rural",cex=2)
Figura 4.3: Gráfico de dispersão para as variáveis X: população urbana e Y: populacao rural.
Dados do exemplo:
dados.ex4_6<-data.frame(
familia=c("A","B","C","D","E","F","G","H","I","J"),
renda_bruta=c(12,16,18,20,28,30,40,48,50,54),
gasto_saude=c(7.2,7.4,7,6.5,6.6,6.7,6,5.6,6,5.5))
attach(dados.ex4_6)
plot(renda_bruta,gasto_saude,pch=20, col="darkblue",
xlab="Renda Bruta",ylab="% de gasto com saúde",cex=2)
Figura 4.4: Gráfico de dispersão para as variáveis X: renda bruta e Y: % renda gasta com saúde.
dados.tab4_14<-data.frame(
individuo=c("A","B","C","D","E","F","G","H"),
resultado=c(45,52,61,70,74,76,80,90),
tempo=c(343,368,355,334,337,381,345,375))
attach(dados.tab4_14)
plot(resultado,tempo,pch=20, col="darkblue",
xlab="Resultado teste",ylab="Tempo",cex=2)
Figura 4.5: Gráfico de dispersão para as variáveis X: resultado do teste e Y: % tempo de operação.
O cálculo das colunas da Tabela 4.15 se baseiam nos dados do Exemplo 4.4. Utilizaremos ainda, para o cálculo do desvio padrão, a função varp, que declaramos nos comandos do Capítulo 3:
varp<-function(x, pop=TRUE, na.rm=TRUE,...){
if (pop==TRUE & na.rm==TRUE){ # calcula var_n desconsiderando os missings
n<-sum(!is.na(x))
return(var(x,na.rm=na.rm,...)*(n-1)/n)
}
else{
if(na.rm==FALSE){
n<-length(x)
return(var(x,na.rm=na.rm,...)*(n-1)/n)
}
}
return(var(x,na.rm=na.rm,...))
}
attach(dados.ex4_4)
tab4_15<-dados.ex4_4
tab4_15$dsvx<-anos_servico-mean(anos_servico) # Desvio da variável X em relação a sua média
tab4_15$dsvy<-n_clientes-mean(n_clientes) # Desvio da variável Y em relação a sua média
tab4_15$zx<-tab4_15$dsvx/sqrt(varp(anos_servico)) # Desvios de X padronizados pelo seu desvio-padrão
tab4_15$zy<-tab4_15$dsvy/sqrt(varp(n_clientes)) # Desvios de Y padronizados pelo seu desvio-padrão
tab4_15$zxzy<-tab4_15$zx*tab4_15$zy # Coeficiente de correlação entre X e Y
attach(tab4_15)
par(mfrow=c(1,2))
plot(dsvx,dsvy,pch=20, col="darkblue",
xlab=expression(x-bar(x)),ylab=expression(y-bar(y)))
abline(v=0, lty=2,col="grey")
abline(h=0, lty=2,col="grey")
plot(zx,zy,pch=20, col="darkblue",
xlab=expression(z[x]),ylab=expression(z[y]))
abline(v=0, lty=2,col="grey")
abline(h=0, lty=2,col="grey")
Figura 4.7: Mudança de escalas para o cálculo do coeficiente de correlação.
Note que nos gráficos acima, utilizamos, nos eixos, a expressão \(x-\overline{x}\). Para imprimir fomulas matemáticas dentro do gráfico, pode-se utilizar a biblioteca grDevices. Utilizando a função expression() pode-se incluir formulas matemáticas de acordo com a seguinte sintaxe*:
| Sintaxe | Significado |
| x + y | x plus y |
| x - y | x minus y |
| x*y | juxtapose x and y |
| x/y | x forwardslash y |
| x %+-% y | x plus or minus y |
| x %/% y | x divided by y |
| x %*% y | x times y |
| x %.% y | x cdot y |
| x[i] | x subscript i |
| x^2 | x superscript 2 |
| paste(x, y, z) | juxtapose x, y, and z |
| sqrt(x) | square root of x |
| sqrt(x, y) | yth root of x |
| x == y | x equals y |
| x != y | x is not equal to y |
| x < y | x is less than y |
| x <= y | x is less than or equal to y |
| x > y | x is greater than y |
| x >= y | x is greater than or equal to y |
| x %~~% y | x is approximately equal to y |
| x %=~% y | x and y are congruent |
| x %==% y | x is defined as y |
| x %prop% y | x is proportional to y |
| x %~% y | x is distributed as y |
| plain(x) | draw x in normal font |
| bold(x) | draw x in bold font |
| italic(x) | draw x in italic font |
| bolditalic(x) | draw x in bolditalic font |
| symbol(x) | draw x in symbol font |
| list(x, y, z) | comma-separated list |
| … | ellipsis (height varies) |
| cdots | ellipsis (vertically centred) |
| ldots | ellipsis (at baseline) |
| x %subset% y | x is a proper subset of y |
| x %subseteq% y | x is a subset of y |
| x %notsubset% y | x is not a subset of y |
| x %supset% y | x is a proper superset of y |
| x %supseteq% y | x is a superset of y |
| x %in% y | x is an element of y |
| x %notin% y | x is not an element of y |
| hat(x) | x with a circumflex |
| tilde(x) | x with a tilde |
| dot(x) | x with a dot |
| ring(x) | x with a ring |
| bar(xy) | xy with bar |
| widehat(xy) | xy with a wide circumflex |
| widetilde(xy) | xy with a wide tilde |
| x %<->% y | x double-arrow y |
| x %->% y | x right-arrow y |
| x %<-% y | x left-arrow y |
| x %up% y | x up-arrow y |
| x %down% y | x down-arrow y |
| x %<=>% y | x is equivalent to y |
| x %=>% y | x implies y |
| x %<=% y | y implies x |
| x %dblup% y | x double-up-arrow y |
| x %dbldown% y | x double-down-arrow y |
| alpha – omega | Greek symbols |
| Alpha – Omega | uppercase Greek symbols |
| theta1, phi1, sigma1, omega1 | cursive Greek symbols |
| Upsilon1 | capital upsilon with hook |
| aleph | first letter of Hebrew alphabet |
| infinity | infinity symbol |
| partialdiff | partial differential symbol |
| nabla | nabla, gradient symbol |
| 32*degree | 32 degrees |
| 60*minute | 60 minutes of angle |
| 30*second | 30 seconds of angle |
| displaystyle(x) | draw x in normal size (extra spacing) |
| textstyle(x) | draw x in normal size |
| scriptstyle(x) | draw x in small size |
| scriptscriptstyle(x) | draw x in very small size |
| underline(x) | draw x underlined |
| x ~~ y | put extra space between x and y |
| x + phantom(0) + y | leave gap for “0”, but don’t draw it |
| x + over(1, phantom(0)) | leave vertical gap for “0” (don’t draw) |
| frac(x, y) | x over y |
| over(x, y) | x over y |
| atop(x, y) | x over y (no horizontal bar) |
| sum(x[i], i==1, n) | sum x[i] for i equals 1 to n |
| prod(plain(P)(X==x), x) | product of P(X=x) for all values of x |
| integral(f(x)*dx, a, b) | definite integral of f(x) wrt x |
| union(A[i], i==1, n) | union of A[i] for i equals 1 to n |
| intersect(A[i], i==1, n) | intersection of A[i] |
| lim(f(x), x %->% 0) | limit of f(x) as x tends to 0 |
| min(g(x), x > 0) | minimum of g(x) for x greater than 0 |
| inf(S) | infimum of S |
| sup(S) | supremum of S |
| x^y + z | normal operator precedence |
| x^(y + z) | visible grouping of operands |
| x^{y + z} | invisible grouping of operands |
| group(“(”,list(a, b),“]”) | specify left and right delimiters |
| bgroup(“(”,atop(x,y),“)”) | use scalable delimiters |
| group(lceil, x, rceil) | special delimiters |
| group(lfloor, x, rfloor) | special delimiters |
*fonte:R Help
Para calcular o coeficiente de correlação linear (Equação 4.7) e covariância (Equação 4.9) entre duas variáveis, utilize os comandos cor e cov
cor(X,Y) # Calcula a correlação linear entre X e Y
cov(X,Y) # Calcula a covariância entre X e Y
Para construir a Tabela 4.16, precisamos calcular as estatísticas descritivas de resumo e dispersão por grupo, depois calcular estas quantidades para a amostra e por fim montar a tabela. O mesmo será feito na Tabela 4.17. Utilizaremos os dados da Tabela 2.1, como descrito no livro.
attach(tab2_1)
tapply(salario,grau_instrucao,summary)-> summary.tab4_16 # Calculando medidas de posição por grupo
tapply(salario,grau_instrucao,varp)-> varp.tab4_16 # Calculando variancia por grupo
tapply(salario,grau_instrucao,length)-> n.tab4_16 # Calculando n por grupo
summary.tab4_16[[4]]<-summary(salario) # Calculando medidas de posição de toda a amostra
varp.tab4_16[[4]]<-varp(salario) # Calculando variancia de toda a amostra
n.tab4_16[[4]]<-length(salario) # Calculando n
tab4_16 <- matrix(unlist(summary.tab4_16), ncol = 6, byrow = TRUE)
tab4_16<-cbind(n.tab4_16,tab4_16,sqrt(varp.tab4_16),varp.tab4_16)
dimnames(tab4_16)<-list(
c("Fundamental","Medio","Superior", "Todos"),
c("n", "Min.","Q1","Mediana","Média","Q3","Max.","dp(S)","Var(S)"))
| n | Min. | Q1 | Mediana | Média | Q3 | Max. | dp(S) | Var(S) | |
|---|---|---|---|---|---|---|---|---|---|
| Fundamental | 12 | 4.00 | 6.01 | 7.12 | 7.84 | 9.16 | 13.8 | 2.83 | 8.01 |
| Medio | 18 | 5.73 | 8.84 | 10.90 | 11.50 | 14.40 | 19.4 | 3.61 | 13.04 |
| Superior | 6 | 10.50 | 13.60 | 16.70 | 16.50 | 18.40 | 23.3 | 4.11 | 16.89 |
| Todos | 36 | 4.00 | 7.55 | 10.20 | 11.10 | 14.10 | 23.3 | 4.52 | 20.46 |
Além da forma apresentada anteriormente para a construção de box plots (função boxplot apresentada no Capítulo 3), é possível construir box plots a partir do ggplot2. Utilizaremos a camada geom_boxplot para construir os box plots das Figuras 4.8 e 4.9 com o ggplot2.
ggplot(tab2_1, aes(grau_instrucao, salario)) + geom_boxplot(fill = "darkblue", colour = "grey")
Figura 4.8: Box plots de salário segundo grau de instrução.
attach(tab2_1)
tapply(salario,reg_procedencia,summary)-> summary.tab4_17 # Calculando medidas de posição por grupo
tapply(salario,reg_procedencia,varp)-> varp.tab4_17 # Calculando variancia por grupo
tapply(salario,reg_procedencia,length)-> n.tab4_17 # Calculando n por grupo
summary.tab4_17[[4]]<-summary(salario) # Calculando medidas de posição de toda a amostra
varp.tab4_17[[4]]<-varp(salario) # Calculando variancia de toda a amostra
n.tab4_17[[4]]<-length(salario) # Calculando n
tab4_17 <- matrix(unlist(summary.tab4_17), ncol = 6, byrow = TRUE)
tab4_17<-cbind(n.tab4_17,tab4_17,sqrt(varp.tab4_17),varp.tab4_17)
dimnames(tab4_17)<-list(
c("Capital","Interior","Outra", "Todos"),
c("n", "Min.","Q1","Mediana","Média","Q3","Max.","dp(S)","Var(S)"))
| n | Min. | Q1 | Mediana | Média | Q3 | Max. | dp(S) | Var(S) | |
|---|---|---|---|---|---|---|---|---|---|
| Capital | 11 | 4.56 | 7.49 | 9.77 | 11.5 | 16.6 | 19.4 | 5.22 | 27.27 |
| Interior | 12 | 4.00 | 7.80 | 10.60 | 11.6 | 14.7 | 23.3 | 5.07 | 25.71 |
| Outra | 13 | 5.73 | 8.74 | 9.80 | 10.4 | 12.8 | 16.2 | 3.02 | 9.13 |
| Todos | 36 | 4.00 | 7.55 | 10.20 | 11.1 | 14.1 | 23.3 | 4.52 | 20.46 |
ggplot(tab2_1, aes(reg_procedencia, salario)) + geom_boxplot(fill = "darkblue", colour = "grey") # + geom_jitter()
Figura 4.9: Box plots de salário segundo região de procedência.
#R^2 para Salário por grau de instrução
varS1=t(tab4_16[1:3,1])%*%tab4_16[1:3,9]/sum(tab4_16[1:3,1])
R2.1=1-varS1/tab4_16[4,9]
print(paste("media(var(S)) :",round(varS1,2)))
## [1] "media(var(S)) : 12"
print(paste("R^2 :",round(R2.1,2)))
## [1] "R^2 : 0.41"
#R^2 para Salário por região de procedência
varS2=t(tab4_17[1:3,1])%*%tab4_17[1:3,9]/sum(tab4_17[1:3,1])
R2.2=1-varS2/tab4_17[4,9]
print(paste("media(var(S)) :",round(varS2,2)))
## [1] "media(var(S)) : 20.2"
print(paste("R^2 :",round(R2.2,2)))
## [1] "R^2 : 0.01"
tab4_18<-data.frame(aluno=1:20,prova1=c(8.5,3.5,7.2,5.5,9.5,7,4.8,6.6,2.5,7,7.4,5.6,6.3,3,8.1,3.8,6.8,10,4.5,5.9),prova2=c(8,2.8,6.5,6.2,9,7.5,5.2,7.2,4,6.8,6.5,5,6.5,3,9,4,5.5,10,5.5,5))
plot(tab4_18$prova1,tab4_18$prova2,xlab="Quantis da 1a. prova",ylab="Quantis da 2a. prova",pch=16,col="darkblue")
abline(a=0,b=1)
Figura 4.10: Gráfico q x q para as notas em duas provas de Estatística.
| aluno | prova1 | prova2 |
|---|---|---|
| 1 | 8.5 | 8.0 |
| 2 | 3.5 | 2.8 |
| 3 | 7.2 | 6.5 |
| 4 | 5.5 | 6.2 |
| 5 | 9.5 | 9.0 |
| 6 | 7.0 | 7.5 |
| 7 | 4.8 | 5.2 |
| 8 | 6.6 | 7.2 |
| 9 | 2.5 | 4.0 |
| 10 | 7.0 | 6.8 |
| 11 | 7.4 | 6.5 |
| 12 | 5.6 | 5.0 |
| 13 | 6.3 | 6.5 |
| 14 | 3.0 | 3.0 |
| 15 | 8.1 | 9.0 |
| 16 | 3.8 | 4.0 |
| 17 | 6.8 | 5.5 |
| 18 | 10.0 | 10.0 |
| 19 | 4.5 | 5.5 |
| 20 | 5.9 | 5.0 |
Para este exemplo, utilizaremos a função quantile - já apresentada anteriormente - que calcula os quantis da variável solicitada, e a função seq, que controi uma sequencia de números ordenados. veja ?seq para mais detalhes.
cd_temperaturas<-read.table("cd-temperaturas.csv",h=T,skip=4,sep=";",dec=",") # Leitura dos dados
attach(cd_temperaturas)
q_cananeia<-quantile(cananeia,probs = seq(0,1,1/120)) # seq(0,1,1/120) constroi uma sequencia de 0 a 1 com saltos de 1/120 de distância.
q_ubatuba<-quantile(ubatuba,probs = seq(0,1,1/120))
plot(q_cananeia,q_ubatuba,xlab="Quantis Cananéia",ylab="Quantis Ubatuba",pch=16,col="darkblue")
abline(a=0,b=1)
Figura 4.11: Gráfico q x q para os valores de temperatura de Cananéia e Ubatuba.
tab2_1$idade<-tab2_1$idade_anos*12+tab2_1$idade_meses
attach(tab2_1)
par(mfrow=c(1,3),pin=c(2,2))
plot(idade[grau_instrucao=="ensino fundamental"],salario[grau_instrucao=="ensino fundamental"],main="Fundamental",xlab="Idade",ylab="Salário",pch=16,col="darkblue")
plot(idade[grau_instrucao=="ensino médio"],salario[grau_instrucao=="ensino médio"],main="Médio",xlab="Idade",ylab="Salário",pch=16,col="darkblue")
plot(idade[grau_instrucao=="superior"],salario[grau_instrucao=="superior"],main="Superior",xlab="Idade",ylab="Salário",pch=16,col="darkblue")
Figura 4.12: Gráficos de dispersão das variáveis salário e idade, segundo a variável grau de instrução.
Leitura dos dados:
cd_mercado <- read.table("cd-mercado.csv",h=T,skip=4,sep=";",dec=",") # Leitura dos dados
attach(cd_mercado)
plot(telebras[1:39],indice[1:39],xlab="Telebrás",ylab="Ibovespa",pch=16,col="darkblue")
abline(lm(indice[1:39]~telebras[1:39]))
Figura 4.13: Gráfico de dispersão para ações da Telebrás e BOVESPA.
Calculando a correlação linear entre os dois preçcos temos:
print(paste("Corr(X,Y) = ",round(cor(indice[1:39],telebras[1:39]),2)))
## [1] "Corr(X,Y) = 0.98"
Leitura dos dados:
cd_veiculos <- read.table("cd-veiculos.csv",h=T,skip=4,sep=";",dec=",") # Leitura dos dados
Novamente, utilizaremos a biblioteca ggplot2 para a constução da Figura 4.14.
attach(cd_veiculos)
ggplot(cd_veiculos, aes(comprimento,preco)) + geom_point(aes(shape =N_I,colour=N_I), size = 4)
Figura 4.14: Gráfico de dispersão simbólico das variáveis preço e comprimento de veículos, categorizadas pela variável procedência: nacional(N) e importado(I).