Análise exploratória de dados

Nesta aula:

Uma etapa importante da análise exploratória de dados envolve visualizar dados. Isso será apresentado na próxima aula!

Importando dados

Nesta aula, utilizaremos a tabela preparada na aula anterior: "dados_output/sidra_4092_arrumado.rds".

Caso não tenha o arquivo da tabela que utilizaremos, você pode baixar aqui, e copiar o arquivo para a pasta dados_output do seu projeto.

Outra opção é executar o código abaixo:

download.file(
  url = "https://github.com/ipeadata-lab/curso_r_intro_202409/raw/refs/heads/main/dados_output/sidra_4092_arrumado.rds",
  destfile = "dados_output/sidra_4092_arrumado.rds",
  mode = "wb"
  )
1
URL que desejamos baixar
2
Caminho onde queremos baixar o arquivo (diretório + nome do arquivo + extensão do arquivo)
3
Configuração que evita corromper arquivos binários.

Vamos carregar a base de dados com a função read_rds():

library(dplyr)
dados <- readr::read_rds("dados_output/sidra_4092_arrumado.rds")
glimpse(dados)
1
Carregando o pacote dplyr
2
Importando os dados
3
Espiando a tabela
Rows: 1,350
Columns: 16
$ uf                                       <chr> "Amapá", "Bahia", "Rio Grande…
$ uf_codigo                                <fct> 16, 29, 24, 27, 13, 28, 25, 2…
$ uf_sigla                                 <chr> "AP", "BA", "RN", "AL", "AM",…
$ regiao                                   <chr> "Norte", "Nordeste", "Nordest…
$ trimestre                                <chr> "1º trimestre 2012", "1º trim…
$ trimestre_codigo                         <chr> "201201", "201201", "201201",…
$ ano                                      <dbl> 2012, 2012, 2012, 2012, 2012,…
$ trimestre_inicio                         <date> 2012-01-01, 2012-01-01, 2012…
$ mil_pessoas_total                        <dbl> 487, 10986, 2540, 2383, 2463,…
$ mil_pessoas_forca_de_trabalho            <dbl> 318, 6888, 1370, 1173, 1558, …
$ mil_pessoas_forca_de_trabalho_ocupada    <dbl> 278, 6086, 1211, 1041, 1386, …
$ mil_pessoas_forca_de_trabalho_desocupada <dbl> 40, 802, 159, 133, 173, 99, 1…
$ mil_pessoas_fora_da_forca_de_trabalho    <dbl> 170, 4098, 1170, 1210, 905, 6…
$ prop_desocupacao                         <dbl> 0.12578616, 0.11643438, 0.116…
$ perc_desocupacao                         <dbl> 12.578616, 11.643438, 11.6058…
$ periodo_pandemia                         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…

Estatísticas descritivas

Na aula conhecendo os dados, vimos algumas funções que são interessantes para ver estatísticas descritivas de todas as variáveis de uma vez, como a summary() e a skim().

Podemos utilizar também funções do R para calcular estatísticas descritivas de uma variável.

Por exemplo, para calcular a média da variável perc_desocupacao, podemos usar a função mean():

mean(dados$perc_desocupacao)
[1] 10.2724

Nesse caso, estamos fazendo a média de TODOS os valores da variável prop_desocupacao, incluindo proporções de períodos diferentes. Veremos em breve como podemos calcular a média considerando grupos (por exemplo, qual é a média em cada período?).

A seguir, temos uma lista de funções que podem ser utilizadas para calcular estatísticas descritivas de uma variável:

Função O que retorna?
min() Valor mínimo
max() Valor máximo
sum() Soma
mean() Média
weighted.mean() Média ponderada
median() Mediana
quantile() Quantil
var() Variância (simples)
sd() Desvio Padrão

Vamos calcular algumas dessas estatísticas para a variável perc_desocupacao:

min(dados$perc_desocupacao)
[1] 2.344666
max(dados$perc_desocupacao)
[1] 21.7527
mean(dados$perc_desocupacao)
[1] 10.2724
median(dados$perc_desocupacao)
[1] 9.776482
var(dados$perc_desocupacao)
[1] 14.88816
sd(dados$perc_desocupacao)
[1] 3.858517
Aviso

As variáveis que estamos trabalhando não possuem valores faltantes (NA). Caso a variável que você esteja trabalhando possua valores faltantes, é importante considerar o argumento na.rm = TRUE nas funções de estatísticas descritivas, para que os valores faltantes sejam ignorados ao realizar os cálculos.

