Introdução ao R

Autor

Beatriz Milz

Data de Publicação

22 de outubro de 2024

Objetivos

  • Explorar os dados sobre os mananciais utilizados para abastecimento público na Região Metropolitana de São Paulo.

Fonte dos dados:

Carregando os pacotes necessários

library(tidyverse)
library(knitr)
library(DT)
1
Carregando o pacote tidyverse, uma coleção de pacotes que facilitam a manipulação e visualização de dados.
2
Carregando os pacotes knitr e DT, para apresentar os resultados de forma mais amigável no arquivo final.

Carregando os dados

dados_brutos <- read_csv2("https://github.com/beatrizmilz/mananciais/raw/master/inst/extdata/mananciais.csv")
1
Importando a tabela disponível neste link, usando a função read_csv2(). Essa função importa arquivos .CSV (comma separated values), utilizando o ponto e vírgula (;) como separador. O sinal <- se chama atribuição, e é usado para armazenar o resultado da função read_csv2() na variável dados_brutos
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 56786 Columns: 8
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
chr  (1): sistema
dbl  (6): volume_porcentagem, volume_variacao, volume_operacional, pluviomet...
date (1): data

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Conhecendo a base de dados

  • O que cada linha significa?
  • Quais são as variáveis presentes na base de dados?
  • Qual é o tipo de cada variável? É o esperado?
  • Tem alguma variável que seria interessante gerar a partir das informações presentes na base de dados?
glimpse(dados_brutos)
1
A função glimpse() é usada para visualizar um resumo da estrutura do conjunto de dados. Ela mostra o número de observações e variáveis, além de listar as variáveis presentes e seus tipos.
Rows: 56,786
Columns: 8
$ data                <date> 2024-10-16, 2024-10-16, 2024-10-16, 2024-10-16, 2…
$ sistema             <chr> "Cantareira", "Alto Tietê", "Guarapiranga", "Cotia…
$ volume_porcentagem  <dbl> 47.5, 43.2, 36.5, 34.7, 61.4, 24.4, 44.3, 47.7, 43…
$ volume_variacao     <dbl> -0.2, -0.2, -0.2, -0.3, -0.3, -0.2, -0.4, -0.3, -0…
$ volume_operacional  <dbl> 466.27737, 241.82664, 62.47359, 5.71873, 68.92470,…
$ pluviometria_dia    <dbl> 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, …
$ pluviometria_mensal <dbl> 51.7, 24.6, 20.2, 25.6, 24.4, 40.2, 30.6, 51.7, 24…
$ pluviometria_hist   <dbl> 130.3, 109.3, 114.7, 120.4, 133.1, 174.8, 144.0, 1…

Criando uma nova coluna

dados <- dados_brutos |>
  mutate(ano = year(data))

glimpse(dados)
1
O operador |> é usado para encadear funções, passando o resultado da função anterior como argumento para a próxima função.
2
A função mutate() é usada para criar uma nova coluna chamada ano, que armazena o ano da variável data. A função year() é usada para extrair o ano da variável data.
Rows: 56,786
Columns: 9
$ data                <date> 2024-10-16, 2024-10-16, 2024-10-16, 2024-10-16, 2…
$ sistema             <chr> "Cantareira", "Alto Tietê", "Guarapiranga", "Cotia…
$ volume_porcentagem  <dbl> 47.5, 43.2, 36.5, 34.7, 61.4, 24.4, 44.3, 47.7, 43…
$ volume_variacao     <dbl> -0.2, -0.2, -0.2, -0.3, -0.3, -0.2, -0.4, -0.3, -0…
$ volume_operacional  <dbl> 466.27737, 241.82664, 62.47359, 5.71873, 68.92470,…
$ pluviometria_dia    <dbl> 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, …
$ pluviometria_mensal <dbl> 51.7, 24.6, 20.2, 25.6, 24.4, 40.2, 30.6, 51.7, 24…
$ pluviometria_hist   <dbl> 130.3, 109.3, 114.7, 120.4, 133.1, 174.8, 144.0, 1…
$ ano                 <dbl> 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 20…

Análise exploratória

Quais são os sistemas presentes na base Mananciais?

