8 Introdução à 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.

Vamos ilustrar estes conceitos com um conjunto de dados já incluído no R, o conjunto mtcars que descreve características de diferentes modelos de automóvel.

Primeiro vamos carregar e inspecionar os dados. Os comandos abaixo mostram como: (i) carregar os dados, (ii) visualizar todo o conjunto de dados, (iii) obter informações sobre os dados. Sendo este um conjunto de dados que vem junto com o R ele possui documentação que explica os dados. O mesmo acontece com todos os conjuntos de dados distribuídos com o R.

  > data(mtcars)
  > mtcars
  > help(mtcars)

Digitando mtcars foi possível visualizar todos os dados. Entretanto em geral não queremos visualizar todos os dados, mas apenas uma parte deles. Os dois primeiros comandos abaixo mostram apenas a parte inicial do arquivo de dados. Os demais comandos mostram como verificar a dimensão do conjunto de dados (número de linhas e colunas) e como ver o nome das variáveis.

  > mtcars[1:6, ]

                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
  Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
  Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
  Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
  Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
  Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
  Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

  > head(mtcars)

                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
  Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
  Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
  Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
  Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
  Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
  Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

  > dim(mtcars)

  [1] 32 11

  > names(mtcars)

   [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
  [11] "carb"

Vamos agora, por simplicidade, selecionar um subconjunto destes dados com apenas algumas das variáveis. Para isto vamos criar um objeto chamado mtc que contém apenas as variáveis desejadas. Para selecioná-las indicamos os números das colunas correspondentes à estas variáveis.

  > mtc <- mtcars[, c(1, 2, 4, 6, 9, 10)]
  > head(mtc)

                     mpg cyl  hp    wt am gear
  Mazda RX4         21.0   6 110 2.620  1    4
  Mazda RX4 Wag     21.0   6 110 2.875  1    4
  Datsun 710        22.8   4  93 2.320  1    4
  Hornet 4 Drive    21.4   6 110 3.215  0    3
  Hornet Sportabout 18.7   8 175 3.440  0    3
  Valiant           18.1   6 105 3.460  0    3

  > names(mtc)

  [1] "mpg"  "cyl"  "hp"   "wt"   "am"   "gear"

Vamos anexar o objeto para facilitar a digitação com o comando abaixo. O uso e sentido deste comando será explicado mais adiante.

  > attach(mtc)

NOTA: em versões mais recentes do R foi introduzido a função with() que dispensa o uso de attach(), além de ser mais segura.

Vamos agora ver uma descrição da variável número de cilindros. Vamos fazer uma tabela de frequências absolutas e gráficos de barras e de setores.

  > tcyl <- table(cyl)
  > barplot(tcyl)
  > pie(tcyl)


PIC

Figura 4: Dois tipos de gráficos para variável número de cilindros: de barras (esquerda) e de setores (direita).


Para obter frequências relativas poderíamos usar os comandos abaixo. Note duas formas alternativas.

  > tcyl <- 100 * table(cyl)/length(cyl)
  > tcyl

  cyl
       4      6      8
  34.375 21.875 43.750

  > prop.table(tcyl)

  cyl
        4       6       8
  0.34375 0.21875 0.43750

Passando agora para uma variável quantitativa contínua vamos ver o comportamento da variável que mede o rendimento dos carros (em mpg – milhas por galão). Primeiro fazemos uma tabela de frequências, depois gráficos (histograma, box-plot e diagrama ramos-e-folhas) e finalmente obtemos algumas medidas que resumem os dados.

  > table(cut(mpg, br = seq(10, 35, 5)))
  > hist(mpg)
  > boxplot(mpg)
  > stem(mpg)
  > summary(mpg)

8.2 Descrição bivariada

Vamos primeiro ver o resumo de duas variáveis categóricas: o tipo de marcha e o número de cilindros. Os comandos abaixo mostram como obter a tabela com o cruzamento destas variáveis e gráficos. Note e compare as saídas obtidas com cada um dos comandos a seguir.

  > table(am, cyl)

     cyl
  am   4  6  8
    0  3  4 12
    1  8  3  2

  > prop.table(table(am, cyl))

     cyl
  am        4       6       8
    0 0.09375 0.12500 0.37500
    1 0.25000 0.09375 0.06250

  > prop.table(table(am, cyl), margin = 1)

     cyl
  am          4         6         8
    0 0.1578947 0.2105263 0.6315789
    1 0.6153846 0.2307692 0.1538462

  > prop.table(table(am, cyl), margin = 2)

     cyl
  am          4         6         8
    0 0.2727273 0.5714286 0.8571429
    1 0.7272727 0.4285714 0.1428571

É possível também obter visualizações gráficas destes cruzamentos. Experimente os comandosa seguir, explore seus argumentos e observe os gráficos produzidos.

  > plot(table(am, cyl))
  > barplot(table(am, cyl), leg = T)
  > barplot(table(am, cyl), beside = T, leg = T)

Agora vamos relacionar uma categórica (tipo de câmbio) com uma contínua (rendimento). O primeiro comando mostra como obter medidas resumo do rendimento para cada tipo de câmbio. A seguir obtemos as médias para cada tipo de câmbio de duas formas diferentes, a primeira selecionando os dados de cada um individualmente, e a segunda obtendo ambas as médias de uma só vez.

  > tapply(mpg, am, summary)

  $0
     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    10.40   14.95   17.30   17.15   19.20   24.40
  
  $1
     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    15.00   21.00   22.80   24.39   30.40   33.90

  > m0 <- mean(mpg[am == 0])
  > m0

  [1] 17.14737

  > m1 <- mean(mpg[am == 1])
  > m1

  [1] 24.39231

  > m0m1 <- tapply(mpg, am, mean)
  > m0m1

         0        1
  17.14737 24.39231

A seguir são mostrados dois tipos de gráficos que podem ser obtidos para descrever o comportamento e associação destas variáveis.

  > plot(am, mpg)
  > points(c(0, 1), m0m1, cex = 2, col = 2, pch = 20)


PIC

Figura 5: Dados de rendimentos para cada tipo de câmbio. Pontos vermelhos de tamanho maior indicam o rendimento médio para cada tipo de câmbio.


  > par(mfrow = c(1, 2))
  > by(hp, am, hist, main = "", xlim = c(50, 350))
  > par(mfrow = c(1, 1))


PIC

Figura 6: Histogramas dos rendimentos para cada tipo de câmbio.


Pode-se fazer um teste estatístico usando o teste t para comparar os redimentos de carros com diferentes tipos de câmbio e/ou com diferentes números de cilindros usando a análise de variância.

  > t.test(mpg[am == 0], mpg[am == 1])

   Welch Two Sample t-test
  
  data:  mpg[am == 0] and mpg[am == 1]
  t = -3.7671, df = 18.332, p-value = 0.001374
  alternative hypothesis: true difference in means is not equal to 0
  95 percent confidence interval:
   -11.280194  -3.209684
  sample estimates:
  mean of x mean of y
   17.14737  24.39231

  > tapply(mpg, cyl, mean)

         4        6        8
  26.66364 19.74286 15.10000

  > anova(aov(mpg ~ cyl))

  Analysis of Variance Table
  
  Response: mpg
            Df Sum Sq Mean Sq F value    Pr(>F)
  cyl        1 817.71  817.71  79.561 6.113e-10 ***
  Residuals 30 308.33   10.28
  ---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Inspecione ainda o gráfico produzido pleo comando abaixo.

  > plot(cyl,mpg)

Passamos agora para a relação entre duas variáveis contínuas (peso e rendimento) cuja relação pode ser investigada como se segue. O coeficiente de correlação linear de Pearson pode ser obtido com:

  > cor(wt, mpg)

  [1] -0.8676594

e o gráfico de rendimento versus peso com

  > plot(wt, mpg, xlab = "peso (ton)", ylab = "rendimento (mpg)")

PIC

Podemos ainda usar recusos gráficos para visualizar três variáveis ao mesmo tempo. Inspecione os gráficos produzidos com os comandos a seguir.

  > points(wt[cyl==4], mpg[cyl==4], col=2, pch=19)
  > points(wt[cyl==6], mpg[cyl==6], col=3, pch=19)
  > points(wt[cyl==8], mpg[cyl==8], col=4, pch=19)
  
  > plot(wt, mpg, pch=21, bg=(2:4)[codes(factor(cyl))])
  > plot(wt, mpg, pch=21, bg=(2:4)[codes(factor(am))])
  
  > plot(hp, mpg)
  > plot(hp, mpg, pch=21, bg=c(2,4)[codes(factor(am))])
  
  > par(mfrow=c(1,2))
  > plot(hp[am==0], mpg[am == 0])
  > plot(hp[am==1], mpg[am == 1])
  > par(mfrow=c(1,1))

8.3 Descrevendo um outro conjunto de dados

Vamos agora utilizar um outro conjunto de dados que já vem disponível com o R – o conjunto airquality.

Estes dados são medidas de: concentração de ozônio (Ozone), radiação solar (Solar.R), velocidade de vento (Wind) e temperatura (Temp) coletados diariamente (Day) por cinco meses (Month).

Primeiramente vamos carregar e visualisar os dados com os comandos:

> data(airquality)       # carrega os dados  
> airquality             # mostra os dados

Vamos agora usar alguns comandos para “conhecer melhor” a estrutura dos dados. Nos comandos a seguir verificamos queairquality é um data-frame, obtemos os nomes das variáveis (colunas), a dimensão.

  > is.data.frame(airquality)

  [1] TRUE

  > class(airquality)

  [1] "data.frame"

  > names(airquality)

  [1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day"

  > dim(airquality)

  [1] 153   6

Note ainda que o comando help(airquality) mostra a documentação destes deados, disponível por se tratar de um conjunto de dados já incluido no R. Bem, agora que conhecemos melhor o conjunto airquality, sabemos o número de dados, seu formato, o número de nome das variáveis podemos começar a analisá-los.

Veja por exemplo alguns comandos:

> summary(airquality)             # rápido sumário das variáveis  
> summary(airquality[,1:4])       # rápido sumário apenas das 4 primeiras variáveis  
> mean(airquality$Temp)           # média das temperaturas no período  
> mean(airquality$Ozone)          # média do Ozone no período - note a resposta NA  
> airquality$Ozone                # a razão é que existem ‘‘dados perdidos'' na variável Ozone  
> mean(airquality$Ozone, na.rm=T) # média do Ozone no período - retirando valores perdidos

Note que os útimos três comandos são trabalhosos de serem digitados pois temos que digitar airquality a cada vez!
Mas há um mecanismo no R para facilitar isto: o caminho de procura (“search path”). Começe digitando e vendo s saída de:
search()

O programa vai mostrar o caminho de procura dos objetos. Ou seja, quando voce usa um nome do objeto o R vai procurar este objeto nos caminhos indicado, na ordem apresentada.

Pois bem, podemos “adicionar” um novo local neste caminho de procura e este novo local pode ser o nosso objeto airquality. Digite o seguinte e compare com o anterior:

> attach(airquality)   # anexando o objeto airquality no caminho de procura.  
> search()             # mostra o caminho agora com o airquality incluído  
> mean(Temp)           # e ... a digitação fica mais fácil e rápida !!!!  
> mean(Ozone, na.rm=T) # pois com o airquality anexado o R acha as variáveis

NOTA: Para retirar o objeto do caminho de procura basta digitar detach(airquality).

Bem, agora é com voce!
Reflita sobre os dados e use seus conhecimentos de estatística para fazer uma análise descritiva interessante destes dados.

Pense em questões relevantes e veja como usar medidas e gráficos para respondê-las. Use os comandos mostrados anteriormente. Por exemplo:

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 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.
    1. qual o número médio e mediano de cada um dos crimes?
    2. encontre a mediana e quartis para cada crime.
    3. encontre o número máximo e mínimo para cada crime.
    4. faça um gráfico adequado para o número de assassinatos (murder).
    5. faça um diagrama ramo-e-folhas para o número de estupros (rape).
    6. verifique se há correlação entre os diferentes tipos de crime.
    7. verifique se há correlação entre os crimes e a proporção de população urbana.
    8. encontre os estados com maior e menor ocorrência de cada tipo de crime.
    9. encontre os estados com maior e menor ocorrência per capta de cada tipo de crime.
    10. encontre os estados com maior e menor ocorrência do total de crimes.