Análise descritiva

Aula 4

Bruno Montezano

Grupo Alliance
Programa de Pós-Graduação em Psiquiatria e Ciências do Comportamento
Universidade Federal do Rio Grande do Sul

22 de maio de 2023

Conteúdo de hoje

  • Medidas de tendência central
  • Medidas de dispersão
  • Medidas de assimetria e curtose
  • Distribuição normal
  • Transformação de dados
  • Tabelas de frequência

Dados dos pinguins

Hoje nós usaremos os dados dos pinguins do pacote dados.

Este conjunto de dados contém 14 variáveis de 344 observações de pinguins adultos perto da Estação Palmer na Antártida.

Os dados incluem a espécies de pinguins e ilhas do Arquipélago Palmer, medidas de cada espécie, sexo do pinguim e ano de documentação.

pinguins

library(dados)
library(tidyverse)

glimpse(pinguins)
Rows: 344
Columns: 8
$ especie               <fct> Pinguim-de-adélia, Pinguim-de-adélia, Pinguim-de…
$ ilha                  <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torg…
$ comprimento_bico      <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34…
$ profundidade_bico     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18…
$ comprimento_nadadeira <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190,…
$ massa_corporal        <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 34…
$ sexo                  <fct> macho, fêmea, fêmea, NA, fêmea, macho, fêmea, ma…
$ ano                   <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, …
pinguins
# A tibble: 344 × 8
   especie        ilha  comprimento_bico profundidade_bico comprimento_nadadeira
   <fct>          <fct>            <dbl>             <dbl>                 <int>
 1 Pinguim-de-ad… Torg…             39.1              18.7                   181
 2 Pinguim-de-ad… Torg…             39.5              17.4                   186
 3 Pinguim-de-ad… Torg…             40.3              18                     195
 4 Pinguim-de-ad… Torg…             NA                NA                      NA
 5 Pinguim-de-ad… Torg…             36.7              19.3                   193
 6 Pinguim-de-ad… Torg…             39.3              20.6                   190
 7 Pinguim-de-ad… Torg…             38.9              17.8                   181
 8 Pinguim-de-ad… Torg…             39.2              19.6                   195
 9 Pinguim-de-ad… Torg…             34.1              18.1                   193
10 Pinguim-de-ad… Torg…             42                20.2                   190
# ℹ 334 more rows
# ℹ 3 more variables: massa_corporal <int>, sexo <fct>, ano <int>

Revisão de conceitos matemáticos

Variáveis

Variáveis são símbolos que representam conjuntos de um ou mais elementos que podem assumir qualquer quantidade de valores.

  • Letras como \(x\), \(y\) e \(z\) são comumente usadas para indicar variáveis
    • Por exemplo: \(x = 3\)
  • Letras maiúsculas (\(X\)) ou letras com um índice (\(x_i\)) referem-se a variáveis com múltiplos valores — ou seja, com dimensões
    • Por exemplo: \(X = x_i = (15, 16, 32)\)
    • Variáveis com uma dimensão (comprimento) são chamadas de vetor
  • Variáveis como \(x_i\) são usadas para indexar elementos de vetores
    • \(i\) é uma variável que indica a posição indexada
    • Por exemplo: \(x_1 = 15, x_2 = 16, x_3 = 32\)

Somatório

\[\sum_{i=1}^{n}x_i\]

“Soma de todos os valores de \(x\) do primeiro (\(i = 1\)) até o último (\(n\))”

 

Dado \(x = [9, 12, 12, 14, 27]\):

\[\sum_{i=1}^{n}x_i = x_1 + x_2 + x_3 + x_4 + x_5 = 9 + 12 + 12 + 14 + 27 = 74\]

x <- c(9, 12, 12, 14, 27)
sum(x)
[1] 74

É comum ao somar todos os elementos de um vetor, omitirmos os sobrescritos e subscritos, por exemplo: \(\sum{x_i} = \sum_{i=1}^{n}x_i\)

Medidas de tendência central

Média

A média (aritmética) é o valor esperado de uma variável.

\[\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_{i}\]

Se você extrair elementos aleatoriamente dessa variável, a média seria o chute menos errado que você poderia fazer sobre esse valor1.

Dito de outra forma, as diferenças positivas e negativas entre todos os valores e a média equivalem entre si.