dados |> 
  distinct(sistema)
1
A função distinct() é usada para retornar apenas os valores únicos de uma variável (ou conjunto de variáveis).
# A tibble: 7 × 1
  sistema     
  <chr>       
1 Cantareira  
2 Alto Tietê  
3 Guarapiranga
4 Cotia       
5 Rio Grande  
6 Rio Claro   
7 São Lourenço

Qual é o período disponível na base de dados?

min(dados$data)
max(dados$data)
1
A função min() é usada para retornar o valor mínimo de uma variável.
2
A função max() é usada para retornar o valor máximo de uma variável.
[1] "2000-01-01"
[1] "2024-10-16"

Qual é o sistema com o menor volume armazenado atualmente?

dados |> 
  filter(data == max(data)) |>
  arrange(volume_porcentagem)
1
A função filter() é usada para filtrar apenas as linhas que atendem a uma condição específica. Nesse caso, estamos filtrando apenas os dados da data mais recente.
2
A função arrange() é usada para ordenar as linhas de acordo com uma variável específica. Nesse caso, estamos ordenando as linhas de acordo com o volume armazenado, de forma crescente.
# A tibble: 7 × 9
  data       sistema      volume_porcentagem volume_variacao volume_operacional
  <date>     <chr>                     <dbl>           <dbl>              <dbl>
1 2024-10-16 Rio Claro                  24.4            -0.2               3.34
2 2024-10-16 Cotia                      34.7            -0.3               5.72
3 2024-10-16 Guarapiranga               36.5            -0.2              62.5 
4 2024-10-16 Alto Tietê                 43.2            -0.2             242.  
5 2024-10-16 São Lourenço               44.3            -0.4              39.3 
6 2024-10-16 Cantareira                 47.5            -0.2             466.  
7 2024-10-16 Rio Grande                 61.4            -0.3              68.9 
# ℹ 4 more variables: pluviometria_dia <dbl>, pluviometria_mensal <dbl>,
#   pluviometria_hist <dbl>, ano <dbl>

Considerando a série histórica, qual é o volume operacional máximo para cada sistema?

dados |> 
  group_by(sistema) |>
  filter(volume_operacional == max(volume_operacional)) |>
  ungroup() |>
  arrange(desc(volume_operacional))
1
A função group_by() é usada para agrupar os dados de acordo com uma variável específica. Estamos agrupando a base de dados por sistema, e as próximas funções serão aplicadas a cada grupo separadamente.
2
A função filter() é usada para filtrar apenas as linhas que atendem a uma condição específica. Nesse caso, estamos filtrando apenas os dados com o volume operacional máximo, para cada sistema (pois a base de dados está agrupada).
3
A função ungroup() é usada para remover a informação de agrupamento dos dados.
4
A função arrange() é usada para ordenar as linhas de acordo com uma variável específica. Nesse caso, estamos ordenando as linhas de acordo com o volume operacional, de forma decrescente (devido à função desc()).
# A tibble: 7 × 9
  data       sistema      volume_porcentagem volume_variacao volume_operacional
  <date>     <chr>                     <dbl>           <dbl>              <dbl>
1 2010-04-08 Cantareira                100.              0.3              987. 
2 2019-06-07 Alto Tietê                 98.1             0                550. 
3 2009-10-21 Guarapiranga               96.6             0.2              165. 
4 2019-03-12 Rio Grande                108.              2.3              122. 
5 2020-03-04 São Lourenço              102.              2.2               90.6
6 2010-01-22 Cotia                     110.              0.9               18.2
7 2009-10-09 Rio Claro                 108               5.2               14.8
# ℹ 4 more variables: pluviometria_dia <dbl>, pluviometria_mensal <dbl>,
#   pluviometria_hist <dbl>, ano <dbl>

Como o volume do sistema Cantareira variou ao longo do tempo?

dados |> 
  filter(sistema == "Cantareira") |>
  ggplot() +
  aes(x = data, y = volume_porcentagem) +
  geom_line() +
  labs(x = "Ano",
       y = "Volume (%)") +
  theme_minimal()
