Análises preliminares

Vamos analisar um banco de dados imbutido no R com dados de medidas de tamanho e espessura de pétalas e sépalas de 3 diferentes espécies de flores.

options(scipen=999) # Tira a notação científica do tipo 2e-16
data(iris)
names(iris) # Retorna o nome das variáveis
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"
dim(iris) # Dimensões do banco de dados
## [1] 150   5
head(iris) # Mostra as primeiras colunas
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
tail(iris) # Mostra as últimas colunas
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica
View(iris) # Visualizar o banco de dados completo

Vamos olhar primeiro para a classe de cada variável:

class(iris[[1]])
## [1] "numeric"
class(iris[[2]])
## [1] "numeric"
class(iris[[3]])
## [1] "numeric"
class(iris[[4]])
## [1] "numeric"
class(iris[[5]])
## [1] "factor"

As quatro primeiras variáveis são numéricas. A última é do tipo factor, uma classe que ainda não abordamos. Faremos isso mais adiante. Vamos nos concentrar agora em possibilidades de análises para dados do tipo numeric.

Podemos pedir um conjunto de estatísticas descritivas dos dados com o comando summary()

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Podemos usar o mesmo comando para tirar estatísticas descritivas de cada variável

summary(iris$Sepal.Length)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.300   5.100   5.800   5.843   6.400   7.900

ou pedir as estatísticas que nos interessam. Por exemplo:

mean(iris$Sepal.Length) # Média
## [1] 5.843333
median(iris$Sepal.Length) # Mediana
## [1] 5.8
var(iris$Sepal.Length) # Variância
## [1] 0.6856935
sd(iris$Sepal.Length) # Desvio Padrão
## [1] 0.8280661
max(iris$Sepal.Length) # Máximo
## [1] 7.9
min(iris$Sepal.Length) # Mínimo
## [1] 4.3
quantile(iris$Sepal.Length) # Quartis
##   0%  25%  50%  75% 100% 
##  4.3  5.1  5.8  6.4  7.9
quantile(iris$Sepal.Length, probs =c(0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1)) # Decis
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
## 4.30 4.80 5.00 5.27 5.60 5.80 6.10 6.30 6.52 6.90 7.90

Algumas estatísticas comuns

Vamos investigar algumas relações entre essas variáveis. Primeiro, vamos tirar uma matriz de correlações.

cor(iris[,1:4]) # Correlaciona as variáveis de 1 a 4
##              Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
## Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
## Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
## Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000
cor(iris$Sepal.Length, iris$Petal.Length) # Correlação entre duas variáveis
## [1] 0.8717538
cor.test(iris$Sepal.Length, iris$Petal.Length) # Correlação com teste estatístico
## 
##  Pearson's product-moment correlation
## 
## data:  iris$Sepal.Length and iris$Petal.Length
## t = 21.646, df = 148, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8270363 0.9055080
## sample estimates:
##       cor 
## 0.8717538
plot(iris$Sepal.Length, iris$Petal.Length) # produz um scatterplot

Podemos fazer algumas seleções (subsettings) em nossos dados caso queiramos investigar um grupo específico. Neste caso, vamos olhar para algumas estatísticas das flores pertencentes apenas ao grupo virginica.

# Seleciono as linhas em que a variável Species é igual ao character "virginica"
summary(iris[iris$Species == "virginica", ])
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.900   Min.   :2.200   Min.   :4.500   Min.   :1.400  
##  1st Qu.:6.225   1st Qu.:2.800   1st Qu.:5.100   1st Qu.:1.800  
##  Median :6.500   Median :3.000   Median :5.550   Median :2.000  
##  Mean   :6.588   Mean   :2.974   Mean   :5.552   Mean   :2.026  
##  3rd Qu.:6.900   3rd Qu.:3.175   3rd Qu.:5.875   3rd Qu.:2.300  
##  Max.   :7.900   Max.   :3.800   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    : 0  
##  versicolor: 0  
##  virginica :50  
##                 
##                 
## 
# Seleciono apenas os casos da variável Petal.Length que pertençam ao grupo "virginica"
mean(iris$Petal.Length[iris$Species == "virginica"]) 
## [1] 5.552
var(iris$Petal.Length[iris$Species == "virginica"])
## [1] 0.3045878
sd(iris$Petal.Length[iris$Species == "virginica"])
## [1] 0.5518947