pinguins |> 
  summarise(media_massa = mean(massa_corporal, na.rm = TRUE),
            media_comprimento_bico = mean(comprimento_bico, na.rm = TRUE))
# A tibble: 1 × 2
  media_massa media_comprimento_bico
        <dbl>                  <dbl>
1       4202.                   43.9

Mediana

O valor para o qual não mais da metade dos valores é superior ou inferior1.

A mediana tem essa fórmula esquisita:

\[m(x_i) = \begin{cases} x_{\frac{n+1}{2}},& \text{se } n \text{ ímpar}\\ \frac{1}{2}(x_{\frac{n}{2}} + x_{\frac{n}{2} + 1}), &\text{se } n \text{ par}\end{cases}\]

“Se \(x\) tem um número ímpar de elementos, ao colocá-los em ordem, a mediana é o valor do meio. Se \(x\) tem um número par de elementos, a mediana é a média dos dois valores do meio”.
pinguins |> 
  summarise(mediana_massa = median(massa_corporal, na.rm = TRUE),
            mediana_comprimento_bico = median(comprimento_bico, na.rm = TRUE))
# A tibble: 1 × 2
  mediana_massa mediana_comprimento_bico
          <dbl>                    <dbl>
1          4050                     44.4

 

Moda

A moda é o valor mais frequente na variável.

Existem fórmulas para a moda, mas elas não são nada intuitivas, apesar da moda ser a medida de tendência central mais intuitiva.

Vocês podem usar count() para ver a frequência de valores:

pinguins |> 
  count(especie)
# A tibble: 3 × 2
  especie                 n
  <fct>               <int>
1 Pinguim-de-adélia     152
2 Pinguim-de-barbicha    68
3 Pinguim-gentoo        124

E vocês podem achar a moda diretamente com um filter():

pinguins |> 
  count(especie) |> 
  filter(n == max(n))
# A tibble: 1 × 2
  especie               n
  <fct>             <int>
1 Pinguim-de-adélia   152

Valores extremos

A média é sensível a valores extremos:

z <- c(2, 5, 3, 5, 105)
mean(z)
[1] 24

A mediana não é:

median(z)
[1] 5

Isso significa que a mediana pode ser uma “média” mais útil quando os dados têm valores extremos.

Isto é comum com variáveis como renda e números de episódios auto-relatados.

Medidas de dispersão

Variância

A variância mede como os dados estão dispersos em torno da média. Normalmente usamos a variância amostral:

\[ s^2 = \frac{\sum (x_i - \bar{x})^2}{n - 1} \]

pinguins |> 
  filter(!is.na(massa_corporal)) |> 
  summarise(variancia_na_mao_massa = sum(
    (massa_corporal - mean(massa_corporal))^2 /
      (length(massa_corporal) - 1)),
    variancia_massa = var(massa_corporal)
    )
# A tibble: 1 × 2
  variancia_na_mao_massa variancia_massa
                   <dbl>           <dbl>
1                643131.         643131.

Se todos os valores são iguais, a variância é zero.

Desvio padrão

O desvio padrão (\(s\) ou \(sd\), ou \(dp\) em português) é simplesmente a raíz quadrada da variância:

\[s = \sqrt{s^2}\]

Você pode interpretar como a distância “típica” dos valores em relação à média.

pinguins |> 
  filter(!is.na(massa_corporal)) |> 
  summarise(desvio_padrao_na_mao_massa = sqrt(var(massa_corporal)),
    desvio_padrao_massa = sd(massa_corporal)
    )
# A tibble: 1 × 2
  desvio_padrao_na_mao_massa desvio_padrao_massa
                       <dbl>               <dbl>
1                       802.                802.

O desvio padrão se apresenta na mesma unidade de medida da variável.

Amplitude

A amplitude (\(R\)) é a medida de dispersão mais fácil de calcular. Nós subtraímos o menor valor (\(L\)) do maior valor (\(H\)) da variável.

\[R = H - L\]

pinguins |>
  filter(!is.na(massa_corporal)) |>
  summarise(
    massa_max = max(massa_corporal),
    massa_min = min(massa_corporal),
    massa_amplitude = max(massa_corporal) - min(massa_corporal)
  )
# A tibble: 1 × 3
  massa_max massa_min massa_amplitude
      <int>     <int>           <int>
1      6300      2700            3600

Intervalo interquartil

