O primeiro passo para a análise de dados no R é a importação dos dados. Para isso, considere a Tabela 2.1 de informações de 36 empregados da Companhia MB. A Tabela consta no livro da seguinte forma:
| N | Estado Civil | Grau de Instrução | N de Filhos | Salario (x Sal Min) | Idade(Anos) | Idade(Meses) | Região de Procedência |
|---|---|---|---|---|---|---|---|
| 1 | solteiro | ensino fundamental | NA | 4.00 | 26 | 3 | interior |
| 2 | casado | ensino fundamental | 1 | 4.56 | 32 | 10 | capital |
| 3 | casado | ensino fundamental | 2 | 5.25 | 36 | 5 | capital |
| 4 | solteiro | ensino médio | NA | 5.73 | 20 | 10 | outra |
| 5 | solteiro | ensino fundamental | NA | 6.26 | 40 | 7 | outra |
| 6 | casado | ensino fundamental | 0 | 6.66 | 28 | 0 | interior |
| 7 | solteiro | ensino fundamental | NA | 6.86 | 41 | 0 | interior |
| 8 | solteiro | ensino fundamental | NA | 7.39 | 43 | 4 | capital |
| 9 | casado | ensino médio | 1 | 7.59 | 34 | 10 | capital |
| 10 | solteiro | ensino médio | NA | 7.44 | 23 | 6 | outra |
| 11 | casado | ensino médio | 2 | 8.12 | 33 | 6 | interior |
| 12 | solteiro | ensino fundamental | NA | 8.46 | 27 | 11 | capital |
| 13 | solteiro | ensino médio | NA | 8.74 | 37 | 5 | outra |
| 14 | casado | ensino fundamental | 3 | 8.95 | 44 | 2 | outra |
| 15 | casado | ensino médio | 0 | 9.13 | 30 | 5 | interior |
| 16 | solteiro | ensino médio | NA | 9.35 | 38 | 8 | outra |
| 17 | casado | ensino médio | 1 | 9.77 | 31 | 7 | capital |
| 18 | casado | ensino fundamental | 2 | 9.80 | 39 | 7 | outra |
| 19 | solteiro | superior | NA | 10.53 | 25 | 8 | interior |
| 20 | solteiro | ensino médio | NA | 10.76 | 37 | 4 | interior |
| 21 | casado | ensino médio | 1 | 11.06 | 30 | 9 | outra |
| 22 | solteiro | ensino médio | NA | 11.59 | 34 | 2 | capital |
| 23 | solteiro | ensino fundamental | NA | 12.00 | 41 | 0 | outra |
| 24 | casado | superior | 0 | 12.79 | 26 | 1 | outra |
| 25 | casado | ensino médio | 2 | 13.23 | 32 | 5 | interior |
| 26 | casado | ensino médio | 2 | 13.60 | 35 | 0 | outra |
| 27 | solteiro | ensino fundamental | NA | 13.85 | 46 | 7 | outra |
| 28 | casado | ensino médio | 0 | 14.69 | 29 | 8 | interior |
| 29 | casado | ensino médio | 5 | 14.71 | 40 | 6 | interior |
| 30 | casado | ensino médio | 2 | 15.99 | 35 | 10 | capital |
| 31 | solteiro | superior | NA | 16.22 | 31 | 5 | outra |
| 32 | casado | ensino médio | 1 | 16.61 | 36 | 4 | interior |
| 33 | casado | superior | 3 | 17.26 | 43 | 7 | capital |
| 34 | solteiro | superior | NA | 18.75 | 33 | 7 | capital |
| 35 | casado | ensino médio | 2 | 19.40 | 48 | 11 | capital |
| 36 | casado | superior | 3 | 23.30 | 42 | 2 | interior |
Para importá-la, utilizaremos quaisquer um dos formatos TXT, DAT ou CSV. É possível importar uma planilha excel diretamente, mas para isso, é preciso ter um compilador Perl ou Java instalado. Para maiores detalhes de como importar arquivos a partir do excel, veja por exemplo este tutorial ou procure pela biblioteca xlsx.
Desta forma, o primeiro passo é construir um arquivo CSV (ou alternativamente DAT ou TXT), como no exemplo abaixo:
N;estado_civil;grau_instrucao;n_filhos;salario;idade_anos;idade_meses;reg_procedencia
1;solteiro;ensino fundamental;;4,00;26;3;interior
2;casado;ensino fundamental;1;4,56;32;10;capital
3;casado;ensino fundamental;2;5,25;36;5;capital
4;solteiro;ensino médio;;5,73;20;10;outra
5;solteiro;ensino fundamental;;6,26;40;7;outra
6;casado;ensino fundamental;0;6,66;28;0;interior
7;solteiro;ensino fundamental;;6,86;41;0;interior
8;solteiro;ensino fundamental;;7,39;43;4;capital
9;casado;ensino médio;1;7,59;34;10;capital
10;solteiro;ensino médio;;7,44;23;6;outra
11;casado;ensino médio;2;8,12;33;6;interior
12;solteiro;ensino fundamental;;8,46;27;11;capital
13;solteiro;ensino médio;;8,74;37;5;outra
14;casado;ensino fundamental;3;8,95;44;2;outra
15;casado;ensino médio;0;9,13;30;5;interior
16;solteiro;ensino médio;;9,35;38;8;outra
17;casado;ensino médio;1;9,77;31;7;capital
18;casado;ensino fundamental;2;9,80;39;7;outra
19;solteiro;superior;;10,53;25;8;interior
20;solteiro;ensino médio;;10,76;37;4;interior
21;casado;ensino médio;1;11,06;30;9;outra
22;solteiro;ensino médio;;11,59;34;2;capital
23;solteiro;ensino fundamental;;12,00;41;0;outra
24;casado;superior;0;12,79;26;1;outra
25;casado;ensino médio;2;13,23;32;5;interior
26;casado;ensino médio;2;13,60;35;0;outra
27;solteiro;ensino fundamental;;13,85;46;7;outra
28;casado;ensino médio;0;14,69;29;8;interior
29;casado;ensino médio;5;14,71;40;6;interior
30;casado;ensino médio;2;15,99;35;10;capital
31;solteiro;superior;;16,22;31;5;outra
32;casado;ensino médio;1;16,61;36;4;interior
33;casado;superior;3;17,26;43;7;capital
34;solteiro;superior;;18,75;33;7;capital
35;casado;ensino médio;2;19,40;48;11;capital
36;casado;superior;3;23,30;42;2;interior
Este arquivo nada mais é do que a Tabela 2.1 que tínhamos antes, em um formato que delimita as colunas por “;”. Para atingir tal arquivo (obviamente não teremos que digitar tudo novamente)veja a figura esquemática abaixo:
Após a construção do arquivo CSV, procederemos no R com o comando read.table para importar os dados no R. Há muitas opções para a função read.table acima. Nos atentaremos às principais (para maiores detalhes, digite, no R, ?read.table):
file: Nome do arquivo a ser importado (CSV, DAT ou TXT ou similiares). O caminho completo é obrigatório caso o arquivo não esteja na mesma pasta de trabalho.
header: Deve assumir valor TRUE caso a primeira linha do arquivo lido contenha o nome das variáveis.
sep: Caracter que será utilizado para separar as colunas. No nosso caso, utilizaremos “;”.
dec: Caracter que será utilizado como separador decimal. Se o arquivo importado foi gerado em um computador em português, em geral teremos “,”.skip: Número de linhas iniciais a serem ignoradas na leitura inicial do arquivo.
Assim, para ler os dados no R, utilizaremos o seguinte comando:
tab2_1<-read.table("tabela2_1.csv", dec=",", sep=";",h=T)
Podemos facilmente saber quais são as variáveis importadas através do comando:
names(tab2_1)
## [1] "N" "estado_civil" "grau_instrucao" "n_filhos"
## [5] "salario" "idade_anos" "idade_meses" "reg_procedencia"
Para acessar as variáveis dos dados importados, faremos uso do operador ‘$’. Por exemplo, para calcular as principais medidas descritivas da variável salario, faremos:
summary(tab2_1$salario)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.00 7.55 10.20 11.10 14.10 23.30
ni<-table(tab2_1$grau_instrucao) # Calcula a tabela de frequências absolutas e armazena o resultado em 'mytab'
fi<-prop.table(ni) # Tabela de frequências relativas (f_i)
p_fi<-100*prop.table(ni) # Porcentagem (100 f_i)
# Adiciona linhas de total
ni<-c(ni,sum(ni))
fi<-c(fi,sum(fi))
p_fi<-c(p_fi,sum(p_fi))
names(ni)[4]<-"Total"
Para ter o resultado na mesma disposição que na Tabela 2.2, podemos fazer da seguinte forma:
tab2_2<-cbind(ni,fi=round(fi,digits=2),p_fi=round(p_fi,digits=2))
tab2_2
## ni fi p_fi
## ensino fundamental 12 0.33 33.33
## ensino médio 18 0.50 50.00
## superior 6 0.17 16.67
## Total 36 1.00 100.00
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_3<-as.data.frame(
t(rbind(
ni=c(650,1020,330,2000),
p_fi=c(32.5,51,16.5,1)
))
,row.names =c("Fundamental","Médio","Superior","Total")
)
tab2_3
## ni p_fi
## Fundamental 650 32.5
## Médio 1020 51.0
## Superior 330 16.5
## Total 2000 1.0
ni<-table(cut(tab2_1$salario, breaks = seq(4,24,by=4),right=FALSE)) # Frequencias por categorias
tab2_4 <- rbind(ni, p_fi = 100*prop.table(ni)) # Frequencias relativas em %
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_4 <- as.data.frame(
t(cbind(
tab2_4,
c(sum(tab2_4[1,]),sum(tab2_4[2,])
))),row.names =c(colnames(tab2_4),"Total")) #Construcao da tabela
tab2_4<-transform(tab2_4,p_fi=round(p_fi,digits=2))
tab2_4
## ni p_fi
## [4,8) 10 27.78
## [8,12) 12 33.33
## [12,16) 8 22.22
## [16,20) 5 13.89
## [20,24) 1 2.78
## Total 36 100.00
Para os gráficos a seguir, note que comentamos(# no inicio do comando) a informação de título do gráfico, uma vez que seria reduntante com a informação da legenda da figura. Mantivemos o código comentado, no entanto, para chamar a atenção do leitor para as diversas formas de se adicionar esta informação ao gráfico, assim como apresentar-lhes a sintaxe para tal.
#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
table(tab2_1$grau_instrucao),
ylab="Frequência",
cex.names=0.7,
names.arg = c("Fundamental","Médio", "Superior"),
col="darkgrey",
border=NA,
#main="Figura 2.2: Gráfico em barras para a variável Y: grau de instrução.",
axes=TRUE,
ylim=c(0,20)
)
labs<-paste(1:3,"(",tab2_2[1:3,1],";",round(tab2_2[1:3,3],1),"%)",sep="")
pie(table(tab2_1$grau_instrucao),labels=labs)
#title("Figura 2.3: Gráfico em setores para a variável Y: grau de instrução")
legend(-1.1,-0.8,legend=c("1=Fundamental, 2=Médio, 3=Superior"),border=NA,box.col=NA)
#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
table(tab2_1$n_filhos),
ylab="Frequência",
cex.names=0.7,
col="darkgrey",
#main="Figura 2.4: Gráfico em barras para a variável Z: Numero de filhos.",
border=NA)
par(mfrow=c(1,3),pin=c(2,2))
tbs<-as.data.frame(cbind(x=0:5,y=c(1,1,1,1,NA,1)),row.names = as.integer(c(4,5,7,3,NA,1)))
plot(tbs,ylim=c(0,7),pch=19,ylab=NA,bty="n",yaxt="n", col="darkblue",xlab="(a)")
text(x=tbs$x,y=tbs$y,rownames(tbs),pos=3)
stripchart(tab2_1$n_filhos,method = "stack", offset = 1, pch = 19, col="darkblue",ylim=c(0,7),ylab=NA,bty="n",yaxt="n",xlab="(b)",cex=1)
plot(table(tab2_1$n_filhos),type="p", col="darkblue",pch = 19,bty="n",ylab=NA,xlab="(c)")
#mtext("Figura 2.5: Gráficos de dispersão unidimensionais para a variável Z: número de filhos",line=3,adj=1)
ni<-table(tab2_1$n_filhos) # Frequencias absolutas
tab2_5 <- rbind(ni, p_fi = 100*prop.table(ni)) # Frequencias relativas em %
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_5 <- as.data.frame(
t(cbind(
tab2_5,
c(sum(tab2_5[1,]),sum(tab2_5[2,])
))),row.names =c(colnames(tab2_5),"Total")) #Construcao da tabela
tab2_5<-transform(tab2_5,p_fi=round(p_fi,digits=2))
tab2_5
## ni p_fi
## 0 4 20
## 1 5 25
## 2 7 35
## 3 3 15
## 5 1 5
## Total 20 100
#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
table(cut(tab2_1$salario, breaks = seq(4,24,by=4),right=FALSE)),
ylab="Frequência",
xaxt="n",
cex.names=0.7,
col="darkgrey",
border=NA)
#main="Figura 2.6: Gráfico em barras para a variável S: salários" )
axis(1,at=c(.75,1.9,3.1,4.3,5.5),labels=seq(6,22,4),tick=F)
ni<-table(cut(tab2_1$salario, breaks = seq(4,24,by=4),right=FALSE)) # Frequencias por categorias
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_6 <- rbind(si=seq(6,22,by=4),ni, p_fi = 100*prop.table(ni)) # Frequencias relativas em %
tab2_6 <- as.data.frame(
t(cbind(tab2_6,
c(NA,sum(tab2_6[2,]),sum(tab2_6[3,])
))),row.names =c(colnames(tab2_6),"Total")) #Construcao da tabela
tab2_6<-transform(tab2_6,p_fi=round(p_fi,digits=2))
tab2_6
## si ni p_fi
## [4,8) 6 10 27.78
## [8,12) 10 12 33.33
## [12,16) 14 8 22.22
## [16,20) 18 5 13.89
## [20,24) 22 1 2.78
## Total NA 36 100.00
fig27<-hist(tab2_1$salario, breaks = seq(4,24,by=4),right=FALSE,probability = T,plot=F)
aux<-with(fig27, 100 * density* diff(breaks)[1])
labs <- paste(round(aux), "%", sep="")
#quebras de linha apenas ilustrativas para facilitar a leitura
plot(fig27,
freq = FALSE, labels = labs,
ylab="Densidade de Frequência",
xlab="Salário",
col="darkgrey",
border="white",
#labels=T,
#main="Figura 2.7: Histograma da variável S: salários",
xlim=c(0,24), xaxp=c(0,24,6),
ylim=c(0,.1))
fig28<-hist(tab2_1$n_filhos, right=F, breaks=seq(-.5,5.5,1),plot=F)
aux<-with(fig28, 100 * density* diff(breaks)[1])
labs <- paste(round(aux), "%", sep="")
#quebras de linha apenas ilustrativas para facilitar a leitura
plot(fig28,
ylab="Densidade de Frequência",
xlab="Número de Filhos",
col="darkgrey",
border="white",
bty="n",yaxt="n",ylim=c(0,8),
#main="Figura 2.8: Histograma da variável Z: número de filhos"
labels=labs)
#print("Figura 2.9: Ramo-e-folhas para a Variável S: salários.")
stem(tab2_1$salario,scale=2)
##
## The decimal point is at the |
##
## 4 | 06
## 5 | 37
## 6 | 379
## 7 | 446
## 8 | 157
## 9 | 01488
## 10 | 58
## 11 | 16
## 12 | 08
## 13 | 269
## 14 | 77
## 15 |
## 16 | 026
## 17 | 3
## 18 | 8
## 19 | 4
## 20 |
## 21 |
## 22 |
## 23 | 3
#quebras de linha apenas ilustrativas para facilitar a leitura
dureza<-c(53 ,70.2,84.3,69.5,77.8,87.5,53.4,82.5,67.3,54.1,
70.5,71.4,95.4,51.1,74.4,55.7,63.5,85.8,53.5,64.3,
82.7,78.5,55.7,69.1,72.3,59.5,55.3,73 ,52.4,50.7
)
#print("Figura 2.10: Ramo-e-folhas para dados de dureza de peças de alumínio.")
stem(as.integer(dureza),scale=.5)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 5 | 01233345559
## 6 | 34799
## 7 | 00123478
## 8 | 22457
## 9 | 5
#print("Figura 2.11: Ramo-e-folhas para dados de dureza, com ramos divididos.")
stem(as.integer(dureza),scale=1)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 5 | 0123334
## 5 | 5559
## 6 | 34
## 6 | 799
## 7 | 001234
## 7 | 78
## 8 | 224
## 8 | 57
## 9 |
## 9 | 5
cd_notas<-read.table("cd-notas.csv",h=T,skip=4,sep=";",dec=",")
hist(cd_notas$nota,col="darkgrey",
#main="Figura 2.12: Histograma para o CD-Notas. R.",
xlab="Notas",ylab="Frequência",border="white")
stripchart(cd_notas$nota,method = "stack", offset = 2, at=0,
#main="Figura 2.13: Gráfico de dispersão unidimensional para CD-Notas. R.",
pch = 19, col="darkblue",ylab=NA,cex=0.5)
#print("Figura 2.14: Ramo-e-Folha para o CD-Notas. R.")
stem(cd_notas$nota)
##
## The decimal point is at the |
##
## 1 | 5
## 2 | 555
## 3 | 000055555
## 4 | 000000555555
## 5 | 00000000055555555555
## 6 | 000000000000055555555555
## 7 | 0000005555555555
## 8 | 000000555
## 9 | 005
## 10 | 000
cd_poluicao<-read.table("cd-poluicao.csv",h=T,skip=8,sep=";",dec=",")
#quebras de linha apenas ilustrativas para facilitar a leitura
plot.ts(cd_poluicao$temp,
#main="Figura 2.15: Dados de Temperatura de São Paulo. R.",
xlab="Dia", ylab="Grau",col="darkgrey")
#quebras de linha apenas ilustrativas para facilitar a leitura
hist(cd_poluicao$temp,col="darkgrey",xlab="Temperatura",border="white",
#main="Figura 2.16: Histograma dos dados de Temperatura de São Paulo. R.",
ylab="")
stripchart(cd_poluicao$temp, method = "stack", offset = 2, at=0,
#main="Figura 2.17: Gráfico de dispersão unidimensional \n para os dados de temperatura de São Paulo. R.",
pch = 19, col="darkblue",ylab=NA,cex=0.5)
#print("Figura 2.18: Ramo-e-Folha para os dados de temperatura de São Paulo. R.")
stem(cd_poluicao$temp, scale=.5)
##
## The decimal point is at the |
##
## 12 | 3
## 13 | 128
## 14 | 0012588899
## 15 | 112222225558899
## 16 | 000000013344678999
## 17 | 000000001236688888999
## 18 | 00000000001111233345566889999999
## 19 | 00000000012289
## 20 | 00011
## 21 | 0