1
A função filter() é usada para filtrar apenas as linhas que atendem a uma condição específica. Nesse caso, estamos filtrando apenas os dados do sistema Cantareira.
2
A função ggplot() é usada para iniciar a criação de um gráfico.
3
A função aes() é usada para mapear variáveis estéticas (como cor, forma e tamanho) aos dados. Nesse caso, estamos mapeando a variável data ao eixo x e a variável volume_porcentagem ao eixo y.
4
A função geom_line() é usada para adicionar uma camada de linhas ao gráfico.
5
A função labs() é usada para adicionar rótulos aos eixos x e y.
6
A função theme_minimal() é usada para aplicar um tema minimalista ao gráfico.

Como o volume de todos os sistemas variou ao longo do tempo?

dados |> 
  ggplot() +
  aes(x = data, y = volume_porcentagem) +
  geom_line() +
  labs(x = "Ano",
       y = "Volume (%)") +
  theme_minimal() +
  facet_wrap(~sistema)
1
A função ggplot() é usada para iniciar a criação de um gráfico.
2
A função aes() é usada para mapear variáveis estéticas (como cor, forma e tamanho) aos dados. Nesse caso, estamos mapeando a variável data ao eixo x e a variável volume_porcentagem ao eixo y.
3
A função geom_line() é usada para adicionar uma camada de linhas ao gráfico.
4
A função labs() é usada para adicionar rótulos aos eixos x e y.
5
A função theme_minimal() é usada para aplicar um tema minimalista ao gráfico.
6
A função facet_wrap() é usada para criar um gráfico separado para cada categoria da variável sistema.

Exercício

Adapte o código abaixo para criar um gráfico para o sistema Alto Tietê:

dados |> 
  filter(sistema == "Cantareira") |> 
  ggplot() +
  geom_line(aes(x = data, y = volume_porcentagem)) +
  theme_minimal() +
  labs(x = "Ano", y = "Volume (%)")

Cantareira segundo as faixas de operação

  • Faixa 1 – Normal: volume útil acumulado igual ou maior que 60% e limite de retirada de 33,0 m³/s;
  • Faixa 2 – Atenção: volume útil acumulado igual ou maior que 40% e menor que 60% e limite de retirada de 31,0 m³/s;
  • Faixa 3 – Alerta: volume útil acumulado igual ou maior que 30% e menor que 40% e limite de retirada de 27,0 m³/s;
  • Faixa 4 – Restrição: volume útil acumulado igual ou maior que 20% e menor que 30% e limite de retirada de 23,0 m³/s;
  • Faixa 5 – Especial: volume acumulado inferior a 20% do volume útil e limite de retirada de 15,5 m³/s.
dados_cantareira <- dados |>
  filter(sistema == "Cantareira") |>
  mutate(faixa_operacao = case_when(
    volume_porcentagem >= 60 ~ "Faixa 1 - Normal",
    volume_porcentagem >= 40 & volume_porcentagem < 60 ~ "Faixa 2 - Atenção",
    volume_porcentagem >= 30 & volume_porcentagem < 40 ~ "Faixa 3 - Alerta",
    volume_porcentagem >= 20 & volume_porcentagem < 30 ~ "Faixa 4 - Restrição",
    volume_porcentagem < 20 ~ "Faixa 5 - Especial"
  ))
1
Vamos salvar o resultado deste bloco de código na variável dados_cantareira.
2
A função filter() é usada para filtrar apenas as linhas que atendem a uma condição específica. Nesse caso, estamos filtrando apenas os dados do sistema Cantareira.
3
A função mutate() é usada para criar uma nova coluna. Estamos criando uma coluna chamada faixa_operacao, que classifica o volume do reservatório de acordo com as faixas de operação definidas. A função case_when() é usada para definir as condições para cada categoria.
dados_cantareira |> 
  ggplot() +
  aes(x = data, y = volume_porcentagem, color = faixa_operacao) +
  geom_line(aes(group = "none"), linewidth = 1) +
  labs(x = "Ano",
       y = "Volume (%)",
       color = "Faixa de operação") +
  theme_minimal() +
  scale_color_manual(values = c("#7BFF00","#B9BC3D","#D89B5B","#F77979", "red"))