Atenção!

  1. Veja que no caso de summary, usamos vírgula porque especificamos no subsetting linhas e colunas. Quando usamos os comandos mean(), var() e sd(), não usamos vírgula pois trata-se de vetores numéricos, ou seja, especificamos apenas posições.

  2. Para estabelecer uma relação de igualdade no R usamos == (igual, igual) pois = (igual) é um símbolo de atribuição (lembram?). Outros comparativos são > (maior que), < (menor que), <=, (menor ou igual), >= (maior ou igual), != (diferente).

Podemos fazer um teste de duas médias, ou teste T de Student. Testaremos se dois grupos tem médias estatisticamente diferentes ou não. Para isso, primeiro, vamos criar um novo objeto apenas com os dados de duas espécies. Veja bem que esse tipo de teste é feito quando se tem uma variável numérica e uma variável categórica com duas categorias.

# Selecionando as linhas em que Species seja DIFERENTE de "setosa". 
dados <- iris[iris$Species != "setosa",]
t.test(dados$Petal.Length~dados$Species)
## 
##  Welch Two Sample t-test
## 
## data:  dados$Petal.Length by dados$Species
## t = -12.604, df = 95.57, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.49549 -1.08851
## sample estimates:
## mean in group versicolor  mean in group virginica 
##                    4.260                    5.552
boxplot(dados$Petal.Length~dados$Species)

Neste caso, os grupos tem médias estatisticamente diferentes.

Para testar se médias de mais de dois grupos são estatisticamente diferentes, use a análise de variância, ou ANOVA. Vamos testar se existe diferença estatística entre uma das médias da variável Petal.Length para os três grupos de espécies.

summary(aov(iris$Petal.Length~iris$Species))
##               Df Sum Sq Mean Sq F value              Pr(>F)    
## iris$Species   2  437.1  218.55    1180 <0.0000000000000002 ***
## Residuals    147   27.2    0.19                                
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Neste caso, pelo menos 1 dos grupos tem média estatisticamente diferente dos demais.

Variáveis FACTOR

As variáveis de classe factor são variáveis categóricas. Nessa classe, cada categoria tem um label. Podemos criar uma variável categórica entrando com os dados e definindo os labels, por exemplo:

sexo <- factor(x = c("Feminino","Masculino","Feminino","Masculino","Feminino","Feminino"), 
               levels = c("Feminino","Masculino"))
sexo
## [1] Feminino  Masculino Feminino  Masculino Feminino  Feminino 
## Levels: Feminino Masculino

Há uma função excelente implementada no pacote descr para tabela de frequências de uma variável categórica. Trata-se da função freq(). Para usá-la, primeiro, se ele não estiver instalado, podemos instalá-lo com o comando install.packages(). Segundo, precisamos carregar o pacote no ambiente.

install.packages("descr", dependencies = T) # Instala também as dependências do pacote.
library(descr)
freq(sexo)

## sexo 
##           Frequência Percentual
## Feminino           4      66.67
## Masculino          2      33.33
## Total              6     100.00

Vamos usar essa mesma função para analisar a variável Species do banco iris.

freq(iris$Species)

## iris$Species 
##            Frequência Percentual
## setosa             50      33.33
## versicolor         50      33.33
## virginica          50      33.33
## Total             150     100.00

Guarde esse comando. Ele é bastante útil.

Gráficos

Visualização de dados não é algo trivial e há vários estudos interessantes sobre o assunto. Apresentarei aqui apenas algumas dicas básicas.

Para visualizar a distribuição de uma variável, usamos um histograma.

hist(iris$Petal.Length)

Podemos adicionar um label para o eixo x, para o eixo y, um título mais bonito e uma cor no gráfico para que ele fique um pouco mais simpático:

hist(iris$Petal.Length, xlab = "Comprimento da Pétala", ylab="Frequência" ,main="Histograma do Comprimento da Pétala", col="green")

Para visualizar duas variáveis numéricas, podemos usar um scatterplot como fizemos acima.

plot(iris$Petal.Length, iris$Sepal.Length)

Para visualizar diferenças de variáveis numéricas entre grupos, podemos usar boxplots.

boxplot(iris$Petal.Length~iris$Species)

Podemos ainda plotar as frequências de uma variável categórica:

barplot(table(iris$Species))

Veja que o comando freq() que utilizamos mais cedo já produz esse gráfico por default.