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
quantitativas
e podem ser resumidas por tabelas, gráficos e/ou medidas.
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 2. Consulte o livro para mais detalhes sobre estes dados.
| Funcionário | Est. Civil | Instrução | N\(^o\) Filhos | Salário | Ano | Mês | Região
|
| 1 | solteiro | 1o Grau | - | 4.00 | 26 | 3 | interior |
| 2 | casado | 1o Grau | 1 | 4.56 | 32 | 10 | capital |
| 3 | casado | 1o Grau | 2 | 5.25 | 36 | 5 | capital |
| 4 | solteiro | 2o Grau | - | 5.73 | 20 | 10 | outro |
| 5 | solteiro | 1o Grau | - | 6.26 | 40 | 7 | outro |
| 6 | casado | 1o Grau | 0 | 6.66 | 28 | 0 | interior |
| 7 | solteiro | 1o Grau | - | 6.86 | 41 | 0 | interior |
| 8 | solteiro | 1o Grau | - | 7.39 | 43 | 4 | capital |
| 9 | casado | 2o Grau | 1 | 7.59 | 34 | 10 | capital |
| 10 | solteiro | 2o Grau | - | 7.44 | 23 | 6 | outro |
| 11 | casado | 2o Grau | 2 | 8.12 | 33 | 6 | interior |
| 12 | solteiro | 1o Grau | - | 8.46 | 27 | 11 | capital |
| 13 | solteiro | 2o Grau | - | 8.74 | 37 | 5 | outro |
| 14 | casado | 1o Grau | 3 | 8.95 | 44 | 2 | outro |
| 15 | casado | 2o Grau | 0 | 9.13 | 30 | 5 | interior |
| 16 | solteiro | 2o Grau | - | 9.35 | 38 | 8 | outro |
| 17 | casado | 2o Grau | 1 | 9.77 | 31 | 7 | capital |
| 18 | casado | 1o Grau | 2 | 9.80 | 39 | 7 | outro |
| 19 | solteiro | Superior | - | 10.53 | 25 | 8 | interior |
| 20 | solteiro | 2o Grau | - | 10.76 | 37 | 4 | interior |
| 21 | casado | 2o Grau | 1 | 11.06 | 30 | 9 | outro |
| 22 | solteiro | 2o Grau | - | 11.59 | 34 | 2 | capital |
| 23 | solteiro | 1o Grau | - | 12.00 | 41 | 0 | outro |
| 24 | casado | Superior | 0 | 12.79 | 26 | 1 | outro |
| 25 | casado | 2o Grau | 2 | 13.23 | 32 | 5 | interior |
| 26 | casado | 2o Grau | 2 | 13.60 | 35 | 0 | outro |
| 27 | solteiro | 1o Grau | - | 13.85 | 46 | 7 | outro |
| 28 | casado | 2o Grau | 0 | 14.69 | 29 | 8 | interior |
| 29 | casado | 2o Grau | 5 | 14.71 | 40 | 6 | interior |
| 30 | casado | 2o Grau | 2 | 15.99 | 35 | 10 | capital |
| 31 | solteiro | Superior | - | 16.22 | 31 | 5 | outro |
| 32 | casado | 2o Grau | 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 | 2o Grau | 2 | 19.40 | 48 | 11 | capital |
| 36 | casado | Superior | 3 | 23.30 | 42 | 2 | interior |
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 3. Lembre-se que se você precisar corrigir algo na
digitação você pode fazê-lo abrindo a planilha novamente com o comando fix(milsa).
> milsa <- edit(data.frame()) # abra a planilha para entrada dos dados > milsa # visualiza os dados digitados > fix(milsa) # comando a ser usado para correções, se necessário
| 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 elas 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) # conferindo se é um data-frame
[1] TRUE
> names(milsa) # vendo o nome das variáveis
[1] "funcionario" "civil" "instrucao" "filhos" "salario" [6] "ano" "mes" "regiao" "idade"
> dim(milsa) # vendo as dimensões do data-frame
[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) # anexando ao caminho de procura
NOTA: este comando deve ser digitado para que os comandos mostrados a seguir tenham efeito.
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 estão 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 diferentes 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 4.
> pie(table(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 conforme mostrado na Figura 5.
> barplot(instrucao.tb)
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)) # só calcula mediana de variáveis numéricas
[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 6 o obtido com os comandos a seguir.
> plot(filhos.tb) # gráfico das frequências absolutas
Outra possibilidade seria fazer gráficos de frequências relativas e de frequências acumuladas conforme mostrado na Figura 7.
> plot(filhos.tbr) > filhos.fac <- cumsum(filhos.tbr) > filhos.fac > plot(filhos.fac, type="S")
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 # moda
[1] "2"
> filhos.md <- median(filhos, na.rm=T) > filhos.md # mediana
[1] 2
> filhos.me <- mean(filhos, na.rm=T) > filhos.me # média
[1] 1.65
> filhos.me <- mean(filhos, trim=0.1, na.rm=T) > filhos.me # média
[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) # variância
[1] 1.607895
> filhos.dp <- sd(filhos, na.rm=T) # desvio padrão > filhos.dp
[1] 1.268028
> filhos.cv <- 100 * filhos.dp/filhos.me # coeficiente de variação > filhos.cv
[1] 81.15379
> filhos.qt <- quantile(filhos, na.rm=T) > filhos.ai <- filhos.qt[4] - filhos.qt[2] # amplitude interquartílica > 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) # várias medidas
Min. 1st Qu. Median Mean 3rd Qu. Max. NAs 0.00 1.00 2.00 1.65 2.00 5.00 16
> 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) # máximo e mínimo
[1] 4.0 23.3
> nclass.Sturges(salario) # número de classes pelo critério de Sturges
[1] 7
> args(cut)
function (x, ...) NULL
> args(cut.default)
function (x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE, dig.lab = 3L, 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. 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 cima de cada barra, prob=TRUE faz com que o gráfico exiba as frequências relativas. 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)
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 | 15701488 10 | 5816 12 | 08269 14 | 77 16 | 0263 18 | 84 20 | 22 | 3
Finalmente medidas são obtidas da mesma forma que para variáveis discretas. Veja alguns exemplos a seguir.
> salario.md <- median(salario, na.rm=T) > salario.md # mediana
[1] 10.165
> salario.me <- mean(salario, na.rm=T) > salario.me # média
[1] 11.12222
> range(salario, na.rm=T)
[1] 4.0 23.3
> salario.A <- diff(range(salario, na.rm=T)) # amplitude > salario.A
[1] 19.3
> var(salario, na.rm=T) # variância
[1] 21.04477
> salario.dp <- sd(salario, na.rm=T) # desvio padrão > salario.dp
[1] 4.587458
> salario.cv <- 100 * salario.dp/salario.me # coeficiente de variação > salario.cv
[1] 41.24587
> salario.qt <- quantile(salario, na.rm=T) > salario.ai <- salario.qt[4] - salario.qt[2] # amplitude interquartílica > salario.ai
75% 6.5075
> summary(salario) # várias medidas
Min. 1st Qu. Median Mean 3rd Qu. Max. 4.000 7.553 10.165 11.122 14.060 23.300
> fivenum(salario)
[1] 4.000 7.515 10.165 14.270 23.300
Na análise bivariada procuramos identificar relaçõ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 estendida incluindo os totais marginais pode ser obtida com addmargins().
> civ.gi.tb <- table(civil, instrucao) # frequências absolutas > 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 9 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)
Medidas de associação entre duas variáveis qualitativas incluem o Chi-quadrado dado por: \[\chi ^2 = \sum _{i=1}^{k} \frac {(o_i - e_i)^2}{e_i} \; ,\] onde \(o_i\) e \(e_i\) 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 coeficiente de contingência \(C\) e o coeficiente de contingência modificado \(C_1\) dados por: \[C= \sqrt {\frac {\chi ^2}{\chi ^2 + n}} \;\; \mbox { , } \;\; C_1 = \frac {C}{[(t-1)/t]^2},\] onde \(n\) é o número de observações e \(t\) é o mínimo entre o número de linhas e colunas da tabela. Os comandos a seguir mostram como obter todas estas medidas.
> summary(civ.gi.tb) # resumo incluindo o teste Chi-quadrado
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)) # resumo incluindo o teste Chi-quadrado
[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 \(2^o\) 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, 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.
> 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 (\(\sim \)) pela variável instrucao.
> boxplot(salario~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 informando 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 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\).
> 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~\times ~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 no eixo-X.
> plot(idade, salario)
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
Em geral as técnicas descritivas uni e bivariadas mostradas até aqui podem ser estendidas 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 estendido. Anteriormente nesta sessão mostramos como calcular o salário médio para cada nível de instrução. Vamos estender 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 última é mostrada de duas maneiras, uma delas retornando um vetor e outra uma matriz.
> 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) # desanexando do caminha de procura
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 úteis para termos uma ideia 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
você vai ter que teclar ENTER para ver o próximo gráfico.
no “prompt” do programa R digite:
> demo(graphics)
Você vai ver a seguinte mensagem na tela:
demo(graphics)
---- ~~~~~~~~
Type <Return> to start :
a “demo” vai ser iniciada e uma tela gráfica irá se abrir. Na tela de comandos serão mostrados comandos que serão utilizados para gerar um gráfico seguidos da mensagem:
Hit <Return> to see next plot:
agora na tela de comandos apareceram novos comandos para produzir um novo gráfico e a mensagem:
Hit <Return> to see next plot:
para ver o código fonte (comandos) de uma demo você pode utilizar comandos como se seguem
(e de forma análoga para outras "demos"):
> file.show(system.file("demo/graphics.R", package="graphics"))
> file.show(system.file("demo/plotmath.R", package="graphics"))
> file.show(system.file("demo/persp.R", package="graphics"))
Há vários conjuntos de dados incluídos no programa R como, por exemplo, o conjunto mtcars. Estes conjuntos são todos documentados, isto é, você 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) # carrega o conjunto de dados women > women # mostra os dados > help(women) # mostra a documentação destes dados
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 você pode reproduzir para entendê-la melhor.
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.
Faça uma análise descritiva adequada do conjunto de dados women.
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.
qual o número médio e mediano de cada um dos crimes?
encontre a mediana e quartis para cada crime.
encontre o número máximo e mínimo para cada crime.
faça um gráfico adequado para o número de assassinatos (murder).
faça um diagrama ramo-e-folhas para o número de estupros (rape).
verifique se há correlação entre os diferentes tipos de crime.
verifique se há correlação entre os crimes e a proporção de população urbana.
encontre os estados com maior e menor ocorrência de cada tipo de crime.
encontre os estados com maior e menor ocorrência per capita de cada tipo de crime.
encontre os estados com maior e menor ocorrência do total de crimes.