ENGD 02

Plano de Aula

O presente material apresentado contempla a segunda aula prática de Estatística Descritiva. Os assuntos desenvolvidos serão:

  • Medidas de centralidade;

  • Distribuição de dados; e

  • Visualização gráfica.

Para tal, serão utilizados o banco de dados iris. Caso haja um tempo disponível para prolongação e maior detalhamento do conteúdo, um conjunto de dados aleatório será construído durante a aula para realização de nova análise descritiva.
Esta aula está disponível no RPubs e no GitHub.
Para pleno andamento da atividade, os discentes deverão verificar e, se necessário, instalar os seguintes pacotes:

  • dplyr;
  • ggplot2;
  • reshape2;
  • WVPlots;
  • car;
  • cowplot;
  • GGally;
  • ggplotgui.

Primeiro Momento

Utilização do banco de dados iris.

IRIS

O software R, vários data sets estão disponibilizados de maneira residente (sem necessidade de instalação de pacotes), e o iris é um destes.
Para carregar o data set residente é necessário apenas utilizar a função data. Feito isto, prosseguiremos explorando o nosso df (data frame).

data("iris")
View(iris)


Perceba que o objeto iris já consta no seu ambiente de trabalho. E, para explorar o df, utilizaremos o pacote dplyr.

library(dplyr)

É interessante lembrar que o pacote dplyr também pode ser largamente utilizado para manipulação e estruturação do df.
Caso o pacote dplyr não esteja instalado, favor utilizar a função install.packages("nomedopacote").

dplyr::glimpse(iris)
## Observations: 150
## Variables: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9,...
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1,...
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5,...
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1,...
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, s...


Podemos verificar que nosso df é composto por 05 variáveis, sendo 04 numéricas e 01 categórica (Species).
As variáveis numéricas representam as medidas de “partes” das flores analisadas. Já a variável categórica apresenta a espécie de cada flor. Mas, quantas plantas estamos analisando?

n_linhas <- nrow(iris)
paste0("Estamos analisando ", n_linhas, " plantas íris.")
## [1] "Estamos analisando 150 plantas íris."


Quantas plantas pertencem a cada espécie?

table(iris$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50


É possível transformar essa informação em gráfico? Sim, mas temos que realizar manipulação de dados, e para os plots utilizaremos o pacote ggplot2.

df1 <- table(iris$Species)
df1 <- df1 %>% 
  as.data.frame() %>% # transformacao necessaria
  dplyr::rename("Especie" = Var1)
# View(df1)
library(ggplot2)
ggplot(data = df1, mapping = aes(x = Especie, y = Freq)) +
  geom_bar(stat = "identity")


Quais medidas de tendência central podem ser obtidas?

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  
##                 
##                 
## 


Veja que é possível também retornar apenas um valor específico (média, mediana, etc) por variável utilizando $ ou a função attach.

mean(iris$Sepal.Length)
## [1] 5.843333
median(iris$Sepal.Width)
## [1] 3
var(iris$Petal.Length)
## [1] 3.116278
sd(iris$Petal.Width)
## [1] 0.7622377


Também é possível obter essas informações por espécies (grupos), mas, um dos possíveis caminhos, é através da manipulação de dados.
Aqui está presente para a média.

medias <- iris %>% 
  dplyr::group_by(Species) %>% 
  dplyr::summarise(M_sepal_leng = mean(Sepal.Length),
                   M_sepal_wid = mean(Sepal.Width),
                   M_petal_leng = mean(Petal.Length),
                   M_petal_wid = mean(Petal.Width))
View(medias)


Mas, como gerar um gráfico dessas informações?
Para isso, precisamos empilhar as informações, que significa que devemos mudar o arranjo do nosso data frame.
Para isso, vamos utilizar o pacote reshape2. Contudo, informo que o pacote citado está em desuso, já está aposentado. O ideal é utilizar o pacote tidyr.
No pacote reshape2 utilizaremos a função melt, e indicaremos a variável a ser conservada no data frame.

library(reshape2)
medias <- medias %>% 
  reshape2::melt(id.vars = "Species")
View(medias)


Perceba que nosso df agora contém 12 rows e 03 col, com observação agrupada em função da Species e da variable. Isso tornará nosso trabalho extremamente mais fácil.
Caso desejado renomear as variáveis, uma maneira elegante de realizar esta ação é utilizando a função rename do pacote dplyr.

medias <- medias %>% 
  dplyr::rename("Especies" = Species,
                "Variaveis" = variable,
                "Media" = value)


Agora, vamos plotar nosso gráfico e iniciar nossa análise visual.

medias %>% 
  ggplot() +
  geom_point(aes(x = Variaveis, y = Media))


Qual informação podemos sintetizar a partir do gráfico? É possível melhorar?

medias %>% 
  ggplot() +
  geom_point(aes(x = Variaveis, y = Media)) +
  facet_wrap(~Especies) 

# ~ => em funcao de ...
medias %>% 
  ggplot() +
  geom_point(aes(x = Variaveis, y = Media)) +
  facet_wrap(~Especies) +
  theme(axis.text.x = element_text(angle = 90))

medias %>% 
  ggplot() +
  geom_point(aes(x = Especies, y = Media, shape = Variaveis, col = Variaveis), 
             size = 4)

medias %>% 
  ggplot() +
  geom_point(aes(x = Especies, y = Media, shape = Variaveis, col = Variaveis), 
             size = 4) +
  geom_smooth(aes(x = Especies, y = Media))


Vamos comparar com nossa amostra de plantas iris?
Então vamos gerar este objeto para uso posterior.

plot1 <- medias %>% 
  ggplot() +
  geom_point(aes(x = Especies, y = Media, shape = Variaveis, col = Variaveis), 
             size = 4) +
  geom_smooth(aes(x = Especies, y = Media))


Utilizando o data set completo.

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, col = Species, shape = Species))


