• Aluno: Luiz Francisco de França Neto
  • Matrícula: 201910354411
  • Materia Geração de Energia Elétrica
  • Turma: 1
  • Professor: Antonio Guilherme
  • Departamento: Engenharia Elétrica - Ênfase em Sistemas de Potência

1 Introdução

Hidrelétrica de Sobradinho
Hidrelétrica de Sobradinho

1.1 Informações básicas

As informações referente a Hidreletrica de Sobradinho neste capitulo encontram-se em Wikipedia (2024) e Companhia Hidro Elétrica do São Francisco (CHESF) (2024). A Usina Hidrelétrica de Sobradinho, localizada no rio São Francisco, mais especificamente na Bahia, é uma das maiores do Brasil em capacidade de armazenamento de água. Concluída em 1979 e operada pela Companhia Hidro Elétrica do São Francisco (CHESF), a usina é estratégica para o sistema elétrico brasileiro. Seu lago, com 4.214 km² de área e capacidade de 34,1 bilhões de metros cúbicos em sua cota nominal.

A usina possui uma potência instalada de 1.050 MW, com seis unidades geradoras acionadas por turbinas Kaplan de 175.050 kW cada. Abaixo, seguem os principais dados da usina e do reservatorio, retirados do próprio site da chesf em Companhia Hidro Elétrica do São Francisco (CHESF) (2024).

Usina:

Proprietário | CHESF |
Início das Obras | 06/73 |
Início da Operação | 11/79 |
Rio | São Francisco |
Longitude | 40° 50’ Oeste |
Latitude | 9° 35’ Sul |
Distância da Foz | 747,80 km |
Município/Estado | Sobradinho - BA |
Tipo de Construção | Externa |
Potência Instalada | 1.050.300 kW (6 UGs) |
Comprimento da Casa de Força | 250,00 m |
Altura da Casa de Força | 32,00 m |
Largura da Casa de Força | 27,00 m |

.

Reservatório:

Área do reservatório na cota 392,50 m | 4.214 km² |
Volume total do reservatório | 34.116 Hm³ |
Volume útil do reservatório | 28.669 Hm³ |
Vazão regularizada | 2.060 m³/s |
Nível máximo maximumorum | 393,50 m |
Nível máximo operativo normal | 392,50 m |
Nível mínimo operativo normal | 380,50 m |

1.2 Objetivo do trabalho:

O objetivo do trabalho é analisar diversos dados da hidreletrica de sobradinho. Dentre eles: Vazão afluente diária, Vazão vertida diária, Vazão defluente diária, Nível de Montante diário, geração de Energia horária (24 horas), Volume útil diário, Energia Natural Afluente Bruta do subsistema(Nordeste), Energia Armazenada diária no subsistema (Nordeste). Além desta analise, também foram estudas no presente relatório curvas caracteristicas como por exemplo a curva cota x volume. Esses dados foram obtidos por meio de planilhas de excel e tratados em R para análise e apresentação. Essas informações podem ser encontradas nas referências Operador Nacional do Sistema Elétrico (ONS) (2024b) e Operador Nacional do Sistema Elétrico (ONS) (2024a). Ambas do ONS (Operador Nacional do Sistema Elétrico).

2 Introdução téorica:

A teoria básica de estatistica, foi retirada de uma apostila aberta, no qual o seu endereço pode ser encontrada em Matemática e Estatística - UFRGS (2024) e Guilherme (2024).

2.1 Mediana, média e quartis:

A média, é talvez o principal conceito da estatistica e também o mais popular, em que relaciona os valores de um grupo de dados com o número total de dados, como demontra a equação (1).

\[ \bar{x} = \frac{1}{n} \sum_{i=1}^n x_i \tag{1} \] Onde n é o número de dados e \(x_{i}\) são os valores dos dados, obviamente válidos para casos de amostras totalmente númericas. Um dos maiores problemas da média é que não é possível notar como os dados são dispersos, por exemplo numa média escolar (caso em que não há pesos por matéria) é esperado que um aluno média 9 tenha grande desempenho em todas as matérias. Porém, esse aluno pode ser muito mal em geografia mas caso haja um grande número de matérias seu alto desempenho nas demais, esta deficiência pode ser mascarada pela média, não ajudando assim o aluno, professores e responsáveis a observar essa dificuldade.

O conceito de mediana é o de dividir os dados ao meio, ou seja, separar em dois grupos por meio de um valor central. Caso o número de dados, \(n\) seja ímpar, a posição da mediana é dada pela equação (2).

\[ {p} = \frac{n+1}{2} \tag{2} \] Sendo \(p\) a posição do valor em que se encotra a mediana. Por exemplo, numa amostra de 3 valores, o p é igual a dois e significa que o segundo valor na ordem crescente, ou descrecente já que é um valor central, é a mediana. Enquanto para valores pares a mediana é dada pela média dos dois valores centrais \(p_{1}\) e \(p_{2}\), como mostrado na equação (3).

\[ {M_d} = \frac{p_{1}+p_{2}}{2} \tag{3} \] Onde \(M_d\) é a o próprio valor da mediana.

A mediana assim como a média não apresenta como os dados são dispersos, a mesma somente divide os dados por meio de um valor central que muitas vezes podem “mascarar” dados com um comportamento incomum que precisam ser analisados.

Os quartis (medidas separatrizes) que delimitam proporções por meio de valores.:

-Primeiro Quartil (Q1): 25% dos valores são iguais ou menores que Q1.

-Segundo Quartil (Q2): 50% dos valores são iguais ou menores que Q2, que também corresponde a mediana.

-Terceiro Quartil(Q3): 75% dos valores são iguais ou menores que Q3.

Os quartis podem ser úteis para analisar caso se tenha interesse em como está divididos a grande parte dos valores, por exemplo, analisar o intervalo de Q1 a Q3 permite uma analise de como metade dos valores estão distantes ou próximos entre sí, porém, assim no caso da média e da mediana não é possível perceber valores nas extremidades.

2.2 Boxplot

Também chamado de gráfico de caixa, o boxplot é uma forma de demonstrar como os dados são dispersos usando conceitos previamente discutidos na seção 2.1. O boxplot, monta a partir dos dados de primeiro quartil, mediana e terceiro quartil um gráfico no modelo caixa, como mostrado na figura abaixo retirado da referência Matemática e Estatística - UFRGS (2024).

Boxplot
Boxplot

Onde termo \(IQR\) é igual a diferença entre \(Q_3\) e \(Q_1\). É comum em base de dados aparecerem os conhecidos outliers, que são pontos fora dos intervalos destacados. Estes pontos normalmente indicam condições extremas e anormais, mas também podem ser resultados de uma amostra pequena que não abrange uma quantidade de dados necessários. Exemplificando, quando vai se medir a temperatura durante um certo número de dias e acaba que o dia mais quente é um dos outliers, não quer dizer que seja uma condição extrema e nem anormal, pois se essa amostra for pequena isso pode indicar apenas uma mudaça de estação, por exemplo.

2.3 Histogramas

Os histogramas nada mais são que gráficos que permitem analisar a densidade de dados a partir de intervalos. Por isso, nesse estudo para facilitar essa visão a frequência de cada intervalo de dados foi dividida pelo número de dados, com isso o eixo Y tem valores no intervalo de 0 a 1.

Histograma definido pela frequência
Histograma definido pela frequência

Na figura acima retirada da referência Júnior (2024) que os valores no eixo denominado frequência dificultam a visualização de quantos por cento esse intervalo é definido.

Histograma definido pela densidade
Histograma definido pela densidade

Porém, nesta ultima figura é utilizado o conceito de densidade a fim de tornar essa análise mais rápida e fácil.

2.4 Percentis

Está relacionado a função probabilidade acumulada e é a probabilidade de ocorrência de um certo valor ser maior que x, de acordo com os dados fornecidos. No R, o eixo x é o da porcentagem enquanto o eixo y é o eixo dos dados, logo, uma interpretação desse gráfico seria: Para um ponto pertencente a curva (\(x_1\), \(y_1\)) significa que quando se escolhe um valor qualquer da base dados, a probabilidade deste valor ser maior que \(y_1\) é \(x_1\). A figura abaixo mostra o formato de uma gráfico utilizando a função percentil no R.

Percentil
Percentil

2.5 Séries temporais

As séries temporais nada mais são que funções aleatórias de uma variavel. Ela ajuda a satisfazer a necessidade de “prever” o futuro, já que esse não é um fator que pode ser encontrado de forma deterministica.

Ao utilizar o R é possível retirar 3 gráficos:

-Componente de tendência: Indica a direção geral da série, se está crescendo, decresndo ou estável.

-Componente sazonal: Mostra os ciclos que se repetem ao longo do tempo.

-Componente Randômica: São uma espécie de “ruídos” pertencentes a série.

2.6 Gráfico de variação

É o gráfico que relaciona os valores em sequência pela variação, ou seja, pela carcterizando-os pela diferença entre eles pela seguinte Equação (4):

\[ \text{Variação Percentual} = \frac{\text{Valor Atual} - \text{Valor Anterior}}{\text{Valor Anterior}} \times 100 \tag{4} \] Esse gráfico é fundamental para o entendimento da variação e é muito útil para analisar com que frequência uma série tem uma mudança extrema, pois, em alguns casos taxas de variações extremas em um curto intervalo de tempo são piores que valores extremos.

2.7 Gráfico de autocorrelação

Autocorrelação é uma técnica utilizada para analisar a relação de uma série temporal com seus próprios valores passados. Ela mede o grau de correlação entre os dados em diferentes intervalos de tempo (defasagens), ajudando a identificar padrões ou dependências temporais nos dados. Ou seja, mede a dependência de um valor com seu histórico, por exemplo, um atleta de alto nível se prepara para uma maratona olimpica em um periódo de 2 anos, de um dia para o outro não haverá muita evolução em relação a sua velocidade máxima, força física, massa magra e outros fatores que podem ser medidos, além do fato de que nem todos os dias ele irá evoluir pois podem acontecer problemas que não o permita treinar como doenças, problemas familiares e etc. Mas ao observar em uma “janela” de tempo maior, como 2 meses, será possível ver uma boa evolução, ou seja, a correlação entre os dados analisados que medem seu desempenho é menor que ao observar de forma diária, esses padrões são frequentemente representados graficamente por meio de uma Função de Autocorrelação (ACF), que mostra como as correlações variam em diferentes defasagens.

Correlação de dados
Correlação de dados

A linha azul pontilhada indica os limites de significância estatística para os valores de autocorrelação em cada defasagem (lag). Esses limites são calculados para verificar se a correlação observada em um dado lag é estatisticamente significativa ou um evendo causado por acaso, ruídos. Se as barras de autocorrelação ultrapassam a linha azul, isso indica que há uma relação significativa entre os valores da série no lag correspondente. Ou seja, os dados atuais influenciam diretamente os valores passados ou futuros com essa defasagem. Caso as barras fiquem dentro dos limites das linhas azuis, a autocorrelação para aquele lag pode ser considerada não significativa, sugerindo que não há uma relação forte com os valores em intervalos passados.

As informações foram baseadas na Referência IBM (2024) assim como a imagem.

2.8 Média móvel

A média móvel calcula a média de um subconjunto de valores dentro de uma série temporal, ajustando-se conforme novos dados são adicionados e os mais antigos são descartados, suavizando variações temporárias e destacando tendências. Essa média móvel permite encontrar periodos mais críticos levando em consideração um periodo de tempo, ao inves de um valor único. Ou seja, permite uma analise macro considerando um periodo de tempo e não somente um valor que pode ter como fonte um ruído.

2.9 Conceitos básicos de geração

Este tópico busca principalmente descrever os dados que foram analisados no presente trabalho. Como dito anteriormente, diversas informações podem ser retiradas da referência Operador Nacional do Sistema Elétrico (ONS) (2024a). Os principais dados retirados e sua descrição são:

-Vazão Afluente diária: Vazão diária que chega para a usina;

-Vazão vertida diária: Vazão diária liberada por um reservatório através de vertedouros;

-Vazão defluente diária: Vazão diária que sai da usina;

-Vazão turbinada: Vazão que passa através das turbinas de uma usina hidrelétrica;

-Nível de Montante diário: Nível da água diário na usina, equivalente a cota;

-Geração de Energia horária: É a gração de energia por hora da usina em um determinado periodo previamente definido;

-Volume útil diário: É dado pelo volume da usina desconsiderando o volume morto, ou seja, é o volume capaz de produzir energia;

-Energia Natural Afluente Bruta do subsistema: Energia elétrica que pode ser gerada a partir da vazão natural do subsistema;

-Energia Armazenada diária no subsistema: É relativo a capacidade do sistema de armazenar volume de água para de certa forma “guardar energia” para que seja aproveitado posteriormente;

-Custo Marginal de operação semanal do subsistema: É o valor do custo para produzir um pouco mais de um MWh de energia que o sistema precisa.

A data de análise desses dados foi de 01/01/2000 até 06/10/2024, menos a geração de energia horária que apresentou problemas durante sua extração de dados em que só era possível obter um único dia (16 de março de 2024).

Outro dado retirado foi a vazão natural afluente, que como o nome diz é a vazão afluente mas de forma que não haja intervensão humana. Para este foi utilizado todo o periodo de tempo disponivel (01/01/1931 a 31/12/2020).

2.10 Rendimento da usina

Tendo em consideração a vazão turbinada, a potência total do número de turbinas funcionando( Pt) e a queda na turbina(Ht), é possível calcular o rendimento pela Equação (5).

\[ \eta_t = \frac{P_t}{\rho \cdot g \cdot Q_t \cdot H_t}\tag{5} \] Por fim, é possível analisar o fator de produtibilidade, calculado pela Equação (6). Esse fator não é afetado pela gravidade e pela densidade da água.

\[ k= \frac{P_t}{ Q_t \cdot H_t}\tag{6} \]

3 Gráfico cota x volume e evaporação mensal

3.1 Cota x volume