Por exemplo:

altura_personagens_starwars <- dplyr::starwars$height
mean(altura_personagens_starwars)
1
Atribuindo a variável height (altura) da base starwars ao objeto altura_personagens_starwars.
2
Tentando calcular a média da altura dos personagens de Star Wars. O resultado será NA pois temos NA na variável altura_personagens_starwars.
[1] NA
mean(altura_personagens_starwars, na.rm = TRUE)
1
Calculando a média da altura dos personagens de Star Wars, ignorando os valores faltantes (NA).
[1] 174.6049

Estatísticas agregadas (summarise())

Uma função importante do pacote dplyr é a summarise(). Ela permite calcular estatísticas descritivas de variáveis de uma base de dados, usando as funções que vimos anteriormente. A diferença é que retornará um novo data frame com as estatísticas calculadas.

tabela_resumo_perc_desocupacao <- dados |> 
  summarise(
    minimo = min(perc_desocupacao),
    maximo = max(perc_desocupacao),
    amplitude = maximo - minimo,
  )

tabela_resumo_perc_desocupacao
# A tibble: 1 × 3
  minimo maximo amplitude
   <dbl>  <dbl>     <dbl>
1   2.34   21.8      19.4

Porém isso não é muito diferente de usar as funções do R diretamente, como fizemos anteriormente.

A grande vantagem da função summarise() é que podemos calcular estatísticas descritivas para grupos de dados, o que veremos a seguir.

Agrupando dados (group_by())

Imagine que queremos calcular a média da taxa de desemprego para cada estado. Para isso, precisaríamos agrupar a base de dados por cada estado.

A função group_by() do pacote dplyr permite agrupar dados usando uma ou mais variáveis. Ela não faz alterações nas linhas e colunas da base de dados, porém ela cria um atributo que indica que a base de dados está agrupada. Assim, as etapas seguintes que utilizarem a base de dados agrupada irão considerar os grupos criados.

