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.Utilização do banco de dados 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)