O intervalo interquartil representa a diferença entre o primeiro quartil (o 25º percentil) e o terceiro quartil (o 75º percentil) de um conjunto de dados.

\[IQR = Q_3 - Q_1\]

Em termos simples, o quão distantes estão os 50% valores do meio da variável.

pinguins |>
  filter(!is.na(massa_corporal)) |>
  summarise(
    intervalo_interquartil_massa = IQR(massa_corporal),
    primeiro_quartil = quantile(massa_corporal)["25%"],
    terceiro_quartil = quantile(massa_corporal)["75%"]
  )
# A tibble: 1 × 3
  intervalo_interquartil_massa primeiro_quartil terceiro_quartil
                         <dbl>            <dbl>            <dbl>
1                         1200             3550             4750

Distribuição normal

A distribuição normal é uma das distribuições mais importantes em estatística.

  • Também conhecida como distribuição de Gauss, é frequentemente usada para modelar fenômenos naturais
  • Muitos testes estatísticos assumem que os dados seguem uma distribuição normal
  • 68% dos dados estão dentro de um desvio padrão da média, 95% estão dentro de dois desvios padrão e 99,7% estão dentro de três desvios padrão

Como testar normalidade?

Em muitos casos, é necessário verificar se uma amostra segue uma distribuição normal antes de aplicar determinados testes estatísticos.

  • O teste de Shapiro-Wilk é um teste de normalidade que verifica se uma amostra segue uma distribuição normal
  • Se o \(p\)-valor do teste for menor do que o nível de significância (geralmente 0,05), rejeita-se a hipótese nula e conclui-se que a amostra não segue uma distribuição normal
# Exemplo de distribuição normal

# Amostra de 500 sujeitos
# com média de 175cm e 10cm de desvio padrão
alturas_adultos <- rnorm(n = 500,
                         mean = 175,
                         sd = 10)

shapiro.test(alturas_adultos)

    Shapiro-Wilk normality test

data:  alturas_adultos
W = 0.99673, p-value = 0.4093
# Exemplo de variável que não segue uma
# distribuição normal
pinguins |> 
  pull(massa_corporal) |> 
  shapiro.test()

    Shapiro-Wilk normality test

data:  pull(pinguins, massa_corporal)
W = 0.95921, p-value = 0.00000003679

Assimetria

A assimetria mede o quão assimétrica é uma distribuição. Pode assumir valores positivos ou negativos. A média, mediana e moda em geral não são iguais em distribuições assimétricas

  • Uma assimetria negativa indica que a cauda está no lado esquerdo da distribuição
  • Uma assimetria positiva indica que a cauda está no lado direito da distribuição
  • Um valor de zero indica que não há assimetria na distribuição

Exemplo de distribuição assimétrica

Curtose

Curtose é a medida da forma da distribuição em relação à sua média.

  • A curtose de uma distribuição normal é 3
  • Se uma dada distribuição tem uma curtose menor que 3, ela é chamada de platicúrtica
  • Se uma dada distribuição tem uma curtose maior que 3, diz-se que é leptocúrtica

Quanto maior a curtose, maior a propensão a outliers.

Visualizando a curtose

Medidas de assimetria e curtose

Tanto a assimetria quanto a curtose podem ser calculados com funções do pacote moments.

library(moments)
pinguins |>
  pull(massa_corporal) |>
  skewness(na.rm = TRUE)
[1] 0.468264
pinguins |>
  pull(massa_corporal) |>
  kurtosis(na.rm = TRUE)
[1] 2.273757

Transformação de dados

Em alguns casos, os dados podem apresentar distribuições muito distorcidas, o que pode afetar a validade dos testes estatísticos aplicados.

Para resolver esse problema, uma solução comum é aplicar uma transformação aos dados para deixá-los mais próximos de uma distribuição normal.

Transformando a massa_corporal

pinguins |>
  ggplot(aes(x = massa_corporal)) +
  geom_histogram(fill = "coral2") +
  labs(x = "Massa corporal (em gramas)",
       y = "Frequência") +
  theme_bw(base_size = 16,
           base_family = "Charter")

pinguins |>
  mutate(massa_log = log10(massa_corporal)) |>
  ggplot(aes(x = massa_log)) +
  geom_histogram(fill = "deepskyblue4") +
  labs(x = "Log da massa corporal",
       y = "Frequência") +
  theme_bw(base_size = 16,
           base_family = "Charter")

Tabelas de frequência