Um dos tópicos a ser relacionado no presente trabalho é apresentar o gráfico cota x volume, onde a cota é dada em metros e representa o nível do reservatório. Seus valores máximos e mínimo são encontrados no arquivo Hidr.xls, da mesma forma para o volume dado em hectometro cúbico. O primeiro passo dessa ánalise consistiu em contruir o polinômio que relaciona essas duas grandezas. No Hidr.xls é disponibilizado os fatores por meio do nome PCV e de um índice em parênteses que representa qual a potência esse fator se relaciona. Por exemplo, a coluna PCV(2) é o fator que multiplica o volume elevado a 2 para encontrar a cota. Desta forma, a relação entre cota e o volume é dada pela seguinte Expressão 7.

\[ C = (-9.55E-18){V^4}+(1,16E-12){V^3}+(-5.35E-8){V^2}+(1.40E-3){V^1}+3.74E2\tag{7} \] Na equação 3, a variavel \(C\) é a cota e a \(V\) é o volume. Com isso, transformou-se a variavel de volume em um vetor de tamanho 1000 que vai do valor mínimo de volume ao valor máximo e com isso, foi definido o intervalo de aplicação da equação 3, como apresentado pela figura abaixo:

setwd("C:/Geracao")
df <- read.csv2("Hidr.csv")

#summary(df)

# Remoção de NA's 
df <- df[!is.na(df$PCV.4.) & !is.na(df$PCV.3.) & 
           !is.na(df$PCV.2.) & !is.na(df$PCV.1.) & 
           !is.na(df$PCV.0.), ]

# Definindo os volumes
Vol_max <- 34116
vol_min <- 5447

# cria um vetor de tamanho 1000
volume <- seq(Vol_max, vol_min, length.out = 1000)
#print(df$PCV.4.)

# fazendo com que os coeficientes sejam numericos
df$PCV.4. <- as.numeric(df$PCV.4.)
df$PCV.3. <- as.numeric(df$PCV.3.)
df$PCV.2. <- as.numeric(df$PCV.2.)
df$PCV.1. <- as.numeric(df$PCV.1.)
df$PCV.0. <- as.numeric(df$PCV.0.)

# Criação de um polinomio
cota <- (df$PCV.4. * volume^4)+(df$PCV.3.*volume^3)+(df$PCV.2.*volume^2)+(df$PCV.1. * volume)+(df$PCV.0.)


#print(head(volume))
#print(head(cota))

# Plotar o gráfico
plot(volume, cota, type = "l", col = "blue",
     xlab = "Volume (hm³)", ylab = "Cota (m)",
     main = "Gráfico de Cota vs Volume")
grid()

Observa-se no gráfico acima que houve coerência nos valores, já que o a partir dos limites de volume mínimo e máximo é possível observar pelo polinômio que ao aplicar a função cota x volume estes limites atingem os valores de cota mínima e máxima, reespectivamente.

3.2 Evaporação mensal

A evaporação mensal é dada no arquivo Hidr.xls, por mês e em mm. É um valor dado em mílimitro porque toma como referência a altura que alguma refêrencia evapora. Tomando como base o reservatório, basta multiplicar pela área do reservatório para se obter o volume. Com isso, tem-se duas curvas: área máxima e área mínima, com ambas, foi possível obter uma área média dado pela média dos dois valores. O primeiro passo é passar a área e o volume para metros, o volume máximo foi usado como base para a normalização do gráfico. Posteriormente, criou-se um vetor com os 12 valores obtidos de evaporação e, posteriormente, mais 3 vetores foram criados para representar a evaporação pelas áreas mínima, média e máxima, passando a evaporação para metros também. Por fim, esses vetores foram normalizados e foi possível plotar o gráfico mensal para essas três curvas. Abaixo segue o gráfico em m³ e seguido do gráfico normalizado

setwd("C:/Geracao")

df <- read.csv2("Hidr.csv")



area_max <- 4214 * 1000000  # Área máxima em m²
area_min <- 1143.2* 1000000  # Área mínima em m²
area_med <- (area_min + area_max) / 2  # Área média em m²
Vol_max <- 34116 * 1000000  # Volume máximo em m³

# Pegando os dados de evaporação no Hidr
evaporacao <- df[, paste0("Evap.Men..", 1:12, ".")]

# Remover NA's
evaporacao_clean <- na.omit(evaporacao)

# Convertendo os dados de evaporação como númerico
evaporacao_clean <- as.data.frame(lapply(evaporacao_clean, as.numeric))

# Calcular a evaporação para cada área (mínima, média, máxima) sobre o volume máximo e passando para metros
evaporacao_min <- (evaporacao_clean * area_min* 0.001)
evaporacao_med <- (evaporacao_clean * area_med* 0.001) 
evaporacao_max <- (evaporacao_clean * area_max* 0.001) 

# Criando uma sequência de meses
meses <- 1:12

# Plotando o grafico de evaporação para cada mês
plot(meses, evaporacao_min, type = "l", col = "blue", lwd = 2, 
     xlab = "Meses", ylab = "Evaporação m³", 
     main = "Evaporação por Mês (Área Min, Média, Máxima)", 
     xlim = c(1, 12), ylim = range(c(evaporacao_min, evaporacao_med, evaporacao_max)), 
     xaxt = "n", col.axis = "darkblue", col.lab = "darkblue")

# Personalizando o eixo x com o nome dos meses
axis(1, at = 1:12, labels = c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", 
                              "Jul", "Ago", "Set", "Out", "Nov", "Dez"), las = 2, col.axis = "darkblue")

# Adicionando as linhas para evaporação média e máxima
lines(meses, evaporacao_med, type = "l", col = "red", lwd = 2)
lines(meses, evaporacao_max, type = "l", col = "green", lwd = 2)

# Adicionando legenda
legend("topleft", legend = c("Evaporação Mínima", "Evaporação Média", "Evaporação Máxima"), 
       col = c("blue", "red", "green"), lty = 1, lwd = 2, pch = 16, 
       bty = "n", cex = 0.8, text.col = "black")

# Adicionar a grade em cinza
grid(col = "gray", lty = "dotted")

#___________________________________________________________________________________________
#Normalizado


# Pegando os dados de evaporação no Hidr
evaporacao <- df[, paste0("Evap.Men..", 1:12, ".")]

# Remover NA's
evaporacao_clean <- na.omit(evaporacao)

# Convertendo os dados de evaporação como númerico
evaporacao_clean <- as.data.frame(lapply(evaporacao_clean, as.numeric))

# Calcular a evaporação para cada área (mínima, média, máxima) sobre o volume máximo e passando para metros
evaporacao_min <- (evaporacao_clean * area_min* 0.001) / Vol_max
evaporacao_med <- (evaporacao_clean * area_med* 0.001) / Vol_max
evaporacao_max <- (evaporacao_clean * area_max* 0.001) / Vol_max

# Criando uma sequência de meses
meses <- 1:12

# Plotando o grafico de evaporação para cada mês
plot(meses, evaporacao_min, type = "l", col = "blue", lwd = 2, 
     xlab = "Meses", ylab = "Evaporação p.u.", 
     main = "Evaporação por Mês (Área Min, Média, Máxima)", 
     xlim = c(1, 12), ylim = range(c(evaporacao_min, evaporacao_med, evaporacao_max)), 
     xaxt = "n", col.axis = "darkblue", col.lab = "darkblue")

# Personalizando o eixo x com o nome dos meses
axis(1, at = 1:12, labels = c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", 
                              "Jul", "Ago", "Set", "Out", "Nov", "Dez"), las = 2, col.axis = "darkblue")

# Adicionando as linhas para evaporação média e máxima
lines(meses, evaporacao_med, type = "l", col = "red", lwd = 2)
lines(meses, evaporacao_max, type = "l", col = "green", lwd = 2)

# Adicionando legenda
legend("topleft", legend = c("Evaporação Mínima", "Evaporação Média", "Evaporação Máxima"), 
       col = c("blue", "red", "green"), lty = 1, lwd = 2, pch = 16, 
       bty = "n", cex = 0.8, text.col = "black")

# Adicionar a grade em cinza
grid(col = "gray", lty = "dotted")

4 Sumários estatisticos

4.1 Definição

Os sumarios estatísticos são um resumo dado pelo R, a partir da função summary. As base de dados contém tanto os valores dos dados em sí como uma base para as datas. O valores dos dados estão organizados no dataframe chamado “SOBRADINHO”, menos a geração de energia horária que está com a data que foi retirada o dado (15 de março).

4.2 Sumário da vazão afluente

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
summary(df)
##     datas             SOBRADINHO  
##  Length:9045        Min.   :-997  
##  Class :character   1st Qu.: 770  
##  Mode  :character   Median :1109  
##                     Mean   :1580  
##                     3rd Qu.:2000  
##                     Max.   :7791

Normalizando a vazão alfuente e aplicando utilizando a função summary em R:

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)
summary(vazao_afluente_normalizada)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.6310  0.4874  0.7019  1.0000  1.2659  4.9311

4.3 Sumário da vazão natural afluente

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
summary(df)
##     datas             SOBRADINHO   
##  Length:32873       Min.   :  156  
##  Class :character   1st Qu.: 1095  
##  Mode  :character   Median : 1742  
##                     Mean   : 2521  
##                     3rd Qu.: 3422  
##                     Max.   :18525

Normalizando a vazão natural afluente e aplicando utilizando a função summary em R:

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)
summary(vazao_afluente_normalizada)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.06189 0.43443 0.69112 1.00000 1.35765 7.34965

4.4 Sumário da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
summary(df)
##     datas             SOBRADINHO     
##  Length:9046        Min.   :   0.00  
##  Class :character   1st Qu.:   0.00  
##  Mode  :character   Median :   0.00  
##                     Mean   :  27.28  
##                     3rd Qu.:   0.00  
##                     Max.   :3590.00

Normalizando a vazão vertida e desconsiderando os zeros para analise, tem-se

setwd("C:/Geracao")

df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
summary(dados_filtrados)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     2.0   540.5   865.5  1045.7  1490.8  3590.0
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
dados_filt_normal<-dados_filtrados/mean(dados_filtrados)
summary(dados_filt_normal)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.001913 0.516883 0.827683 1.000000 1.425613 3.433138

4.5 Sumário da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
summary(df)
##     datas             SOBRADINHO  
##  Length:9046        Min.   : 551  
##  Class :character   1st Qu.:1099  
##  Mode  :character   Median :1435  
##                     Mean   :1559  
##                     3rd Qu.:1975  
##                     Max.   :6098

Normalizando a vazão defluente e aplicando utilizando a função summary em R:

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
vazao_afluente_defluente <- df$SOBRADINHO / mean(df$SOBRADINHO)
summary(vazao_afluente_defluente)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3535  0.7050  0.9206  1.0000  1.2670  3.9120

4.6 Sumário do nível de montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
summary(df)
##    SOBRADINHO       datas          
##  Min.   :380.8   Length:9046       
##  1st Qu.:385.6   Class :character  
##  Median :388.1   Mode  :character  
##  Mean   :387.8                     
##  3rd Qu.:390.2                     
##  Max.   :392.6

Normalizando o nível do montante diário pela cota máxima (392,5 metros):

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
maximo <- 392.5
nivel <- df$SOBRADINHO / maximo
summary(nivel)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9702  0.9825  0.9888  0.9881  0.9941  1.0003

4.7 Sumário da geração de energia horária

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
summary(df)
##   X15.de.marco  
##  Min.   :405.0  
##  1st Qu.:408.8  
##  Median :411.0  
##  Mean   :410.8  
##  3rd Qu.:412.2  
##  Max.   :416.0

A geração de energia horária foi normalizada pelo seu valor máximo e posteriormente aplicado a função summary no R.

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
maximo<- max(df$X15.de.marco)
normal<-df$X15.de.marco/maximo
summary(normal)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9736  0.9826  0.9880  0.9875  0.9910  1.0000

4.8 Sumário do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
summary(df)
##    SOBRADINHO        datas          
##  Min.   :  1.00   Length:9046       
##  1st Qu.: 27.70   Class :character  
##  Median : 48.00   Mode  :character  
##  Mean   : 49.51                     
##  3rd Qu.: 70.40                     
##  Max.   :101.50

O volume útil diário, como foi dado em porcentagem, basta dividir 100 para encontrar o valor em p.u:

maximo <- 100
nivel <- df$SOBRADINHO / maximo
summary(nivel)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0100  0.2770  0.4800  0.4951  0.7040  1.0150

4.9 Sumário da energia natural afluente bruta do subsitema nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
summary(df)
##     datas             SOBRADINHO   
##  Length:9046        Min.   :  618  
##  Class :character   1st Qu.: 2172  
##  Mode  :character   Median : 3569  
##                     Mean   : 5508  
##                     3rd Qu.: 7310  
##                     Max.   :33141

A energia natural afluente bruta do subsistema nordeste foi normalizada considerando o valor máximo:

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
maximo <- max(df$SOBRADINHO)
nivel <- df$SOBRADINHO / maximo
summary(nivel)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01865 0.06555 0.10769 0.16620 0.22056 1.00000

4.10 Sumário estatístico da Energia armazenada diária do subsitema nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
summary(df)
##     datas             SOBRADINHO   
##  Length:9046        Min.   : 1641  
##  Class :character   1st Qu.:12336  
##  Mode  :character   Median :19692  
##                     Mean   :19694  
##                     3rd Qu.:27248  
##                     Max.   :37635

A Energia armazenada diária do subsitema nordeste foi normalizada considerando o valor máximo:

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
maximo <- max(df$SOBRADINHO)
nivel <- df$SOBRADINHO / maximo
summary(nivel)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0436  0.3278  0.5232  0.5233  0.7240  1.0000

4.11 Sumário do custo marginal de operação

setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
summary(df)
##     datas             SOBRADINHO     
##  Length:1032        Min.   :   0.00  
##  Class :character   1st Qu.:  13.25  
##  Mode  :character   Median :  96.67  
##                     Mean   : 184.61  
##                     3rd Qu.: 229.77  
##                     Max.   :3044.45

5 Histogramas das séries

5.1 histograma da vazão afluente

setwd("C:/Geracao")
df <- read.csv2("vazao_afluente.csv")

# Calcula o histograma sem plota-lo
hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não exibir o gráfico 
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n #Normalizando o eixo y 

# Define o eixo y com proporção apropriada (frequências normalizadas)
plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão afluente", 
     xlab = "[m³/s]", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A vazão afluente foi normalizada pela média, como mostra o resultado a seguir do seu histograma:

