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".

Importante

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
median() Mediana
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),
    media = mean(perc_desocupacao),
    mediana = median(perc_desocupacao),
    variancia = var(perc_desocupacao),
    desvio_padrao = sd(perc_desocupacao)
  )

tabela_resumo_perc_desocupacao
# A tibble: 1 × 6
  minimo maximo media mediana variancia desvio_padrao
   <dbl>  <dbl> <dbl>   <dbl>     <dbl>         <dbl>
1   2.34   21.8  10.3    9.78      14.9          3.86

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 = mean(perc_desocupacao)) 
# A tibble: 50 × 2
   trimestre         media
   <chr>             <dbl>
 1 1º trimestre 2012  8.52
 2 1º trimestre 2013  8.65
 3 1º trimestre 2014  7.54
 4 1º trimestre 2015  8.21
 5 1º trimestre 2016 10.7 
 6 1º trimestre 2017 13.8 
 7 1º trimestre 2018 13.2 
 8 1º trimestre 2019 13.2 
 9 1º trimestre 2020 12.8 
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_desocupacao_trimestre = mean(perc_desocupacao)) 

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 |> 
  filter(trimestre_codigo == "202402") |>
  count(regiao)
1
Filtrando 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

Exercícios sugeridos

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

  2. Qual foi o período (trimestre) para cada estado onde a taxa de desocupação foi menor?

  3. Qual foi a mediana da taxa de desocupação para cada estado, durante o período da pandemia?

Sugestões de materiais