A função count() do pacote dplyr pode ser usada para contar valores (frequência) a partir de uma ou mais variáveis.

pinguins |> 
  count(especie)
# A tibble: 3 × 2
  especie                 n
  <fct>               <int>
1 Pinguim-de-adélia     152
2 Pinguim-de-barbicha    68
3 Pinguim-gentoo        124
pinguins |> 
  count(especie, ilha)
# A tibble: 5 × 3
  especie             ilha          n
  <fct>               <fct>     <int>
1 Pinguim-de-adélia   Biscoe       44
2 Pinguim-de-adélia   Dream        56
3 Pinguim-de-adélia   Torgersen    52
4 Pinguim-de-barbicha Dream        68
5 Pinguim-gentoo      Biscoe      124

Tabelas de frequência com janitor()

O pacote janitor oferece uma função tabyl() para produzir tabulações e tabulações cruzadas, que podem ser modificadas para exibir porcentagens, proporções, etc.

library(janitor)

pinguins |> 
  tabyl(especie)
             especie   n   percent
   Pinguim-de-adélia 152 0.4418605
 Pinguim-de-barbicha  68 0.1976744
      Pinguim-gentoo 124 0.3604651
pinguins |> 
  tabyl(especie, ilha)
             especie Biscoe Dream Torgersen
   Pinguim-de-adélia     44    56        52
 Pinguim-de-barbicha      0    68         0
      Pinguim-gentoo    124     0         0

Funções de enfeite do janitor

Função Desfecho
adorn_totals() Adicionar totais.
adorn_percentages() Converter contagens para proporções.
adorn_pct_formatting() Converte proporções para porcentagens.
adorn_rounding() Arredondar proporções com digits =.
adorn_ns() Adicionar contagens a uma tabela de proporções ou porcentagens.
adorn_title() Adicionar título da linha e coluna.

Exemplo de tabela cruzada

pinguins |> 
  tabyl(especie, ilha)
             especie Biscoe Dream Torgersen
   Pinguim-de-adélia     44    56        52
 Pinguim-de-barbicha      0    68         0
      Pinguim-gentoo    124     0         0
pinguins |>
  tabyl(especie, ilha) |>
  adorn_totals(where = "row") |>
  adorn_percentages(denominator = "col") |>
  adorn_pct_formatting(digits = 1)   
             especie Biscoe  Dream Torgersen
   Pinguim-de-adélia  26.2%  45.2%    100.0%
 Pinguim-de-barbicha   0.0%  54.8%      0.0%
      Pinguim-gentoo  73.8%   0.0%      0.0%
               Total 100.0% 100.0%    100.0%
pinguins |> 
  tabyl(especie, ilha) |> 
  adorn_totals(where = "row") |> 
  adorn_percentages(denominator = "col") |> 
  adorn_pct_formatting() |> 
  adorn_ns(position = "front") |> 
  adorn_title(
    row_name = "Espécie",
    col_name = "Ilha")
                             Ilha                         
             Espécie       Biscoe        Dream   Torgersen
   Pinguim-de-adélia  44  (26.2%)  56  (45.2%) 52 (100.0%)
 Pinguim-de-barbicha   0   (0.0%)  68  (54.8%)  0   (0.0%)
      Pinguim-gentoo 124  (73.8%)   0   (0.0%)  0   (0.0%)
               Total 168 (100.0%) 124 (100.0%) 52 (100.0%)
pinguins |> 
  tabyl(especie, ilha) |> 
  adorn_totals(where = "row") |> 
  adorn_percentages(denominator = "col") |> 
  adorn_pct_formatting() |> 
  adorn_ns(position = "front") |> 
  adorn_title(
    row_name = "Espécie",
    col_name = "Ilha",
    placement = "combined") |> 
  flextable::flextable() |> 
  flextable::save_as_docx(path = "tabela_especie_ilha.docx")

Tarefa de casa

  • Para a tarefa de casa, vamos seguir usando a base pinguins do pacote dados.
  1. Filtre a base para manter apenas as observações do ano de 2009.
  2. Verifique se a variável comprimento_bico da base de dados segue uma distribuição normal através de um histograma e um teste de normalidade de Shapiro-Wilk.
  3. Com a função count(), verifique a frequência da variável sexo na base de dados.
  4. Com a função summarise(), calcule a média, mediana e desvio padrão da variável comprimento_nadadeira.