setwd("C:/Geracao")
df <- read.csv2("vazao_afluente.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

hist_data <- hist(vazao_afluente_normalizada,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

# Define o eixo y com proporção apropriada (frequências normalizadas)
plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão afluente normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Por fim, foi aplicado o log nos valores normalizados

#Histograma com Log
setwd("C:/Geracao")
df <- read.csv2("vazao_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media
log <- log(normal) #Calculando o log
log2 <- log[!is.na(log)] #Retirando os NA no calculo do log 



hist_data <- hist(log2,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

# Define o eixo y com proporção a partir do número de dados
plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão afluente normalizado com log aplicado", 
     xlab = "p.u.", ylab = "Proporção", las = 1,)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Os histogramas apresentam uma concentração significativa de valores nas faixas mais baixas, próximas de 0 a 2000 m³/s, e uma “cauda” (Valores dispersos do conjunto que formam algo similiar a uma calda) longa para os valores mais elevados, acima de 2000 m³/s. Como a calda é maior no sentido positivo, observa-se que há uma tendência maior para extremos relacionados a enchentes, chuvas fortes do que secas. O que não significa que sejam os piores cenários para o sistema. Ao aplicar o logaritmo na vazão normalizada, a distribuição torna-se mais simétrica, aproximando-se de uma distribuição normal. O histograma log-normalizado revela que a maior parte dos valores se concentra entre -1 e 0, indicando que os valores estam concentrados abaixo da média, apesar de que os maiores outliers serem positivos, e ainda o valor de maior proporção está em torno de (-0,5) no gráfico com log.

6 histograma da vazão natural afluente

setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")


hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão natural afluente", 
     xlab = "[m³/s]", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A vazão natural afluente foi normalizada pela média, como mostra o resultado a seguir do seu histograma:

setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

hist_data <- hist(vazao_afluente_normalizada,
                  plot = FALSE,  #Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão natural afluente normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Por fim, foi aplicado o log nos valores normalizados

#Histograma com Log
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   # Não exibe o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

# Define o eixo y com proporção apropriada (frequências normalizadas)
plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão natural afluente com log aplicado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A maior parte dos valores está concentrada entre 0,4 e 1,5 p.u., com uma proporção muito baixa acima de 2 p.u. A presença de vazões extremas, com picos que ultrapassam 18.000 m³/s, evidencia a ocorrência de enchentes fortes que podem ocasionar vazões muito acima do “comum”.

6.1 histograma da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")

hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)



n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma vazão vertida", 
     xlab = "[m³/s]", ylab = "Proporção", las = 1)

A vazão vertida por ter muitos zeros, foi feita duas vezes desconsiderando os zeros:

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
hist_data <- hist(dados_filtrados,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)



n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n



plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma vazão vertida desconsiderando o zero", 
     xlab = "[m³/s]", ylab = "Proporção")

Normalizou-se a Vazão vertida pela média:

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

hist_data <- hist(vazao_afluente_normalizada,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de vazão vertida normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Desconsiderando os zeros tem-se:

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
hist_data <- hist(dados_filtrados/mean(dados_filtrados),
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)



n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n



plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Vazão vertida normalizada desconsiderando o zero", 
     xlab = "p.u.", ylab = "Proporção")

Com isso, aplicou-se o log na normalizada desconsiderando o log:

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
log <- log(dados_filtrados/mean(dados_filtrados))
log2 <- log[!is.na(log)]
hist_data <- hist(log2,
                  plot = FALSE,  
                  breaks = 150)



n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n




plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma vazão vertida normalizada  com log", 
     xlab = "p.u.", ylab = "Proporção")

A análise desconsiderando os valores zero nos dados de vazão vertida permite compreender melhor os padrões de distribuição nos períodos em que houve vertimento. A predominância de vazões entre 0 e 1.000 m³/s sugere que, nos períodos em que há vertimento, ele ocorre de forma controlada, com grandes volumes sendo exceções. Vazões muito acima de 2,0 p.u. são incomuns e indicam momentos críticos de operação do reservatório.

6.2 histograma da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")

hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão defluente", 
     xlab = "[m³/s]", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  # Coloca os números do gráfico na horizontal

Normalizou-se a Vazão defluente pela média:

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
vazao_afluente_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