Existe algum padrão visível? Há correlação? De que tipo?

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, col = Species, shape = Species)) +
  geom_smooth(aes(x = Sepal.Length, y = Sepal.Width), method = "lm") +
  facet_wrap(~Species)

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, col = Species, shape = Species)) +
  geom_smooth(aes(x = Sepal.Length, y = Sepal.Width), method = "lm") +
  facet_wrap(~Species, scales = "free")

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Petal.Length, col = Species, shape = Species)) +
  geom_smooth(aes(x = Sepal.Length, y = Petal.Length), method = "lm") +
  facet_wrap(~Species, scales = "free")


E para plotar todos os plots?

library(WVPlots) 
PairPlot(iris,
         colnames(iris)[1:4], 
         title = "Matriz de dispersão - Iris",
         group_var = "Species")

plot2 <- PairPlot(iris,
                  colnames(iris)[1:4], 
                  title = "Matriz de dispersão - Iris",
                  group_var = "Species")


Boxplot e Histograma no ggplot2.

df2 <- iris %>% 
  dplyr::filter(Species == "setosa")

boxplot_1 <- ggplot(df2) + 
  geom_boxplot(aes(y = Sepal.Length,x = Species),
               color="black",fill="blue") +
                 xlab(label = "Espécie") +
                 ylab(label="Comprimento de Sépala")

boxplot_1 <- boxplot_1 + coord_flip()

hist_1 <- ggplot(df2) +
  geom_histogram(mapping = aes(x = Sepal.Length,y= ..density..), color ="black", fill = "blue", bins = 15)+
  geom_density(mapping = aes(x = Sepal.Length,y= ..scaled..), size = 1)+
  xlab(label = " ")
  ylab(label = "Densidade de Probabilidade")
## $y
## [1] "Densidade de Probabilidade"
## 
## attr(,"class")
## [1] "labels"
library(cowplot)

plot_grid(hist_1, boxplot_1, nrow = 2,rel_heights = c(2,1),scale = 1,align = "hv")

ggplot(iris, aes(Sepal.Length, fill = Species)) + 
  geom_density(alpha = 0.5) +
  scale_y_continuous(expand = expand_scale(mult = c(0, 0.05))) +
  theme_minimal_hgrid(12)


E como podemos verificar a normalidade?

library(GGally)
ggpairs(data = iris, columns = 1:4, 
        mapping = aes(color = Species))

stest <- shapiro.test(iris$Petal.Width)
stest$p.value
## [1] 1.680465e-08


E é possível gerar gráficos em 3D ou de superfícies?

library(scatterplot3d)
scatterplot3d(iris[, c(1, 3, 4)], color = as.numeric(iris$Species))

scatterplot3d(iris[, c(1, 3, 4)], color = as.numeric(iris$Species),
pch = 4, angle = 80)

library(car)
car::scatter3d(x = iris$Petal.Width, 
               y = iris$Sepal.Length, 
               z = iris$Petal.Length, 
               groups = as.factor(iris$Species),
               data = iris, 
               grid = FALSE, fit = "smooth")


E se desejado algo mais simples, que não envolva quase nada de programação? É possível utilizar o pacote ggplotgui, que através de uma GUI, você realizará boa parte de seus gráficos.
Contudo, vale a ressalva de que o uso do GUI não é recomendável para criação de gráficos que possam ser considerados de alta complexidade.

# library(ggplotgui)
# library(shiny)
# https://github.com/gertstulp/ggplotgui/
# ggplotgui::ggplot_shiny(iris)