Comandos R para análises estatísticas

Capítulo 2: Resumo de Dados

2.1 Importando dados

Tabela 2.1

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:

Tabela 2.1: Informações sobre estado civil, crau de instrução, número de filhos, salário (expresso como fração do salário mínimo), idade (medida em anos e meses) e procedência de 36 empregados da seção de orçamentos da Companhia MB.
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:

Save as...

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

2.2 Distribuições de Frequência

Exemplo 2.2

Tabela 2.2

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

Tabela 2.3:

#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

Exemplo 2.3

Tabela 2.4

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

2.3 Gráficos

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.

Exemplo 2.4

Figura 2.2

#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)
  )

Figura 2.2: Gráfico em barras para a variável Y: grau de instrução.

Figura 2.3

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)

Figura 2.3: Gráfico em setores para a variável Y: grau de instrução

Exemplo 2.5

Figura 2.4

#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)

Figura 2.4: Gráfico em barras para a variável Z: Numero de filhos.

Figura 2.5

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)")

Figura 2.5: Gráficos de dispersão unidimensionais para a variável Z: número de filhos.
#mtext("Figura 2.5: Gráficos de dispersão unidimensionais para a variável Z: número de filhos",line=3,adj=1)

Tabela 2.5

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

Exemplo 2.6

Figura 2.6

#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)

Figura 2.6: Gráfico em barras para a variável S: salários.

Tabela 2.6

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

Exemplo 2.7

Figura 2.7

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))

Figura 2.7: Histograma da variável S: salários

Figura 2.8

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)

Figura 2.8: Histograma da variável Z: número de filhos.

2.4 Ramo-e-Folhas

Exemplo 2.8

Figura 2.9

#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
Figura 2.9: Ramo-e-folhas para a Variável S: salários.

Exemplo 2.9

Figura 2.10

#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
Figura 2.10: Ramo-e-folhas para dados de dureza de peças de alumínio.

Figura 2.11

#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
Figura 2.11: Ramo-e-folhas para dados de dureza, com ramos divididos.

2.5 Exemplos Computacionais

Exemplo 2.10

Figura 2.12

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")

Figura 2.12: Histograma para o CD-Notas. R.

Figura 2.13

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)

Figura 2.13: Gráfico de dispersão unidimensional para CD-Notas. R.

Figura 2.14

#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
Figura 2.14: Ramo-e-Folha para o CD-Notas. R.

Exemplo 2.11

Figura 2.15

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")

Figura 2.15: Dados de Temperatura de São Paulo. R.

Figura 2.16

#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="")

Figura 2.16: Histograma dos dados de Temperatura de São Paulo. R.

Figura 2.17

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)

Figura 2.17: Gráfico de dispersão unidimensional para os dados de temperatura de São Paulo. R.

Figura 2.18

#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
Figura 2.18: Ramo-e-Folha para os dados de temperatura de São Paulo. R.

Capítulo Anterior | Introdução | Próximo Capítulo