hist_data <- hist(vazao_afluente_normalizada,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão defluente normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Com isso aplicou-se o log:

#Histograma com Log
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma de Vazão defluente normalizado com log aplicado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A maior frequência de valores está concentrada entre aproximadamente 500 e 2.000 m³/s, com uma redução gradual na frequência para vazões mais altas. A maior parte do tempo, a usina opera liberando vazões moderadas (entre 0,5 e 1,5 p.u), provavelmente ajustadas à geração de energia e ao atendimento de demandas a jusante. Os picos observados representam momentos críticos, como períodos de enchentes ou aumento na demanda energética, que requerem maior vazão defluente. A distribuição logarítmica apresenta uma forma mais simétrica em relação aos histogramas anteriores, concentrando a maioria dos valores entre -1 e 0.

6.3 histograma do nível do montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")


hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

# Define o eixo y com proporção dos dads
plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma do nível de montante diário", 
     xlab = "[m]", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  # Coloca os números do gráfico na horizontal

Normalizou-se o nível do montante diário pela cota máxima da usina, retirado do Hidr.xls.

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
maximo <- 392.5

nivel <- df$SOBRADINHO / maximo

hist_data <- hist(nivel,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma do nível de montante diário normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Aplicando o log:

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
maximo <- 392.5
normal<-df$SOBRADINHO/maximo
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma do nivel de montante normalizado com log", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Observa-se que pela característica da normalização que foi o valor máximo da cota, então o logaritimo não tem mais o zero como um valor central e sim como o limite. Pois o log máximo é 0 (log(1)) e os demais são negativos pois estão entre 0 e 1. Além de que, o único valor acima do máximo é decorrente de possiveis aproximações na base de dados já que representa apenas 1,0003 p.u como indicado no summary. Os valores estão concentrados entre 386 e 392 metros, com maior frequência em torno de 390 metros.Porém, houveram periodos em que o reservatório esteve perto do seu limite. Níveis próximos ou acima da cota máxima (392,5 metros) podem levar a necessidade de vertimento. Já níveis menores observados (380,8 metros, sendo que o mínimo é 380,5 segundo a base de dados) indicam períodos críticos, possivelmente associados a secas ou maior uso do volume armazenado.

6.4 histograma da geração de energia horária

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")


hist_data <- hist(df$X15.de.marco,
                  plot = FALSE,   
                  breaks = 25)

n <- length(df$X15.de.marco)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma da Geração Horária dia 15/03/24", 
     xlab = "MW", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A geração de energia horária foi normalizada pelo valor máximo:

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
maximo<- max(df$X15.de.marco)

hist_data <- hist(df$X15.de.marco/maximo,
                  plot = FALSE,   
                  breaks = 25)

n <- length(df$X15.de.marco)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma da Geração Horária dia 15/03/24 normalizado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Com isso, como o valor máximo foi usado para normalizar, o valor máximo no eixo x será 0, pois corresponde ao valor máximo.

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
maximo <- max(df$X15.de.marco)
normal<-df$X15.de.marco/maximo
log <- log(normal)
log2 <- log[!is.na(log)]

hist_data <- hist(log2,
                  plot = FALSE,   
                  breaks = 25)

n <- length(df$X15.de.marco)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Geração horária normalizado com log aplicado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Os valores estão distribuídos de maneira concentrada entre 410 e 413 MW, com maior frequência em torno de 411 MW. Ao aplicação do log destaca variações sutis em torno do valor máximo, comprimindo as extremidades e evidenciando a estabilidade da geração neste dia por conta da grande semelhança entre os gráficos.

6.5 histograma do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma do volume útil diário", 
     xlab = "%", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

O volume útil já veio em porcentagem, logo para passa-lo para p.u. basta dividir por 100:

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
maximo <- 100

nivel <- df$SOBRADINHO / maximo

hist_data <- hist(nivel,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma do volume útil diário normalizada", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Aplicando o log:

normal<-df$SOBRADINHO/100
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma volume útil normalizado normalizado com log", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Observa-se que pela característica da normalização que foi 100% o logaritimo não tem mais o zero como um valor central e sim como o limite. Pois o log máximo é 0 (log(1)) e os demais são negativos pois estão entre 0 e 1. O volume útil chegou a atingir 1% indicando períodos críticos com quase total esgotamento da reserva da usina (desconsiderando o volume morto).Os valores estão distribuídos entre 0% e 100%, com maior concentração entre 40% e 70%, indicando que o reservatório frequentemente opera em níveis consideravel intermediários. Há uma concentração de valores próximos de 100% sugerindo que, embora esporadicos, há periodos em que o reservatório está completamente cheio, provavelmente durante chuvas fortes.

6.6 Histograma da energia natural afluente bruta do subsistema nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "energia natural afluente bruta do subsistema nordeste", 
     xlab = "MWm", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A normalização da energia natural afluente bruta do subsistema nordeste foi feita a partir do valor máximo da mesma.

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
maximo <- max(df$SOBRADINHO)

nivel <- df$SOBRADINHO / maximo

hist_data <- hist(nivel,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "energia natural afluente bruta do nordeste normalizado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Como em alguns casos anteriores, ao aplicar o log o valor mais a direita no eixo x do histograma será 0 e corresponde ao valor máximo.

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")

normal<-df$SOBRADINHO/max(df$SOBRADINHO)
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "log da energia natural afluente bruta do subsistema", 
     xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

Ao normalizar pela máxima ENA observada (33.141 MWm) nota-se que os valores estão concentrados entre 0 e 0,2 p.u. Observa-se que o sistema trabalha 1/5 do seu valor base adotado nesse periodo, indicando uma possível crise hidrica ocorreu nessa analise que afetou a geração de energia.

6.7 Histograma da energia armazenada diária no subsitema Nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "energia armazenada diária no subsitema nordeste", 
     xlab = "GWh", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

A normalização da energia armazenada diária do subsistema nordeste foi feita a partir do valor máximo da mesma.

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
maximo <- max(df$SOBRADINHO)

nivel <- df$SOBRADINHO / maximo

hist_data <- hist(nivel,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "energia armazenada diária do subsistema normalizado", 
     xlab = "p.u.", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

O mesmo que o caso que a energia natural afluente bruta do subsistema nordeste ocorre ao logaritimizar:

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")

normal<-df$SOBRADINHO/max(df$SOBRADINHO)
log <- log(normal)
log2 <- log[!is.na(log)]



hist_data <- hist(log2,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "log da energia armazenada diária do subsistema", 
     xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1)  

O histograma da energia armazenada mostra uma distribuição bem espalhada, com maior densidade de valores entre 10000 e 35000 GWh. O valor mínimo registrado foi de 1641 GWh, enquanto o máximo atingiu 37635 GWh. Pelo histograma normalizado é possível observar que há muitos valores próximos a 1 p.u. mas que entre 0,97 e 1 p.u. esses valores caem drasticamente, indicando que possívelmente o valor máximo está relacionado a um periodo de cheia em que foi possível armazenar energia na forma de água em hidrelétricas a fio d’água, como Sobradinho.

6.8 Histograma do custo marginal de operação

setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
# Substituindo os meses abreviados por seu número (1-12)
df$datas <- gsub("jan.", "01", df$datas)
df$datas <- gsub("fev.", "02", df$datas)
df$datas <- gsub("mar.", "03", df$datas)
df$datas <- gsub("abr.", "04", df$datas)
df$datas <- gsub("mai.", "05", df$datas)
df$datas <- gsub("jun.", "06", df$datas)
df$datas <- gsub("jul.", "07", df$datas)
df$datas <- gsub("ago.", "08", df$datas)
df$datas <- gsub("set.", "09", df$datas)
df$datas <- gsub("out.", "10", df$datas)
df$datas <- gsub("nov.", "11", df$datas)
df$datas <- gsub("dez.", "12", df$datas)

# Substituir o ano com dois dígitos pelo de quatro dígitos
df$datas <- gsub(" de (\\d{2})$", " de 20\\1", df$datas)


# ajustando o formato das datas
df$datas <- as.Date(df$datas, format = "%d de %m de %Y")
df$datas_formatada <- format(df$datas, "%d/%m/%Y")



hist_data <- hist(df$SOBRADINHO,
                  plot = FALSE,   # Não faz o gráfico automaticamente
                  breaks = 150)

n <- length(df$SOBRADINHO)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Custo marginal de operação semanal do subsitema nordeste", 
     xlab = "custo marginal (R$)", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1) 

O custo marginal de operação não foi normalizada. Em termos práticos, a predominância de valores baixos indica uma eficiência operacional em grande parte dos dados.

7 Bloxplot das séries

Nas séries, foi desenhado além dos item citados no capítulo de bloxplot, também foi feito uma linha pontilhada vermelha que coincide com a média.

As séries são normalizadas da mesma forma que o sumário estatístico e os histrogramas. Posteriormente, aplicou-se a função logo em cada série.

7.1 Bloxplot da vazão afluente

#setwd("C:/Geracao")
df <- read.csv2("C:/geracao2/vazao_afluente.csv")
#Boxplot sem normalização
boxplot(df$SOBRADINHO, 
        main = "Box Plot de Vazão afluente",    # Título do gráfico
        ylab = "[m³/s]",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2)  # linha da média

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media
boxplot(normal, 
        main = "Box Plot de Vazão afluente ",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(normal), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media

log <- log(normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "Box Plot da Vazão afluente log normalizada",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

Como esperado por conta da análise dos histogramas, a linha vermelha (média) está posicionada acima da mediana. Idicando a forte influência dos outliers no calculo da média e que valores extremos são majoritariamente positivo. Após a transformação logarítmica, a média está mais próxima da mediana, indicando uma redução significativa da assimetria nos dados. Os outliers negativos no gráfico do log indicam a grande influência dos extremos no cálculo da média, fazendo com que não haja outliers positivos e sim negativos nesse gráfico.

7.2 Bloxplot da vazão natural afluente:

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
boxplot(df$SOBRADINHO, 
        main = "Box Plot de Vazão natural afluente",    # Título do gráfico
        ylab = "m³/s",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2) 

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media
boxplot(normal, 
        main = "Box Plot de Vazão natural afluente ",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(normal), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media

log <- log(normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "Box Plot da Vazão natural afluente log normalizada",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

A mediana (linha preta dentro do box) está abaixo da média (linha vermelha), há uma grande quantidade de outliers positivos representando eventos extremos de alta vazão, esses outliers estendem a cauda dos histogramas, além de deslocar a média para cima. Por se considerar a analise da vazão natural afluente conter dados de 1931 até 2020, pode-se concluir que Os valores entre 1º e 3º quartil refletem a vazão natural regular do sistema. A aplicação do logaritmo reduz a assimetria da distribuição, tornando-a mais equilibrada. A média (linha vermelha) está muito próxima da mediana, indicando que os valores extremos têm menor influência, talvez por conta da grande quantidade de dados.

7.3 Bloxplot da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
boxplot(df$SOBRADINHO, 
        main = "Box Plot de Vazão vertida",    # Título do gráfico
        ylab = "m³/s",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2)  # linha da média

A vazão vertida por ter muitos zeros, foi feita duas vezes desconsiderando os zeros:

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]
boxplot(dados_filtrados, 
        main = "Box Plot de Vazão Vertida (sem zeros)",    
        ylab = "m³/s",                       
        col = "lightblue",                      
        border = "black")                       


abline(h = mean(dados_filtrados), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
mlt<-mean(df$SOBRADINHO)
vazao_vertida_numerico_mlt<-df$SOBRADINHO/mlt
boxplot(vazao_vertida_numerico_mlt, 
        main = "Box Plot de Vazão Vertida ",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

abline(h = mean(vazao_vertida_numerico_mlt), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
dados_filtrados <- df$SOBRADINHO[df$SOBRADINHO > 0]

mlt<-mean(dados_filtrados)
df_normal<-dados_filtrados/mlt


log <- log(df_normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
      main = "Box Plot de Vazão vertida com log",    
      ylab = "log",                       
      col = "lightblue",                      
      border = "black")                       
abline(h = mean(log2), col = "red", lwd = 2, lty = 2)

A mediana está próxima de 1.000 m³/s, enquanto a média (linha vermelha) está um pouco acima. O intervalo interquartil (IQR) varia de aproximadamente 500 m³/s a 1.500 m³/s, concentrando a maioria dos valores de vazão vertida nesse intervalo. Os pontos acima do limite superior representam eventos de vazões extremas (outliers), com valores superiores a 2.500 m³/s estes valores indicam eventos pontuais de alta vazão vertida, como durante cheias ou descargas excepcionais para controle do reservatório. No boxplot normalizado e com logaritimo mostra uma distribuição mais simétrica, com a mediana e a média alinhadas em torno de 0 na escala logarítmica. Reduzindo a influência de outliers, proporcionando uma análise mais equilibrada.

7.4 Bloxplot da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
boxplot(df$SOBRADINHO, 
      main = "Box Plot de Vazão defluente",    
      ylab = "m³/s",                       
      col = "lightblue",                      
      border = "black")                       
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2)

media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media


boxplot(normal, 
        main = "Box Plot de Vazão defluente normalizada ",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

media<-mean(df$SOBRADINHO)
normal<-df$SOBRADINHO/media

log <- log(normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "Box Plot de Vazão defluente normalizada com log aplicado",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

Os três boxplots fornecem perspectivas complementares sobre a distribuição da vazão defluente, considerando os valores absolutos (m³/s), normalizados (p.u.), e normalizados com logaritmo aplicado. A mediana (linha preta) está ligeiramente abaixo da média (linha vermelha), indicando uma assimetria positiva na distribuição (valores altos deslocam a média para cima. Há uma quantidade significativa de outliers, representando eventos de alta vazão defluente. Esses valores podem estar associados a períodos de cheias ou maior demanda por geração de energia. Em que mesmo com o log aplicado há um grande número de outliers. Os outliers acima de 2,0 p.u. representam eventos de alta vazão, que são menos frequentes, mas que devem ser levados em consideração.

7.5 Bloxplot do nível de montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
boxplot(df$SOBRADINHO, 
        main = "Boxplot do nível de montante diário",   
        ylab = "m",                       
        col = "lightblue",                      
        border = "black")                      


abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2) 

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
maximo<-392.5
df_normal<-df$SOBRADINHO/maximo
boxplot(df_normal, 
        main = "Box Plot do nível de montante diario normalizado",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

media_log <- log(mean(df_normal, na.rm = TRUE))

# Adicionar uma linha horizontal na média logarítmica
abline(h = media_log, col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
maximo<-392.5
df_normal<-df$SOBRADINHO/maximo


log <- log(df_normal)
log2 <- log[!is.na(log)]
boxplot(log2, 
        main = "Box Plot do nível de montante diario com log aplicado",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

media_log <- log(mean(df_normal, na.rm = TRUE))

# Adicionar uma linha horizontal na média logarítmica
abline(h = media_log, col = "red", lwd = 2, lty = 2)

Na distribuição geral a mediana está próxima de 388 metros, indicando que metade dos valores se concentra abaixo deste nível. O nível de montante diário apresenta uma distribuição estável, com a maior parte dos valores entre 386 e 390 metros, ou 0,97 e 0,99 p.u.. Com isso pode-se concluir que o reservatório opera frequentemente próximo da cota máxima

7.6 Bloxplot da geração de energia horária

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
boxplot(df$X15.de.marco, 
        main = "Boxplot Geração Horária dia 15/03/24",    # Título do gráfico
        ylab = "MW",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(df$X15.de.marco), col = "red", lwd = 2, lty = 2) 

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
maximo<-1050.3
df_normal<-df/maximo


boxplot(df$X15.de.marco/maximo, 
        main = "Boxplot normalizado Geração Horária dia 15/03/24",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

abline(h = mean(df$X15.de.marco/maximo), col = "red", lwd = 2, lty = 2)  # linha da média

setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
maximo<-1050.3
df_normal<-df/maximo
log <- log(df_normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "Boxplot com log da Geração Horária dia 15/03/24",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

abline(h = mean(df$X15.de.marco/maximo), col = "red", lwd = 2, lty = 2)  # linha da média

Os boxplots não tem outliers, indicando que a geração horaria para o dia 15 de março de 2024 teve valores concentrados entre sí.

7.7 Bloxplot do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
boxplot(df$SOBRADINHO, 
        main = "Boxplot do volume útil",    # Título do gráfico
        ylab = "%",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2) 

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
cem_porcento<-100
df_normal<-df$SOBRADINHO/cem_porcento
boxplot(df_normal, 
        main = "Boxplot normalizado volume util diario normalizado",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box

abline(h = mean(df$SOBRADINHO/cem_porcento), col = "red", lwd = 2, lty = 2)  # linha da média

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
x<-df$SOBRADINHO/100

log <- log(x)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "Box Plot do volume util diario log normalizada",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(log2), col = "red", lwd = 2, lty = 2)

A média está próxima de 50%, indicando que o reservatório opera, em média, em metade de sua capacidade útil. O log destaca os valores baixos, evidenciando outliers abaixo de -2 p.u., correspondendo a momentos críticos de baixa disponibilidade hídrica.Os boxplots revelam um reservatório que opera de forma estável, mas que enfrenta momentos críticos de baixa disponibilidade de água.

7.8 Bloxplot da energia natural afluente bruta do subsitema nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
boxplot(df$SOBRADINHO, 
        main = "Energia Natural Afluente Bruta do subsistema Nordeste",    # Título do gráfico
        ylab = "MWm",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
maxi<-max(df$SOBRADINHO)
normal<-df$SOBRADINHO/maxi

boxplot(normal, 
        main = "Energia Natural Afluente Bruta do subsistema Normalizada",    # Título do gráfico
        ylab = "p.u.",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(normal), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
maximo<-max(df$SOBRADINHO)
normal<-df$SOBRADINHO/maximo

log <- log(normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "log da energia natural afluente bruta do subsistema ",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

Os boxplots mostram que a maior parte dos valores da energia natural afluente bruta do subsistema Nordeste estão concentrados em níveis mais baixos, abaixo da média (linha vermelha). Porém, existem alguns valores bem altos, que aparecem como outliers, mostrando situações onde a energia afluente foi muito maior do que o normal. A energia natural afluente bruta do Nordeste varia bastante, mas a maioria dos valores está em níveis mais baixos, com alguns picos altos aparecendo ocasionalmente.Indicando que possívelmente houve um momento de crise desse subsistema, e que os outliers seriam os valores em que esse periodo ainda não ocorreu ou posterior.

7.9 Bloxplot estatístico da Energia armazenada diária do subsitema nordeste

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
boxplot(df$SOBRADINHO, 
        main = "Energia armazenada diária no subsistema Nordeste",    # Título do gráfico
        ylab = "GWh",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(df$SOBRADINHO), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
maxi<-max(df$SOBRADINHO)
normal<-df$SOBRADINHO/maxi

boxplot(normal, 
        main = "Energia armazenada diária no subsistema Nordeste p.u",    # Título do gráfico
        ylab = "p.u",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(normal), col = "red", lwd = 2, lty = 2)

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
maximo<-max(df$SOBRADINHO)
normal<-df$SOBRADINHO/maximo

log <- log(normal)
log2 <- log[!is.na(log)]

boxplot(log2, 
        main = "log Energia armazenada diária no subsistema",    # Título do gráfico
        ylab = "log",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = log(mean(normal)), col = "red", lwd = 2, lty = 2)

A mediana está próxima de 19692 GWh, como indicado no resumo estatístico e pelo boxplot esse valor está bem próximo da média, indicando uma caracteristica normal da série. A energia armazenada no subsistema Nordeste apresenta uma distribuição concentrada entre 0,3 e 0,7 p.u., indicando que, na maior parte do tempo, os reservatórios operaram dentro desse desse valor, é importante relembrar que a normalização ocorreu com o maior valor encontrado na série que não corresponde a capacidade de armazenamento total do subsistema. Como a normalização ocorreu pelo máximo da série, o log tem um comportamento predominantemente negativo.

7.10 Bloxplot do custo marginal de operação

setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
df$datas <- gsub("jan.", "01", df$datas)
df$datas <- gsub("fev.", "02", df$datas)
df$datas <- gsub("mar.", "03", df$datas)
df$datas <- gsub("abr.", "04", df$datas)
df$datas <- gsub("mai.", "05", df$datas)
df$datas <- gsub("jun.", "06", df$datas)
df$datas <- gsub("jul.", "07", df$datas)
df$datas <- gsub("ago.", "08", df$datas)
df$datas <- gsub("set.", "09", df$datas)
df$datas <- gsub("out.", "10", df$datas)
df$datas <- gsub("nov.", "11", df$datas)
df$datas <- gsub("dez.", "12", df$datas)

# Substituindo o ano com dois dígitos para quatro dígitos
df$datas <- gsub(" de (\\d{2})$", " de 20\\1", df$datas)

# Convertendo as datas para o formato 01/01/2000
df$datas <- as.Date(df$datas, format = "%d de %m de %Y")

df$datas_formatada <- format(df$datas, "%d/%m/%Y")

boxplot(df$SOBRADINHO, 
        main = "Boxplot custo marginal",    # Título do gráfico
        ylab = "R$",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box


abline(h = mean(df$m), col = "red", lwd = 2, lty = 2)

A maioria dos valores encontra-se concentrada em uma faixa bem baixa, próxima do limite inferior da distribuição. Contudo, existem vários outliers significativos que se estendem a valores muito altos, alcançando até cerca de R$3044,45/MWh (valor máximo). Os outliers indicam semanas específicas onde o custo marginal foi excepcionalmente alto, provavelmente em momentos de escassez hídrica. A linha da mediana está em R$96,67 e a média é 184,61 reais.

8 Séries temporais

8.1 Série temporal da vazão afluente

#setwd("C:/geracao2")
#list.files("C:/geracao2")
df <- read.csv2("C:/geracao2/vazao_afluente.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# Criar a série temporal 
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Série Temporal - Vazão afluente Sobradinho",
     xlab = "Data", ylab = "m³/s ")
     

grid()

É possível observar um pico extremo entre 2004 e 2008, nesse caso por ser um pico positivo é provável que seja decorrente de alguma enchente e uma periodo muito chuvoso. Já entre 2016 e 2020, reflete um periodo de seca. Apesar dos extremos, é possível observar que há ciclos aparentemente bem definidos para os picos, mas certas condições podem fazer com que eles sejam acima do esperado como foi entre 2004 e 2008.

8.2 Série temporal da vazão natural afluente

Para a série temporal da natural afluente, dividiu-se em 3 periodos iguais como segue a baixo

library(xts)
library(zoo)  # Para agregar os dados


setwd("C:/Geracao")


df <- read.csv2("vazao_natural_afluente.csv")


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

#  série temporal 
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)

# Agregando os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)

# Dividindo a série temporal em três períodos
serie1 <- serie_mensal["1931/1960"]
serie2 <- serie_mensal["1961/1990"]
serie3 <- serie_mensal["1991/2020"]



# Gráfico 1: 1931 a 1960
plot(serie1, type = "l", col = "blue",
     main = "Vazão natural afluente (1931-1960)",
     xlab = "Data", ylab = "m³/s")
grid()

library(xts)
library(zoo)  # Para agregar os dados

setwd("C:/Geracao")

df <- read.csv2("vazao_natural_afluente.csv")


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

#  série temporal 
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)

# Agregando os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)

# Dividir a série temporal em três períodos
serie1 <- serie_mensal["1931/1960"]
serie2 <- serie_mensal["1961/1990"]
serie3 <- serie_mensal["1991/2020"]



# Gráfico 2: 1961-1990
plot(serie2, type = "l", col = "blue",
     main = "Vazão natural afluente (1961-1990)",
     xlab = "Data", ylab = "m³/s")
grid()

library(xts)
library(zoo)  # Para agregar os dados

setwd("C:/Geracao")

df <- read.csv2("vazao_natural_afluente.csv")


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

#  série temporal 
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)

# Agregando os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)

# Dividir a série temporal em três períodos
serie1 <- serie_mensal["1931/1960"]
serie2 <- serie_mensal["1961/1990"]
serie3 <- serie_mensal["1991/2020"]



# Gráfico 2: 1961-1990
plot(serie3, type = "l", col = "blue",
     main = "Vazão natural afluente (1991-2020)",
     xlab = "Data", ylab = "m³/s")
grid()

A série temporal foi dividida em três períodos distintos: 1931–1960, 1961–1990 e 1991–2020. Essa segmentação permite observar a evolução da vazão natural ao longo do tempo. O primeiro periodo é caracterizado por vazões com um comportamento de primeiro harmonico senoidal, com picos moderados em relação aos outros períodos. Pode estar relacionado a forma de medição da vazão nestes periodo que com certeza não são tão acuradas como o último periodo analisado ou então que esse comportamento indica uma fase de menor impacto de variabilidade climática. Porém, um dos maiores picos ocorreram nesse periodo chegando a ultrapassar 10.000. Já o segundo periodo com picos de vazão mais intensos e frequentes (2 superando 8.000 m³/s, como nos anos de 1978 e 1983).Há também períodos de vazões mais reduzidas, indicando possivei ciclos de seca, como os anos 1985–1990. Por fim, o terceiro é marcado por uma tendência de redução geral das vazões, com picos menos intensos e frequentes. Eventos extremos de alta vazão são menos comuns, e a maioria dos picos se encontra majoritariamente abaixo de 8.000 m³/s. As baixas vazões se tornam mais frequentes, especialmente após 2010, indicando a intensificação de períodos de seca, possivelmente associada a mudanças climáticas.

8.3 Série temporal da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Série Temporal - vazão vertida Sobradinho",
     xlab = "Data", ylab = "m³/s")
grid()

A maior parte dos vertimentos ocorreu entre os anos de 2004 e 2009, com picos notáveis de vazão que ultrapassaram os 3.000 m³/s. Após 2009, houve longos períodos sem qualquer vertimento significativo ou com vertimentos exporadicos como entre 2009 e 2020. Os vertimento voltaram a ocorrer a partir de 2020, com picos expressivos, embora em menor magnitude do que os registrados no período anterior (2004–2009).

8.4 Série temporal da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Série Temporal - vazão defluente Sobradinho",
     xlab = "Data", ylab = "m³/s ")
grid()

A série temporal da vazão defluente da usina de Sobradinho, cobrindo o período de 2000 a 2024, apresenta os padrões de liberação de água pelo reservatório. Há uma tendência geral de redução nas vazões médias entre 2010 e 2016 e nos anos recentes (2020–2024), observa-se uma leve retomada de vazões mais altas, embora ainda abaixo dos níveis registrados no início dos anos 2000. Já nos periodo entre 2004 e 2012O período é marcado por picos expressivos de vazão, com o maior valor de toda a série superando 6.000 m³/s.

8.5 Série temporal do nível de montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Nível de montante",
     xlab = "Data", ylab = "m")
grid()

A série temporal do nível de montante diário reflete as variações na altura da água no reservatório da usina de Sobradinho ao longo dos anos, a série mostra um padrão cíclico, com oscilações regulares que parecem estar associadas às estações hidrológicas e energeticas bem definidas.

8.6 Série temporal da geração de energia horária

# Criando o vetor de horas

hora <- seq(from = as.POSIXct("2024-11-22 00:00"), 
            to = as.POSIXct("2024-11-22 23:00"), 
            by = "hour")


setwd("C:/Geracao")

df <- read.csv2("geracao_horaria.csv")

# serie temporal
serie_temporal <- xts(df$X15.de.marco, order.by = hora)

# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Geração de energia horária",
     xlab = "Horas", ylab = "MW")
grid()

A série temporal da geração horária de energia apresenta as flutuações nos valores de geração ao longo do dia, evidenciando o comportamento do sistema sob condições operacionais específicas no dia analisado. Observa-se que no horário comercial é o periodo de menor geração de energia, com excessão ao meio dia.

8.7 Série temporal do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Série Temporal - volume útil diário ",
     xlab = "Data", ylab = "%")
grid()

Supõe-se que os picos estão ligados a periodos de alta preciptação, mas por conta da usina não ser a fio d’água, o homem pode influênciar a partir da liberação de água. Olhando para os periodos, entre 2000 e 2004, o volume útil operou entre 20 e 60, raramente superando esses limites. Já entre 2004 e 2008 houveram altos picos, chegando a encher o reservatório por completo, mas logo em seguida houve uma grande queda no inicio de 2008 que por mais que logo em seguida houverão picos elevados entre 2012 e 2020 o reservatorio esteve majoritariamente a baixo de 40% com um longo periodo abaixo de 20%. Por fim, o reservatório vem em uma crescente em relação ao volume, indicando ciclos por fatores naturais.

8.8 Série temporal da Energia natural afluente bruta do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")


library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Energia natural afluente bruta do subsitema",
     xlab = "Data", ylab = "MWm")
grid()

A série temporal da energia natural afluente bruta do subsistema Nordeste mostra um comportamento cíclico bem definido, com picos altos e períodos de valores baixos que provavelmente correspondem às estações chuvosas e secas, respectivamente. Ou também, a periodos com mais demanda de energia como o verão e periodo em que as pessoas consomem menos

8.9 Série temporal Energia armazenada diária do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")

library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "Energia armazenada diária do subsitema",
     xlab = "Data", ylab = "GWh")
grid()

Observa-se que similar a energia bruta gerada do substema, o periodo de baixo armazenamento de energia ocorreu entre 2012 e 2020. Indicando que de fato nesse periodo o subsistema apresentou desafios naturais relacionados a falta de água decorrente de periodos secos.

8.10 Série temporal do custo marginal de operação

setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
df$datas <- gsub("jan.", "01", df$datas)
df$datas <- gsub("fev.", "02", df$datas)
df$datas <- gsub("mar.", "03", df$datas)
df$datas <- gsub("abr.", "04", df$datas)
df$datas <- gsub("mai.", "05", df$datas)
df$datas <- gsub("jun.", "06", df$datas)
df$datas <- gsub("jul.", "07", df$datas)
df$datas <- gsub("ago.", "08", df$datas)
df$datas <- gsub("set.", "09", df$datas)
df$datas <- gsub("out.", "10", df$datas)
df$datas <- gsub("nov.", "11", df$datas)
df$datas <- gsub("dez.", "12", df$datas)

# Substituindo o ano com dois dígitos para quatro dígitos
df$datas <- gsub(" de (\\d{2})$", " de 20\\1", df$datas)

#Formato antifo
df$datas <- as.Date(df$datas, format = "%d de %m de %Y")

# Formato novo
df$datas_formatada <- format(df$datas, "%d/%m/%Y")

library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# serie temporal
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)


# Plotar a série temporal
plot(serie_temporal, type = "l", col = "blue",
     main = "custo marginal de operação",
     xlab = "Data", ylab = "R$")
grid()

A série temporal do custo marginal de operação semanal do subsistema Nordeste demonstra variações significativas ao longo dos anos. Observa-se que houve um alto valor em 2015 e o valor máximo da série em 2021. Observa-se que a maior é praticamente o dobro que a segunda maior. Mas de forma geral o custo marginal apresenta valores baixos na maior parte do tempo, quando comparado a média e aos picos, o que foi demonstrado na concentração dos dados em torno de valores menores, como identificado no histograma e no boxplot.

9 Boxplot anuais

Os boxplots anuais são valores que permitem analisar tdas as informações de um boxplot, como já discutido, mas co os valores organizados de forma anual. Para meios de comparação, os valores forma analisados em p.u.

9.1 Bloxplot anual da vazão afluente

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)
# Adicionando a coluna de ano
df <- df %>%
  mutate(ano = format(datas, "%y"))  # Extraindo o ano como texto 

# Boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores Anuais vazão afluente Sobradinho", x = "Ano", y = "Vazão p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Observa-se que houve uma redução nos valores das medianas logo após 2010, que voltou a crescer entre 2020 e 2022 mas posteriormente decresceu. Essa tendência pode estar associada a mudanças climáticas ou interferências humanas no uso da hidréletrica já que a mesma não é fio d’água e possui reservatório.

O maior extremo, em módulo, ocorreu no ano de 2007 chegando a quase 5 p.u.

Aplicando o log para os valores normalizados:

setwd("C:/Geracao")

df <- read.csv2("vazao_afluente.csv")


library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

#adicionando a coluna de ano
df <- df %>%
  mutate(ano = format(datas, "%Y"))  

# Calcular a média anual para normalização
df <- df %>%
  group_by(ano) %>%  # Agrupando por ano
  mutate(
    media_anual = mean(SOBRADINHO, na.rm = TRUE),  # Média anual da vazão
    vazao_normalizada = SOBRADINHO / media_anual  # Vazão normalizada pela média anual
  ) %>%
  ungroup()  # Desagrupar os dados

# Criar o boxplot com log imbutido
ggplot(df, aes(x = factor(ano), y = log(vazao_normalizada))) +  
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(
    title = "Boxplot do Log dos Valores Anuais (Vazão Afluente - Sobradinho)",
    x = "Ano",
    y = "Log da Vazão Normalizada"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

9.2 Boxplot anual da vazão natural afluente

Assim como para o caso de série temporal, foi divido em 3 partes iguais.

setwd("C:/Geracao")

df <- read.csv2("vazao_natural_afluente.csv")
# Box plot com intervalos de 30 anos separados
library(dplyr)
library(ggplot2)

# Converter a coluna de datas para o formato Date
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media <- mean(df$SOBRADINHO)

# Adicionar a coluna de ano
df <- df %>%
  mutate(ano = as.numeric(format(datas, "%Y")))  

# Criar dataframes para cada intervalo
df_1931_1960 <- df %>% filter(ano >= 1931 & ano <= 1960)
df_1961_1990 <- df %>% filter(ano >= 1961 & ano <= 1990)
df_1991_2020 <- df %>% filter(ano >= 1991 & ano <= 2020)

# Criar os boxplots para cada intervalo
boxplot_1931_1960 <- ggplot(df_1931_1960, aes(x = factor(ano), y = SOBRADINHO / media)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores de vazao natural afluente (1931-1960)", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot_1961_1990 <- ggplot(df_1961_1990, aes(x = factor(ano), y = SOBRADINHO / media)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores de vazao natural afluente (1961-1990)", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot_1991_2020 <- ggplot(df_1991_2020, aes(x = factor(ano), y = SOBRADINHO / media)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores de vazao natural afluente (1991-2020)", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Exibir os gráficos
print(boxplot_1931_1960)

print(boxplot_1961_1990)

print(boxplot_1991_2020)

Os boxplots anuais fornecem uma visão detalhada da distribuição das vazões naturais afluentes ao longo das décadas, destacando a mediana, dispersão e valores extremos (outliers). A análise a seguir engloba os três períodos apresentados: 1931–1960, 1961–1990 e 1991–2020. No primeiro periodo as vazões mais altas são menos frequentes, com exceção de alguns anos como 1949, que registra outliers significativos, nesse periodo houveram apenas 10 outliers. No segundo periodo é caracterizado por um aumento significativo na dispersão e é o periodo no qual houve maiores outliers em relação ao primeiro periodo. Por fim, no terceiro periodo, as medianas em vários anos estão em níveis mais baixos em comparação com os períodos anteriores, indicando uma redução gradual das vazões. Esse é o periodo que teve mais outliers, totalizando 16 anos.

Aplicando o log para os valores normalizados:

setwd("C:/Geracao")


df <- read.csv2("vazao_natural_afluente.csv")

library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# Adicionando a coluna de ano 
df <- df %>%
  mutate(ano = as.numeric(format(datas, "%Y")))  


df <- df %>%
  group_by(ano) %>%  
  mutate(
    media_anual = mean(SOBRADINHO, na.rm = TRUE),  # Média anual
    vazao_normalizada = SOBRADINHO / media_anual,  # Normalizar pela média anual
    vazao_log_normalizada = log(vazao_normalizada)  # log
  ) %>%
  ungroup()  # Desagrupar os dados

# dataframes para os 30 anos
df_1931_1960 <- df %>% filter(ano >= 1931 & ano <= 1960)
df_1961_1990 <- df %>% filter(ano >= 1961 & ano <= 1990)
df_1991_2020 <- df %>% filter(ano >= 1991 & ano <= 2020)

# boxplots para cada intervalo
boxplot_1931_1960 <- ggplot(df_1931_1960, aes(x = factor(ano), y = vazao_log_normalizada)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do Log da Vazão Normalizada (1931-1960)", x = "Ano", y = "Log da Vazão Normalizada") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot_1961_1990 <- ggplot(df_1961_1990, aes(x = factor(ano), y = vazao_log_normalizada)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do Log da Vazão Normalizada (1961-1990)", x = "Ano", y = "Log da Vazão Normalizada") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot_1991_2020 <- ggplot(df_1991_2020, aes(x = factor(ano), y = vazao_log_normalizada)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do Log da Vazão Normalizada (1991-2020)", x = "Ano", y = "Log da Vazão Normalizada") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Exibindo os gráficos
print(boxplot_1931_1960)

print(boxplot_1961_1990)

print(boxplot_1991_2020)

9.3 Bloxplot anual da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
library(dplyr)
library(ggplot2)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores Anuais vazão vertida Sobradinho", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

O boxplot revela que os vertimentos ocorreram de forma concentrada em períodos específicos, como entre 2004 e 2009 que só não houve vertimento no ano de 2008. Porém, houve um periodo de 9 anos seguidos sem vertimento que teve inicio em 2013 e voltou a ter vertimento apenas em 2022. Observa-se que o não vertimento coincide com o periodo em que houve as menores vazões afluentes e com o periodo critico da usina.

9.4 Bloxplot anual da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  # Extrair o ano como texto

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores Anuais vazão defluente Sobradinho", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Anos como 2004 e 2007 têm um número significativo de outliers, representando eventos de altas vazões, com valores próximos de 3 a 4 p.u.. Já após 2012, todas as medianas foram abaixo de 1 p.u indicando que os operadores da hidréletrica estão preversando manter o reservatório, por motivos elétricos ou climáticos ou ambos. Em 2022 a usina pareceu iniciar uma crescente na vazão defluente mas caiu em 2024, porém, é necessário uma janela de observação maior para concluir essa analise.

Aplicando o log nos valores anuais:

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")

library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")


df <- df %>%
  mutate(ano = format(datas, "%Y")) 


df <- df %>%
  group_by(ano) %>%  # grupos por anos
  mutate(
    media_anual = mean(SOBRADINHO, na.rm = TRUE),  # Média anual da vazão
    vazao_normalizada = SOBRADINHO / media_anual  # Vazão normalizada pela média anual
  ) %>%
  ungroup()  #desagrupando

# boxplot dos valores log-transformados normalizados
ggplot(df, aes(x = factor(ano), y = log(vazao_normalizada))) +  
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(
    title = "Boxplot do Log dos Valores Anuais (Vazão defluente - Sobradinho)",
    x = "Ano",
    y = "Log da Vazão Normalizada"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

9.5 Bloxplot anual do nível de montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

#  boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores Anuais vazão nivel do montante diario", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Os níveis do reservatórios, no periodo analisado, inicialmente começaram com a mediana proximo 0,98 p.u. e a partir de 2004 até 2014, no periodo de 10 anos, teve valores acima de 0,985 p.u.. E posteriormente os valores sofreram uma queda drastica, com a mediana abaixo de 0,98 p.u. durante 3 anos que posterioemnte voltou a cresces. Outliers não são muito frequentes, ocorrendo apenas nos anos de 2004 e 2009.

Aplicando o log nos valores normalizados:

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")

library(dplyr)
library(ggplot2)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

df <- df %>%
  mutate(ano = format(datas, "%Y"))  

vazao_normalizada = df$SOBRADINHO / max(df$SOBRADINHO)  
    
#  boxplot dos valores log-transformados normalizados
ggplot(df, aes(x = factor(ano), y = log(vazao_normalizada))) +  
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(
    title = "Boxplot do Log dos Valores Anuais (Nível do montante - Sobradinho)",
    x = "Ano",
    y = "Log do Nível do montante normalizado"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Lembrando que os níveis de montante diário tem foram normalizados pelo seu valor máximo

9.6 Bloxplot anual do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")

library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-100

df <- df %>%
  mutate(ano = format(datas, "%y"))  

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot dos Valores Anuais volume útil diário", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

O gráfico de volume útil mostra uma senoide ao olhar pelas medianas, em que em nenhum ano apresentou outliers. Indicando que há periodos de abundância em água, mas que há periodos em que é necessário atenção por conta de possíveis secas, que apresentam um comportamento ciclico.

Aplicando o log tem-se:

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")

library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-100

df <- df %>%
  mutate(ano = format(datas, "%y"))  

# boxplot dos valores anuais

Log<-log(df$SOBRADINHO/media)

ggplot(df, aes(x = factor(ano), y = Log)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do log Valores Anuais volume útil diário", x = "Ano", y = "Log do volume útil normalizado") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

9.7 Bloxplot anual da Energia natural afluente bruta do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
library(dplyr)
library(ggplot2)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot anual Energia natural afluente bruta do subsitema", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Observa-se que pela diferença entre o primeiro e o terceiro quartils que alguns anos são compostos como abundantes no quesito de energia desse subsistema, com destaque para 2004 que foi o periodo em que a houve a máxima energia analisada para a serie. Já anos como 2015, observa-se que os dados ficaram muito próximos e em valores bem baixo, não tendo nenhum outlier.

Aplicando o log nos valores normalizados:

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
library(dplyr)
library(ggplot2)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

Log<-log(df$SOBRADINHO/media)

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = Log)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do log anual Energia natural afluente bruta do subsitema", x = "Ano", y = "log da Energia natural afluente bruta do subsitema normalizada") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

9.8 Bloxplot anual da Energia armazenada diária do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

#  boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO/media)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot Anual Energia armazenada diária do subsitema", x = "Ano", y = "p.u.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

Observa-se que os boxplots anuais não apresentam outliers, em 2004 observa-se uma alta variação entre os dados de armazenamento, com um periodo interquartil bem largo, indicando uma boa capadidade de armazenamento. O oposto ocorre para os anos de 2015, 2016 e 2017 em que os valores de mediana são baixos e não tem nenhum valor muito diferente que caracterize um outlier. A serie aparenta estar em um periodo de bom armazenamento de energia entre 2020 e 2024.

Aplicando o log nos valores normalizados:

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")

library(dplyr)
library(ggplot2)


df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)

df <- df %>%
  mutate(ano = format(datas, "%y"))  

Log<-log(df$SOBRADINHO/media)

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = Log)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot do log anual Energia armazenada diária do subsitema nordeste", x = "Ano", y = "log Energia armazenada diária do subsitema nordeste normalizada") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

9.9 Bloxplot anual do custo marginal de operação

setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
df$datas <- gsub("jan.", "01", df$datas)
df$datas <- gsub("fev.", "02", df$datas)
df$datas <- gsub("mar.", "03", df$datas)
df$datas <- gsub("abr.", "04", df$datas)
df$datas <- gsub("mai.", "05", df$datas)
df$datas <- gsub("jun.", "06", df$datas)
df$datas <- gsub("jul.", "07", df$datas)
df$datas <- gsub("ago.", "08", df$datas)
df$datas <- gsub("set.", "09", df$datas)
df$datas <- gsub("out.", "10", df$datas)
df$datas <- gsub("nov.", "11", df$datas)
df$datas <- gsub("dez.", "12", df$datas)

# deixando o ano com dois dígitos para quatro dígitos
df$datas <- gsub(" de (\\d{2})$", " de 20\\1", df$datas)


df$datas <- as.Date(df$datas, format = "%d de %m de %Y")


df$datas_formatada <- format(df$datas, "%d/%m/%Y")
library(dplyr)
library(ggplot2)




df <- df %>%
  mutate(ano = format(datas, "%y")) 

# boxplot dos valores anuais

ggplot(df, aes(x = factor(ano), y = SOBRADINHO)) +  # Usar o ano como eixo x
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.size = 2) +
  labs(title = "Boxplot Anual custo marginal de operação", x = "Ano", y = "R$") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta o texto do eixo x

O intervalo mais crítico do custo marginal de operação ocorreu em 2013 até 2021. Indicando uma menor eficiência do sistema. Os demais anos apresentaram uma boa eficiência quando comparado a esse periodo.

10 Gráfico de persistência da série da vazão natural afluente

Utilizou-se a vazão natural afluente normalizada e posteriormente utilizou-se a função percentil para se obter o gráfico de persistência. Com isso, foi possível percerber em quantas turbinas poderam atuar em conjunto. Isso é dado pelas linhas verticais que representam as vazões correspondentes ao engolimento das turbinas (Q1 a Q6), destacadas nos percentis associados. Percentil no eixo x: Representa a frequência relativa acumulada da vazão ao longo do tempo, do maior (100º percentil) ao menor (0º percentil). Percentis mais altos indicam situações de maior disponibilidade de água.

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")

# Vazão das turbinas normalizada pela média dos dados
vazao_turbina <- 710 / mean(df$SOBRADINHO)

# Calculo das vazões para diferentes as turbinas (Q1, Q2, ..., Q6)
turbinas <- 1:6
vazao_turbinas <- turbinas * vazao_turbina

vazao_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

#percentis
percentis <- quantile(vazao_normalizada, probs = seq(0, 1, 0.01))



cores_turbinas <- c("red", "green", "blue", "purple", "orange", "brown")  # Cores para Q1 a Q6

percentis_turbinas <- sapply(vazao_turbinas, function(vazao) {
  which.min(abs(percentis - vazao))  # Encontra o índice do percentil mais próximo da vazão
})

# Gráfico de persistência 
plot(seq(100, 0, -1), percentis, type = "l", 
     xlab = "Percentil", ylab = "Vazão Normalizada", 
     main = "Persistência da Vazão Natural Afluente Normalizada - Turbinas", 
     col = "blue", lwd = 2)
grid()

# vazões das turbinas com linhas verticais
for(i in 1:6) {
  abline(v = 100 - percentis_turbinas[i], col = cores_turbinas[i], lty = 3,lwd = 2)  # Linhas verticais para Q1, Q2, ..., Q6
}

# Adicionando a legenda ao gráfico
legend("topright",
       legend = c(paste("Q", 1:6, sep = "")),
       col = cores_turbinas, 
       lty = rep(3, 6), 
       cex = 0.8, 
       box.lwd = 1,   # espessura da borda da caixa da legenda
       bg = "white",  # Fundo branco 
       inset = 0.05)

A interpretação do gráfico pode ser dada que em mais de 90% do tempo é possível operar com ao menos 1 turbina com sua vazão nominal. Quanto mais turbinas operam em conjunto, mais as linhas verticais se aproximam.

Por fim, Colocou as linhas verticais indicando a média, mediana e o percentil, assim como a energia assegurada. Onde a energia assegurada foi calculada por meio da Equação 8.

\[ Energia_{assegurada} = \frac{457.5}{k \cdot Q_{max} \cdot \Delta H} \tag{8} \] Onde na Equação 8: - 457.5 é a Garantia física (MWm) da usina de sobradinho; -k é o fator de produtibilidade específico [MW.s/m4]; - Delta H representa uma variação entre a altura e o canal de fuga que não representa energia.

É possível obter uma energia assegurada máxima (considerando a variação de H mínima) e uma energia assegurada mínima (considerando a variação de H máxima). Sempre diminuido pelo do canal de fuga (362,5 metros) na altura.

#Sys.setlocale("LC_CTYPE", "pt_BR.UTF-8")


setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")

# Grafico de persistência para média, mediana e percentis

vazao_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

#
percentis <- quantile(vazao_normalizada, probs = seq(0, 1, 0.01))
media <- 1  # Como a série foi normalizada pela média, a média será 1
mediana <- median(vazao_normalizada)
percentil_5 <- quantile(vazao_normalizada, 0.05)
percentil_95 <- quantile(vazao_normalizada, 0.95)

# parâmetros
k = 0.009023 
Qmax = 7791 
canal_fuga = 362.5 # Dado do Hidri
Hmax = 392.5 - canal_fuga   # Delta H máximo
Hmin = 380.5 - canal_fuga   # Delta H mínimo
Energia_assegurada_minima = 457.5 / (k * Qmax * Hmax) # Garantia física (MWm)/(k*Hmax*Qmax), como é o inverso da altura, para altura máxima tem-se a assegurada mínima
Energia_assegurada_maxima = 457.5 / (k * Qmax * Hmin)


cores_referencia <- c("red", "green", "purple", "orange", "blue", "brown")  # Cores para Média, Mediana, P5, P95

dados<-c(media,mediana,percentil_5,percentil_95,Energia_assegurada_minima,Energia_assegurada_maxima)

percentis_dados <- sapply(dados, function(vazao) {
  which.min(abs(percentis - vazao))  # Encontra o índice do percentil mais próximo da vazão
})




# Plotando o gráfico de persistência (vazão normalizada)
plot(seq(100, 0, -1), percentis, type = "l", 
     xlab = "Percentil", ylab = "Vazão Normalizada", 
     main = enc2utf8("Persistência da Vazão Natural Afluente Normalizada"),  
     col = "blue", lwd = 2)
grid()


# Destacando os valores de média, mediana, percentis
abline(v = 100-percentis_dados[1], col = cores_referencia[1], lty = 2,lwd = 2)  # Linha da média
abline(v = 100-percentis_dados[2], col = cores_referencia[2], lty = 2,lwd = 2)  # Linha da mediana
abline(v = 100-percentis_dados[3], col = cores_referencia[3], lty = 2,lwd = 2)  # Linha do percentil 5%
abline(v = 100-percentis_dados[4], col = cores_referencia[4], lty = 2,lwd = 2)  # Linha do percentil 95%
abline(v = 100-percentis_dados[5], col = cores_referencia[5], lty = 2,lwd = 2)  # Linha da energia assegurada máxima
abline(v = 100-percentis_dados[6], col = cores_referencia[6], lty = 2,lwd = 2)  # Linha da energia assegurada mínima


legend("topright", 
       legend = c("Média", "Mediana", "Percentil 5%", "Percentil 95%", "Energia assegurada máxima", "Energia assegurada mínima"), 
       col = cores_referencia, 
       lty = c(2, 2, 2, 2),  
       cex = 0.8, 
       box.lwd = 1,   # espessura da borda da caixa da legenda
       bg = "white",  # Fundo branco 
       inset = 0.05) 

10.1 Persistência da energia realmente gerada

Para comparar a energia realmente gerada, foram feitos as seguintes considerações: Como tem-se a vazão natural afluente na usina em p.u., para comparar com a energia realmente gerada, como são proporcionais em p.u. criou-se o gráfico de persistência das duas séries normalizadas e, posteriormente, multiplicou ambos pelas suas reespectivas persistências, afim de compara-los.

setwd("C:/Geracao")
energia<- read.csv2("energia_gerada.csv")

setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")

df_2020 <- subset(df, datas >= as.Date("01/01/2000") & datas <= as.Date("31/12/2020"))
energia_2020 <- subset(energia, datas >= as.Date("01/01/2000") & datas <= as.Date("31/12/2020"))

# Normalizar a vazão pelo valor médio do período de 2000 a 2020
vazao <- df_2020$SOBRADINHO / mean(df_2020$SOBRADINHO)

# percentis para a vazão
percentis <- 1 - quantile(vazao, probs = seq(0, 1, length.out = length(vazao)))

# vazão em ordem decrescente
vazao_decrescente <- sort(vazao, decreasing = TRUE)

# Multiplicar os percentis pelo seu dado correspondente
aux <- percentis * vazao_decrescente

# Normalizar a energia pelo valor médio do mesmo período
energia_normalizada <- energia_2020$SOBRADINHO / mean(energia_2020$SOBRADINHO)

# percentis para a energia normalizada
percentis_energia <- 1-quantile(energia_normalizada, probs = seq(0, 1, length.out = length(energia_normalizada)))

# energia em ordem decrescente
energia_decrescente <- sort(energia_normalizada, decreasing = TRUE)

# Multiplicar os percentis pelo seu correspondente
aux_energia <- energia_decrescente * percentis_energia

cores_referencia <- c("red", "green", "purple", "orange", "blue","brown")

# Gráfico Vazão x Probabilidade
plot(
  seq(0, 1, length.out = length(vazao)), aux, type = "l", col = "blue", lwd = 2,
  xlab = "Percentis", ylab = "Vazão x Probabilidade (p.u.)", 
  main = "Vazão natural afluente x Probabilidade", ylim = range(aux)
)

# Percentis das turbinas
abline(v = 1-0.07, col = cores_referencia[1], lty = 2)  
abline(v = 1-0.4, col = cores_referencia[2], lty = 2)  
abline(v = 1-0.6, col = cores_referencia[3], lty = 2)  
abline(v = 1-0.69, col = cores_referencia[4], lty = 2)  
abline(v = 1-0.76, col = cores_referencia[5], lty = 2)  
abline(v = 1-0.82, col = cores_referencia[6], lty = 2)  
legend("topright", 
       legend = c(paste("Turbina", 1:6)),
       col = cores_turbinas,  # Diferentes cores para cada turbina
       pch = 16,  # Círculo sólido para os pontos
       cex = 0.8, 
       box.lwd = 1,   
       bg = "white",  
       inset = 0.05)

grid()

# Gráfico Energia Gerada x Probabilidade
plot(
  seq(0, 1, length.out = length(energia_normalizada)), aux_energia, type = "l", col = "green", lwd = 2,
  xlab = "Percentis", ylab = "Energia x Probabilidade (p.u.)", 
  main = "Energia Gerada x Probabilidade", ylim = range(aux_energia)
)

# Percentis das turbinas
abline(v = 1-0.07, col = cores_referencia[1], lty = 2)  
abline(v = 1-0.4, col = cores_referencia[2], lty = 2)  
abline(v = 1-0.6, col = cores_referencia[3], lty = 2)  
abline(v = 1-0.69, col = cores_referencia[4], lty = 2)  
abline(v = 1-0.76, col = cores_referencia[5], lty = 2)  
abline(v = 1-0.82, col = cores_referencia[6], lty = 2)  

legend("topright", 
       legend = c(paste("Turbina", 1:6)),
       col = cores_turbinas,  # Diferentes cores para cada turbina
       pch = 16,  # Círculo sólido para os pontos
       cex = 0.8, 
       box.lwd = 1,   
       bg = "white",  
       inset = 0.05)

grid()

No gráfico “Vazão natural afluente x Probabilidade”, observa-se uma curva decrescente que indica que as vazões mais elevadas ocorrem com menor frequência, enquanto as vazões médias e baixas têm maior probabilidade de ocorrência. As linhas verticais tracejadas correspondem aos percentis que representam o ponto de operação de cada uma das seis turbinas da usina. Já o gráfico “Energia Gerada x Probabilidade” segue um padrão semelhante, mostrando que a energia gerada diminui com a redução das vazões disponíveis, indicando uma relação entre a energia gerada e a vazão natural afluente. Os gráficos foram plotados separadamente por conta das suas escalas em y serem diferentes, mas observa-se uma semelhança quando multiplica-se tanto a vazão natural afluente e a energia gerada (ambas em p.u.) pelo seu reespectivo percentil, é possível nota a semelhança de comportamento das curvas. Um primeiro ponto é destacado que ambos passam a ser negativoa partir de 60% (0.6 no gráfico), onde a usina começa a trabalhar com duas turbinas.

11 Adição de uma nova máquina

setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
#Grafico de persistÊncia para as turbinas
# Vazão das turbinas (cada turbina tem 710 m³/s) normalizadas pela média da série
vazao_turbina <- 710 / mean(df$SOBRADINHO)


turbinas <- 1:7
vazao_turbinas <- turbinas * vazao_turbina

vazao_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)

#  percentis e a média da série normalizada
percentis <- quantile(vazao_normalizada, probs = seq(0, 1, 0.01))



cores_turbinas <- c("red", "green", "blue", "purple", "orange", "brown","black")  # Cores para Q1 a Q7

percentis_turbinas <- sapply(vazao_turbinas, function(vazao) {
  which.min(abs(percentis - vazao))  # Encontra o índice do percentil mais próximo da vazão
})


plot(seq(100, 0, -1), percentis, type = "l", 
     xlab = "Percentil", ylab = "Vazão Normalizada", 
     main = "Adição de uma turbina", 
     col = "blue", lwd = 2)
grid()

# Destacando as vazões das turbinas com linhas verticais
for(i in 1:7) {
  abline(v = 100 - percentis_turbinas[i], col = cores_turbinas[i], lty = 3, lwd = 2)  # Linhas verticais para Q1, Q2, ..., Q6 e a adicional 
}


legend("topright", 
       legend = c(paste("Q", 1:7, sep = "")),
       col = cores_turbinas, 
       lty = rep(3, 6),  
       cex = 0.8, 
       box.lwd = 1,   
       bg = "white",  
       inset = 0.05)

Observa-se que o percentual para turbina 7 é muito, representando assim um ganho muito baixo de energia. Isso é possivel a partir da função decompose no R.

12 Componentes de tendência, sazonal e randômica das séries

12.1 Componentes de tendência, sazonal e randômica da vazão afluente

setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
# Componentes de tendência, sazonal e randômica

vazao_ts <- ts(df$SOBRADINHO/mean(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

Pela componente de tendência tem-se de 2002 a 2007 foi um período de crescimento elevado, indicando melhores condições climáticas de cheias no rio São Francisco. Já entre 2009 a 2017: Declínio acentuado, indicando periodos críticos de longa duração. Posteriormente, houve um pequeno periodo de recuperação, mas que em 2021 começou a cair novamente. A sazonalidade apresenta ciclos regulares e previsíveis, podendo indicar periodos de chuva ou seca. Os ruídos aparecem em periodos mais extremos que ocorreram entre 2017 e 2019.

12.2 Componentes de tendência, sazonal e randômica da vazão natural afluente

setwd("C:/Geracao")

df <- read.csv2("vazao_natural_afluente.csv")

vazao_ts <- ts(df$SOBRADINHO/mean(df$SOBRADINHO), start = c(1931, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

A tendência geral apresenta flutuações, com períodos de estabilidade seguidos por declínios nas últimas décadas sendo o último o mais intenso. Esses declínios podem estar relacionados a mudanças climáticas e impactos humanos. A sazonalidade é consistente ao longo dos anos, com padrões regulares de aumento e redução de vazão, indicando os periodos chuvosos e secos. a componente randômica destacou eventos climáticos extremos, como enchentes e secas, que fogem ao padrão sazonal e faz com que apareçam valores extremos.

12.3 Componentes de tendência, sazonal e randômica da vazão vertida

setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
vazao_ts <- ts(df$SOBRADINHO/mean(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

A tendência é marcada por períodos pontuais de atividade, intercalados por longos períodos de inatividade, representando os momentos em que há necessidade de escoamento do reservatório. Esse comportamento sugere que a vazão vertida não é regular, sendo acionada somente em condições específicas, que é o que realmente acontece. Observa-se que a sazonalidade é praticamente 0 em grande parte do tempo, indicando pouca influência na série. O ruído apresenta picos isolados que coincidem com os períodos de vertimento

12.4 Componentes de tendência, sazonal e randômica da vazão defluente

setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
vazao_ts <- ts(df$SOBRADINHO/mean(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

A tendência é relativamente estável, com um padrão de flutuação gradual ao longo dos anos, no periodo de 2000 a 2013, aproximadamente. Mas que após esse periodo houve uma queda exponencial que só voltou a crescer em 2017 mas que ainda está instável. A sazonalidade é bem definida, refletindo o impacto dos ciclos anuais de precipitação, influência climática e etc. O ruído apresenta picos significativos em períodos específicos, podendo indicar uma operação anormal devido a condições energeticas inesperadas ou mesmo secas intensas que faz com que seja necessário reter mais água para o reservatório.

12.5 Componentes de tendência, sazonal e randômica de montante diário

setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
vazao_ts <- ts(df$SOBRADINHO/max(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

Incialmente entre 2004 e 2010, o reservatório manteve níveis praticamnete constante, indicando que houve uma grande estabilidade no controle da cota. Porém, logo em seguida houve uma queda repentina que se manteve em valores baixos entre 2015 e 2017. Posteriormente, houve uma boa crescente no nível de água da hidréletrica, indicando uma possível recuperação do seu reservartório. A sazonalidade é bastante regular e reflete a variação cíclica anual do nível do montante. O ruído apresenta variações pequenas, com a maior parte dos valores muito próximos ao nível médio. Isso evidencia que o nível do montante é fortemente controlado, com pouca influência de eventos aleatórios ou extremos.

12.6 Componentes de tendência, sazonal e randômica do volume útil diário

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
vazao_ts <- ts(df$SOBRADINHO/100, start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

2001 a 2005: A tendência é predominantemente crescente, indicando que houve condições favoráveis (Chuvas provavelmente) de armazenamento. 2006 a 2017: Observa-se uma queda acentuada na tendência, que coincide com os períodos críticos de baixa disponibilidade hídrica. Por fim, há recuperação gradual, com aumento na tendência até cerca de 2022, estabilizando-se em níveis intermediários. A forte presença da sazonalidade reforça a influência dos ciclos climáticos naturais no comportamento do reservatório, seja ligado a epocas do ano, a influência do homem e outros fatores. Os ruídos mais intensos ocorrem em 2014-2016, indicando eventos não explicados por tendências ou sazonalidade ( mudanças extremas nas condições climáticas ou intervenções operacionais).

12.7 Componentes de tendência, sazonal e randômica da Energia natural afluente bruta do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")

vazao_ts <- ts(df$SOBRADINHO/max(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

A componente de tendência apresenta um grande decaimento entre 2005 e 2018 aproximadamente, seguido de um periodo de aparente recuperação para os anos seguintes. A sazonalidade está bem definida para todos o periodo.

12.8 Componentes de tendência, sazonal e randômica da Energia armazenada diária do subsitema

setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
vazao_ts <- ts(df$SOBRADINHO/max(df$SOBRADINHO), start = c(2000, 1), frequency = 365)

# Decompor a série
decomp <- decompose(vazao_ts, type = "multiplicative")

# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomp$trend
sazonal <- decomp$seasonal
randomico <- decomp$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

A componente de tendência mostra períodos bem definidos de aumento e declínio na energia armazenada. Inicialmente, há um comportamento inicial crescente seguido de estabilidade até 2010, posteriormente há uma queda acentuada até 2016, por conta de uma crise hídrica. Após 2016, há uma recuperação gradual, com tendência crescente até 2021, indicando melhora nas condições hídricas

13 Série de temporal de média móvel da vazão natural afluente

Para a vazão natural afluente, foi realizado a média móvel de 12 meses, a fim de realizar as seguintes analises:

  • O sumário estatístico;

  • A autocorrelação;

  • O Histograma;

  • As componentes de tendência, sazonal e randômica.

13.1 Sumário estatísco

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")

library(zoo)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y") # Ajuste o formato 
df$SOBRADINHO <- as.numeric(df$SOBRADINHO)

# Calcular a média móvel de 12 meses
df$media_movel_12 <- rollmean(df$SOBRADINHO, k = 12, fill = NA, align = "right")
df <- df[!is.na(df$media_movel_12), ]


#Sumario média móvel
summary(df$media_movel_12)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   162.2  1101.8  1759.0  2520.2  3429.2 18228.1

14 Autocorrelação

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
library(zoo)


# média móvel 
df$media_movel_12m <- rollmean(df$SOBRADINHO, k = 12, fill = NA)

# Remover valores NA para a média móvel
media_movel <- na.omit(df$media_movel_12m)

# Ajustar o tamanho da janela de plotagem e o tamanho do título
par(mar = c(5, 4, 4, 2) + 0.1)  # Ajusta as margens do gráfico
acf(media_movel, main = "Autocorrelação - Média Móvel de 12 Meses", las = 1, cex.main = 0.8)  # Ajusta o tamanho do título

Pode-se observar que houve uma grande correlação entre a vazão e os anos seguintes, durante mais de 20 anos, onde a correlação passou a ser menor que 0,8 mas em todos os casos, as linhas ficarão acima da azul, indicando que essas indicações não são tão influênciados por ruídos. A linha azul indica a correlação zero.

14.1 Histograma

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
df$SOBRADINHO <- as.numeric(df$SOBRADINHO)



df$media_movel_12m <- rollmean(df$SOBRADINHO, k = 12, fill = NA)


media_movel <- na.omit(df$media_movel_12m)


hist_data <- hist(media_movel,
                  plot = FALSE,  
                  breaks = 120)

n <- length(media_movel)
frequencia_normalizada <- hist_data$counts / n

plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma da média móvel", 
     xlab = "[m³/s]", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1) 

Normalizado pela média tem-se:

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
df$SOBRADINHO <- as.numeric(df$SOBRADINHO)



df$media_movel_12m <- rollmean(df$SOBRADINHO, k = 12, fill = NA)

# Remover valores NA para a média móvel
media_movel <- na.omit(df$media_movel_12m)


hist_data <- hist(media_movel/mean(media_movel),
                  plot = FALSE,   #
                  breaks = 120)

n <- length(media_movel)
frequencia_normalizada <- hist_data$counts / n


plot(hist_data$mids, frequencia_normalizada, type = "h",  
     lwd = 2, main = "Histograma da média móvel normalizado", 
     xlab = "p.u", ylab = "Proporção", las = 1)

axis(2, 
     at = seq(0, max(frequencia_normalizada)),
     labels = round(seq(0, max(frequencia_normalizada)), 4),
     las = 1) 

O histograma demonstra que a maior parte dos valores da média móvel está concentrada em níveis mais baixos (próximos ao limite inferior da série), com uma longa cauda à direita. Indicando que valores maiores que a média ocorrem esporadicamente.

14.2 Componentes de tendência, sazonal e randômica

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
df$SOBRADINHO <- as.numeric(df$SOBRADINHO)

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# Calcular a média móvel mensal
#Com tamanho de 30 anos
df$media_movel_mensal <- rollapply(df$SOBRADINHO, width = 30, FUN = mean, fill = NA, align = "right")


df$mes <- format(df$datas, "%Y-%m")  #  coluna com o mês no formato "yyyy-mm"
df_media_movel_mensal <- aggregate(df$media_movel_mensal, by = list(df$mes), FUN = mean, na.rm = TRUE)


colnames(df_media_movel_mensal) <- c("mes", "media_movel_mensal")

# série temporal para a média móvel mensal
ts_media_movel_mensal <- ts(df_media_movel_mensal$media_movel_mensal, 
                            start = c(as.numeric(substr(df_media_movel_mensal$mes[1], 1, 4)), 
                                      as.numeric(substr(df_media_movel_mensal$mes[1], 6, 7))),
                            frequency = 12)  

# Decompor a série temporal
decomposicao <- decompose(ts_media_movel_mensal, type = "multiplicative")  


# Extrair as componentes de tendência, sazonal e ruído
tendencia <- decomposicao$trend
sazonal <- decomposicao$seasonal
randomico <- decomposicao$random

# Ajustar as margens e configurar o layout para 3 gráficos
par(mfrow = c(3, 1), mar = c(2, 4, 2, 2))  # Definir margens menores
plot(tendencia, main = "Componente de Tendência", xlab = "Tempo", ylab = "Tendência",las=1)
plot(sazonal, main = "Componente Sazonal", xlab = "Tempo", ylab = "Sazonalidade",las=1)
plot(randomico, main = "Componente Randômica", xlab = "Tempo", ylab = "Ruído",las=1)

grid()

Observa-se que a componente de tendência sofreu a maior queda posterior ao ano de 2010, indicando o periodo crítico da usina.

15 Variação da Vazão natural afluente normalizada e Armazenamento da usina

Foi realizado o gráfico da variação das seguintes séries:

  • Vazão natural afluente normalizada;

  • Armazenamento da usina em %.

15.1 Vazão natural afluente normalizada

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
#Variação

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# Calcular a variação percentual entre os valores consecutivos para fazer o gáfico de variação
variacao <- diff(df$SOBRADINHO) / head(df$SOBRADINHO, -1) * 100

#  tempo correspondente à variação (removendo o primeiro valor)
tempo <- df$datas[-1]

# Criar um gráfico de variação com o tempo como eixo X
plot(tempo, variacao, type = "l", col = "blue", xlab = "Tempo", ylab = "Variação (%)", main = "Variação da Série Natural afluente")

Entre os anos de 1931 até 1960, observa-se uma alta variabilidade da vazão natural afluente, com valores ultrapassando 40% de variação. Posteriormente de 1960 até 1980 não ocorre tantas variações, estando contidas no intervalo de -10 a 20%. As maiores variações ocorreram principalmente após os anos 2000, emq ue observa-se um pico de aproximadamente 80% e momentos próximoa 2020 em que a variação chegou a -30% indicando possíveis secas.

15.2 Armazenamento da usina

setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
#Variação

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")

# Calcular a variação percentual entre os valores consecutivos para fazer o gáfico de variação
variacao <- diff(df$SOBRADINHO) / head(df$SOBRADINHO, -1) * 100

#  tempo correspondente à variação (removendo o primeiro valor)
tempo <- df$datas[-1]

# Criar um gráfico de variação com o tempo como eixo X
plot(tempo, variacao, type = "l", col = "blue", xlab = "Tempo", ylab = "Variação (%)", main = "Variação da Série de volume útil")
grid()

No gráfico do volume útil, a análise se concentra em um período mais recente (de 2000 até 2020).Entre 2000 e 2015 observa-se que a variação do volume útil só ultrapassou 10% uma vez. Já entre 2015 e 2020 observa-se que há um momento de altas variações do volume útil, e por fim, após 2020 as variações são as mais baixas. A vazão natural afluente apresenta maior variabilidade na sua série, enquanto o volume útil tem sua oscilação mais limitada, o que pode ser justificado já que o reservatório é controlado atravez das vazões que entram e saem da hidrelétrica. Porém, grandes variações em ambas as séries podem indicar condições extremas como secas ou chuvas que podem alterar esses dois parâmetros drasticamente.

16 Periodo crítico de Sobradinho

O periodo crítico da usina de Sobradinho foi calculado no intervalo de 60 meses, com inicio em 11/12/2012, e fim em 11/11/2017. Esse periodo não corresponde ao mesmo periodo crítico do SIN que ocorreu em 1949 e 1956.

setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")

df$datas <- as.Date(df$datas, format = "%d/%m/%Y")


df <- df[order(df$datas), ]

# CalculO da média móvel de 5 anos (60 meses)
library(zoo)
df$media_movel <- rollapply(df$SOBRADINHO, width = 60, FUN = mean, align = "right", fill = NA)

# menor valor da média móvel
periodo_critico <- df[which.min(df$media_movel), ]
print(periodo_critico)
##            datas SOBRADINHO media_movel
## 31727 2017-11-11        346    389.8667

Porém, o ONS já vem considerando um novo período crítico (junho de 2012 até dezembro de 2020), com duração de 103 meses. Levando em consideração o novo periodo crítico do SIN e o periodo crítico de Sobradinho conclui-se que o intervalo de tempo crítico de Sobradinho está contido no intervalo crítico do SIN. Ou seja, o periodo crítico de Sobradinho (levando em consideração a média móvel de 5 anos) ocorreu durante o periodo crítico do SIN.

17 Eficiência da usina

Para o calculo da eficiência como foi considerado os dados de geração realmente gerada (MWm), nível do montante diário(m) e a vazão turbinada pela hidrelétrica(m³/s) . Com isso, aplicou-se a Equação (6), afim de analisar o valor de k ao longo do tempo. Os dados de vazão turbinada no Operador Nacional do Sistema Elétrico (ONS) (2024a) para a hidrelétrica de Sobradinho está disponível apenas no intervalo: 26/08/2007 até 12/01/2022. Com isso, o primeiro passo foi deixar os dados com o mesmo tamanho para que depois seja possível calcular o valor de k.

library(dplyr)
library(purrr)  
library(xts)
library(ggplot2)


setwd("C:/Geracao")
df <- read.csv2("C:/Geracao/vazao_turbinada.csv")
energia <- read.csv2("energia_gerada.csv")
cota <- read.csv2("nivel_de_montante_m.csv")

canal_fuga = 362.5 #Canal de fuga do hidr


df$Datas <- as.Date(df$Datas, format = "%d/%m/%Y")
energia$datas <- as.Date(energia$datas, format = "%d/%m/%Y")
cota$datas <- as.Date(cota$datas, format = "%d/%m/%Y")

# Intervalo desejado
data_inicio <- as.Date("2007-08-26")
data_fim <- as.Date("2022-01-12")

# Filtrar os dados no intervalo especificado
df_filtrado <- df %>%
  filter(Datas >= data_inicio & Datas <= data_fim)

energia_filtrada <- energia %>%
  filter(datas >= data_inicio & datas <= data_fim)

cota_filtrada <- cota %>%
  filter(datas >= data_inicio & datas <= data_fim)


dados_combinados <- reduce(
  list(df_filtrado, energia_filtrada, cota_filtrada),
  function(x, y) merge(x, y, by.x = ifelse("Datas" %in% names(x), "Datas", "datas"),
                        by.y = ifelse("Datas" %in% names(y), "Datas", "datas"), all = FALSE)
)

# Separar as colunas relevantes após o merge
df_alinhado <- dados_combinados %>%
  select(Datas, SOBRADINHO.x) %>%  
  rename(SOBRADINHO = SOBRADINHO.x) 

energia_alinhada <- dados_combinados %>%
  select(Datas, SOBRADINHO.y) %>%  
  rename(SOBRADINHO = SOBRADINHO.y)  

cota_alinhada <- dados_combinados %>%
  select(Datas, SOBRADINHO) 


#print(dim(df_alinhado))
#print(dim(energia_alinhada))
#print(dim(cota_alinhada))


energia_alinhada$SOBRADINHO <- as.numeric(energia_alinhada$SOBRADINHO)
df_alinhado$SOBRADINHO <- as.numeric(df_alinhado$SOBRADINHO)
cota_alinhada$SOBRADINHO <- as.numeric(cota_alinhada$SOBRADINHO)



k=energia_alinhada$SOBRADINHO/(df_alinhado$SOBRADINHO*(cota_alinhada$SOBRADINHO-canal_fuga))


library(ggplot2)

ggplot() +
  geom_line(aes(x = df_alinhado$Datas, y = k), color = "blue", size = 1) + 
  labs(
    title = "Variação de K para Sobradinho",
    x = "anos",
    y = "MW.s/m^4"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),  # Centralizar título
    panel.grid.minor = element_blank()  # Remover as grades menores para clareza
  ) +
  scale_x_date(
    breaks = "1 year",  # Colocar uma quebra anual
    labels = scales::date_format("%Y"),  
    expand = c(0, 0)  
  ) +
  scale_y_continuous(
    breaks = seq(0, max(k, na.rm = TRUE), by = 5),  #Quebra de 5 em 5
    labels = scales::comma  
  )

Observa-se no gráfico acima que durante o periodo inicial de analise a eficiência da usina estava bem, com valores de k majoritariamente acima de 5 MW.s/m^4. Porém, durante o periodo crítico observasse que esse valor vai praticamente a zero, abaixo utilizou-se o R para aplicar a função summary e observar o valor mínimo, média e o valor máximo:

summary(k)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##  0.006536  0.014189  5.723757  5.926927  9.486191 25.401206

Observa-se que o periodo crítico da usina, fez com que a mesma tive-se um rendimento praticamente zero, mas que o valor intermediário de dados (mediana) está acima de 5,7 MW.s/m^4 e que 25% dos valores estão acima de 9,48 MW.s/m^4. No periodo crítico nota-se que esporadicamente há um valor de k mais elevado mas que rapidamente decai a quase zero. O box plot de k pode apresentar melhor a distribuição dos valores de k como segue a seguir

boxplot(k, 
        main = "Variação de K para Sobradinho",    # Título do gráfico
        ylab = "MW.s/m^4",                       
        col = "lightblue",                      # Cor do box
        border = "black")                       # Cor da borda do box
abline(h = mean(k), col = "red", lwd = 2, lty = 2)

18 Conclusão

Este trabalhou abordou diversos dados sobre a hidrelétrica de Sobradinho, onde foi possível observar o efeito do seu periodo crítico em dados como diversas vazões, energia, custo marginal de operação e outros. Observou-se que levando em consideração a usina de Sobradinho o novo período crítico do SIN está de acordo, mas obviamente, outras usinas devem ser levadas em consideração. Observou-se como diversos mecanismo de estatística auxiliam na analise e permitem tirar conclusões mais certeiras e com a menor inflência possível dos “ruídos”. Este estudo permite levantar dados da usina que podem auxiliar em previsões, tomadas de decisões e planejamentos para periodos críticos ou até mesmo periodos de abundância. Vale ressaltar que os “piores” e “melhores” cenârios não são valores estáticos no tempo, eles podem ocorrer devido a influência humana e ao ciclo da natureza, sem que seja possível ao analistas de dados prever qual será o mais extremo.

Referências:

Companhia Hidro Elétrica do São Francisco (CHESF). 2024. “Usina Hidrelétrica de Sobradinho.” 2024. https://www.chesf.com.br/SistemaChesf/Pages/SistemaGeracao/Sobradinho.aspx.
Guilherme, Antônio. 2024. “Blog de Antônio Guilherme.” 2024. https://www.antonioguilherme.web.br.com/blog/.
IBM. 2024. “Autocorrelação.” 2024. https://www.ibm.com/br-pt/topics/autocorrelation.
Júnior, PUC Consultoria. 2024. “Histograma: O Que é e Como Usar.” 2024. https://pucconsultoriajr.com.br/histograma-o-que-e-e-como-usar/.
Matemática e Estatística - UFRGS, Instituto de. 2024. “Apostila de Estatística Básica.” 2024. https://www.ufrgs.br/probabilidade-estatistica/extra/material/apostila_de_estatistica_basica.pdf.
Operador Nacional do Sistema Elétrico (ONS). 2024a. “Histórico Da Operação - Dados Gerais.” 2024. https://www.ons.org.br/paginas/resultados-da-operacao/historico-da-operacao/dados-gerais.
———. 2024b. “Página de Autenticação Do ONS.” 2024. https://sso.ons.org.br/auth/realms/ONS/protocol/openid-connect/auth?client_id=POP&redirect_uri=https%3A%2F%2Fpops.ons.org.br%2Fons.pop.federation%2FAzure%2F&response_type=code&scope=openid&code_challenge=zEJe1iVadaLobPegX6TgHkT3b-p0goY19xKUbpqoPZE&code_challenge_method=S256&state=OpenIdConnect.AuthenticationProperties%3DFaaxn8Q86I0OuqUT6Rm7LOf6-nWBKG_pr0OR6gpi7hoeeLGTuOI5w3JQ-9fOclZZ0GdUYPI51JgxR2SRQortxvlqY0Zoac0Tb35zascCFjKVpswv-VwcVHlXcRTra31r_OQ8DLi688OQAQNBLfXTZrzuDctJey7h-jr9hMBt6mWe1dtx54xVZuG8iXVjZI5WI2XE7_NYJoAn_OskoMBk3yPvDyvvDdOUWJVkK6ITG5hhdgUZfdsW4V6G18t1ejWe8xH6eekkmXNHGeqj3Z_RuUZ3ATGaGhJu6B0JgzuVD74__ti99Qo8x_sL_aikoSBCi96zAAlBtRxt3Jk4K5IlhRT3bCjK48Ptic2VnopakWK1w64zrN4PgQVWpbHyCuib7n38had1TmiScHwlkzIRC4rMCGYrQDiZlEHPh5DdqTCmHxGLVAV2GVCDA7YtLJN6O1hra7EvE-1G601Gg9IzyzI5Thlt4ElUSTX7vO41JjM_wg0jeFuzQOwychGI0W-MhKeWm-2eRvN37QHQFGl5AR91BNHum4weqL1JAbJAVGdh_v_9DoVKVKL41Hwlje_KZxqt8rvtzBwP8Tz1y-iyn48mk1nr5mpfgGzc58JulqmzQHaK0Rlh_XMDpm55NurimzKqAQ&response_mode=form_post&nonce=638667785951650102.MGMzODI5MDItNzEwYi00M2E1LTg3M2QtNWFiOTQ3M2U2NzEwNjY1M2RkNGEtNTQzOS00ZGM1LWEyOTAtODBhMjQxZGQ1OTlh&x-client-SKU=ID_NET461&x-client-ver=5.3.0.0.
Wikipedia. 2024. “Usina Hidrelétrica de Sobradinho.” 2024. https://pt.wikipedia.org/wiki/Usina_Hidrel%C3%A9trica_de_Sobradinho.