As interrupções no fornecimento de energia elétrica são eventos críticos que afetam diretamente a qualidade de vida dos consumidores e a eficiência operacional das empresas. Este relatório tem como objetivo analisar as interrupções de energia elétrica da concessionária NeoEnergia Pernambuco no período de 2024, com o intuito de identificar padrões, causas principais e possíveis melhorias no serviço. Esta análise é relevante tanto para os consumidores, que desejam um serviço mais confiável, quanto para a concessionária, que busca melhorar sua eficiência e reduzir custos operacionais associados às interrupções.
Para abordar este problema, utilizamos um conjunto de dados fornecido pela Agência Nacional de Energia Elétrica contendo registros nacionais detalhados de interrupções de energia elétrica no ano de 2024. A metodologia inclui a limpeza e preparação dos dados, seguida por uma análise exploratória detalhada para identificar padrões e insights relevantes. Utilizaremos técnicas de manipulação de dados e visualização para apresentar nossos achados de forma clara e compreensível.
Nossa abordagem técnica envolve o uso de pacotes do R para manipulação, limpeza e análise de dados. Os pacotes principais incluem dplyr para manipulação de dados, readr para leitura de arquivos CSV, stringr para manipulação de strings, hms para manipulação de horas e tidyr para transformação de dados.
A análise proporcionará uma visão detalhada das interrupções de energia, identificando as causas mais frequentes e os tempos de interrupção mais críticos. Isso permitirá que a CELPE adote medidas preventivas e corretivas mais eficazes, resultando em um serviço de maior qualidade para os consumidores e em uma operação mais eficiente para a empresa.
options(repos = c(CRAN = "https://cran.rstudio.com/"))
# Instalar pacotes, se necessário
required_packages <- c("dplyr", "readr", "stringr", "hms", "tidyr", "ggplot2", "knitr", "DT")
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)
# Carregar pacotes
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
library(stringr)
library(hms)
library(tidyr)
library(ggplot2)
library(knitr)
library(DT)
| Pacote | Propósito |
|---|---|
| dplyr | Utilizado para manipulação e transformação de dados de forma eficiente. |
| readr | Utilizado para leitura de arquivos CSV, facilitando a importação dos dados. |
| stringr | Utilizado para manipulação de strings, permitindo a limpeza e formatação de textos. |
| hms | Utilizado para manipulação de horas, facilitando o cálculo de durações. |
| tidyr | Utilizado para transformação e limpeza de dados, permitindo a reorganização de dados em formatos mais utilizáveis. |
| ggplot2 | Utilizado para criar gráficos avançados e personalizáveis. |
| knitr | Utilizado para criar documentos dinâmicos |
| DT | Utilizado para criar tabelas interativas em web pages |
Para esse relatório foi utilizado os dados fornecido pela Agência Nacional de Energia Elétrica contendo registros nacionais detalhados de interrupções de energia elétrica no ano de 2024.
Os dados originais são compostor por 3161659 linhas e 18 colunas e são apresentados abaixo:
## # A tibble: 10 × 18
## DatGeracaoConjuntoDados IdeConjuntoUnidadeConsumidora DscConjuntoUnidadeCon…¹
## <date> <dbl> <chr>
## 1 2024-06-10 15923 Atuba
## 2 2024-06-10 16197 ILHA DE BALSAS
## 3 2024-06-10 16488 CAMPINAS S1
## 4 2024-06-10 16531 Cachoeirinha 2
## 5 2024-06-10 14816 RONDONOPOLIS 1
## 6 2024-06-10 16972 MOSSORÓ III
## 7 2024-06-10 15848 JUCÁS
## 8 2024-06-10 16745 BONJI
## 9 2024-06-10 15070 ESPERANCA AEREO MT/MT
## 10 2024-06-10 17314 AREAL
## # ℹ abbreviated name: ¹DscConjuntoUnidadeConsumidora
## # ℹ 15 more variables: DscAlimentadorSubestacao <chr>,
## # DscSubestacaoDistribuicao <chr>, NumOrdemInterrupcao <chr>,
## # DscTipoInterrupcao <chr>, IdeMotivoInterrupcao <dbl>,
## # DatInicioInterrupcao <dttm>, DatFimInterrupcao <dttm>,
## # DscFatoGeradorInterrupcao <chr>, NumNivelTensao <dbl>,
## # NumUnidadeConsumidora <dbl>, NumConsumidorConjunto <dbl>, NumAno <dbl>, …
Esses dados são estruturados com as sequintes informações:
| Coluna | Descrição |
|---|---|
| SigAgente | Nome da concessionária de energia elétrica |
| DatGeracaoConjuntoDados | Data em que o conjunto de dados foi gerado |
| NumNivelTensao | Nível de tensão da interrupção |
| DatInicioInterrupcao | Data e hora de início da interrupção |
| DatFimInterrupcao | Data e hora de fim da interrupção |
| DscFatoGeradorInterrupcao | Descrição do fato gerador da interrupção |
| DscTipoInterrupcao | Tipo de interrupção |
| DscClassificacaoInterrupcao | Classificação da interrupção |
| NumOrdemInterrupcao | Número de ordem da interrupção dentro de um conjunto de dados |
| DscAlimentadorSubestacao | Nome do alimentador ou subestação afetada |
| NumConsumidorConjunto | Número de consumidores afetados |
| IdeConjuntoUnidadeConsumidora | Identificador do conjunto de unidade consumidora |
| DscTipoInterrupcao | Tipo de interrupção; pode ser um erro ou pode ter sido programada para manutenção. |
| DscClassificacaoInterrupcao | Classificação detalhada da interrupção; descreve mais sobre a causa da falha ou a situação. |
A importação dos dados foi realizada usando a função read_delim() do pacote readr, que permite especificar o delimitador e a codificação do arquivo. Após a importação, foram realizadas as seguintes etapas de limpeza:
Podemos analisar os passos executados no código abaixo:
dados1 <- dados %>%
mutate(across(everything(), ~ str_trim(.))) %>%
filter(SigAgente == "CELPE") %>%
filter(!is.na(DatGeracaoConjuntoDados)) %>%
filter(NumNivelTensao != 0) %>%
select(-NumCPFCNPJ, # Excluir colunas desnecessárias
-IdeConjuntoUnidadeConsumidora,
-DscAlimentadorSubestacao,
-NumOrdemInterrupcao,
-NomAgenteRegulado,
-NumConsumidorConjunto,
-DatGeracaoConjuntoDados,
-DscTipoInterrupcao) # Excluir coluna desnecessária
dados1 <- dados1 %>%
mutate(
DatInicioInterrupcao = as.POSIXct(DatInicioInterrupcao, format = "%Y-%m-%d %H:%M:%S", tz = "America/Sao_Paulo"),
DatFimInterrupcao = as.POSIXct(DatFimInterrupcao, format = "%Y-%m-%d %H:%M:%S", tz = "America/Sao_Paulo")
)
# Calcular o tempo total de interrupção e formatar o resultado
dados1 <- dados1 %>%
mutate(
TempoTotalInterrupcao = difftime(DatFimInterrupcao, DatInicioInterrupcao, units = "secs") %>%
as.numeric() %>%
hms::as_hms() %>%
as.character()
)
dados1 <- dados1 %>%
separate(DscFatoGeradorInterrupcao, into = c("Desconhecido", "Tipo", "Fato", "Causa"), sep = " - ", extra = "drop", fill = "right") %>%
mutate(
Causa = if_else(is.na(Causa), "NAO CLASSIFICADA", Causa) # Preencher NA com "NAO CLASSIFICADA"
) %>%
select(-Desconhecido) %>% # Remover a coluna "Desconhecido"
select(-DatInicioInterrupcao, -DatFimInterrupcao) # Remover colunas de data e hora
Os dados limpos contem 85251 linhas e 11 colunas, uma redução de 3076408 linhas e 7 colunas.
Dessa forma, extraimos apenas as informações mais relevantes para a nossa análise.
Os dados limpos são apresentados abaixo:
| Coluna | Descrição |
|---|---|
| DscConjuntoUnidadeConsumidora | Identificação da unidade consumidora afetada pela interrupção. |
| DscSubestacaoDistribuicao | Nome da subestação responsável pelo fornecimento de energia à unidade consumidora. |
| ideMotivoInterrupcao | Código do motivo da interrupção (0-8). |
| Tipo | Tipo de interrupção (Programada ou Não Programada). |
| Fato | Fato que causou a interrupção (Ex: Meio Ambiente, Terceiros, etc.). |
| Causa | Causa específica da interrupção (Ex: DESCARGA ATMOSFÉRICA, SOBRECARGA). |
| NumNivelTensao | Nível de tensão em volts onde ocorreu a interrupção. |
| NumUnidadeConsumidora | Número de unidades consumidoras afetadas pela interrupção. |
| NumAno | Ano em que a interrupção ocorreu. |
| SigAgente | Concessionária responsável (Filtrado para CELPE). |
| TempoTotalInterrupcao | Tempo total de interrupção em segundos (convertido para minutos). |
Com os dados limpos, podemos visualizar algumas informações para nos auxiliar na tomada de descisão. A análise das principais causas de interrupção ajuda a identificar quais fatores são responsáveis por mais interrupções de energia. Um gráfico de barras horizontais é mais adequado para representar e comparar a frequência de várias causas de interrupção de forma clara e ordenada. Com isso, a concessionária pode usar essa informação para focar suas ações em resolver as causas mais frequentes de interrupção. Se uma causa específica for responsável pela maioria das interrupções, pode ser necessário um plano de ação para mitigar essa causa.
dados1 %>%
group_by(Causa) %>%
summarise(Contagem = n()) %>%
arrange(desc(Contagem)) %>%
ggplot(aes(x = reorder(Causa, Contagem), y = Contagem, fill = Causa)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(
x = "Causa", y = "Número de Ocorrências") +
theme_minimal() +
theme(legend.position = "none",
axis.text.y = element_text(size = 10),
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12),
plot.title = element_text(size = 14, face = "bold"))
O gráfico ajuda a identificar quais causas são mais frequentes e, portanto, mais críticas para a qualidade do serviço. Com essas informações a concessionária pode alocar recursos de maneira mais eficaz.
Dentro das informações vista a cima, precisamos compreender quais fatos são mais relevantes para as interrupções de energia, para isso vamos investigar qual fato mais ocorre para gerar a interrupção do sistema. Abaixo vemos o gráfico que aborda os fatos mais frequentes de interrupção ajuda a identificar quais eventos são mais comuns e que podem ser abordados para melhorar a eficiência do serviço.
dados1 %>%
group_by(Fato) %>%
summarise(Contagem = n()) %>%
arrange(desc(Contagem)) %>%
top_n(10, Contagem) %>%
ggplot(aes(x = reorder(Fato, Contagem), y = Contagem, fill = Fato)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Top 10 Fatos de Interrupção de Energia",
x = "Fato", y = "Número de Ocorrências") +
theme_minimal() +
theme(legend.position = "none",
axis.text.y = element_text(size = 10),
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12),
plot.title = element_text(size = 14, face = "bold"))
Isso nos leva a observar que devido ao fato apresentado, a maior parte das interrupções são por fatores fora do controle da concessionária. Para confirmar isso, vamos verificar o gráfico de interrupções programadas & Não programadas.
# Interrupções Programadas vs. Não Programadas
dados1 %>%
group_by(Tipo) %>%
summarise(Contagem = n()) %>%
ggplot(aes(x = Tipo, y = Contagem, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(title = "Número de Interrupções Programadas vs. Não Programadas",
x = "Tipo de Interrupção", y = "Número de Ocorrências") +
theme_minimal() +
theme(legend.position = "none")
E a maior parte dessas interrupções ocorre no nivel de tensão:
# Gráfico de barras mostrando a distribuição dos níveis de tensão das interrupções
ggplot(dados1, aes(x = as.factor(NumNivelTensao))) +
geom_bar(fill = "lightgreen") +
labs(title = "Distribuição dos Níveis de Tensão nas Interrupções de Energia",
x = "Nível de Tensão (V)", y = "Número de Interrupções") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
E por fim, é apresentado as unidades consumidoras com maior número de interrupções esse ano.
# Gráfico de barras mostrando as unidades consumidoras com mais interrupções
top_consumidores <- dados1 %>%
group_by(DscConjuntoUnidadeConsumidora) %>%
summarise(Número_de_Interrupções = n()) %>%
arrange(desc(Número_de_Interrupções)) %>%
slice_head(n = 10)
ggplot(top_consumidores, aes(x = reorder(DscConjuntoUnidadeConsumidora, Número_de_Interrupções), y = Número_de_Interrupções)) +
geom_bar(stat = "identity", fill = "orange") +
labs(title = "Top 10 Unidades Consumidoras com Mais Interrupções",
x = "Unidade Consumidora", y = "Número de Interrupções") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
O problema abordado neste relatório é a necessidade de entender melhor as características e as causas das interrupções de energia elétrica fornecida pela concessionária CELPE. Interrupções de energia afetam diretamente a qualidade dos serviços prestados pela concessionária e podem impactar a satisfação dos clientes. Compreender a frequência, a duração e as causas dessas interrupções é crucial para melhorar a gestão da infraestrutura elétrica e a comunicação com os consumidores. Este estudo busca responder a questões como quais são as principais causas das interrupções, como essas interrupções variam ao longo do tempo, e qual é a diferença entre interrupções programadas e não programadas.
Nessa abordagem os dados foram importados e limpos utilizando funções de manipulação de dados do pacote dplyr. A limpeza envolveu a exclusão de colunas desnecessárias, a conversão de datas e horas para o formato apropriado, e a criação de novas variáveis, como o tempo total de interrupção. Foram realizadas transformações para calcular a duração das interrupções e para classificar as interrupções em categorias como programadas e não programadas. O tempo total de interrupção foi convertido para um formato legível (HH:MM), e a coluna “DscFatoGeradorInterrupcao” foi desmembrada em componentes para facilitar a análise das causas.
Além de que a análise incluiu a criação de gráficos e tabelas para explorar a distribuição das interrupções, a comparação entre interrupções programadas e não programadas, e a identificação das principais causas de interrupções. A abordagem incluiu gráficos de barras, gráficos de linha e gráficos de pizza, entre outros.
Esse estudo revelou insights significativos sobre as interrupções de energia elétrica da CELPE, entre elas: