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:
.
Reservatório:
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).
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).
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.
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).
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.
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.
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.
Porém, nesta ultima figura é utilizado o conceito de densidade a fim de tornar essa análise mais rápida e fácil.
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.
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.
É 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.
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.
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.
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;
-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).
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:
\[ C = (-9.55E-18){V^4}+(1,16E-12){V^3}+(-5.35E-8){V^2}+(1.40E-3){V^1}+3.74E2\tag{3} \] 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)
# Remover linhas com NA em colunas PCV
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.), ]
# Definir volume máximo e mínimo
Vol_max <- 34116
vol_min <- 5447
# Criar sequência de volumes
volume <- seq(Vol_max, vol_min, length.out = 1000)
#print(df$PCV.4.)
# Garantir que os coeficientes sejam numéricos
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.)
# Criar o polinômio usando a primeira linha
cota <- (df$PCV.4. * volume^4)+(df$PCV.3.*volume^3)+(df$PCV.2.*volume^2)+(df$PCV.1. * volume)+(df$PCV.0.)
# Verificar valores gerados
#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.
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")
# Carregar o dataframe
df <- read.csv2("Hidr.csv")
# Definir as áreas e volume máximo
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³
# Selecionar as colunas de evaporação "Evap.Men.1." até "Evap.Men.12."
evaporacao <- df[, paste0("Evap.Men..", 1:12, ".")]
# Remover linhas com NA nas colunas de evaporação
evaporacao_clean <- na.omit(evaporacao)
# Converter as colunas para numéricas
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)
# Criar uma sequência de meses (1 a 12)
meses <- 1:12
# Plotar o gráfico com as 3 linhas de evaporação para as 3 áreas
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")
# Personalizar os valores do eixo X (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")
# Adicionar 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)
# Adicionar a 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 para facilitar a leitura
grid(col = "gray", lty = "dotted")
#___________________________________________________________________________________________
#Normalizado
# Selecionar as colunas de evaporação "Evap.Men.1." até "Evap.Men.12."
evaporacao <- df[, paste0("Evap.Men..", 1:12, ".")]
# Remover linhas com NA nas colunas de evaporação
evaporacao_clean <- na.omit(evaporacao)
# Converter as colunas para numéricas
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
# Criar uma sequência de meses (1 a 12)
meses <- 1:12
# Plotar o gráfico com as 3 linhas de evaporação para as 3 áreas
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")
# Personalizar os valores do eixo X (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")
# Adicionar 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)
# Adicionar a 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 para facilitar a leitura
grid(col = "gray", lty = "dotted")
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).
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
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
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]
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
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
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
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
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
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
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
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
setwd("C:/Geracao")
df <- read.csv2("vazao_afluente.csv")
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
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 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, # 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 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)
## Warning in log(normal): NaNs produzidos
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 afluente normalizado com log aplicado",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
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.
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
plot = FALSE, # Não exibe o gráfico automaticamente
breaks = 130)
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",
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)
# histograma da vazão natural afluente
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
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",
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 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 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,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
axis(2,
at = seq(0, max(frequencia_normalizada)),
labels = round(seq(0, max(frequencia_normalizada)), 4),
las = 1)
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
#Fazer um histograma sem normalização
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
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 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 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 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 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 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 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 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, # 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 vazão vertida normalizada com log",
xlab = "p.u.", ylab = "Proporção")
setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
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 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 o texto 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, # 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 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, # 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 defluente normalizado com log aplicado",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
axis(2,
at = seq(0, max(frequencia_normalizada)),
labels = round(seq(0, max(frequencia_normalizada)), 4),
las = 1)
setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(df$SOBRADINHO,
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 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 o texto 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, # 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 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, # 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 do nivel de montante normalizado com log",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
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.
setwd("C:/Geracao")
df<- read.csv2("geracao_horaria.csv")
hist_data <- hist(df$X15.de.marco,
plot = FALSE, # Não exibe o gráfico automaticamente
breaks = 25)
n <- length(df$X15.de.marco)
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 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, # Não exibe o gráfico automaticamente
breaks = 25)
n <- length(df$X15.de.marco)
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 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, # Não exibe o gráfico automaticamente
breaks = 25)
n <- length(df$X15.de.marco)
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 = "Geração horáia normalizado com log aplicado",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
axis(2,
at = seq(0, max(frequencia_normalizada)),
labels = round(seq(0, max(frequencia_normalizada)), 4),
las = 1)
setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
hist_data <- hist(df$SOBRADINHO,
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 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) # Coloca o texto na horizontal
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 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 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 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 volume útil normalizado normalizado com log",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
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.
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 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 da 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) # Coloca o texto na horizontal
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 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 = "energia natural afluente bruta do subsistema 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 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 = "log da energia natural afluente bruta do subsistema",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
axis(2,
at = seq(0, max(frequencia_normalizada)),
labels = round(seq(0, max(frequencia_normalizada)), 4),
las = 1)
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 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 da 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) # Coloca o texto na horizontal
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 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 = "energia armazenada diária do subsistema 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)
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 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 = "log da energia armazenada diária do subsistema",
xlab = "p.u.", ylab = "Proporção", las = 1,color='blue')
## Warning in plot.window(...): "color" não é um parâmetro gráfico
## Warning in plot.xy(xy, type, ...): "color" não é um parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in axis(side = side, at = at, labels = labels, ...): "color" não é um
## parâmetro gráfico
## Warning in box(...): "color" não é um parâmetro gráfico
## Warning in title(...): "color" não é um parâmetro gráfico
axis(2,
at = seq(0, max(frequencia_normalizada)),
labels = round(seq(0, max(frequencia_normalizada)), 4),
las = 1)
setwd("C:/Geracao")
df<- read.csv2("custo_marginal.csv")
# Substituir os meses abreviados por seu número correspondente
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 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")
# Agora formate para 'dd/mm/yyyy'
df$datas_formatada <- format(df$datas, "%d/%m/%Y")
hist_data <- hist(df$SOBRADINHO,
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 = "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) # Coloca o texto na horizontal
O custo marginal de operação não foi normalizada.
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.
setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
#Boxplot sem normalização
boxplot(df$SOBRADINHO,
main = "Box Plot de Vazão afluente [m³/s]", # 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)
## Warning in log(normal): NaNs produzidos
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.
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
boxplot(df$SOBRADINHO,
main = "Box Plot de Vazão natural afluente [m³/s]", # 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
summary(normal)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.06189 0.43443 0.69112 1.00000 1.35765 7.34965
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)
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
boxplot(df$SOBRADINHO,
main = "Box Plot de Vazão afluente [m³/s]", # 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 = "Valores (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
summary(df_normal)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.001913 0.516883 0.827683 1.000000 1.425613 3.433138
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)
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)
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)
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
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)
setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
boxplot(df$SOBRADINHO,
main = "Box Plot da Energia Natural Afluente Bruta do subsistema Nordeste MWm", # 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 = "Box Plot Energia Natural Afluente Bruta do subsistema em 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_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 = "Box Plot do 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)
setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
boxplot(df$SOBRADINHO,
main = "BoxPlot da 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)
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)
# Substituir 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")
# Agora formate para 'dd/mm/yyyy'
df$datas_formatada <- format(df$datas, "%d/%m/%Y")
boxplot(df$SOBRADINHO,
main = "Boxplot custo marginal", # Título do gráfico
ylab = "custo marginal (R$)",
col = "lightblue", # Cor do box
border = "black") # Cor da borda do box
abline(h = mean(df$m), col = "red", lwd = 2, lty = 2)
## Warning in mean.default(df$m): argumento não é numérico nem lógico: retornando
## NA
setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
library(xts)
## Warning: pacote 'xts' foi compilado no R versão 4.4.2
## Carregando pacotes exigidos: zoo
##
## Anexando pacote: 'zoo'
## Os seguintes objetos são mascarados por 'package:base':
##
## as.Date, as.Date.numeric
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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()
Para a série temporal da natural afluente, dividiu-se em 3 periodos iguais como segue a baixo
library(xts)
library(zoo) # Para agregação de dados
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
# Converter a coluna de datas
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)
# Agregar os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)
## NOTE: `apply.monthly(..., FUN = mean)` operates by column, unlike other math
## functions (e.g. median, sum, var, sd). Please use `FUN = colMeans` instead,
## and use `FUN = function(x) mean(x)` to take the mean of all columns. Set
## `options(xts.message.period.apply.mean = FALSE)` to suppress this message.
# 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 1: 1931 a 1960
plot(serie1, type = "l", col = "blue",
main = "Vazão natural afluente Sobradinho (1931-1960)",
xlab = "Data", ylab = "[m³/s]")
grid()
library(xts)
library(zoo) # Para agregação de dados
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
# Converter a coluna de datas
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)
# Agregar os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)
## NOTE: `apply.monthly(..., FUN = mean)` operates by column, unlike other math
## functions (e.g. median, sum, var, sd). Please use `FUN = colMeans` instead,
## and use `FUN = function(x) mean(x)` to take the mean of all columns. Set
## `options(xts.message.period.apply.mean = FALSE)` to suppress this message.
# 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 Sobradinho (1961-1990)",
xlab = "Data", ylab = "[m³/s]")
grid()
library(xts)
library(zoo) # Para agregação de dados
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
# Converter a coluna de datas
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
serie_temporal <- xts(df$SOBRADINHO, order.by = df$datas)
# Agregar os dados para média mensal
serie_mensal <- apply.monthly(serie_temporal, mean)
## NOTE: `apply.monthly(..., FUN = mean)` operates by column, unlike other math
## functions (e.g. median, sum, var, sd). Please use `FUN = colMeans` instead,
## and use `FUN = function(x) mean(x)` to take the mean of all columns. Set
## `options(xts.message.period.apply.mean = FALSE)` to suppress this message.
# 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 Sobradinho (1991-2020)",
xlab = "Data", ylab = "[m³/s]")
grid()
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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()
setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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()
setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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 Sobradinho",
xlab = "Data", ylab = "[m] ")
grid()
# Criar o vetor de horas
# Criar o vetor de horas para um único dia
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")
# Verifique o nome correto da coluna com os dados (exemplo: "Sobradinho")
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 Sobradinho",
xlab = "Horas", ylab = "MW")
grid()
setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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 = "%")
grid()
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")
# Criar a série temporal no formato xts
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()
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")
# Criar a série temporal no formato xts
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()
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)
# Substituir 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")
# Agora formate para 'dd/mm/yyyy'
df$datas_formatada <- format(df$datas, "%d/%m/%Y")
library(xts)
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Criar a série temporal no formato xts
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()
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.
setwd("C:/Geracao")
df<- read.csv2("vazao_afluente.csv")
library(dplyr)
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:xts':
##
## first, last
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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
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"))) # Extrair o ano como número
# Criar subsets para cada intervalo de 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)
# 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 = "Vazão 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 = "Vazão 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 = "Vazão 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)
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
setwd("C:/Geracao")
df<- read.csv2("Vazao_defluente.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-mean(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
setwd("C:/Geracao")
df<- read.csv2("nivel_de_montante_m.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
## Bloxplot anual do volume útil diário
setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-100
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
setwd("C:/Geracao")
df<- read.csv2("energia_natural_afluente_bruta_do_subsistema_da_sua_usina_em_mwm.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Energia natural afluente bruta do subsitema", 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
setwd("C:/Geracao")
df<- read.csv2("energia_armazenada_diaria_no_subsistema_de_sua_usina_em_gwh.csv")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
media<-max(df$SOBRADINHO)
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
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)
# Substituir 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")
# Agora formate para 'dd/mm/yyyy'
df$datas_formatada <- format(df$datas, "%d/%m/%Y")
library(dplyr)
library(ggplot2)
# Converter a coluna de datas para o formato Date, caso ainda não esteja
# Adicionar a coluna de ano
df <- df %>%
mutate(ano = format(datas, "%y")) # Extrair o ano como texto
# Criar o 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 = "Vazão p.u.") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ajusta o texto do eixo x
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 (cada turbina tem 710 m³/s)
vazao_turbina <- 710 / mean(df$SOBRADINHO)
# Calculo das vazões para diferentes números de turbinas ligadas (Q1, Q2, ..., Q6)
turbinas <- 1:6
vazao_turbinas <- turbinas * vazao_turbina
vazao_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)
# Calculo dos percentis
percentis <- quantile(vazao_normalizada, probs = seq(0, 1, 0.01))
# Definir cores para as turbinas
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 para média, mediana e percentis
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()
# Destacando as 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), # Linhas com estilo 3 para as turbinas
cex = 0.8,
box.lwd = 1, # Ajustar a espessura da borda da caixa da legenda
bg = "white", # Fundo branco para a legenda
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 dada pelas seguintes formulas: \[ Energia_{assegurada} = \frac{457.5}{k \cdot Q_{max} \cdot \Delta H} \tag{5} \] Onde na Equação 5: - 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.
# Definir a codificação para UTF-8
#Sys.setlocale("LC_CTYPE", "pt_BR.UTF-8")
# Carregar o arquivo CSV
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)
# Calcular os percentis e a média da série normalizada
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)
# Definir parâmetros adicionais
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)
# Definir cores para a média, mediana, percentis
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"), # Usando enc2utf8 para garantir a codificação correta
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
# Adicionando a legenda ao gráfico
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), # Linha com estilo 2 para as referências
cex = 0.8,
box.lwd = 1, # Ajustar a espessura da borda da caixa da legenda
bg = "white", # Fundo branco para a legenda
inset = 0.05)
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 transformar em energia, basta multiplicar pelo fator de produtibilidade específico [MW.s/m4] e pela variação de altura. Já que a energia em p.u. não depende mais do tempo por conta da normalização. A outra consideração foi considerar os valores de 01/01/2000, para se ter uma amostragem de dados igual para comparação. Com isso, a energia gerada a partir de um valor de vazão em p.u é dada pela Equação 6.
\[ Energia_{gerada} = {k \cdot Q \cdot \Delta H} \tag{5} \]
setwd("C:/Geracao")
energia<- read.csv2("energia_gerada.csv")
setwd("C:/Geracao")
df <- read.csv2("vazao_natural_afluente.csv")
#Item 6 energia a partir da persistência da vazão natural afluente normalizada
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
# Filtrar os dados entre 01/01/2020 e 31/12/2020
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 apenas para o período selecionado
vazao_2020 <- df_2020$SOBRADINHO
vazao_normalizada_2020<-vazao_2020/mean(vazao_2020)
summary(vazao_normalizada_2020)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.06199 0.43471 0.69060 1.00000 1.35696 7.36098
# Calcular os percentis e a média da série normalizada
percentis_max <- quantile((vazao_2020*k*Hmax), probs = seq(0, 1, 0.01))
percentis_min<- quantile((vazao_2020*k*Hmin), probs = seq(0, 1, 0.01))
energia_2020 <- energia_2020$SOBRADINHO
summary(energia_2020)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 102.0 231.0 327.0 352.7 462.0 1035.0
percentis_energia <- quantile(energia_2020, probs = seq(0, 1, 0.01))
summary(percentis_energia)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 102.0 231.0 327.0 354.9 462.0 1035.0
summary(percentis_max)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 42.23 296.13 470.46 705.76 924.41 5014.53
summary(percentis_energia)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 102.0 231.0 327.0 354.9 462.0 1035.0
# Plotar as duas curvas no gráfico
plot(seq(100, 0, -1), percentis_max, type = "l",
xlab = "Percentil", ylab = "Energia (MWm)",
main = "energia realmente gerada x energia da persistência",
col = "blue", lwd = 2, las = 1)
lines(seq(100, 0, -1), percentis_min, col = "red", lwd = 2) # Adicionar a segunda curva
lines(seq(100, 0, -1), percentis_energia, col = "green", lwd = 2)
grid()
legend("topright", legend = c("Percentis Máximos", "Percentis Mínimos", 'Energia realmente gerada'),
col = c("blue", "red","green"), lwd = 2)
Os percentis mínimos e máximos representam a energia gerada para uma determinada variação de altura.
A grande diferença é nítida pois está considerando que toda a vazão natural afluente está produzindo energia. Por isso que a energia realmente gerada não se encontra integralmente dentro dos limites de máximos e mínimos.
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)
vazao_turbina <- 710 / mean(df$SOBRADINHO)
# Calcular as vazões para diferentes números de turbinas ligadas (Q1, Q2, ..., Q6)
turbinas <- 1:7
vazao_turbinas <- turbinas * vazao_turbina
#Grafico de persistÊncia para media, mediana e percentis
vazao_normalizada <- df$SOBRADINHO / mean(df$SOBRADINHO)
# Calcular os percentis e a média da série normalizada
percentis <- quantile(vazao_normalizada, probs = seq(0, 1, 0.01))
# Definir cores para as turbinas
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
})
# Gráfico de persistência para média, mediana e percentis
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
}
# Adicionando a legenda ao gráfico
legend("topright",
legend = c(paste("Q", 1:7, sep = "")),
col = cores_turbinas,
lty = rep(3, 6), # Linhas com estilo 3 para as turbinas
cex = 0.8,
box.lwd = 1, # Ajustar a espessura da borda da caixa da legenda
bg = "white", # Fundo branco para a legenda
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.
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()
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()
setwd("C:/Geracao")
df<- read.csv2("Vazao_vertida.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()
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()
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()
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()
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()
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()
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.
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
library(zoo)
# Certifique-se de que a coluna de datas esteja no formato correto
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
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
library(zoo)
# Calcular a média móvel para a coluna desejada (por exemplo, "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)
# 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 fruto
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)
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(media_movel,
plot = FALSE, # Não exibe o gráfico automaticamente
breaks = 120)
n <- length(media_movel)
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 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)
# Calcula o histograma sem exibi-lo automaticamente
hist_data <- hist(media_movel/mean(media_movel),
plot = FALSE, # Não exibe o gráfico automaticamente
breaks = 120)
n <- length(media_movel)
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 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)
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
# Vamos usar rollapply para calcular a média móvel de 30 dias (aproximadamente um mês)
df$media_movel_mensal <- rollapply(df$SOBRADINHO, width = 30, FUN = mean, fill = NA, align = "right")
# Agregar os dados para obter a média mensal (somando as médias móveis em cada mês)
df$mes <- format(df$datas, "%Y-%m") # Criar uma 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)
# Renomear as colunas para melhor entendimento
colnames(df_media_movel_mensal) <- c("mes", "media_movel_mensal")
# Criar a 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) # Frequência mensal
# Decompor a série temporal
decomposicao <- decompose(ts_media_movel_mensal, type = "multiplicative") # Você pode usar "additive" se achar mais adequado
# 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()
Foi realizado o gráfico da variação das seguintes séries:
Vazão natural afluente normalizada;
Armazenamento da usina em %.
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
#Variação
# Converter a coluna de datas para o formato Date
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Calcular a variação percentual entre os valores consecutivos d
variacao <- diff(df$SOBRADINHO) / head(df$SOBRADINHO, -1) * 100
# Criar o vetor de 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")
## Armazenamento da usina
setwd("C:/Geracao")
df<- read.csv2("volume_util_diario.csv")
#Variação
# Converter a coluna de datas para o formato Date
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Calcular a variação percentual entre os valores consecutivos
variacao <- diff(df$SOBRADINHO) / head(df$SOBRADINHO, -1) * 100
# Criar o vetor de 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()
# Periodo crítico de Sobradinho
setwd("C:/Geracao")
df<- read.csv2("vazao_natural_afluente.csv")
# Converter a coluna de datas para formato Date
df$datas <- as.Date(df$datas, format = "%d/%m/%Y")
# Ordenar os dados por data, caso necessário
df <- df[order(df$datas), ]
# Calcular a 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)
# Encontrar o 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