Veja o exemplo a seguir: ao agrupar a base dados por uf, estamos criando grupos de dados para cada estado. Veja que o resultado é uma tibble, mas a diferença é que agora temos um grupo para cada estado (# Groups: uf [27]):

dados |> 
  group_by(uf)
# A tibble: 1,350 × 16
# Groups:   uf [27]
   uf                 uf_codigo uf_sigla regiao trimestre trimestre_codigo   ano
   <chr>              <fct>     <chr>    <chr>  <chr>     <chr>            <dbl>
 1 Amapá              16        AP       Norte  1º trime… 201201            2012
 2 Bahia              29        BA       Norde… 1º trime… 201201            2012
 3 Rio Grande do Nor… 24        RN       Norde… 1º trime… 201201            2012
 4 Alagoas            27        AL       Norde… 1º trime… 201201            2012
 5 Amazonas           13        AM       Norte  1º trime… 201201            2012
 6 Sergipe            28        SE       Norde… 1º trime… 201201            2012
 7 Paraíba            25        PB       Norde… 1º trime… 201201            2012
 8 Pernambuco         26        PE       Norde… 1º trime… 201201            2012
 9 Acre               12        AC       Norte  1º trime… 201201            2012
10 Distrito Federal   53        DF       Centr… 1º trime… 201201            2012
# ℹ 1,340 more rows
# ℹ 9 more variables: trimestre_inicio <date>, mil_pessoas_total <dbl>,
#   mil_pessoas_forca_de_trabalho <dbl>,
#   mil_pessoas_forca_de_trabalho_ocupada <dbl>,
#   mil_pessoas_forca_de_trabalho_desocupada <dbl>,
#   mil_pessoas_fora_da_forca_de_trabalho <dbl>, prop_desocupacao <dbl>,
#   perc_desocupacao <dbl>, periodo_pandemia <dbl>

Podemos agrupar também usando mais que uma variável. Neste exemplo, vamos agrupar por uf e ano: uf, ano [351]. Isso significa que temos um grupo para cada combinação de estado (27) e ano (13), totalizando 351 grupos.

dados |> 
  group_by(uf, ano)
# A tibble: 1,350 × 16
# Groups:   uf, ano [351]
   uf                 uf_codigo uf_sigla regiao trimestre trimestre_codigo   ano
   <chr>              <fct>     <chr>    <chr>  <chr>     <chr>            <dbl>
 1 Amapá              16        AP       Norte  1º trime… 201201            2012
 2 Bahia              29        BA       Norde… 1º trime… 201201            2012
 3 Rio Grande do Nor… 24        RN       Norde… 1º trime… 201201            2012
 4 Alagoas            27        AL       Norde… 1º trime… 201201            2012
 5 Amazonas           13        AM       Norte  1º trime… 201201            2012
 6 Sergipe            28        SE       Norde… 1º trime… 201201            2012
 7 Paraíba            25        PB       Norde… 1º trime… 201201            2012
 8 Pernambuco         26        PE       Norde… 1º trime… 201201            2012
 9 Acre               12        AC       Norte  1º trime… 201201            2012
10 Distrito Federal   53        DF       Centr… 1º trime… 201201            2012
# ℹ 1,340 more rows
# ℹ 9 more variables: trimestre_inicio <date>, mil_pessoas_total <dbl>,
#   mil_pessoas_forca_de_trabalho <dbl>,
#   mil_pessoas_forca_de_trabalho_ocupada <dbl>,
#   mil_pessoas_forca_de_trabalho_desocupada <dbl>,
#   mil_pessoas_fora_da_forca_de_trabalho <dbl>, prop_desocupacao <dbl>,
#   perc_desocupacao <dbl>, periodo_pandemia <dbl>

Podemos usar função ungroup() para remover os grupos criados. Porém as funções que utilizaremos muitas vezes já remove os grupos. Veremos exemplos a seguir.

Estatísticas agregadas utilizando grupos (group_by() + summarise())

Agora que sabemos como agrupar dados, podemos calcular estatísticas descritivas para cada grupo.

Exemplo com um grupo

dados |> 
  group_by(uf) |>
  summarise(
    minimo = min(perc_desocupacao),
    media = mean(perc_desocupacao),
    mediana = median(perc_desocupacao),
    maximo = max(perc_desocupacao),
    amplitude = maximo - minimo
  )
# A tibble: 27 × 6
   uf               minimo media mediana maximo amplitude
   <chr>             <dbl> <dbl>   <dbl>  <dbl>     <dbl>
 1 Acre               6.18 11.4    11.1    18.2     12.0 
 2 Alagoas            8.15 13.5    12.6    20.4     12.3 
 3 Amapá              8.88 14.4    14.4    21.7     12.9 
 4 Amazonas           6.82 12.0    12.0    18.0     11.2 
 5 Bahia              9.10 15.0    15.3    21.7     12.6 
 6 Ceará              6.65 10.3    10.3    15.1      8.46
 7 Distrito Federal   8.49 11.5    11.4    15.7      7.19
 8 Espírito Santo     4.50  9.39    9.24   14.7     10.2 
 9 Goiás              3.95  8.39    8.05   13.9      9.91
10 Maranhão           5.59 11.4    10.9    17.5     11.9 
# ℹ 17 more rows

Importante: A função summarise() retorna um novo data frame com as colunas utilizadas para agrupar os dados e as estatísticas calculadas.

Exemplo com mais de um grupo

Podemos utilizar mais que uma variável para agrupar. No exemplo a seguir, vamos agrupar por uf e ano:

dados |> 
  group_by(uf, ano) |>
  summarise(
    media = mean(perc_desocupacao)
  )
`summarise()` has grouped output by 'uf'. You can override using the `.groups`
argument.
# A tibble: 351 × 3
# Groups:   uf [27]
   uf      ano media
   <chr> <dbl> <dbl>
 1 Acre   2012  8.55
 2 Acre   2013  9.06
 3 Acre   2014  7.82
 4 Acre   2015  8.68
 5 Acre   2016 11.0 
 6 Acre   2017 14.3 
 7 Acre   2018 13.8 
 8 Acre   2019 14.7 
 9 Acre   2020 15.4 
10 Acre   2021 15.4 
# ℹ 341 more rows

A função retornou o seguinte warning:

`summarise()` has grouped output by 'uf'. You can override using the `.groups` argument.

Isso significa que a função summarise() retornou um data frame agrupado por uf. Se quisermos remover o agrupamento, podemos usar o argumento .groups = "drop":

dados |> 
  group_by(uf, ano) |>
  summarise(
    media = mean(perc_desocupacao),
    .groups = "drop"
  )
1
O argumento .groups = "drop" retorna uma tibble sem grupos.
# A tibble: 351 × 3
   uf      ano media
   <chr> <dbl> <dbl>
 1 Acre   2012  8.55
 2 Acre   2013  9.06
 3 Acre   2014  7.82
 4 Acre   2015  8.68
 5 Acre   2016 11.0 
 6 Acre   2017 14.3 
 7 Acre   2018 13.8 
 8 Acre   2019 14.7 
 9 Acre   2020 15.4 
10 Acre   2021 15.4 
# ℹ 341 more rows

Outra opção é usar a função ungroup():

dados |> 
  group_by(uf, ano) |>
  summarise(
    media = mean(perc_desocupacao)
  ) |> 
  ungroup()
`summarise()` has grouped output by 'uf'. You can override using the `.groups`
argument.
# A tibble: 351 × 3
   uf      ano media
   <chr> <dbl> <dbl>
 1 Acre   2012  8.55
 2 Acre   2013  9.06
 3 Acre   2014  7.82
 4 Acre   2015  8.68
 5 Acre   2016 11.0 
 6 Acre   2017 14.3 
 7 Acre   2018 13.8 
 8 Acre   2019 14.7 
 9 Acre   2020 15.4 
10 Acre   2021 15.4 
# ℹ 341 more rows

Filtros com grupos (group_by() + filter())

Podemos combinar a função group_by() com a função filter() para realizar filtros que respeitem o agrupamento dos dados.

Por exemplo, queremos responder a pergunta: Qual foi período (trimestre) para cada estado onde a taxa de desocupação foi maior?

Para isso, primeiro precisamos agrupar com o estado. A primeira coisa que vem em mente é utilizar a função summarise() e buscar o valor máximo:

dados |> 
  group_by(uf) |> 
  summarise(maximo = max(perc_desocupacao))
# A tibble: 27 × 2
   uf               maximo
   <chr>             <dbl>
 1 Acre               18.2
 2 Alagoas            20.4
 3 Amapá              21.7
 4 Amazonas           18.0
 5 Bahia              21.7
 6 Ceará              15.1
 7 Distrito Federal   15.7
 8 Espírito Santo     14.7
 9 Goiás              13.9
10 Maranhão           17.5
# ℹ 17 more rows

Porém como o summarise() apenas retorna as colunas de grupo e as colunas criadas, não temos a informação do trimestre.

Para isso, podemos utilizar a função filter() para filtrar os dados por estado, filtrando a linha que apresenta o maior valor encontrado (max(perc_desocupacao)) na coluna perc_desocupacao:

dados |>
  group_by(uf) |>
  filter(perc_desocupacao == max(perc_desocupacao)) |>
  arrange(desc(perc_desocupacao)) |>
  select(uf, trimestre, perc_desocupacao)
1
Agrupando por estado (uf).
2
Filtrando as linhas que apresentam o maior valor encontrado na coluna perc_desocupacao.
3
Ordenando os dados de forma decrescente, segundo o perc_desocupacao.
4
Selecionando apenas as colunas relevantes para a pergunta.
# A tibble: 27 × 3
# Groups:   uf [27]
   uf                  trimestre         perc_desocupacao
   <chr>               <chr>                        <dbl>
 1 Pernambuco          2º trimestre 2021             21.8
 2 Amapá               2º trimestre 2018             21.7
 3 Bahia               1º trimestre 2021             21.7
 4 Sergipe             3º trimestre 2020             20.8
 5 Alagoas             4º trimestre 2020             20.4
 6 Rio de Janeiro      1º trimestre 2021             19.6
 7 Roraima             3º trimestre 2020             19.1
 8 Acre                1º trimestre 2019             18.2
 9 Amazonas            1º trimestre 2017             18.0
10 Rio Grande do Norte 3º trimestre 2020             17.9
# ℹ 17 more rows

Criando colunas utilizando grupos (group_by() + mutate())

Podemos criar novas colunas utilizando a função mutate().

Podemos utilizar essa pergunta como exemplo: - Qual é a média da taxa de desocupação para cada trimestre?

Podemos fazer calcular a média com a função summarise():

dados |>
  group_by(trimestre) |>
  summarise(
    media_ponderada = weighted.mean(perc_desocupacao, mil_pessoas_total)
  ) 
1
Calculando a média ponderada da taxa de desocupação, considerando a coluna mil_pessoas_total como peso.
# A tibble: 50 × 2
   trimestre         media_ponderada
   <chr>                       <dbl>
 1 1º trimestre 2012            8.05
 2 1º trimestre 2013            8.15
 3 1º trimestre 2014            7.29
 4 1º trimestre 2015            8.07
 5 1º trimestre 2016           11.1 
 6 1º trimestre 2017           14.0 
 7 1º trimestre 2018           13.4 
 8 1º trimestre 2019           13.0 
 9 1º trimestre 2020           12.5 
10 1º trimestre 2021           15.1 
# ℹ 40 more rows

A média foi calculada, porém o resultado é apenas uma tabela contendo o trimestre (a coluna de agrupamento), e a média (a coluna criada dentro do summarise()). Porém, se quisermos ter essa média como uma coluna da tabela, podemos fazer esse cálculo utilizando o mutate()

dados_media_trimestre <- dados |>
  group_by(trimestre) |>
  mutate(
    media_ponderada = weighted.mean(perc_desocupacao, mil_pessoas_total)
  ) 
1
Criando uma nova coluna com mutate()
2
Calculando a média ponderada da taxa de desocupação, considerando a coluna mil_pessoas_total como peso.

Tabelas de frequência

Utilizamos tabelas de frequência para representar a quantidade de ocorrências de linhas segundo um grupo de variáveis.

A função count() do pacote dplyr é uma forma simples de criar tabelas de frequência.

Por exemplo: Se queremos saber quantos estados temos em cada região, podemos filtrar para apenas um período (para que não haja duplicações), e contar a quantidade de linhas em cada categoria da coluna regiao, usando a função count():

dados_tri_recente <- dados |> 
  dplyr::filter(trimestre_codigo == "202402")
1
Filtrando o trimestre mais recente
dados_tri_recente |>
  count(regiao)
1
Usando dados filtrados para o trimestre mais recente
2
Contando a quantidade de linhas para cada região (nesse caso, quantos estados tem por região).
# A tibble: 5 × 2
  regiao           n
  <chr>        <int>
1 Centro Oeste     4
2 Nordeste         9
3 Norte            7
4 Sudeste          4
5 Sul              3

Outras funções que podem ser utilizadas para criar tabelas de frequência são: table() (do R base) e tabyl() (do pacote janitor).

A função table() retorna uma tabela de frequência em formato largo. Nesse caso, o argumento é um vetor:

table(dados_tri_recente$regiao)

Centro Oeste     Nordeste        Norte      Sudeste          Sul 
           4            9            7            4            3 

A função janitor::tabyl() gera uma tabela de frequência com o percentual de cada categoria. Nele, o argumento é um data frame, e passamos a variável que queremos contar (podemos informar mais que uma variável):

janitor::tabyl(dados_tri_recente, regiao)
       regiao n   percent
 Centro Oeste 4 0.1481481
     Nordeste 9 0.3333333
        Norte 7 0.2592593
      Sudeste 4 0.1481481
          Sul 3 0.1111111

Exercícios sugeridos

  1. Calcule a média da taxa de desocupação nos dois primeiros trimestres de 2024, por região.

O resultado esperado é:

# A tibble: 5 × 2
  regiao       media
  <chr>        <dbl>
1 Centro Oeste  5.80
2 Nordeste      9.60
3 Norte         7.24
4 Sudeste       6.96
5 Sul           4.66
  1. Qual foi o período (trimestre) para cada estado onde a taxa de desocupação foi menor? Ordene o resultado de forma crescente.

Lembre-se de que podemos fazer filtros agrupados!

O resultado esperado é:

# A tibble: 27 × 3
   uf                 trimestre         perc_desocupacao
   <chr>              <chr>                        <dbl>
 1 Rondônia           3º trimestre 2023             2.34
 2 Mato Grosso        3º trimestre 2023             2.42
 3 Santa Catarina     4º trimestre 2013             2.57
 4 Mato Grosso do Sul 4º trimestre 2022             3.35
 5 Paraná             4º trimestre 2014             3.75
 6 Goiás              4º trimestre 2013             3.95
 7 Tocantins          2º trimestre 2024             4.31
 8 Rio Grande do Sul  4º trimestre 2012             4.39
 9 Roraima            4º trimestre 2022             4.49
10 Espírito Santo     2º trimestre 2024             4.50
# ℹ 17 more rows
  1. Qual foi a mediana da taxa de desocupação para cada estado, durante o período da pandemia? Ordene o resultado de forma decrescente.

O resultado esperado é:

# A tibble: 27 × 2
   uf                  mediana
   <chr>                 <dbl>
 1 Bahia                  20.2
 2 Pernambuco             19.3
 3 Sergipe                18.3
 4 Alagoas                18.3
 5 Rio de Janeiro         16.8
 6 Maranhão               16.3
 7 Amapá                  15.9
 8 Amazonas               15.7
 9 Rio Grande do Norte    15.5
10 Acre                   14.9
# ℹ 17 more rows

Sugestões de materiais