1
A função ggplot() é usada para iniciar a criação de um gráfico.
2
A função aes() é usada para mapear variáveis estéticas (como cor, forma e tamanho) aos dados. Nesse caso, estamos mapeando a variável data ao eixo x, a variável volume_porcentagem ao eixo y e a variável faixa_operacao à cor.
3
A função geom_line() é usada para adicionar uma camada de linhas ao gráfico. A estética group = "none" é usada para garantir que cada linha seja desenhada separadamente. O argumento linewidth = 1 é usado para definir a largura da linha.
4
A função labs() é usada para adicionar rótulos aos eixos x e y, e à legenda de cores.
5
A função theme_minimal() é usada para aplicar um tema minimalista ao gráfico.
6
A função scale_color_manual() é usada para definir as cores usadas na legenda. Estamos definindo manualmente as cores para cada faixa de operação.

Exercício

O que o resultado a seguir significa?

dados_cantareira |> 
  count(faixa_operacao)
# A tibble: 5 × 2
  faixa_operacao          n
  <chr>               <int>
1 Faixa 1 - Normal     2644
2 Faixa 2 - Atenção    3248
3 Faixa 3 - Alerta     1423
4 Faixa 4 - Restrição   610
5 Faixa 5 - Especial   1131

Criando uma tabela de resumo

  • Porcentagem do volume do reservatório: calculando os valores mínimo, máximo, média, variância, desvio padrão.
dados |> 
  summarise(
    min = min(volume_porcentagem),
    max = max(volume_porcentagem),
    media = mean(volume_porcentagem),
    variancia = var(volume_porcentagem),
    desvio_padrao = sd(volume_porcentagem)
            ) |>
  kable()
1
A função summarise() é usada para resumir os dados de acordo com uma ou mais funções.
2
A função min() é usada para calcular o valor mínimo da variável volume_porcentagem.
3
A função max() é usada para calcular o valor máximo da variável volume_porcentagem.
4
A função mean() é usada para calcular a média da variável volume_porcentagem.
5
A função var() é usada para calcular a variância da variável volume_porcentagem.
6
A função sd() é usada para calcular o desvio padrão da variável volume_porcentagem.
min max media variancia desvio_padrao
-24.3 110.5 66.81573 639.2168 25.28274
  • E para todas as combinações de Sistema e Ano?
tabela_resumo <- dados |>
  group_by(sistema, ano) |>
  summarise(
    min = min(volume_porcentagem), 
    max = max(volume_porcentagem), 
    media = mean(volume_porcentagem), 
    variancia = var(volume_porcentagem), 
    desvio_padrao = sd(volume_porcentagem) 
            ) 
2
A função summarise() é usada para resumir os dados de acordo com uma ou mais funções. Estamos fazendo as mesmas sumarizações que no exemplo anterior, mas agora para cada combinação de sistema e ano.
`summarise()` has grouped output by 'sistema'. You can override using the
`.groups` argument.
tabela_resumo |>
  DT::datatable()

Exportando o arquivo final

Podemos exportar a tabela de resumo para um arquivo .csv ou .xlsx:

write_csv2(
  tabela_resumo,
  "tabela_resumo_mananciais.csv"
  )

writexl::write_xlsx(
  tabela_resumo, 
  "tabela_resumo_mananciais.xlsx"
  )
1
A função write_csv2() é usada para exportar a tabela de resumo para um arquivo .csv, utilizando o ponto e vírgula (;) como separador. O arquivo será salvo com o nome tabela_resumo_mananciais.csv.
2
A função write_xlsx() é usada para exportar a tabela de resumo para um arquivo .xlsx, que pode ser aberto no Excel.

Exercício

Adapte o código a seguir para criar uma tabela de resumo para a variável de Volume Operacional:

dados |> 
  group_by(ano, sistema) |> 
  summarise(min = min(volume_porcentagem),
            max = max(volume_porcentagem),
            media = round(mean(volume_porcentagem), 1),
            variancia = round(var(volume_porcentagem), 1), 
            desvio_padrao = round(sd(volume_porcentagem), 1)) |> 
  DT::datatable()

Materiais para estudo