8 Análise descritiva

8.1 Descrição univariada

Nesta sessão vamos ver alguns (mas não todos!) comandos do R para fazer uma análise descritiva de um conjunto de dados.

Uma boa forma de iniciar uma análise descritiva adequada é verificar os tipode de variáveis disponíveis. Variáveis podem ser classificadas da seguinte forma:

e podem ser resumidas por tabelas, gráficos e/ou medidas.

8.2 O conjunto de dados “milsa”

O livro Estatística Básica de W. Bussab e P. Morettin traz no primeiro capítulo um conjunto de dados hipotético de atributos de 36 funcionários da companhia “Milsa”. Os dados estão reproduzidos na tabela 8.2. Consulte o livro para mais detalhes sobre este dados.



Tabela 2: Dados de Bussab & Morettin
















Funcionário
Est. Civil
Instrução
No Filhos
Salário
Ano
Mês
Região








1 solteiro 1o Grau - 4.00 26 3interior
2 casado 1o Grau 1 4.56 32 10capital
3 casado 1o Grau 2 5.25 36 5capital
4 solteiro 2o Grau - 5.73 20 10outro
5 solteiro 1o Grau - 6.26 40 7outro
6 casado 1o Grau 0 6.66 28 0interior
7 solteiro 1o Grau - 6.86 41 0interior
8 solteiro 1o Grau - 7.39 43 4capital
9 casado 2o Grau 1 7.59 34 10capital
10 solteiro 2o Grau - 7.44 23 6outro
11 casado 2o Grau 2 8.12 33 6interior
12 solteiro 1o Grau - 8.46 27 11capital
13 solteiro 2o Grau - 8.74 37 5outro
14 casado 1o Grau 3 8.95 44 2outro
15 casado 2o Grau 0 9.13 30 5interior
16 solteiro 2o Grau - 9.35 38 8outro
17 casado 2o Grau 1 9.77 31 7capital
18 casado 1o Grau 2 9.80 39 7outro
19 solteiro Superior - 10.53 25 8interior
20 solteiro 2o Grau - 10.76 37 4interior
21 casado 2o Grau 1 11.06 30 9outro
22 solteiro 2o Grau - 11.59 34 2capital
23 solteiro 1o Grau - 12.00 41 0outro
24 casado Superior 0 12.79 26 1outro
25 casado 2o Grau 2 13.23 32 5interior
26 casado 2o Grau 2 13.60 35 0outro
27 solteiro 1o Grau - 13.85 46 7outro
28 casado 2o Grau 0 14.69 29 8interior
29 casado 2o Grau 5 14.71 40 6interior
30 casado 2o Grau 2 15.99 35 10capital
31 solteiro Superior - 16.22 31 5outro
32 casado 2o Grau 1 16.61 36 4interior
33 casado Superior 3 17.26 43 7capital
34 solteiro Superior - 18.75 33 7capital
35 casado 2o Grau 2 19.40 48 11capital
36 casado Superior 3 23.30 42 2interior









O que queremos aqui é ver como, no programa R:

Estes são dados no "estilo planilha", com variáveis de diferentes tipos: categóricas e numéricas (qualitativas e quantitativas). Portanto o formato ideal de armazenamento destes dados no R é o data.frame. Para entrar com estes dados no diretamente no R podemos usar o editor que vem com o programa. Para digitar rapidamente estes dados é mais fácil usar códigos para as variáveis categóricas. Desta forma, na coluna de estado civil vamos digitar o código 1 para solteiro e 2 para casado. Fazemos de maneira similar com as colunas Grau de Instrução e Região de Procedência. No comando a seguir invocamos o editor, entramos com os dados na janela que vai aparecer na sua tela e quanto saímos do editor (pressionando o botão QUIT) os dados ficam armazenados no objeto milsa. Após isto digitamos o nome do objeto (milsa) e podemos ver o conteúdo digitado, como mostra a tabela 8.2. Lembre-se que se voce precisar corrigir algo na digitação voce pode fazê-lo abrindo a planilha novamente com o comando fix(milsa).

  > milsa <- edit(data.frame())
  > milsa
  > fix(milsa)


Tabela 3: Dados digitados usando códigos para variáveis

















civil
instrucao
filhos
salario
ano
mes
regiao








1 1 1 NA 4.00 26 3 1
2 2 1 1 4.56 32 10 2
3 2 1 2 5.25 36 5 2
4 1 2 NA 5.73 20 10 3
5 1 1 NA 6.26 40 7 3
6 2 1 0 6.66 28 0 1
7 1 1 NA 6.86 41 0 1
8 1 1 NA 7.39 43 4 2
9 2 2 1 7.59 34 10 2
10 1 2 NA 7.44 23 6 3
11 2 2 2 8.12 33 6 1
12 1 1 NA 8.46 27 11 2
13 1 2 NA 8.74 37 5 3
14 2 1 3 8.95 44 2 3
15 2 2 0 9.13 30 5 1
16 1 2 NA 9.35 38 8 3
17 2 2 1 9.77 31 7 2
18 2 1 2 9.80 39 7 3
19 1 3 NA 10.53 25 8 1
20 1 2 NA 10.76 37 4 1
21 2 2 1 11.06 30 9 3
22 1 2 NA 11.59 34 2 2
23 1 1 NA 12.00 41 0 3
24 2 3 0 12.79 26 1 3
25 2 2 2 13.23 32 5 1
26 2 2 2 13.60 35 0 3
27 1 1 NA 13.85 46 7 3
28 2 2 0 14.69 29 8 1
29 2 2 5 14.71 40 6 1
30 2 2 2 15.99 35 10 2
31 1 3 NA 16.22 31 5 3
32 2 2 1 16.61 36 4 1
33 2 3 3 17.26 43 7 2
34 1 3 NA 18.75 33 7 2
35 2 2 2 19.40 48 11 2
36 2 3 3 23.30 42 2 1









Atenção: Note que além de digitar os dados na planilha digitamos também o nome que escolhemos para cada variável. Para isto basta, na planilha, clicar no nome da variável e escolher a opção CHANGE NAME e informar o novo nome da variável.

A planilha digitada como está ainda não está pronta. Precisamos informar para o programa que as variáveis civil, instrucao e regiao, NÃO são numéricas e sim categóricas. No R variáveis categóricas são definidas usando o comando factor(), que vamos usar para redefinir nossas variáveis conforme os comandos a seguir. Inicialmente inspecionamos as primeiras linhas do conjunto de dados. A seguir redefinimos a variável civil com os rótulos (labels) solteiro e casado associados aos níveis (levels) 1 e 2. Para variável instruçao usamos o argumento adicional ordered = TRUE para indicar que é uma variável ordinal. Na variável regiao codificamos assim: 2=capital, 1=interior, 3=outro. Ao final inspecionamos as primeiras linhas do conjunto de dados digitando usando head().

  > head(milsa)
    funcionario civil instrucao filhos salario ano mes regiao
  1           1     1         1     NA    4.00  26   3      1
  2           2     2         1      1    4.56  32  10      2
  3           3     2         1      2    5.25  36   5      2
  4           4     1         2     NA    5.73  20  10      3
  5           5     1         1     NA    6.26  40   7      3
  6           6     2         1      0    6.66  28   0      1
  > milsa$civil <- factor(milsa$civil, label = c("solteiro", "casado"),
  +     levels = 1:2)
  > milsa$instrucao <- factor(milsa$instrucao, label = c("1oGrau",
  +     "2oGrau", "Superior"), lev = 1:3, ord = T)
  > milsa$regiao <- factor(milsa$regiao, label = c("capital", "interior",
  +     "outro"), lev = c(2, 1, 3))
  > head(milsa)
    funcionario    civil instrucao filhos salario ano mes   regiao
  1           1 solteiro    1oGrau     NA    4.00  26   3 interior
  2           2   casado    1oGrau      1    4.56  32  10  capital
  3           3   casado    1oGrau      2    5.25  36   5  capital
  4           4 solteiro    2oGrau     NA    5.73  20  10    outro
  5           5 solteiro    1oGrau     NA    6.26  40   7    outro
  6           6   casado    1oGrau      0    6.66  28   0 interior

Em versões mais recentes do R foi introduzida a função transform() que pode ser usada alternativamente aos comandos mostrados acima para modificar ou gerar novas variáveis. Por exemplo, os comandos acima poderiam ser substituídos por:

  > milsa <- transform(milsa, civil = factor(civil, label = c("solteiro",
  +     "casado"), levels = 1:2), instrucao = factor(instrucao, label = c("1oGrau",
  +     "2oGrau", "Superior"), lev = 1:3, ord = T), regiao = factor(regiao,
  +     label = c("capital", "interior", "outro"), lev = c(2, 1,
  +         3)))

Vamos ainda definir uma nova variável única idade a partir das variáveis ano e mes que foram digitadas. Para gerar a variável idade em anos fazemos:

  > milsa <- transform(milsa, idade = ano + mes/12)
  > milsa$idade
   [1] 26.25000 32.83333 36.41667 20.83333 40.58333 28.00000 41.00000 43.33333
   [9] 34.83333 23.50000 33.50000 27.91667 37.41667 44.16667 30.41667 38.66667
  [17] 31.58333 39.58333 25.66667 37.33333 30.75000 34.16667 41.00000 26.08333
  [25] 32.41667 35.00000 46.58333 29.66667 40.50000 35.83333 31.41667 36.33333
  [33] 43.58333 33.58333 48.91667 42.16667

Uma outra forma de se obter o mesmo resultado seria:

  > milsa$idade <- milsa$ano + milsa$mes/12

Agora que os dados estão prontos podemos começar a análise descritiva. A seguir mostramos como fazer análises descritivas uni e bi-variadas. Inspecione os comandos mostrados a seguir e os resultados por eleas produzidos. Sugerimos ainda que o leitor use o R para reproduzir os resultados mostrados no texto dos capítulos 1 a 3 do livro de Bussab & Morettin relacionados com este exemplo.

Inicialmente verificamos que o objeto milsa é um data-frame, usamos names() para ver os nomes das variáveis, e dim() para ver o número de linhas (36 indivíduos) e colunas (9 variáveis).

  > is.data.frame(milsa)
  [1] TRUE
  > names(milsa)
  [1] "funcionario" "civil"       "instrucao"   "filhos"      "salario"
  [6] "ano"         "mes"         "regiao"      "idade"
  > dim(milsa)
  [1] 36  9

Como na sequência vamos fazer diversas análises com estes dados usaremos o command attach() para anexar o objeto ao caminho de procura para simplificar a digitação.

  > attach(milsa)

NOTA: este comando deve ser digitado para que os comandos mostrados a seguir tenham efeito.

8.2.1 Análise Univariada

A análise univariada consiste basicamente em, para cada uma das variáveis individualmente:

A partir destes resultados pode-se montar um resumo geral dos dados.

A seguir vamos mostrar como obter tabelas, gráficos e medidas com o R. Para isto vamos selecionar uma variável de cada tipo para que o leitor possa, por analogia, obter resultados para as demais.

Variável Qualitativa Nominal A variável civil é uma qualitativa nominal. Desta forma podemos obter: (i) uma tabela de frequências (absolutas e/ou relativas), (ii) um gráfico de setores, (iii) a "moda", i.e. o valor que ocorre com maior frequência.

Vamos primeiro listar os dados e checar se estao na forma de um fator, que é adequada para variáveis deste tipo.

  > civil

   [1] solteiro casado   casado   solteiro solteiro casado   solteiro solteiro
   [9] casado   solteiro casado   solteiro solteiro casado   casado   solteiro
  [17] casado   casado   solteiro solteiro casado   solteiro solteiro casado
  [25] casado   casado   solteiro casado   casado   casado   solteiro casado
  [33] casado   solteiro casado   casado
  Levels: solteiro casado

  > is.factor(civil)

  [1] TRUE

