-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path06-analise-exploratoria.Rmd
784 lines (634 loc) · 27.3 KB
/
06-analise-exploratoria.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
# (PART) Estatística {-}
# Análise exploratória de dados
```{r external-code-cap6, cache=FALSE, include=FALSE}
knitr::read_chunk("scripts/analise-exploratoria-exercicios.R")
```
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
tipos de variáveis disponíveis. Variáveis podem ser classificadas da
seguinte forma:
- Qualitativas
- Nominais
- Ordinais
- Quantitativas
- Discretas
- Contínuas
e podem ser resumidas por tabelas, gráficos e/ou medidas de tendência central e dispersão.
## O conjunto de dados `milsa`
O livro "Estatística Básica" dos Profs Wilton Bussab e Pedro Morettin [@bussab+morettin:2017] traz no
segundo capítulo um conjunto de dados hipotético de atributos de 36 funcionários da companhia "Milsa".
Os dados estão reproduzidos na tabela a seguir.
Consulte o livro para mais detalhes sobre este dados.
```{r, echo=FALSE, results='asis'}
url <- "http://www.leg.ufpr.br/~fernandomayer/data/milsa.csv"
milsa <- read.csv("dados/milsa.csv")
knitr::kable(milsa)
```
Estes dados estão disponíveis em um arquivo `csv` no endereço
<http://www.leg.ufpr.br/~fernandomayer/data/milsa.csv>.
O nosso objetivo é, através do R,
- entrar com os dados;
- fazer uma preparação dos dados;
- fazer uma análise descritiva.
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 importar os dados do endereço acima diretamente para o R, usamos
```{r, eval=FALSE}
url <- "http://www.leg.ufpr.br/~fernandomayer/data/milsa.csv"
milsa <- read.csv(url)
```
```{r, include=FALSE}
milsa <- read.csv("dados/milsa.csv")
```
E para conferir a estrutura dos dados podemos usar algumas funções como:
```{r}
str(milsa)
head(milsa)
tail(milsa)
```
Podemos classificar todas as variáveis desse conjunto de dados como:
| Variável | Classificação |
|-------------|-----------------------|
|`Funcionario`| Quantitativa discreta
|`Est.civil` | Qualitativa nominal
|`Inst` | Qualitativa ordinal
|`Filhos` | Quantitativa discreta
|`Salario` | Quantitativa contínua
|`Anos` | Quantitativa contínua
|`Meses` | Quantitativa contínua
|`Regiao` | Qualitativa nominal
Como a variável `Inst` é qualitativa ordinal, podemos indicar para o R
que ela deve ser tratada como ordinal. Se observarmos os níveis desse
fator:
```{r}
levels(milsa$Inst)
```
já notamos que a ordenação está correta (da esquerda para a direita),
pois sabemos que a classificação interna dos níveis é por ordem
alfabética, e nesse caso, por coincidência, a ordem já está na sequência
correta. Mesmo assim, podemos indicar que este fator é ordinal, usando o
argumento `ordered` da função `factor()`
```{r}
milsa$Inst <- factor(milsa$Inst, ordered = TRUE)
```
Caso as classes em ordem alfabética não estivessem na ordem desejada feriamos a definição mais detalhada com:]
```{r}
milsa$Inst <- factor(milsa$Inst,
levels = c("1o Grau", "2o Grau", "Superior"),
labels = c("1o Grau", "2o Grau", "Superior"),
ordered = TRUE)
```
O argumento `levels` deve conter os valores que a variável assume na ordem desejada e `labels` são rótulos que serão usados para se referir a estes valores e que não necessáriamente precisam ter o mesmo nome que `levels` , mas precisam estar na ordem correta.
Note agora a modificação na classe dessa coluna, e a representação dos níveis:
```{r}
class(milsa$Inst)
milsa$Inst
```
A coluna continua sendo um `factor`, mas agora também é `ordered` (sim,
um objeto pode ter mais de uma classe, se elas foram compatíveis e/ou
complementares). Os níveis agora são representados por
```
1o Grau < 2o Grau < Superior
```
para indicar explicitamente que existe uma ordem nos níveis desse fator.
Podemos ainda definir uma nova variável, chamada `Idade`, a partir das
variáveis `Anos` e `Meses`:
```{r}
milsa$Idade <- milsa$Anos + milsa$Meses/12
```
Aproveitamos este comando para ilustrar uma opção interessante: usar `with` para referenciar diretamente a variávelo que vai ser tratado pelo comando. Desta forma elimina-se a necessidade de digitar `milsa$` mais de uma vez.
```{r}
milsa$Idade <- with(milsa, Anos + Meses/12)
```
Os dois comandos acima (de modificação da classe de uma variável, e a
criação de uma nova variável) poderiam ser facilmente executadas de uma
única vez através do comando `transform()`
```{r}
milsa <- transform(milsa,
Inst = factor(Inst, ordered = TRUE),
Idade = Anos + Meses/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 bivariadas.
Inspecione os comandos mostrados a seguir e os resultados por eles
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. Veja [aqui](https://rpubs.com/EstatBasica/Introd)
os scripts do livro.
## Análise univariada
A análise univariada consiste basicamente em, para cada uma das
variáveis individualmente:
- Classificar a variável quanto a seu tipo: qualitativa (nominal ou
ordinal) ou quantitativa (discreta ou contínua).
- Obter tabelas, gráficos e/ou medidas que resumam a variável.
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 `Est.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.
Já vimos, através do resultado da função `str()` acima, que esta
variável é um fator. A seguir obtemos frequências absolutas e relativas
(note duas formas diferentes de obter as frequências relativas).
```{r}
## Frequência absoluta
civil.tb <- with(milsa, table(Est.civil))
civil.tb
## Frequência relativa, calculando manualmente
civil.tb/sum(civil.tb)
## Frequência relativa, com a função prop.table()
prop.table(civil.tb)
```
Os gráficos de barras e de setores são adequados para representar esta
variável. Os comandos `barplot()` e `pie()` usam o resultado da função
`table()` para gerar os gráficos:
```{r, fig.show='hold'}
par(mfrow = c(1,2), mar=c(3,3,0.5,0.5))
barplot(civil.tb)
pie(civil.tb)
par(mfrow = c(1,1))
```
A *moda* de qualquer variável aleatória é definida como o valor mais
frequente encontrado na amostra. No R não há uma função pronta para
"calcular" a moda, pois ela pode ser obtida facilmente através do uso de
funções básicas. Uma opção seria usar os comandos abaixo:
```{r}
names(civil.tb)[which.max(civil.tb)]
```
Deixamos a cargo do leitor entender e interpretar esse comando.
### Variável Qualitativa Ordinal
Para exemplificar como obter análises para uma variável qualitativa
ordinal vamos selecionar a variável `Inst`.
As tabelas de frequências são obtidas de forma semelhante à mostrada
anteriormente.
```{r}
## Frequência absoluta
inst.tb <- with(milsa, table(Inst))
inst.tb
## Frequência relativa
prop.table(inst.tb)
```
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 apenas um gráfico
de barras conforme mostrado abaixo
```{r}
barplot(inst.tb)
```
Em alguns casos podemos querer mostrar o gráfico de barras com as barras
classificadas da menor para a maior, ou vice-versa, independente da
ordem dos níveis. Para isso podemos usar a função `sort()` para ordenar
os valores da tabela e fazer o gráfico
```{r, fig.show='hold'}
par(mfrow = c(1,2))
## Menor para maior
barplot(sort(inst.tb))
## Maior para menor
barplot(sort(inst.tb, decreasing = TRUE))
par(mfrow = c(1,1))
```
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
isso usamos o comando seguinte.
```{r, error=TRUE}
## Moda
names(inst.tb)[which.max(inst.tb)]
## Mediana
with(milsa, median(Inst)) # só funciona para variáveis numéricas
with(milsa, median(as.numeric(Inst))) # traz a mediana da codificação do nível
with(milsa, levels(Inst)[median(as.numeric(Inst))]) # valor correto
```
### 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.
Frequências absolutas e relativas são obtidas como anteriormente. Também
vamos calcular a frequência acumulada, onde a frequência em uma classe é
a soma das frequências das classes anteriores. Para isso usamos a função
`cumsum()`, que já faz a soma acumulada.
```{r}
## Frequência absoluta
filhos.tb <- with(milsa, table(Filhos))
filhos.tb
## Frequência relativa
filhos.tbr <- prop.table(filhos.tb)
filhos.tbr
## Frequência acumulada
filhos.tba <- cumsum(filhos.tbr)
filhos.tba
```
O gráfico adequado para frequências absolutas de uma variável discreta é
parecido com um gráfico de barras, mas nesse caso, as frequências são
indicadas por linhas. Usando a função `plot()` em um objeto resultado da
função `table()`, o gráfico adequado já é selecionado:
```{r}
plot(filhos.tb)
```
Outra possibilidade seria fazer gráficos de frequências relativas e de
frequências acumuladas conforme mostrado na
```{r, fig.show='hold'}
par(mfrow = c(1,2))
## Frequência relativa
plot(filhos.tbr)
## Frequência relativa acumulada
plot(filhos.tba, type = "S") # tipo step (escada)
par(mfrow = c(1,1))
```
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 = TRUE` é necessário
porque não há informação sobre número de filhos para alguns indivíduos
(`NA`). Para calcular a média aparada, usamos o argumento `trim = 0.1`
que indica que a média deve ser calculada excluindo-se 10% dos menores e
10% dos maiores valores do vetor de dados. Ao final mostramos como obter
os quartis, incluido o mínimo e o máximo.
```{r}
## Moda
names(filhos.tb)[which.max(filhos.tb)]
## Mediana
median(milsa$Filhos, na.rm = TRUE)
## Média
with(milsa, mean(Filhos, na.rm = TRUE))
## Média aparada
with(milsa, mean(Filhos, trim = 0.1, na.rm = TRUE))
## Quartis
with(milsa, quantile(Filhos, na.rm = TRUE))
```
Passando agora para medidas de dispersão, vejamos como obter o máximo e
mínimo, e com isso a amplitude, além da variância, desvio padrão, e
coeficiente de variação. Também obtemos os quartis para calcular a
amplitude interquartílica.
```{r}
## Máximo e mínimo
with(milsa, max(Filhos, na.rm = TRUE))
with(milsa, min(Filhos, na.rm = TRUE))
## As duas informações juntas
with(milsa, range(Filhos, na.rm = TRUE))
## Amplitude é a diferença entre máximo e mínimo
with(milsa, diff(range(Filhos, na.rm = TRUE)))
## Variância
with(milsa, var(Filhos, na.rm = TRUE))
## Desvio-padrão
with(milsa, sd(Filhos, na.rm = TRUE))
## Coeficiente de variação
with(milsa, 100*sd(Filhos, na.rm = TRUE)/mean(Filhos, na.rm = TRUE))
## Quartis
(filhos.qt <- with(milsa, quantile(Filhos, na.rm = TRUE)))
## Amplitude interquartílica
filhos.qt[4] - filhos.qt[2]
```
Finalmente, podemos usar a função **genérica** `summary()` para resumir
os dados de uma só vez
```{r}
with(milsa, summary(Filhos))
```
### Variável quantitativa contínua
Para concluir os exemplos para análise univariada vamos considerar a
variável quantitativa contínua `Salario`.
Para se fazer uma tabela de frequências de uma variável 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
a função `cut()` para agrupar os dados em classes e finalmente obtemos
as frequências absolutas e relativas.
```{r}
## Máximo e mínimo
with(milsa, range(Salario))
## Número de classes estimado, com base no critério de Sturges. Veja
## outras opções em ?nclass
with(milsa, nclass.Sturges(Salario))
## Criando as classes com a função cut(), usando os valores mínimos e
## máximos dados em range()
with(milsa, cut(Salario, breaks = seq(4, 23.3, length.out = 8)))
```
Note que uma das classes é `NA`. Isso ocorre pela definição das classes,
que por padrão é no formato `(a,b]`, ou seja, o intervalo é aberto em
`a` (não inclui `a`) e fechado em `b` (inclui `b`). Podemos alterar esse
padrão usando o argumento `include.lowest = TRUE`,
```{r}
with(milsa, cut(Salario, breaks = seq(4, 23.3, length.out = 8),
include.lowest = TRUE))
```
E note que agora a primeira classe fica `[a,b]`, ou seja, fechada
(incluindo) os dois lados. Para que o intervalo seja fechado à esquerda,
usamos o argumento `right = FALSE`. As combinações possíveis para esses
dois argumentos, e as classes resultantes são apresentadas na tabela
abaixo:
Argumentos Resultado
--------------------------------- ---------------------
`include.lowest = T, right = T` `[a,b], ..., (y,z]`
`include.lowest = F, right = T` `(a,b], ..., (y,z]`
`include.lowest = F, right = F` `[a,b), ..., [y,z)`
`include.lowest = T, right = F` `[a,b), ..., [y,z]`
Outra opção para "acomodar" todos os extremos dentro das classes, seria
naturalmente atribuir valores um pouco menores que o mínimo, e um pouco
maiores que o máximo. Abaixo, usamos essa abordagem e fazemos uma tabela
com as frequências absolutas e relativas.
```{r}
salario.cut <- with(milsa,
cut(Salario, breaks = seq(3.5, 23.5, length.out = 8)))
salario.cut
## Tabela com as frequencias absolutas por classe
salario.tb <- table(salario.cut)
salario.tb
## Tabela com as frequências relativas
prop.table(salario.tb)
```
Na sequência vamos mostrar dois possíveis gráficos para variáveis
contínuas: o histograma e o *box-plot*.
Para fazer um histograma usamos a função `hist()`, por exemplo,
```{r}
with(milsa, hist(Salario))
```
A função `hist()` possui vários argumentos para alterar o comportamento
da saída do gráfico. Por exemplo, com `labels = TRUE` as frequências são
mostradas acima de cada barra. Com `freq = FALSE`, o gráfico é feito com
as frequências relativas. O título no alto do gráfico pode ser redefinido ou excluído usando o argumento `main`. A divisão das classes segue os mesmo padrões de função `cut()`.
```{r}
with(milsa, hist(Salario, freq = FALSE, labels = TRUE, main=""))
```
Por padrão, a função `hist()` calcula automaticamente o número de
classes e os valores limites de cada classe. No entanto, isto pode ser
alterado com o argumento `breaks`, que pode receber um vetor
definindo os limites das classes, uma função para definir as quebras, um
nome de critério (por exemplo, `"Sturges"`), ou um único escalar
definido o número de classes. As últimas três opções são apenas
sugestões utilizadas pela função. O argumento `nclass` também funciona
dessa forma, recebendo apenas um valor com o número de classes (como
sugestão).
```{r}
with(milsa, hist(Salario, nclass = 15))
```
Assim como na função `cut()`, os argumentos `include.lowest` e `right`
são utilizados para controlar a borda das classes.
Uma característica importante da função `hist()` é que ela retorna não
apenas o gráfico, mas também uma lista com as informações utilizadas
para construir o gráfico. Associando um histograma a um objeto, podemos
ver o seu conteúdo:
```{r}
salario.hist <- with(milsa, hist(Salario))
salario.hist
```
Estas informações podem então ser utilizadas para outros propósitos
dentro do R.
Os **boxplots** são úteis para revelar o centro, a dispersão e a
distribuição dos dados, além de **outliers**. São construídos da
seguinte forma:
- A linha central mais escura representa a mediana. Os extremos da
caixa são o $1^{o}$ ($q1$) e o $3^{o}$ ($q3$) quartis.
- As linhas que se extendem das caixas são definidas como:
$$q1-1,5\cdot IQR\ \qquad \mathrm{e}\ \qquad q3+1,5\cdot IQR$$
onde $IQR$ é o intervalo inter-quartil. As linhas vão até os valores
máximo e mínimo que ainda se encontram dentro deste intervalo.
```{r}
with(milsa, boxplot(Salario))
```
Existem também vários argumentos que permitem variações do *boxplot*,
tais como caixas com tamanho proporcional aos tamanhos
dos grupos (`varwidth = TRUE`), e caixas "acinturadas" (*notched
boxplot*) (`notch = TRUE`).
```{r}
with(milsa, boxplot(Salario, varwidth = TRUE, notch = TRUE))
```
Ambas opções são úteis quando há mais de um grupo e a comparação entre
os *boxplots* é facilitada.
Finalmente, podemos obter as medidas de posição e dispersão da mesma
forma que para variáveis discretas. Veja alguns exemplos a seguir. Note
que aqui não é necessário o uso do argumento `na.rm = TRUE`, pois não
existem `NA`s nesta variável.
```{r}
## Mediana
with(milsa, median(Salario))
## Média
with(milsa, mean(Salario))
## Média aparada
with(milsa, mean(Salario, trim = 0.1))
## Quartis
with(milsa, quantile(Salario))
## Máximo e mínimo
with(milsa, max(Salario))
with(milsa, min(Salario))
## As duas informações juntas
with(milsa, range(Salario))
## Amplitude é a diferença entre máximo e mínimo
with(milsa, diff(range(Salario)))
## Variância
with(milsa, var(Salario))
## Desvio-padrão
with(milsa, sd(Salario))
## Coeficiente de variação
with(milsa, 100 * sd(Salario)/mean(Salario))
## Quartis
salario.qt <- with(milsa, quantile(Salario))
## Amplitude interquartílica
salario.qt[4] - salario.qt[2]
```
## Análise Bivariada
Na análise bivariada procuramos identificar relações entre duas variáveis.
Assim como na análise univariada, estas relações podem ser resumidas por
gráficos, tabelas e/ou medidas estatísticas.
O tipo de resumo vai depender dos tipos das variáveis envolvidas.
Vamos considerar três possibilidades:
- Qualitativa *vs* qualitativa
- Qualitativa *vs* quantitativa
- Quantitativa *vs* quantitativa
Salienta-se ainda que:
- As análise mostradas a seguir não esgotam as possibilidades de
análises envolvendo duas variáveis e devem ser vistas apenas como uma
sugestão inicial.
- Relações entre duas variáveis devem ser examinadas com cautela pois
podem ser mascaradas por uma ou mais variáveis adicionais não
considerada na análise. Estas são chamadas **variáveis de
confundimento**. Análises com variáveis de confundimento não serão
discutidas neste ponto.
> **Observação**: de agora em diante, como serão consideradas mais de
> uma variável, será ainda mais vantajoso usar a função `with()` para
> chamar a maioria das funções.
### Qualitativa *vs* qualitativa
Vamos considerar as variáveis `Est.civil` (estado civil), e `Inst` (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 adequada de apresentação vai depender dos objetivos da análise e
da interpretação desejada para os dados. Inicialmente obtemos a tabela de
frequências absolutas para o cruzamento das duas variáveis, usando a
função `table()`. A tabela extendida incluindo os totais marginais pode
ser obtida com a função `addmargins()`.
```{r}
## Tabela de frequências absolutas
civ.inst.tb <- with(milsa, table(Est.civil, Inst))
civ.inst.tb
addmargins(civ.inst.tb)
```
<!-- Ver tambem margin.table() -->
Tabelas de frequências relativas são obtidas com `prop.table()`, mas
aqui existem três possibilidades para as proporções em cada casela:
- Em relação ao total geral.
- Em relação aos totais por linha (`margin = 1`).
- Em relação aos totais por coluna (`margin = 2`).
```{r}
## Frequência relativa global
prop.table(civ.inst.tb)
## Frequência relativa por linha
prop.table(civ.inst.tb, margin = 1)
## Frequência relativa por coluna
prop.table(civ.inst.tb, margin = 2)
```
Abaixo são representados quatro tipos de 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.
```{r, fig.show='hold'}
par(mfrow = c(2,2))
barplot(civ.inst.tb, legend = TRUE)
barplot(t(civ.inst.tb), legend = TRUE)
barplot(civ.inst.tb, beside = TRUE, legend = TRUE)
barplot(t(prop.table(civ.inst.tb)), beside = TRUE, legend = TRUE)
par(mfrow = c(1,1))
```
<!-- Incluir aqui a medida de associacao chi-quadrado -->
<!-- Incluir reagrupamento -->
### Qualitativa *vs* quantitativa
Para exemplificar este caso vamos considerar as variáveis `Inst` 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 a função `cut()`.
Lembre-se que as classes são definidas por intervalos abertos à esquerda,
então usamos o argumento `include.lowest = TRUE` para garantir que todos
os dados, inclusive 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.
```{r}
## Quartis de salario
with(milsa, quantile(Salario))
## Classificação de acordo com os quartis
salario.cut <- with(milsa, cut(Salario, breaks = quantile(milsa$Salario),
include.lowest = TRUE))
## Tabela de frequências absolutas
inst.sal.tb <- with(milsa, table(Inst, salario.cut))
inst.sal.tb
prop.table(inst.sal.tb, margin = 1)
```
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 deve ser colocada 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 na função abaixo, usamos a notação de **fórmula** do
R, com `Salario ~ Inst` indicando que a variável `Salario` é explicada,
ou descrita, ($\sim$) pela variável `Inst`.
```{r}
boxplot(Salario ~ Inst, data = milsa)
```
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 descritivas, o usual é obter um resumo da variável
quantitativa como mostrado na análise univariada, porém agora informando
este resumo para cada nível do fator qualitativo de interesse.
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.
```{r}
with(milsa, tapply(Salario, Inst, mean))
with(milsa, tapply(Salario, Inst, sd))
with(milsa, tapply(Salario, Inst, quantile))
```
> NOTE que aqui usamos a função `tapply()`. Para saber mais sobre os
> recursos dessa função e de outras da família `*apply`, veja o
> [script_gapminder.R](scripts/script_gapminder.R).
### 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 conforme 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~\times~4$.
```{r}
## Classes de Idade
idade.cut <- with(milsa, cut(Idade, breaks = quantile(Idade),
include.lowest = TRUE))
table(idade.cut)
## Classes de salario
salario.cut <- with(milsa, cut(Salario, breaks = quantile(Salario),
include.lowest = TRUE))
table(salario.cut)
## Tabela cruzada
table(idade.cut, salario.cut)
prop.table(table(idade.cut, salario.cut), margin = 1)
```
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~\times~3$.
```{r}
idade.cut2 <- with(milsa, cut(Idade,
breaks = quantile(Idade, seq(0, 1, length = 4)),
include.lowest = TRUE))
salario.cut2 <- with(milsa, cut(Salario,
breaks = quantile(Salario, seq(0, 1, length = 4)),
include.lowest = TRUE))
table(idade.cut2, salario.cut2)
prop.table(table(idade.cut2, salario.cut2), margin = 1)
```
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 no eixo X. Note que na função
`plot()`, podemos usar tanto os argumentos `x` e `y`, quanto o formato
de fórmula (como visto anteriormente).
```{r, fig.keep='last'}
with(milsa, plot(x = Idade, y = Salario))
plot(Salario ~ Idade, data = milsa)
```
Para quantificar a associação entre variáveis deste tipo, usamos o
coeficiente de correlação. A função `cor()` possui opção para três
coeficientes de correlação, tendo como *default* o coeficiente de
correlação linear de Pearson.
```{r}
with(milsa, cor(Idade, Salario))
with(milsa, cor(Idade, Salario, method = "kendall"))
with(milsa, cor(Idade, Salario, method = "spearman"))
```
## Exercícios {-}
1. Experimente as funções `mean()`, `var()`, `sd()`, `median()`,
`quantile()` nos dados mostrados anteriormente (`milsa`). Veja a
documentação das funções e as opções de uso.
2. Carregue o conjunto de dados `women` com `data(women)`. Veja o que
são os dados com `help(women)`, e faça uma análise descritiva
adequada.
```{r ex2, eval=FALSE, include=FALSE}
```
3. Carregue o conjunto de dados `USArrests` com
`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 *boxplot* 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.
11. Calcule a média de crimes (entre `Murder`, `Assault` e `Rape`)
para cada estado.
```{r ex3, eval=FALSE, include=FALSE}
```
A resolução de todos os exercícios desta página está disponível neste
[script](scripts/analise-exploratoria-exercicios.R).