11 Estatíticas
11.1 Introdução
Neste capítulo, trataremos sobre alguns gráficos comuns na área da estatística, utilizando o pacote ggplot2
.
Para os exemplos, utilizaremos o mesmo conjunto de dados utilizados no Capítulo 9, presente no arquivo alunos.csv
.
dados_alunos <- readr::read_csv("dados/alunos.csv")
dados_alunos
#> # A tibble: 64 × 7
#> sexo idade altura peso horas_estudo media_ponderada futuro
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 M 23 1.75 80 2 7.5 academico
#> 2 F 19 1.67 65 2 8.3 mercado
#> 3 M 19 1.7 90 3 6.9 mercado
#> 4 M 22 1.73 87 3 7.1 academico
#> 5 M 19 1.83 71 2 6.5 mercado
#> 6 M 19 1.8 80 3 8.6 mercado
#> 7 M 20 1.9 90 2 7.8 academico
#> 8 F 20 1.6 55 1 8 mercado
#> 9 F 24 1.62 55 2 8.2 academico
#> 10 F 18 1.64 60 2 7.3 mercado
#> # ℹ 54 more rows
11.2 Histogramas
Neste primeiro caso, faremos um histograma referente à média ponderada dos alunos.
Esse tipo de gráfico é útil para verificar a frequência e a distribuição de uma variável numérica que assume uma ampla gama de valores (variável quantitativa contínua). Sua construção é dada pela divisão do eixo x em barras igualmente espaçadas e, no eixo y, apresenta o número de observações dos respectivos intervalos.
Para isso, utilizamos a função geom_histogram()
, sendo necessário indicar somente o argumento x =
, pois o eixo y será construído, automaticamente, pela contagem dos valores.
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Podemos definir a largura dos intervalos ou a quantidade de barras de um histograma utilizando os argumentos binwidth =
e bins =
, respectivamente. Em relação à largura dos intervalos, o argumento recebe uma medida nas unidades da variável x
. Já a quantidade de barras, por padrão, é atribuído 30 intervalos.
# Gráfico à esquerda
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_histogram(binwidth = 0.5)
# Gráfico à direita
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_histogram(bins = 8)
No gráfico à esquerda, definimos uma largura de intervalos em 0.5, ou seja, as notas vão de 0.5 em 0.5. Enquanto isso, no gráfico à direita, definimos 8 barras para a apresentação do histograma.
De acordo com o valor atribuído a quaisquer dos argumentos, podemos observar diferentes padrões. Dessa forma, é importante explorar uma variedade de valores até que os dados estejam bem ajustados ao histograma.
Para melhorar a aparência do histograma, utilizamos o argumento color =
para colorir as bordas das barras e o fill =
para preencher o seu interior com cor.
# Gráfico à esquerda
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_histogram(binwidth = 0.5, color = "black", fill = "#00AEF3")
# Gráfico à direita
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_histogram(bins = 8, color = "black", fill = "#1FC361")
11.3 Gráfico de densidade
Uma outra alternativa para representar variáveis numéricas contínuas é o gráfico de densidade. Para isso, utilizamos a função geom_density()
. Este gráfico é uma versão suavizada do histograma que nos fornece uma noção sobre a simetria dos dados.
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_density()
Podemos preencher seu interior com o argumento fill =
e alterar a transparência da cor com o alpha =
.
ggplot(dados_alunos, aes(x = media_ponderada)) +
geom_density(fill = "#AEC70D", alpha = 0.3)
Também podemos representar mais de uma densidade em um mesmo gráfico. Basta atribuir uma variável categórica ao argumento fill =
e/ou color =
para diferenciar as densidades.
ggplot(dados_alunos, aes(x = media_ponderada, color = sexo, fill = sexo)) +
geom_density(alpha = 0.3)
11.4 Boxplot
O boxplot ou gráfico de caixas é muito útil para observarmos a posição e a distribuição de valores. Além disso, permite identificar possíveis observações atípicas do conjunto de dados. Para fazermos os boxplots, utilizamos a função geom_boxplot()
.
ggplot(dados_alunos, aes(y = media_ponderada)) +
geom_boxplot()
Nesse primeiro caso, fizemos um boxplot da média ponderada de todos os alunos. A observação representada por um ponto é um valor atípico aos dados.
Podemos incluir uma variável categórica ao boxplot. Como por exemplo, distinguir os dados de acordo com a variável futuro
.
ggplot(dados_alunos, aes(x = futuro, y = media_ponderada)) +
geom_boxplot()
Neste caso, podemos ver a distribuição da média ponderada dos estudantes de acordo com as perspectivas futuras de cada um. Para isso, atribuímos a variável categórica futuro
ao eixo x.
Ainda, podemos incluir uma segunda variável categórica. Agora, dividiremos os dados de acordo com as perspectivas futuras e o sexo.
ggplot(dados_alunos, aes(x = futuro, y = media_ponderada, fill = sexo)) +
geom_boxplot()
Para isso, atribuimos a variável sexo
ao argumento fill =
, distinguindo o sexo dos estudantes por cor. Como resultado, podemos observar a distribuição das médias ponderadas de acordo com o sexo e a perspectiva futura dos alunos.
Para conferir os valores utilizados para construir o boxplot, podemos utilizar a função summary()
.
# Todos os valores de `media_ponderada`
summary(dados_alunos$media_ponderada)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 5.000 7.000 7.400 7.425 8.000 8.700
# Valores agrupados por `futuro`
dados_alunos |>
dplyr::group_by(futuro) |>
dplyr::summarise(
summary(media_ponderada) |> rbind() |> tibble::as_tibble()
)
#> # A tibble: 2 × 7
#> futuro Min. `1st Qu.` Median Mean `3rd Qu.` Max.
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 academico 6.6 7.1 7.5 7.58 8.1 8.7
#> 2 mercado 5 6.95 7.4 7.37 8 8.7
# Valores agrupados por `futuro` e `sexo`
dados_alunos |>
dplyr::group_by(futuro, sexo) |>
dplyr::summarise(
summary(media_ponderada) |> rbind() |> tibble::as_tibble()
)
#> # A tibble: 4 × 8
#> # Groups: futuro [2]
#> futuro sexo Min. `1st Qu.` Median Mean `3rd Qu.` Max.
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 academico F 6.6 6.85 8.2 7.74 8.5 8.7
#> 2 academico M 6.9 7.2 7.4 7.46 7.75 8.1
#> 3 mercado F 6.7 7.2 7.5 7.61 8 8.4
#> 4 mercado M 5 6.72 7.15 7.21 7.93 8.7
Por fim, para calcular a amplitude interquartil (cujo cálculo se dá pela subtração do valor do 3º quartil com o do 1º quartil) utilizamos a função IQR()
.
# Todos os valores de `media_ponderada`
IQR(dados_alunos$media_ponderada)
#> [1] 1
# Valores agrupados por `futuro`
dados_alunos |>
dplyr::group_by(futuro) |>
dplyr::summarise(iqr = IQR(media_ponderada))
#> # A tibble: 2 × 2
#> futuro iqr
#> <chr> <dbl>
#> 1 academico 1
#> 2 mercado 1.05
# Valores agrupados por `futuro` e `sexo`
dados_alunos |>
dplyr::group_by(futuro, sexo) |>
dplyr::summarise(iqr = IQR(media_ponderada))
#> # A tibble: 4 × 3
#> # Groups: futuro [2]
#> futuro sexo iqr
#> <chr> <chr> <dbl>
#> 1 academico F 1.65
#> 2 academico M 0.55
#> 3 mercado F 0.8
#> 4 mercado M 1.20
11.5 Gráfico de barras com desvios padrão
Para adicionar desvios padrão ao gráfico de barras no ggplot2
, usamos a função geom_errorbar()
, que adiciona barras de erro representando a variação dos dados.
Para isso, utilizaremos os dados do data frame diamonds
, conjunto de dados do próprio pacote ggplot2
.
diamonds
#> # A tibble: 53,940 × 10
#> carat cut color clarity depth table price x y z
#> <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
#> 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
#> 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
#> 4 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
#> 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
#> 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
#> 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
#> 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
#> 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
#> 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39
#> # ℹ 53,930 more rows
Primeiramente, criaremos um resumo dos dados com média e desvio padrão a partir das funções group_by()
e summarise()
(vide Seção 7.5).
diamonds_resumo <- diamonds |>
dplyr::group_by(cut) |>
dplyr::summarise(
media_preco = mean(price),
desvio_padrao = sd(price)
)
diamonds_resumo
#> # A tibble: 5 × 3
#> cut media_preco desvio_padrao
#> <ord> <dbl> <dbl>
#> 1 Fair 4359. 3560.
#> 2 Good 3929. 3682.
#> 3 Very Good 3982. 3936.
#> 4 Premium 4584. 4349.
#> 5 Ideal 3458. 3808.
Com as medidas calculadas, construiremos o gráfico de barras com a função geom_bar()
e colocar os desvios padrão com a função geom_errorbar()
.
ggplot(diamonds_resumo, aes(x = cut, y = media_preco)) +
geom_bar(stat = "identity", fill = "steelblue") +
geom_errorbar(
aes(
ymin = media_preco - desvio_padrao,
ymax = media_preco + desvio_padrao
),
width = 0.2
)
Note que os limites inferior e superior da barra de erro foram construídos a partir da subtração e da soma pela média dos preços de diamantes, respectivamente. Com o argumento width =
definimos a largura da barra de erro.
11.6 Resumo
Para saber mais sobre os gráficos estatísticos, confira o seguinte material R Gallery Book.