A seguir obtemos frequências absolutas e relativas (note duas formas fiferentes de obter as frequências relativas. Note ainda que optamos por armazenar as frequências absolutas em um objeto que chamamos de civil.tb.

  > civil.tb <- table(civil)
  > civil.tb

  civil
  solteiro   casado
        16       20

  > 100 * table(civil)/length(civil)

  civil
  solteiro   casado
  44.44444 55.55556

  > prop.table(civil.tb)

  civil
   solteiro    casado
  0.4444444 0.5555556

O gráfico de setores é adequado para representar esta variável conforme mostrado na Figura 8.2.1.

  > pie(table(civil))


PIC

Figura 4: Gráfico de setores para variável civil.


NOTA: Em computadores antigos e de baixa resolução gráfica (como por exemplo em alguns computadores da Sala A do LABEST/UFPR) o gráfico pode não aparecer de forma adequada devido limitação de memória da placa de vídeo. Se este for o caso use o comando mostrado a seguir ANTES de fazer o gráfico.

  > X11(colortype = "pseudo.cube")

Finalmente encontramos a moda para esta variável cujo valor optamos por armazenar no objeto civil.mo.

  > civil.mo <- names(civil.tb)[which.max(civil.tb)]
  > civil.mo
  [1] "casado"

Variável Qualitativa Ordinal Para exemplificar como obter análises para uma variável qualitativa ordinal vamos selecionar a variável instrucao.

  > instrucao

   [1] 1oGrau   1oGrau   1oGrau   2oGrau   1oGrau   1oGrau   1oGrau   1oGrau
   [9] 2oGrau   2oGrau   2oGrau   1oGrau   2oGrau   1oGrau   2oGrau   2oGrau
  [17] 2oGrau   1oGrau   Superior 2oGrau   2oGrau   2oGrau   1oGrau   Superior
  [25] 2oGrau   2oGrau   1oGrau   2oGrau   2oGrau   2oGrau   Superior 2oGrau
  [33] Superior Superior 2oGrau   Superior
  Levels: 1oGrau < 2oGrau < Superior

  > is.factor(instrucao)

  [1] TRUE

As tabelas de frequências são obtidas de forma semelhante à mostrada anteriormente.

  > instrucao.tb <- table(instrucao)
  > instrucao.tb

  instrucao
    1oGrau   2oGrau Superior
        12       18        6

  > prop.table(instrucao.tb)

  instrucao
     1oGrau    2oGrau  Superior
  0.3333333 0.5000000 0.1666667

O gráfico de setores não é adequado para este tipo de variável por não expressar a ordem dos possíveis valores. Usamos então um gráfico de barras conforma mostrado na Figura 8.2.1.

  > barplot(instrucao.tb)


PIC

Figura 5: Gráfico de barras para variável instrucao.


Para uma variável ordinal, além da moda podemos também calcular outras medidas, tais como a mediana conforme exemplificado a seguir. Note que o comando median() não funciona com variáveis não numéricas e por isto usamos o comando seguinte.

  > instrucao.mo <- names(instrucao.tb)[which.max(instrucao.tb)]
  > instrucao.mo

  [1] "2oGrau"

  > median(as.numeric(instrucao))

  [1] 2

  > levels(milsa$instrucao)[median(as.numeric(milsa$instrucao))]

  [1] "2oGrau"

Variável quantitativa discreta Vamos agora usar a variável filhos (número de filhos) para ilustrar algumas análises que podem ser feitas com uma quantitativa discreta. Note que esta deve ser uma variável numérica, e não um fator.

  > filhos

   [1] NA  1  2 NA NA  0 NA NA  1 NA  2 NA NA  3  0 NA  1  2 NA NA  1 NA NA  0  2
  [26]  2 NA  0  5  2 NA  1  3 NA  2  3

  > is.factor(filhos)

  [1] FALSE

  > is.numeric(filhos)

  [1] TRUE

Frequências absolutas e relativas são obtidas como anteriormente.

  > filhos.tb <- table(filhos)
  > filhos.tb

  filhos
  0 1 2 3 5
  4 5 7 3 1

  > filhos.tbr <- prop.table(filhos.tb)
  > filhos.tbr

  filhos
     0    1    2    3    5
  0.20 0.25 0.35 0.15 0.05

O gráfico adequado para frequências absolutas de uma variável discreta é mostrado na Figura 8.2.1 o obtido com os comandos a seguir.

  > plot(filhos.tb)


PIC

Figura 6: Gráfico de frequências absolutas para variável filhos.


Outra possibilidade seria fazer gráficos de frequências relativas e de prequências acumuladas conforme mostrado na Figura 8.2.1.

  > plot(filhos.tbr)
  > filhos.fac <- cumsum(filhos.tbr)
  > filhos.fac
  > plot(filhos.fac, type = "S")


PIC

Figura 7: Gráfico de frequências relativas (esquerda) e frequências acumuladas para variável filhos.


Sendo a variável numérica há uma maior diversidade de medidas estatísticas que podem ser calculadas.

A seguir mostramos como obter algumas medidas de posição: moda, mediana, média e média aparada. Note que o argumento na.rm=T é necessário porque não há informação sobre número de filhos para alguns indivíduos. O argumento trim=0.1 indica uma média aparada onde foram retirados 10% dos menores e 10% dos maiores dados. Ao final mostramos como obter os quartis, mínimo e máximo.

  > filhos.mo <- names(filhos.tb)[which.max(filhos.tb)]
  > filhos.mo
  [1] "2"
  > filhos.md <- median(filhos, na.rm = T)
  > filhos.md
  [1] 2
  > filhos.me <- mean(filhos, na.rm = T)
  > filhos.me
  [1] 1.65
  > filhos.me <- mean(filhos, trim = 0.1, na.rm = T)
  > filhos.me
  [1] 1.5625
  > filhos.qt <- quantile(filhos, na.rm = T)

Passando agora para medidas de dispersão vejamos como obter máximo e mínimo daí a amplitude, variância e desvio padrão, coeficiente de variação. Depois obtemos os quartis e daí a amplitude interquartílica.

  > range(filhos, na.rm = T)
  [1] 0 5
  > filhos.A <- diff(range(filhos, na.rm = T))
  > filhos.A
  [1] 5
  > var(filhos, na.rm = T)
  [1] 1.607895
  > filhos.dp <- sd(filhos, na.rm = T)
  > filhos.dp
  [1] 1.268028
  > filhos.cv <- 100 * filhos.dp/filhos.me
  > filhos.cv
  [1] 81.15379
  > filhos.qt <- quantile(filhos, na.rm = T)
  > filhos.ai <- filhos.qt[4] - filhos.qt[2]
  > filhos.ai
  75%
    1

Finalmente, notamos que há comandos para se obter várias medidas de uma sá vez. Inspecione os resultados dos comandos abaixo.

  > summary(filhos)
     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
     0.00    1.00    2.00    1.65    2.00    5.00   16.00
  > fivenum(filhos)
  [1] 0 1 2 2 5

Variável quantitativa Contínua Para concluir os exemplos para análise univariada vamos considerar a variável quantitativa contínua salario. Começamos mostrando os valores da variável e verificando o seu tipo no R.

  > salario

   [1]  4.00  4.56  5.25  5.73  6.26  6.66  6.86  7.39  7.59  7.44  8.12  8.46
  [13]  8.74  8.95  9.13  9.35  9.77  9.80 10.53 10.76 11.06 11.59 12.00 12.79
  [25] 13.23 13.60 13.85 14.69 14.71 15.99 16.22 16.61 17.26 18.75 19.40 23.30

  > is.factor(salario)

  [1] FALSE

  > is.numeric(salario)

  [1] TRUE

Para se fazer uma tabela de frequências de uma contínua é preciso primeiro agrupar os dados em classes. Nos comandos mostrados a seguir verificamos inicialmente os valores máximo e mínimo dos dados, depois usamos o critério de Sturges para definir o número de classes, usamos cut() para agrupar os dados em classes e finalmente obtemos as frequências absolotas e relativas.

  > range(salario)

  [1]  4.0 23.3

  > nclass.Sturges(salario)

  [1] 7

  > args(cut)

  function (x, ...)
  NULL

  > args(cut.default)

  function (x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE,
      dig.lab = 3, ordered_result = FALSE, ...)
  NULL

  > salario.tb <- table(cut(salario, seq(3.5, 23.5, l = 8)))
  > prop.table(salario.tb)

   (3.5,6.36] (6.36,9.21] (9.21,12.1] (12.1,14.9] (14.9,17.8] (17.8,20.6]
   0.13888889  0.27777778  0.22222222  0.16666667  0.11111111  0.05555556
  (20.6,23.5]
   0.02777778

Na sequência vamos mostrar dois possíveis gráficos para variáveis contínuas: histograma e box-plot conforme Figura 8.2.1. Neste comando fazemos main= para evitar que a função coloque automaticamente o título no gráfico, o que é o comportamento padrão de hist(). É sempre bom lembrar que há várias outras opções fornecidas pelos argumentos das funções. Por exemplo, em hist() acrescentando labels=TRUE as frequências são mostradas em coma de cada barra, prob=TRUE faz com que o gráfico exiba as frequências relaticas. Por default a função calcula automaticamente o número de classes e os valores limites de cada classe e isto pode ser alterado com o argumento breaks que pode receber um vetor definindo os limites das classes definidos pelo usuário, um nome de critério (default="Sturges"), número de classes ou mesmo uma função para definir as classes; ou ainda nclass pode receber um escalar definindo o número de classes. Além destas há ainda várias outras opções implementadas pelos argumentos da função conforme descrito em help(hist). Da mesma forma argumentos permitem variações em boxplot tais como caixas com tamanho proporcional aos tamanhos dos grupos, caixas "acinturadas"(notched boxplot) entre outras.

  > hist(salario, main = "")
  > boxplot(salario)


PIC

Figura 8: Histograma (esquerda) e boxplot (direita) para a variável salario.


Uma outra representação gráfica para variáveis numéricas é o diagrama ramo-e-folhas que pode ser obtido conforme mostrado a seguir.

  > stem(salario)

    The decimal point is at the |
  
     4 | 0637
     6 | 379446
     8 | 15791388
    10 | 5816
    12 | 08268
    14 | 77
    16 | 0263
    18 | 84
    20 |
    22 | 3

Finalmente medidas s obtidas da mesma forma que para variáveis discretas. Veja alguns exemplos a seguir.

  > salario.md <- median(salario, na.rm = T)
  > salario.md

  [1] 10.165

  > salario.me <- mean(salario, na.rm = T)
  > salario.me

  [1] 11.12222

  > range(salario, na.rm = T)

  [1]  4.0 23.3

  > salario.A <- diff(range(salario, na.rm = T))
  > salario.A

  [1] 19.3

  > var(salario, na.rm = T)

  [1] 21.04477

  > salario.dp <- sd(salario, na.rm = T)
  > salario.dp

  [1] 4.587458

  > salario.cv <- 100 * salario.dp/salario.me
  > salario.cv

  [1] 41.24587

  > salario.qt <- quantile(salario, na.rm = T)
  > salario.ai <- salario.qt[4] - salario.qt[2]
  > salario.ai

     75%
  6.5075

  > summary(salario)

     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    4.000   7.552  10.160  11.120  14.060  23.300

  > fivenum(salario)

  [1]  4.000  7.515 10.165 14.270 23.300

8.2.2 Análise Bivariada

Na análise bivariada procuramos identificar relaccões entre duas variáveis. Assim como na univariada estas relações podem ser resumidas por gráficos, tabelas e/ou medidas estatística. O tipo de resumo vai depender dos tipos das variáveis envolvidas. Vamos considerar três possibilidades:

Salienta-se ainda que:

Qualitativa vs Qualitativa Vamos considerar as variáveis civil (estado civil) e instrucao (grau de instrução). A tabela envolvendo duas variáveis é chamada tabela de cruzamento ou tabela de contingência e pode ser apresentada de várias formas, conforme discutido a seguir. A forma mais adequada de apresentação vai depender dos objetivos da análise e da interpretação desejada para os dados. Iniciamente obtemos com table() a tabela de frequências absolutas. A tabela extendida incluindo os totais marginais pode ser obtida com addmargins().

  > civ.gi.tb <- table(civil, instrucao)
  > civ.gi.tb

            instrucao
  civil      1oGrau 2oGrau Superior
    solteiro      7      6        3
    casado        5     12        3

  > addmargins(civ.gi.tb)

            instrucao
  civil      1oGrau 2oGrau Superior Sum
    solteiro      7      6        3  16
    casado        5     12        3  20
    Sum          12     18        6  36

Tabelas de frequências relativas são obtidas com prop.table() e tais frequências podem ser globais, por linha (margin=1) ou por coluna (margin=2).

  > prop.table(civ.gi.tb)

            instrucao
  civil          1oGrau     2oGrau   Superior
    solteiro 0.19444444 0.16666667 0.08333333
    casado   0.13888889 0.33333333 0.08333333

  > prop.table(civ.gi.tb, margin = 1)

            instrucao
  civil      1oGrau 2oGrau Superior
    solteiro 0.4375 0.3750   0.1875
    casado   0.2500 0.6000   0.1500

  > prop.table(civ.gi.tb, margin = 2)

            instrucao
  civil         1oGrau    2oGrau  Superior
    solteiro 0.5833333 0.3333333 0.5000000
    casado   0.4166667 0.6666667 0.5000000

Na Figura 8.2.2 mostramos quatro diferentes gráficos de barras que podem ser usados para representar o cruzamento das variáveis. A transposição da tabela com t() permite alterar a variável que define os grupos no eixo horizontal. O uso de prop.table() permite o obtenção de gráficos com frequências relativas.

  > barplot(civ.gi.tb, legend = T)
  > barplot(t(civ.gi.tb), legend = T)
  > barplot(civ.gi.tb, beside = T, legend = T)
  > barplot(t(prop.table(civ.gi.tb)), beside = T, legend = T)


PIC

Figura 9: Quatro tipos de gráficos de barras ilustrando o resultado do cruzamento das variáveis civil e instrucao.


Medidas de associação entre duas variáveis qualitativas incluem o Chi-quadrado dado por:

      ∑k          2
χ2 =      (oi --ei)-,
      i=1    ei
onde oi e ei são, respectivamente, frequências observadas e esperadas nas k posições da tabela de cruzamento das variáveis. Outras medidas derivadas desta são o o coeficiente de contingência C e o coeficiente de contingência modificado C1 dados por:
     ∘ -------
          χ2               C
C  =    -2-----, C1 = ----------2,
        χ +  n        [(t - 1)∕t]
onde n é o número de observações e t é o mínimo entre o número de linas e colunas da tabela. Os comandos a seguir mostram como obter todas estas medidas.
  > summary(civ.gi.tb)
  Number of cases in table: 36
  Number of factors: 2
  Test for independence of all factors:
   Chisq = 1.9125, df = 2, p-value = 0.3843
   Chi-squared approximation may be incorrect
  > names(summary(civ.gi.tb))
  [1] "n.vars"    "n.cases"   "statistic" "parameter" "approx.ok" "p.value"
  [7] "call"
  > chisq <- summary(civ.gi.tb)$stat
  > chisq
  [1] 1.9125
  > n <- sum(civ.gi.tb)
  > n
  [1] 36
  > C <- sqrt(chisq/(chisq + n))
  > C
  [1] 0.2245999
  > t <- min(dim(civ.gi.tb))
  > C1 <- C/((t - 1)/t)^2
  > C1
  [1] 0.8983995

Muitas vezes é necessário reagrupar categorias porque algumas frequências são muito baixas. Por exemplo vamos criar uma nova variável para agrupar 2o Grau e Superior usando ifelse() e depois podemos refazer as análises do cruzamento com esta nova variável

  > instrucao1 <- ifelse(instrucao == "1oGrau", 1, 2)
  > instrucao1 <- factor(instrucao1, label = c("1oGrau", "2o+Superior"),
  +     lev = 1:2, ord = T)
  > table(instrucao1)
  instrucao1
       1oGrau 2o+Superior
           12          24
  > table(civil, instrucao1)
            instrucao1
  civil      1oGrau 2o+Superior
    solteiro      7           9
    casado        5          15
  > summary(table(civil, instrucao1))
  Number of cases in table: 36
  Number of factors: 2
  Test for independence of all factors:
   Chisq = 1.4062, df = 1, p-value = 0.2357

Qualitativa vs Quantitativa Para exemplificar este caso vamos considerar as variáveis instrucao e salario.

Para se obter uma tabela de frequências é necessário agrupar a variável quantitativa em classes. No exemplo a seguir vamos agrupar a variável salário em 4 classes definidas pelos quartis usando cut(). Note que as classes são definidas por intervalos abertos à esquerda e então usamos o argumento include.lowest=TRUE para garantir que todos os dados, incluve o menor (mínimo) seja incluído na primeira classe. Após agrupar esta variável obtemos a(s) tabela(s) de cruzamento como mostrado no caso anterior.

  > quantile(salario)

       0%     25%     50%     75%    100%
   4.0000  7.5525 10.1650 14.0600 23.3000

  > salario.cl <- cut(salario, quantile(salario), include.lowest = T)
  > ins.sal.tb <- table(instrucao, salario.cl)
  > ins.sal.tb

            salario.cl
  instrucao  [4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
    1oGrau          7           3           2           0
    2oGrau          2           6           5           5
    Superior        0           0           2           4

  > prop.table(ins.sal.tb, margin = 1)

            salario.cl
  instrucao   [4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
    1oGrau   0.5833333   0.2500000   0.1666667   0.0000000
    2oGrau   0.1111111   0.3333333   0.2777778   0.2777778
    Superior 0.0000000   0.0000000   0.3333333   0.6666667

No gráfico vamos considerar que neste exemplo a instrução deve ser a variável explicativa e portanto colocada no eixo-X e o salário é a variável resposta e portanto no eixo-Y. Isto é, consideramos que a instrução deve explicar, ainda que parcialmente, o salário (e não o contrário!). Vamos então obter um boxplot dos salários para cada nível de instrução. Note que o função abaixo usamos a notação de formula do R, com salario instrucao indicando que a variável salario é explicada (~) pela variável instrucao.

  > boxplot(salario ~ instrucao)


PIC

Figura 10: Boxplot da variável salario para cada nível da variável instrucao.


Poderíamos ainda fazer gráficos com a variável salario agrupada em classes, e neste caso os gráficos seriam como no caso anterior com duas variáveis qualitativas.

Para as medidas o usual é obter um resumo da quantitativa como mostrado na análise univariada, porém agora infromando este resumo para cada nível do fator qualitativo. A seguir mostramos alguns exemplos de como obter a média, desvio padrão e o resumo de cinco números do salário para cada nível de instrução.

  > tapply(salario, instrucao, mean)
     1oGrau    2oGrau  Superior
   7.836667 11.528333 16.475000
  > tapply(salario, instrucao, sd)
    1oGrau   2oGrau Superior
  2.956464 3.715144 4.502438
  > tapply(salario, instrucao, quantile)
  $1oGrau
       0%     25%     50%     75%    100%
   4.0000  6.0075  7.1250  9.1625 13.8500
  
  $2oGrau
       0%     25%     50%     75%    100%
   5.7300  8.8375 10.9100 14.4175 19.4000
  
  $Superior
       0%     25%     50%     75%    100%
  10.5300 13.6475 16.7400 18.3775 23.3000

Quantitativa vs Quantitativa Para ilustrar este caso vamos considerar as variáveis salario e idade. Para se obter uma tabela é necessário agrupar as variáveis em classes conforma fizemos no caso anterior. Nos comandos abaixo agrupamos as duas variáveis em classes definidas pelos respectivos quartis gerando portanto uma tabela de cruzamento 4  ×  4.

  > idade.cl <- cut(idade, quantile(idade), include.lowest = T)
  > table(idade.cl)

  idade.cl
  [20.8,30.7] (30.7,34.9] (34.9,40.5] (40.5,48.9]
            9           9           9           9

  > salario.cl <- cut(salario, quantile(salario), include.lowest = T)
  > table(salario.cl)

  salario.cl
     [4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
            9           9           9           9

  > table(idade.cl, salario.cl)

               salario.cl
  idade.cl      [4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
    [20.8,30.7]        4           2           2           1
    (30.7,34.9]        1           3           3           2
    (34.9,40.5]        1           3           2           3
    (40.5,48.9]        3           1           2           3

  > prop.table(table(idade.cl, salario.cl), mar = 1)

               salario.cl
  idade.cl       [4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
    [20.8,30.7] 0.4444444   0.2222222   0.2222222   0.1111111
    (30.7,34.9] 0.1111111   0.3333333   0.3333333   0.2222222
    (34.9,40.5] 0.1111111   0.3333333   0.2222222   0.3333333
    (40.5,48.9] 0.3333333   0.1111111   0.2222222   0.3333333

Caso queiramos definir um número menor de classes podemos fazer como no exemplo a seguir onde cada variável é dividida em 3 classes e gerando um tabela de cruzamento 3  ×  3.

  > idade.cl1 <- cut(idade, quantile(idade, seq(0, 1, len = 4)),
  +     include.lowest = T)
  > salario.cl1 <- cut(salario, quantile(salario, seq(0, 1, len = 4)),
  +     include.lowest = T)
  > table(idade.cl1, salario.cl1)

               salario.cl1
  idade.cl1     [4,8.65] (8.65,12.9] (12.9,23.3]
    [20.8,32.1]        5           5           2
    (32.1,37.8]        4           3           5
    (37.8,48.9]        3           4           5

  > prop.table(table(idade.cl1, salario.cl1), mar = 1)

               salario.cl1
  idade.cl1      [4,8.65] (8.65,12.9] (12.9,23.3]
    [20.8,32.1] 0.4166667   0.4166667   0.1666667
    (32.1,37.8] 0.3333333   0.2500000   0.4166667
    (37.8,48.9] 0.2500000   0.3333333   0.4166667

O gráfico adequado para representar duas variáveis quantitativas é um diagrama de dispersão. Note que se as variáveis envolvidas puderem ser classificadas como "explicativa"e "resposta"devemos colocar a primeira no eixo-X e a segunda no eixo-Y. Neste exemplo é razoável admitir que a idade deve explicar, ao menos parcialmente, o salário e portanto fazemos o gráfico com idade n eixo-X.

  > plot(idade, salario)


PIC

Figura 11: Diagrama de dispersão para as variáveis salario e idade.


Para quantificar a associação entre variáveis deste tipo usamos um coeficiente de correlação. A função cor() do R possui opção para três coeficientes tendo como default o coeficiente de correlação linear de Pearson.

  > cor(idade, salario)

  [1] 0.3651397

  > cor(idade, salario, method = "kendall")

  [1] 0.214456

  > cor(idade, salario, method = "spearman")

  [1] 0.2895939

8.2.3 Análises descritvas multivariadas

Em geral as técnicas descritivas uni e bivariadas mostradas até aqui podem ser extendidas a mais dimensões. Além disto há ferramentas específicas para exploração de dados multidimensionais. Neste momento vamos apenas ilustrar como o comando tapply() pode ser extendido. Anteriormente nesta sessão mostramos como calcular o salário médio para cada nível de instrução. Vamos extender este exemplo calculando o salário médio também para cada estado civil e para combinação dos níveis destes dois fatores. Esta úmtima é mostrada de duas maneiras, uma delas retornando um vetor e outra uma matrix.

  > tapply(salario, instrucao, mean)

     1oGrau    2oGrau  Superior
   7.836667 11.528333 16.475000

  > tapply(salario, civil, mean)

   solteiro    casado
   9.870625 12.123500

  > tapply(salario, interaction(instrucao, civil), mean)

    1oGrau.solteiro   2oGrau.solteiro Superior.solteiro     1oGrau.casado
           8.402857          8.935000         15.166667          7.044000
      2oGrau.casado   Superior.casado
          12.825000         17.783333

  > tapply(salario, list(instrucao, civil), mean)

            solteiro   casado
  1oGrau    8.402857  7.04400
  2oGrau    8.935000 12.82500
  Superior 15.166667 17.78333

Além de funções pré-definidas no R, como mean() utilizada nos comandos anteriores, podemos definir uma função particular que desejemos. Como exemplo, considere contar em cada grupo, o número de indivíduos que tem salário igual ou superior a 10 unidades, os comandos seriam como mostrado a seguir.

  > tapply(salario, instrucao, function(x) sum(x >= 10))

    1oGrau   2oGrau Superior
         2       10        6

  > tapply(salario, civil, function(x) sum(x >= 10))

  solteiro   casado
         7       11

  > tapply(salario, interaction(instrucao, civil), function(x) sum(x >=
  +     10))

    1oGrau.solteiro   2oGrau.solteiro Superior.solteiro     1oGrau.casado
                  2                 2                 3                 0
      2oGrau.casado   Superior.casado
                  8                 3

Lembre que ao iniciar as análises com este conjunto de dados anexamos os dados com o comando attach(milsa). Portanto ao terminar as análises com estes dados devemos desanexar este conjunto de dados com o detach()

  > detach(milsa)

8.3 Uma demonstração de recursos gráficos do R

O R vem com algumas demonstrações (demos) de seus recursos “embutidas” no programa. Para listar as demos disponíveis digite na linha de comando:

  > demo()

Para rodar uma delas basta colocar o nome da escolhida entre os parênteses. As demos são úties para termos uma idéia dos recursos disponíveis no programa e para ver os comandos que devem ser utilizados.

Por exemplo, vamos rodar a demo de recursos gráficos. Note que os comandos vão aparecer na janela de comandos e os gráficos serão automaticamente produzidos na janela gráfica. A cada passo voce vai ter que teclar ENTER para ver o próximo gráfico.

8.4 Outros dados disponíveis no R

Há vários conjuntos de dados incluídos no programa R como, por exemplo, o conjunto mtcars. Estes conjuntos são todos documentados, isto é, voce pode usar a função help para obter uma descrição dos dados. Para ver a lista de conjuntos de dados disponíveis digite data(). Por exemplo tente os seguintes comandos:

  > data()
  > data(women)
  > women
  > help(woman)

8.5 Mais detalhes sobre o uso de funções

As funções do R são documentadas e o uso é explicado e ilustrado usando a help(). Por exemplo, o comando help(mean) vai exibir e documentação da função mean(). Note que no final da documentação há exemplos de uso da função que voce pode reproduzir para entendê-la melhor.

8.6 Exercícios

1.
Experimente as funções mean(), var(), sd(), median(), quantile() nos dados mostrados anteriormente. Veja a documentação das funções e as opções de uso.
2.
Faça uma análise descritiva adequada do conjunto de dados women.
3.
Carregue o conjunto de dados USArrests com o comando data(USArrests). Examine a sua documentação com help(USArrests) e responda as perguntas a seguir.
(a)
qual o número médio e mediano de cada um dos crimes?
(b)
encontre a mediana e quartis para cada crime.
(c)
encontre o número máximo e mínimo para cada crime.
(d)
faça um gráfico adequado para o número de assassinatos (murder).
(e)
faça um diagrama ramo-e-folhas para o número de estupros (rape).
(f)
verifique se há correlação entre os diferentes tipos de crime.
(g)
verifique se há correlação entre os crimes e a proporção de população urbana.
(h)
encontre os estados com maior e menor ocorrência de cada tipo de crime.
(i)
encontre os estados com maior e menor ocorrência per capta de cada tipo de crime.
(j)
encontre os estados com maior e menor ocorrência do total de crimes.