Para ilustrar algumas ferramentas de análise de dados, vamos usar dados hipotéticos de atributos de 36 funcionários da companhia “Milsa” (livro Estatística Básica -W. Bussab e P. Morettin). Estes dados são do tipo data.frame. Disponível em: https://mega.nz/#!sh5SDQQC!p3dlAcsgwLwZiQMjcPWoYZm88dn23gqzAPnyM6UMqxI
#copie o arquivo milsa.txt em seu diretório de trabalho.
milsa <- read.table("milsa.txt", head = T)
milsa## funcionario civil instrucao filhos salario ano mês 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
## 7 7 1 1 NA 6.86 41 0 1
## 8 8 1 1 NA 7.39 43 4 2
## 9 9 2 2 1 7.59 34 10 2
## 10 10 1 2 NA 7.44 23 6 3
## 11 11 2 2 2 8.12 33 6 1
## 12 12 1 1 NA 8.46 27 11 2
## 13 13 1 2 NA 8.74 37 5 3
## 14 14 2 1 3 8.95 44 2 3
## 15 15 2 2 0 9.13 30 5 1
## 16 16 1 2 NA 9.35 38 8 3
## 17 17 2 2 1 9.77 31 7 2
## 18 18 2 1 2 9.80 39 7 3
## 19 19 1 3 NA 10.53 25 8 1
## 20 20 1 2 NA 10.76 37 4 1
## 21 21 2 2 1 11.06 30 9 3
## 22 22 1 2 NA 11.59 34 2 2
## 23 23 1 1 NA 12.00 41 0 3
## 24 24 2 3 0 12.79 26 1 3
## 25 25 2 2 2 13.23 32 5 1
## 26 26 2 2 2 13.60 35 0 3
## 27 27 1 1 NA 13.85 46 7 3
## 28 28 2 2 0 14.69 29 8 1
## 29 29 2 2 5 14.71 40 6 1
## 30 30 2 2 2 15.99 35 10 2
## 31 31 1 3 NA 16.22 31 5 3
## 32 32 2 2 1 16.61 36 4 1
## 33 33 2 3 3 17.26 43 7 2
## 34 34 1 3 NA 18.75 33 7 2
## 35 35 2 2 2 19.40 48 11 2
## 36 36 2 3 3 23.30 42 2 1
Inicialmente inspecionamos as primeiras linhas do conjunto de dados:
head(milsa)## funcionario civil instrucao filhos salario ano mês 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
A planilha ainda não está pronta! Precisamos informar para o programa que as variáveis civil, instrução e região NÃO são numéricas e sim categóricas, usando o comando factor().
Primeiro, redefinimos a variável civil com os rótulos (labels) solteiro e casado associados aos níveis (levels) 1 e 2.
Para a variável instrução, usamos o argumento adicional ordered = TRUE para indicar que é uma variável ordinal. Na variável região, codificamos assim: 2=capital, 1=interior, 3=outro.
milsa$civil <- factor(milsa$civil, label = c("solteiro", "casado"), levels = 1:2)
milsa$instrucao <- factor(milsa$instrucao, label = c("1º Grau", "2º Grau", "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 mês regiao
## 1 1 solteiro 1º Grau NA 4.00 26 3 interior
## 2 2 casado 1º Grau 1 4.56 32 10 capital
## 3 3 casado 1º Grau 2 5.25 36 5 capital
## 4 4 solteiro 2º Grau NA 5.73 20 10 outro
## 5 5 solteiro 1º Grau NA 6.26 40 7 outro
## 6 6 casado 1º Grau 0 6.66 28 0 interior
O mesmo poderia ser feito com o comando transform()
# milsa <- transform(milsa, civil = factor(civil, label = c("solteiro", "casado"), levels = 1:2), instrucao=factor(instrucao, label = c("1º Grau", "2º Grau", "Superior"), lev = 1:3, ord = T), regiao = factor(regiao, label = c("capital", "interior", "outro"), lev = c(2, 1, 3)))Vamos agora, definir uma nova variável denominada idade, em anos, a partir das variáveis ano e mês.
milsa$idade <- milsa$ano + milsa$mês/12
milsa$idade## [1] 26.25000 32.83333 36.41667 20.83333 40.58333 28.00000 41.00000
## [8] 43.33333 34.83333 23.50000 33.50000 27.91667 37.41667 44.16667
## [15] 30.41667 38.66667 31.58333 39.58333 25.66667 37.33333 30.75000
## [22] 34.16667 41.00000 26.08333 32.41667 35.00000 46.58333 29.66667
## [29] 40.50000 35.83333 31.41667 36.33333 43.58333 33.58333 48.91667
## [36] 42.16667
#ou
#milsa <- transform(milsa, idade = ano + mês/12)A seguir, fazemos algumas análises descritivas uni e bi-variadas.
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" "mês" "regiao" "idade"
dim(milsa)## [1] 36 9
Uma vez que vamos fazer diversas análises com estes dados, usaremos o comando attach() para anexar o objeto ao caminho de procura.
attach(milsa)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 distribuição da variável
Para exemplificar o uso dessas ferramentas, vamos selecionar uma variável de cada tipo.
A variável civil é uma variável qualitativa nominal, assim podemos obter:
Primeiro, vamos listar os dados e checar se estão na forma de um fator, que é adequada para variáveis desse tipo.
civil## [1] solteiro casado casado solteiro solteiro casado solteiro
## [8] solteiro casado solteiro casado solteiro solteiro casado
## [15] casado solteiro casado casado solteiro solteiro casado
## [22] solteiro solteiro casado casado casado solteiro casado
## [29] casado casado solteiro casado casado solteiro casado
## [36] casado
## Levels: solteiro casado
is.factor(civil)## [1] TRUE
A seguir, obtemos as Frequências absolutas e relativas:
civil.tb <- table(civil)
prop.table(civil.tb)## civil
## solteiro casado
## 0.4444444 0.5555556
O gráfico de setores é adequado para representar esta variável:
pie(table(civil))Finalmente encontramos a moda para esta variável (objeto civil.mo).
civil.mo <- names(civil.tb)[civil.tb == max(civil.tb)]
civil.mo## [1] "casado"
Para exemplificar como obter análises para uma variável qualitativa ordinal, vamos selecionar a variável instrucao.
instrucao## [1] 1º Grau 1º Grau 1º Grau 2º Grau 1º Grau 1º Grau 1º Grau
## [8] 1º Grau 2º Grau 2º Grau 2º Grau 1º Grau 2º Grau 1º Grau
## [15] 2º Grau 2º Grau 2º Grau 1º Grau Superior 2º Grau 2º Grau
## [22] 2º Grau 1º Grau Superior 2º Grau 2º Grau 1º Grau 2º Grau
## [29] 2º Grau 2º Grau Superior 2º Grau Superior Superior 2º Grau
## [36] Superior
## Levels: 1º Grau < 2º Grau < Superior
is.factor(instrucao)## [1] TRUE
As tabelas de frequências são obtidas de forma semelhante
instrucao.tb <- table(instrucao)
instrucao.tb## instrucao
## 1º Grau 2º Grau Superior
## 12 18 6
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:
barplot(instrucao.tb)Para uma variável ordinal, além da moda podemos também calcular outras medidas, tais como a mediana.
Note que o comando median() não funciona com variáveis não numéricas, por isso, usamos:
instrucao.mo <- names(instrucao.tb)[instrucao.tb == max(instrucao.tb)]
instrucao.mo## [1] "2º Grau"
median(as.numeric(instrucao))## [1] 2
levels(milsa$instrucao)[median(as.numeric(milsa$instrucao))]## [1] "2º Grau"
Vamos agora usar a variável filhos (número de filhos) para ilustrar algumas análises que podem ser feitas com uma variável quantitativa discreta.
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
## [24] 0 2 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:
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 pode ser obtido através de um gráfico de linhas:
plot(filhos.tb)Outra possibilidade seria fazer gráficos de Frequências relativas e de Frequências acumuladas:
plot(filhos.tbr)filhos.fac <- cumsum(filhos.tbr)
plot(filhos.fac, type = "S")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 o número de filhos para alguns indivíduos.
O argumento trim=0.1 indica uma média aparada, onde foram retirados 10% menores e 10% maiores valores.
Ao final, mostramos como obter os quartis, números mínimo e máximo, de um conjunto de dados.
filhos.mo <- names(filhos.tb)[filhos.tb == 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.meap <- mean(filhos, trim = 0.1, na.rm = T)
filhos.meap## [1] 1.5625
filhos.qt <- quantile(filhos, na.rm = T)
filhos.qt## 0% 25% 50% 75% 100%
## 0 1 2 2 5
Quanto às medidas de dispersão, vejamos como obter números máximo e mínimo, amplitude, variância e desvio-padrão, coeficiente de variação.
Depois obtemos os quartis e 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] 76.85018
filhos.qt <- quantile(filhos, na.rm = T)
filhos.qt## 0% 25% 50% 75% 100%
## 0 1 2 2 5
filhos.ai <- filhos.qt[4] - filhos.qt[2]
filhos.ai## 75%
## 1
De forma geral, usamos:
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
fivenum(filhos)## [1] 0 1 2 2 5
GRÁFICO DE PONTOS
Vamos construir o gráfico de pontos do número de filhos.
library(lattice)
dotplot(filhos)Uma opção para criar um gráfico através de dados que uma fonte secundária, apresentados através de uma tabela de frequências, pode ser obtida através dos comandos abaixo.
Filhos = c(0,1,2,3,4,5,6)
Freq = c(20,32,15,7,3,2,2)
Total = rep(Filhos,Freq)
dotplot(Total)Se quisermos comparar dois grupos, em relação a uma variável quantitativa discreta, podemos colocar dois gráficos de barras, lado a lado.
Por exemplo, suponha que o conjunto de dados anterior seja relativo a um grupo de pessoas (Grupo A), e que você deseja comparar o número de filhos em relação a outro grupo de pessoas (Grupo B), com frequências de 5,15,7,6,3,2,1.
GrupoA <-matrix(Freq,ncol=7,nrow=1)
colnames(GrupoA)=c(0,1,2,3,4,5,6)
FreqB = c(5,15,7,6,3,2,1)
GrupoB <- matrix(FreqB,ncol=7,nrow=1)
colnames(GrupoB)=c(0,1,2,3,4,5,6)
par(mfrow=c(1,2))
Limsup= max(Freq,FreqB)
barplot(GrupoA,ylim=c(0,Limsup))
barplot(GrupoB,ylim=c(0,Limsup))Para concluir os exemplos para a 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
## [12] 8.46 8.74 8.95 9.13 9.35 9.77 9.80 10.53 10.76 11.06 11.59
## [23] 12.00 12.79 13.23 13.60 13.85 14.69 14.71 15.99 16.22 16.61 17.26
## [34] 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 variável contínua é preciso agrupar os dados em classes.
Para isso, inicialmente verificamos os valores máximo e mínimo dos dados, e usamos o critério de Sturges, para definir o número de classes, usando cut( ) para agrupar os dados.
Finalmente, obtemos as Frequências absolutas e relativas.
range(salario)## [1] 4.0 23.3
nclass.Sturges(salario)## [1] 7
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
Dois possíveis gráficos para variáveis contínuas são os histogramas e os box-plots:
hist(salario)boxplot(salario)Outra representação gráfica para variáveis numéricas é o diagrama de ramo-e-folhas:
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
Algumas medidas estatísticas:
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.qt## 0% 25% 50% 75% 100%
## 4.0000 7.5525 10.1650 14.0600 23.3000
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
Outro exemplo: Dados representando o valor das vendas semanais (em salários mínimos) de vendedores de gênero alimentícios.
Fazendo um histograma:
vendas <- seq(32.5, 67.5, by = 5)
vendedores <- c(2, 10, 18, 50, 70, 30, 18, 2)
dados <- rep(vendas, vendedores)
hist(dados, breaks = seq(30, 70, by = 5), xlab = "vendas", ylab = "no. vendedores", main = "")Na análise bivariada, procuramos identificar relações entre duas variáveis.
O tipo de resumo estatístico informativo vai depender dos tipos das variáveis envolvidas.
A seguir, mostramos algumas possibilidades desse tipo de análise.
Salientamos que as relações entre duas variáveis devem ser examinadas com cautela, pois podem ser mascaradas por variáveis adicionais, não consideradas na análise (variáveis de confundimento).
Vamos considerar as variáveis civil (estado civil) e instrucao (grau de instrução).
A forma mais adequada de construir a tabela envolvendo duas variáveis (tabela de cruzamento) vai depender dos objetivos da análise e da interpretação desejada para os dados.
Inicialmente obteremos a tabela de Frequências absolutas e relativas
civ.gi.tb <- table(civil, instrucao)
prop.table(civ.gi.tb)## instrucao
## civil 1º Grau 2º Grau Superior
## solteiro 0.19444444 0.16666667 0.08333333
## casado 0.13888889 0.33333333 0.08333333
prop.table(civ.gi.tb, margin = 1)## instrucao
## civil 1º Grau 2º Grau Superior
## solteiro 0.4375 0.3750 0.1875
## casado 0.2500 0.6000 0.1500
prop.table(civ.gi.tb, margin = 2)## instrucao
## civil 1º Grau 2º Grau Superior
## solteiro 0.5833333 0.3333333 0.5000000
## casado 0.4166667 0.6666667 0.5000000
barplot(civ.gi.tb, legend = T) barplot(civ.gi.tb, beside = T, legend = T)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 podemos refazer as análises do cruzamento com esta nova variável:
instrucao1 <- ifelse(instrucao == "1º Grau", 1, 2)
instrucao1 <- factor(instrucao1, label = c("1º Grau", "2º + Superior"), lev = 1:2, ord = T)
table(instrucao1)## instrucao1
## 1º Grau 2º + Superior
## 12 24
table(civil, instrucao1)## instrucao1
## civil 1º Grau 2º + 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
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().
Após agrupar esta variável, obtemos a(s) tabela(s) de cruzamento como mostrado anteriormente.
quantile(salario)## 0% 25% 50% 75% 100%
## 4.0000 7.5525 10.1650 14.0600 23.3000
salario.cl <- cut(salario, quantile(salario))
ins.sal.tb <- table(instrucao, salario.cl)
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]
## 1º Grau 0.5454545 0.2727273 0.1818182 0.0000000
## 2º Grau 0.1111111 0.3333333 0.2777778 0.2777778
## Superior 0.0000000 0.0000000 0.3333333 0.6666667
Considerando instrucao como variável explicativa (eixo-X) e salario como variável resposta (eixo-Y), obtemos 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 (~), indicando que a variável salario é explicada pela variável instrução.
boxplot(salario ~ instrucao)Para as medidas estatísticas, o usual é obter um resumo da variável quantitativa para cada nível do fator qualitativo.
Exemplo: Resumos da variável salário, para cada nível de instrução.
tapply(salario, instrucao, mean)## 1º Grau 2º Grau Superior
## 7.836667 11.528333 16.475000
tapply(salario, instrucao, sd)## 1º Grau 2º Grau Superior
## 2.956464 3.715144 4.502438
tapply(salario, instrucao, quantile)## $`1º Grau`
## 0% 25% 50% 75% 100%
## 4.0000 6.0075 7.1250 9.1625 13.8500
##
## $`2º Grau`
## 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
Para ilustrar este caso, vamos considerar as variáveis salário e idade.
Para se obter uma tabela é necessário agrupar as variáveis em classes, por exemplo, através dos quartis, gerando uma tabela de cruzamento 4 × 4.
idade.cl <- cut(idade, quantile(idade))
table(idade.cl)## idade.cl
## (20.8,30.7] (30.7,34.9] (34.9,40.5] (40.5,48.9]
## 8 9 9 9
salario.cl <- cut(salario, quantile(salario))
table(salario.cl)## salario.cl
## (4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
## 8 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] 2 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.2857143 0.2857143 0.2857143 0.1428571
## (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, gerando um tabela de cruzamento 3 × 3.
idade.cl1 <- cut(idade, quantile(idade, seq(0, 1, len = 4)))
salario.cl1 <- cut(salario, quantile(salario, seq(0, 1, len = 4)))
table(idade.cl1, salario.cl1)## salario.cl1
## idade.cl1 (4,8.65] (8.65,12.9] (12.9,23.3]
## (20.8,32.1] 3 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.3000000 0.5000000 0.2000000
## (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 a relação entre duas variáveis quantitativas é um diagrama de dispersão.
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.
plot(idade, salario)