ORIENTAÇÃO DE TCC (CRISTIANO)

Versão 1

INTRODUÇÃO

Sobre o Documento

Nosso objetivo a partir de agora é aplicar todos os conceitos que já vimos sobre séries temporais nos dados reais do seu projeto de TCC. Alguns passos iniciais serão apresentados nesse documento e, então, uma série de exercícios serão adicionados (cada exercício já corresponde a um dos percursos necessários para desenvolvimento dos resultados do seu trabalho).

Você deverá reparar que cada script apresentado possui um índice próprio e, em caso de dúvida, utilize o índice para identifica em que percurso você ficou com dúvida e entre em contato por whatsapp.

Informações Sobre os Dados

Os dados foram baixados do própiro site da ANEEL com as informações sobre a geração distribuída. Ao todo, são 14 variáveis (colunas) e 390.841 observações (todos os dados até a última atualização: 29/01/2020). Em linhas gerais, as variáveis analisadas são:

  • Concessionária: Referência de área de concessão;

  • Código da Concessionária: Referência de área de concessão;

  • Código da Geração Distribuída: Identificação do responsável pela unidade(s) consumidora;

  • CPF ou CNPJ: Identificação do responsável pela unidade(s) consumidora;

  • Classe de Fornecimento: Informação sobre a unidade consumidora;

  • Grupo de Fornecimento: Informação sobre a unidade consumidora;

  • Modalidade da Ligação: Informação sobre a geração distribuída;

  • Quantidade de UC’s Crédito: Quantidade de unidades consumidoras que recebem créditos;

  • Município: Georreferência da instalação;

  • Região: Georreferência da instalação;

  • Data da Conexão: Data da conexão da instalação;

  • Código de Tipo de Geração: Tecnologia de geração de energia da instalação

    • Central Geradora Elétrica (EOL);

    • Central Geradora Hidrelétrica (CGH);

    • Central Geradora Solar Fotovoltaica (UFV);

    • Usina Termelétrica (UTE);

  • Fonte de Energia: Informação complementar ao tipo de geração;

  • Potência Instalada: Potência do sistema instalado (kW).

PROGRAMAÇÃO

Visão Geral

Você não pode se esquecer que a ciência de dados (aqui representada na linguagem R) segue um fluxo de trabalho já consolidado, assim como apresentado abaixo (essa figura foi adaptada do livro R for Data Science e adaptada pelo Curso-r. Vale muito a pena dar uma olhada em ambos):

Como se pode observar o fluxo de trabalho é composto por uma sequência de 7 passos, em que para cada passo um conjunto de pacotes são necessários:

  • Importar: significa introduzir os dados disponíveis em algum formato (csv, xls, xlsx, html) para o ambiente do software R. Os pacotes a serem utilizados dependem, justamente, do formato com que os dados estão armazenados;

    • readr;

    • xml2;

    • haven;

    • readxl;

  • Arrumar: significa realizar uma primeira formatação dos dados de modo a deixar na estrutura correta para aplicação dos tratamentos de análise. Cumpre ressaltar que a estrutura correta de análise compreende cada coluna como uma determinada variável e cada linha uma correspondendete observação de cada variável (os nomes das variáveis devem ser intuitivos e respeitar codificação internacional, isto é, sem espaços e sem caracteres latinos como acentos e/ou cedilha);

    • tadyr;

    • janitor;

    • tibble;

  • Tranformar: significa realizar uma nova formatação dos dados, mas agora de acordo com o objetivo de análise a ser aplicada (por exemplo, visão geral dos dados, cálculo de estatística descritiva, aplicação de alguma técnica de modelagem estatística, etc.);

    • dplyr;

    • stringr;

    • forcats;

    • lubridate;

    • data.table;

  • Modelar: significa aplicar técnicas estatísticas para modelagem dos dados de acordo com os objetivos do pesquisador

    • caret;

    • mlr;

    • lme4;

    • keras;

  • Visualizar: siginifca estruturar os resultados obtidos nas análises na forma de gráficos (seja as análises prévias da parte de tratamento dos dados, ou os resultados das aplicações de técnicas de modelagem)

    • ggplot2;
  • Comunicar: significa organizar todos os procedimentos realizados e resultados obtidos e analisados em um documento (que pode ser formato de texto, ou em um aplicativo, de acordo com o objetivo do pesquisador)

    • rmarkdown;

    • shiny;

  • Automatizar: significa atualizar todos os passos acima explicados periodicamente;

    • plumber;

    • opencpu;

É óbvio que nem todos os passos acima descritos são necessários em todas os projetos, contudo, essa estrutura de fluxo ajuda a nortear os passos do pesquisador e, portanto, respeitaremos rigorosamente o fluxo de trabalho.

Também é evidente que não necessariamente utilizaremos cada um dos pacotes descritos acima, tampouco nos limitaremos a eles. Mais uma vez, há aí uma lista de principais pacotes que são utilizados recorrentemente nos trabalhos associados à ciência de dados. Uma boa dica agora é, aproveite para instalar cada um deles neste momento.

Contudo, não deixe de reparar que o pactoce magrittr está associado a todos os pacotes de cada uma das respectivas etapas do fluxo de trabalho da ciência de dados. Na realidade, ele facilita o trabalho de todos alterando a forma como sequenciamos o código. Já instale o pacote agora (apenas confie e instale, antes mesmo da explicação mais detalhada a frente).

A principal ferramenta do pacote magrittr é o pipe (a representação do pipe no cógido é %>%) e para compreender como ela impacta no sequenciamento do código, vamos usar o própio exemplo do livro R for Data Science (vai ver logo ele, jovem).

Imagine que você queira escrever o poema abaixo na forma de código (linguagem R)

Little bunny Foo Foo

Went hopping through the forest

Scooping up the field mice

And bopping them on the head

Assim, podemos traduzir o poema como um objeto (Little bunny Foo Foo) que executa três funções (hop, scoop e bop). O jeito básico de fazer isso seria com os seguintes comandos:

foo_foo <- little_bunny()

foo_foo_1 <- hop(foo_foo, through = forest)

foo_foo_2 <- scoop(foo_foo_1, up = field_mice)

foo_foo_3 <- bop(foo_foo_2, on = head)

Essa abordagem traz alguns problemas como o fato de o código ter um monte de nome sem importância e sem ser intuitivo para o objeto, a memórica do computador está sendo excessivamente utilizada, pode haver erros/dificuldades de digitação em incrementar sufixos em cada linha. Seria possível adicionar uma abordagem alternativa, como abaixo:

foo_foo <- little_bunny()

foo_foo <- hop(foo_foo, through = forest)

foo_foo <- scoop(foo_foo_1, up = field_mice)

foo_foo <- bop(foo_foo_2, on = head)

Assim, há menor necessidade de digitação, porém, caso haja algum erro em algum procedimento é difícil realizar a depuração (identificar a fonte de erro). Além disso, com os mesmos nomes de objeto não fica claro o objetivo de cada função.

O pipe vem para substituir justamente esses problemas de sequenciamento, assim, teríamos o seguinte sequenciamento de códigos:

library(magrittr)



foo_foo <- little_bunny() %>% 
  
  hop(foo_foo, through = forest) %>% 
  
  scoop(foo_foo_1, up = field_mice) %>% 
  
  bop(foo_foo_2, on = head)

Dessa forma, todos os problemas ressaltados acima são evitados (não há utilização excessiva da memória, não há nomes não intuitivos, não há excesso de digitação, a programação é baseada em verbos o que facilita a depuração e o entendimento de cada função). Ou seja, sempre que possível empregaremos o pipe na programação.

A partir dessa visão geral, vamos começar a trabalhar os dados do seu projeto.

Importação

Como dito, o pacote (função) a ser utilizado na etapa de importação dos dados depende estritamente da forma pela qual os dados estão armazenados. Nesse caso, te enviei uma nova planilha do excel com a última atualização da base de dados a ser explorada. Assim, por estar em uma planilha do excel, vamos utilizar o pacote readxl, mais especificamente, a função read_excel. Também utilizaremos o parâmetro col_types da função para já especificar o formato de cada uma das colunas de variáveis e, ao final, adicionaremos um comando para dar uma olhada geral na planilha que foi carregada. (copie os códigos e rode no seu script)

# PRÁTICA 1



# Pacote a ser carregado da biblioteca:
library(readxl)



# Importando os dados em um objeto do tipo tibble e definindo as variáveis (repare na identação):
dados_gd <- read_excel("dados_gd_01_2021.xlsx", 
                       
                       col_types = c("text", "text", "text", "text", "text", "text", "text", 
                                     
                                     "numeric", "text", "text", "date", "text", "text", "numeric"))



# OBS: Não se esqueça que você deverá criar um projeto para que não seja necessário definir o 
# diretório em que a planilha de excel está (ou deverá definir o diretório). Caso haja dúvida, me 
# me contate. 



# Visão geral da planilha importada para o ambiente do software ("olhada estilo planilha de excel"):
View(dados_gd)



# Visão geral da planilha importada para o ambiente do software ("olhada estilo console do R")
# Acostume-se com essa (para bases de dados maiores, a versão acima trava muito):
str(dados_gd)
## tibble [390,841 x 14] (S3: tbl_df/tbl/data.frame)
##  $ NomAgente            : chr [1:390841] "CEMIG DISTRIBUIÇÃO S.A" "CEMIG DISTRIBUIÇÃO S.A" "COMPANHIA DE ELETRICIDADE DO ESTADO DA BAHIA" "ELETROPAULO METROPOLITANA ELETRICIDADE DE SÃO PAULO S.A." ...
##  $ SigAgente            : chr [1:390841] "CEMIG-D" "CEMIG-D" "COELBA" "ELETROPAULO" ...
##  $ CodGD                : chr [1:390841] "GD.MG.000.101.670" "GD.MG.000.164.767" "GD.BA.000.231.433" "GD.SP.000.246.615" ...
##  $ CPF_CNPJ_encrypt     : chr [1:390841] "31466566333271" "35610130767" "46773836842" "73563596333284" ...
##  $ DscClasseFornecimento: chr [1:390841] "Comercial" "Residencial" "Comercial" "Industrial" ...
##  $ DscGrupoFornecimento : chr [1:390841] "B3" "B1" "B3" "B3" ...
##  $ DscModalidade        : chr [1:390841] "Geracao na propria UC" "Geracao na propria UC" "Geracao na propria UC" "Geracao na propria UC" ...
##  $ QtdUCRecebeCredito   : num [1:390841] 1 1 1 1 1 2 2 1 1 1 ...
##  $ NomMunicipio         : chr [1:390841] "Araxá - MG" "Uberlândia - MG" "Licínio de Almeida - BA" "São Paulo - SP" ...
##  $ NomRegiao            : chr [1:390841] "Sudeste" "Sudeste" "Nordeste" "Sudeste" ...
##  $ DthConexao           : POSIXct[1:390841], format: "2019-05-30" "2019-12-19" ...
##  $ SigTipoGeracao       : chr [1:390841] "UFV" "UFV" "UFV" "UFV" ...
##  $ DscCombustivel       : chr [1:390841] "Radiação solar" "Radiação solar" "Radiação solar" "Radiação solar" ...
##  $ MdaPotenciaInstalada : num [1:390841] 17.5 2.4 12.1 5 5 ...

Repare que eu coloquei o resultado dessa parte no documento. a função str mostra o tipo do objeto após importação (neste caso, tibble), as dimensões dos dados (neste caso, 390.841 linhas e 14 colunas, dito de outra forma, 390.841 observações e 14 variáveis), o nome de cada uma das variáveis, o formato das varíaveis (conforme definimos com o parâmetro col_types), a dimensão da variável e as primeiras observações de cada uma delas.

Esta visão geral é importante para que tenhamos uma boa perspectiva do que fazer na próxima etapa do fluxo de trabalho. Por exemplo, os nomes podem ser melhor arranjados de modo a deixar mais intuitivo e, além disso, devemos reparar que o nome do município é seguido do estado e, desta forma, temos duas informações em uma mesma variável (devemos separar as informações em diferentes colunas).

Arrumação

Este será o primeiro percurso em que utilizaremos uma sequência de comandos e, portanto, que aplicaremos o pipe como ferramenta (deveremos carregar o pacote magrittr). Além disso, deveremos alterar os nomes das variáveis com a função rename (para isso deveremos utilizar um pacote com muitas funções de transformação, o dplyr, que neste caso será já utilizado aqui na fase de arrumação) e também vamos separar as informações contidas em uma das colunas com a função separate e, por isso, devemos carregar o pacote tidyr. Ao final, vale aquela espiada para ver se deu tudo certo. (copie os códigos e rode no seu script)

# PRÁTICA 2



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)

library(tidyr)



# A sequência de passos será, alterar os nomes e depois separar as informações de uma das colunas
# além disso, não ateraremos o nome do objeto:
dados_gd <- dados_gd %>% 
  
  rename('concessionaria' = NomAgente,
         
         'cod_concessionaria' = SigAgente,
         
         'id_instalacao' = CodGD,
         
         'id_proprietario' = CPF_CNPJ_encrypt,
         
         'classe' = DscClasseFornecimento,
         
         'grupo' = DscGrupoFornecimento,
         
         'modalidade' = DscModalidade,
         
         'qtde_consumidores' = QtdUCRecebeCredito,
         
         'regiao' = NomRegiao,
         
         'data_instalacao' = DthConexao,
         
         'tipo' = SigTipoGeracao,
         
         'combustivel' = DscCombustivel,
         
         'potencia_kw' = MdaPotenciaInstalada) %>% 
  
  separate(NomMunicipio, into = c('municipio', 'estado'), sep = " - ")
  
  

# OBS: Repare que para alterar os nomes das variáveis a ordem dos parâmetros é estranha, primeiro o 
# nome novo e depois o nome antigo (acho que seria mais intuitivo dizer que o nome antigo é igual 
# ao nome novo, mas quem sou eu na fila do pão!). Também repare em como o pipe foi utilizado e, caso
# haja qualquer dúvida, me contate.



# Vou assumir que você já entendeu e me limitar ao "estilo R de visualização da base":
str(dados_gd)
## tibble [390,841 x 15] (S3: tbl_df/tbl/data.frame)
##  $ concessionaria    : chr [1:390841] "CEMIG DISTRIBUIÇÃO S.A" "CEMIG DISTRIBUIÇÃO S.A" "COMPANHIA DE ELETRICIDADE DO ESTADO DA BAHIA" "ELETROPAULO METROPOLITANA ELETRICIDADE DE SÃO PAULO S.A." ...
##  $ cod_concessionaria: chr [1:390841] "CEMIG-D" "CEMIG-D" "COELBA" "ELETROPAULO" ...
##  $ id_instalacao     : chr [1:390841] "GD.MG.000.101.670" "GD.MG.000.164.767" "GD.BA.000.231.433" "GD.SP.000.246.615" ...
##  $ id_proprietario   : chr [1:390841] "31466566333271" "35610130767" "46773836842" "73563596333284" ...
##  $ classe            : chr [1:390841] "Comercial" "Residencial" "Comercial" "Industrial" ...
##  $ grupo             : chr [1:390841] "B3" "B1" "B3" "B3" ...
##  $ modalidade        : chr [1:390841] "Geracao na propria UC" "Geracao na propria UC" "Geracao na propria UC" "Geracao na propria UC" ...
##  $ qtde_consumidores : num [1:390841] 1 1 1 1 1 2 2 1 1 1 ...
##  $ municipio         : chr [1:390841] "Araxá" "Uberlândia" "Licínio de Almeida" "São Paulo" ...
##  $ estado            : chr [1:390841] "MG" "MG" "BA" "SP" ...
##  $ regiao            : chr [1:390841] "Sudeste" "Sudeste" "Nordeste" "Sudeste" ...
##  $ data_instalacao   : POSIXct[1:390841], format: "2019-05-30" "2019-12-19" ...
##  $ tipo              : chr [1:390841] "UFV" "UFV" "UFV" "UFV" ...
##  $ combustivel       : chr [1:390841] "Radiação solar" "Radiação solar" "Radiação solar" "Radiação solar" ...
##  $ potencia_kw       : num [1:390841] 17.5 2.4 12.1 5 5 ...

Esta fase está finalizada e foi fácil, mas não se engane, é a fase mais chata que tem na maior parte dos projetos do mundo real. Neste caso, foi fácil pois a base de dados importada já é utilizada por cientistas de dados e, portanto, já segue um padrão razóavel.

Cumpre observar por último que o nome das variáveis (também aconteceu com a definição do nome do objeto) seguiu um estilo padronizado:

  • Todos os caracteres em minúsculo;

  • Não há acentos ou cedilha;

  • Não há espaços entre palavras (eu uso o estilo cobra, mas também é recorrente o estilo camelo);

    • Estilo cobra de separação de palavras: “qtde_consumidores” (lembra a cobra rastejando, dizem);

    • Estilo camelo de separação de palavras: “QtdeConsumidores” (lembra a corcova do camelo, dizem).

Agora, está na hora da mágica acontecer. Afinal, devemos ter resultados!

Transformação

Até aqui nós vimos que temos dados de instalações de geradores, com os respectivos tamanhos, e com diferentes atributos (concessionaria, classe, grupo, modalidade, tipo, etc.). Repare que uma das colunas corresponde a uma referência de data e, assim, em breve começaremos as análises de séries temporais.

Mas antes de correr devemos caminhar sobre os dados, ou seja, obter uma descrição geral sobre os dados. Em primeiro lugar, não vamos estudar a geração distribuída como um todo, mas apenas a tecnologia fotovoltaica e, para justificar esta segmentação, seria interessante avaliar qual a representatividade dela em relação ao todo. Vamos fazer isso?

Continuaremos utilizando, principalmente, a função pipe do pacote magrittr no sequenciamento dos códigos mas, obviamente, também serão utilizadas novas funções do pacote dplyr. Em primeiro lugar, deveremos agrupar (função group_by) a matriz de acordo com critério das informações de alguma coluna por exemplo, sabemos que a coluna tipo explicita em suas observações quatro diferentes estruturas de geração de energia (EOL, CGH, UFV, UTE, volte à explicação dos dados para melhor compreender), então, toda operação que realizarmos na matriz (por exemplo, soma de instalações) ocorrerá dentro do grupo especificado.

Em seguida, utilizaremos a função summarise para criar operações dentro dos grupos, por exemplo, dentro de summarise utilizaremos a função n() para somar a quantidade de instalações em cada um dos grupos. Não se preocupe se você não entendeu nada, este é o tipo de caso em que é mais fácil entender o que foi feito ao reproduzir uma programação e observar os seus resultados. Então vamos lá…(copie os códigos e rode no seu script)

# PRÁTICA 3



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



# Criando um novo objeto que definirá a quantidade de instalações em cada tipo de geração:
n_instalacoes_tecnologias <- dados_gd %>%
  
  group_by(tipo) %>% 
  
  summarise(n_instalacoes = n())



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Vou assumir que você já entendeu o "estilo R de visualização da base":
str(n_instalacoes_tecnologias)
## tibble [4 x 2] (S3: tbl_df/tbl/data.frame)
##  $ tipo         : chr [1:4] "CGH" "EOL" "UFV" "UTE"
##  $ n_instalacoes: int [1:4] 34 68 390443 296
# Mas nesse caso é legal dar uma olhada "estilo excel" (dessa vez eu deixo):
View(n_instalacoes_tecnologias)

Apenas com essas poucas linhas de programação já conseguimos demonstrar que a tecnologia fotovoltaica compreende a esmagadora maioria de instalações em geração distribuída (ao todo, são 390.443 instalações fotovoltaicas contra pouco mais de 3 centenas das demais tecnologias somadas). Isso ocorre pois a fotovoltaica é a mais descentralizada, isto é, a fonte eólica depende de regiões com alta incidência de vento, pequenas centrais hidrelétricas dependem de locais com disponibilidade de água e em relevo adequado, termelétrica de disponibilidade de combustível, mas sol tem em todo lugar.

Mas pode ser interessante demonstrar a análise acima em proporção. Assim, para calcular as porcentagens de participação de cada tecnologia de geração deveremos criar uma nova variável a partir de operações com uma variável já existente e, desta forma, acabamos de descrever a função mutate do pacote dplyr. Assim como em summarise, associada a função mutate é provável utilizar alguma outra função e, no presente caso, será utilizada a função soma (sum) e depois a função para arredondamento do resultado de porcentagem (round). Mais uma vez estamos no caso em que é mais fácil compreender com a própria programação, então, rode o próximo script. (copie os códigos e rode no seu script)

# PRÁTICA 4



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



# Criando um novo objeto que definirá a quantidade e proporção de instalações em cada tipo de 
# geração:
prop_instalacoes_tecnologias <- dados_gd %>%
  
  group_by(tipo) %>% 
  
  summarise(n_instalacoes = n()) %>% 
  
  mutate(prop_instalacoes = round(n_instalacoes/sum(n_instalacoes)*100, 2))



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Vou assumir que você já entendeu o "estilo R de visualização da base":
str(prop_instalacoes_tecnologias)
## tibble [4 x 3] (S3: tbl_df/tbl/data.frame)
##  $ tipo            : chr [1:4] "CGH" "EOL" "UFV" "UTE"
##  $ n_instalacoes   : int [1:4] 34 68 390443 296
##  $ prop_instalacoes: num [1:4] 0.01 0.02 99.9 0.08
# Mas nesse caso é legal dar uma olhada "estilo excel" (dessa vez eu deixo):
View(prop_instalacoes_tecnologias)

Mas nem tudo é um mar de rosas! De fato, o número de instalações não prova necessariamente que a tecnologia de geração fotovoltaica é a mais importante para a experiência brasileira em geração distribuída pois, mesmo com grande quantidade de instalações, pode ser que as outras tecnologias apresentem poucas unidades mas com instalações muito maiores e, assim, representem uma maior potência instalada. Associado a esse fato, pode ser que ao ser uma instalação maior, mais unidades consumidoras consumam a energia gerada pela instalação. Nesse caso, adaptaremos a programação anterior de modo a contemplar a análise de proporções completa de cada uma das tecnologias. (copie os códigos e rode no seu script)

# PRÁTICA 5



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



# Criando um novo objeto que definirá a quantidade e proporção de instalações, unidades consumidoras
# e potências em cada tipo de geração:
proporcoes_tecnologias <- dados_gd %>% 
  
  group_by(tipo) %>% 
  
  summarise(n_instalacoes = n(),
            
            n_unidades_consumidoras = sum(qtde_consumidores),
            
            n_potencias = sum(potencia_kw)) %>% 
  
  mutate(prop_instalacoes = round(n_instalacoes/sum(n_instalacoes)*100, 2),
         
         prop_unidades_consumidoras = round(n_unidades_consumidoras/sum(n_unidades_consumidoras)*100, 2),
         
         prop_potencias = round(n_potencias/sum(n_potencias)*100, 2))



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Vou assumir que você já entendeu o "estilo R de visualização da base":
str(proporcoes_tecnologias)
## tibble [4 x 7] (S3: tbl_df/tbl/data.frame)
##  $ tipo                      : chr [1:4] "CGH" "EOL" "UFV" "UTE"
##  $ n_instalacoes             : int [1:4] 34 68 390443 296
##  $ n_unidades_consumidoras   : num [1:4] 5542 131 487097 4913
##  $ n_potencias               : num [1:4] 24346 14968 4659909 95302
##  $ prop_instalacoes          : num [1:4] 0.01 0.02 99.9 0.08
##  $ prop_unidades_consumidoras: num [1:4] 1.11 0.03 97.87 0.99
##  $ prop_potencias            : num [1:4] 0.51 0.31 97.19 1.99
# Mas nesse caso é legal dar uma olhada "estilo excel" (dessa vez eu deixo):
View(proporcoes_tecnologias)

Para o terror das inimigas, pode-se observar que a tecnolgia fotovoltaica corresponde à 99,90% das instalações, 97,87% das unidades consumidoras que utilizam geradores fotovoltaicos e 97,19% da potência instalada total no contexto da geração distribuída.

Aproveitando o fato de já termos provado que a tecnologia fotovoltaica representa a maior parte do mercado fotovoltaico e, além disso, aproveitando o fato de você já estar craque na parte de tratamento de dados com essa base, que tal já aplicar um filtro na base para limitá-la apenas à tecnologia fotovoltaica (para isso, utilizaremos a função filter também do pacote dplyr) e analisar as proporções de instalações, unidades consumidoras e de potências entre os estados do nosso Brasil? Para isso, tente compreender a adaptação que foi realizada no script abaixo: (copie os códigos e rode no seu script)

# PRÁTICA 6



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



# Criando um novo objeto que definirá a quantidade e proporção de instalações, unidades consumidoras
# e potências em cada estado (apenas para a tecnologia fotovoltaica - pv):
prop_estados_pv <- dados_gd %>% 
  
  filter(tipo == 'UFV') %>% 
  
  group_by(estado) %>% 
  
  summarise(n_instalacoes = n(),
            
            n_unidades_consumidoras = sum(qtde_consumidores),
            
            n_potencias = sum(potencia_kw)) %>% 
  
  mutate(prop_instalacoes = round(n_instalacoes/sum(n_instalacoes)*100, 2),
         
         prop_unidades_consumidoras = round(n_unidades_consumidoras/sum(n_unidades_consumidoras)*100, 2),
         
         prop_potencias = round(n_potencias/sum(n_potencias)*100, 2))



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Vou assumir que você já entendeu o "estilo R de visualização da base":
str(prop_estados_pv)
## tibble [27 x 7] (S3: tbl_df/tbl/data.frame)
##  $ estado                    : chr [1:27] "AC" "AL" "AM" "AP" ...
##  $ n_instalacoes             : int [1:27] 697 2531 1512 329 15402 10402 2674 6281 16097 4343 ...
##  $ n_unidades_consumidoras   : num [1:27] 703 4355 1834 396 17525 ...
##  $ n_potencias               : num [1:27] 8454 33681 22253 6415 156004 ...
##  $ prop_instalacoes          : num [1:27] 0.18 0.65 0.39 0.08 3.94 2.66 0.68 1.61 4.12 1.11 ...
##  $ prop_unidades_consumidoras: num [1:27] 0.14 0.89 0.38 0.08 3.6 2.72 0.59 1.49 4.38 1.24 ...
##  $ prop_potencias            : num [1:27] 0.18 0.72 0.48 0.14 3.35 3.47 0.84 1.82 5.28 1.08 ...
# Mas nesse caso é legal dar uma olhada "estilo excel" (dessa vez eu deixo):
View(prop_estados_pv)

Cansei, agora é com você! Faça as atividades propostas (tudo isso vai compor o seu TCC, visto que, no seu trabalho de TCC precisamos justificar o motivo de analisar séries temporais de fotovoltaica e dar uma visão geral do mercado fotovoltaico no país - já estamos trabalhando o conteúdo do seu projeto, nada aqui é “à toa”)

QUESTÃO 1 - Analise quais os estados mais representativos em geração distribuída fotovoltaica.

QUESTÃO 2 - Adapte o script da prática 6 aumentando a abrangência para os municípios.

QUESTÃO 3 - Adapte o script da prática 6 analisando por critério de concessionária.

QUESTÃO 4 - Adapte o script da prática 6 analisando por critério de classe de consumo.

QUESTÃO 5 - Adapte o script da prática 6 analisando por critério de grupo de consumo.

QUESTÃO 6 - Adapte o script da prática 6 analisando por critério de modalidade de consumo.

DESAFIO - Adapte o script da prática 6 para relacionar os municípios e as respectivas áreas de concessão (qual concessionária atende qual município?).

A partir de todos esses tratamentos já temos alguns resultados e análises importantes. Antes de partir para tratamentos e análises no contexto de séries temporais, vamos discutir visualização dos dados para o que já foi feito. Assim, não perdemos o “fio da meada” com o que já temos. Em um segundo documento vamos nos concentrar em aplicar as técnicas que já vimos nesta base de dados.

Visualização

Em primeiro lugar, vamos transformas as tabelas de proporções entre as tecnologias, que criamos durante a fase de tratamento, em um gráfico. As análises gráficas são mais intuitivas e rápidas e, por isso, sempre opte por uma apresentação gráfica no lugar de uma apresentação tabular. Porém, é sempre bom evitar o extremismos, por exemplo, no caso das proporções de tecnologia na geração distribuída brasileira, a porcentagem de fotovoltaica é tão grande que impede a estruturação de um gráfico de barras (as barras das outras tecnologias serão muito pequenas e a visualização trará poucos benefícios).

Para os gráficos que rodaremos a partir de agora utilizaremos uma das ferramentas gráficas mais poderosas da ciência de dados (e eu não me refiro só ao R, mas em relação a todos os softwares), o pacote ggplot2. Essa ferramenta permite criar camadas de informações gráficas a partir de sua função ggplot cada camada é definida por uma geometria gráfica.

Vamos usar nosso próprio exemplo prático para compreender o conceito de criação de camadas (reafirmo uma boa lida no livro R for Data Science e/ou no material da Curso-r vai te deixar craque). Já de cara é importante explicar que a sequência de códigos para adicionar camadas é similar à dinâmica de programação viabilizada pelo pipe (apenas substituiremos o símbolo %>% por +).

Iniciemos a nossa estruturação gráfica com a segmentação do número de instalações em cada um dos estados brasileiros (objeto prop_estados_pv criado na fase de tratamento - PRÁTICA 6). Vamos iniciar a apresentação a partir de uma camada de gráfico de barras (geometria chamada de geom_col). (copie os códigos e rode no seu script)

# PRÁTICA 7



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# A primeira linha informa o objeto de referência para utilização dos dados. Já a segunda linha 
# adiciona a primeira camada gráfica (aqui será uma só, camada de gráfico de barras com a 
# especificação de que coluna do objeto indicado deve ser alocado em cada eixo):
ggplot(prop_estados_pv) + 
  
  geom_col(mapping = aes(x = estado, y = prop_instalacoes)) 

# OBS: caso ainda não tenha entendido a lógica, me contate.

Seria melhorar os nomes dos eixos e adicionar algumas informações, tais como título e fonte de dados. Para todas essas informações adicionaremos uma linha de código na programação acima (formatando cada um desses parâmetros). (copie os códigos e rode no seu script)

# PRÁTICA 8



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# A primeira linha informa o objeto de referência para utilização dos dados. Já a segunda linha 
# adiciona a primeira camada gráfica (aqui será uma só, camada de gráfico de barras com a 
# especificação de que coluna do objeto indicado deve ser alocado em cada eixo). Na última linha
# foi adicionada a formatação dos parâmetros:
ggplot(prop_estados_pv) + 
  
  geom_col(mapping = aes(x = estado, y = prop_instalacoes)) +
  
  labs(title = 'Proporção de Geradores Distribuídos Fotovoltaicos por Estado',
       
       x = 'Estados',
       
       y =  'Proporção (em % do total)',
       
       caption = 'ANEEL, Geração Distribuída') 

# OBS: caso ainda não tenha entendido a lógica, me contate.

Você pode ser da “coxinharia” e querer melhorar a visualização gráfica, ao virar o gráfico com a linha de comando coord_flip, também pode alterar o tema do gráfico com a linha de comando theme_dark() (são disponibilizados uma série de temas para o seu gráfico, basta dar uma olhada aqui). Você pode até alterar a cor da barra, adicionando um parâmetro fill em sua geometria e ordenar as barras com a função reorder do stats (base do R) dentro da estruturação do gráfico por critério da maior participação no mercado. (copie os códigos e rode no seu script)

# PRÁTICA 9



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# A primeira linha informa o objeto de referência para utilização dos dados. Já a segunda linha 
# adiciona a primeira camada gráfica (aqui será uma só, camada de gráfico de barras com a 
# especificação de que coluna do objeto indicado deve ser alocado em cada eixo). Depois foi adicionada 
# uma linha para formatação dos parâmetros de texto, uma para girar o gráfico e a última para alterar 
# o seu tema (também foi adicionado um parâmetro fill na geometria para alterar a cor e um parâmetro
# reorder no eixo x para ordernar as barras):
ggplot(prop_estados_pv) + 
  
  geom_col(mapping = aes(x = reorder(estado, prop_instalacoes), y = prop_instalacoes), fill = 'lightgreen') +
  
  labs(title = 'Proporção de Geradores Distribuídos Fotovoltaicos por Estado',
       
       x = 'Estados',
       
       y =  'Proporção (em % do total)',
       
       caption = 'ANEEL, Geração Distribuída') +
  
  coord_flip() +
  
  theme_dark()

# OBS: caso ainda não tenha entendido a lógica, me contate.

Mas ainda não estou satisfeito, também seria relevante adicionar não só a análise de instalacões, mas aproveitar nossos cálculos de unidades consumidoras e de potência instalada. Tudo isso em um mesmo gráfico de barras. Para que isso aconteca de maneira mais “cientista de dados” é necessário voltar a fase de tratamento de dados e reorganizar o nosso objeto prop_estados_pv. Volte ao fluxo de trabalho da ciência de dados e repare que as fases de tratamento e visualização são recursivas. Portanto, adicionarei uma pequena seção de tratamento aqui exclusivamente para atender a uma necessidade de estrutura de dados para a visualização desejada. Por ser uma versão mais “cientista de dados” chamarei o objeto criado de prop_estados_pv_cd, vamos lá…

Basicamente o que queremos é realizar uma transformação nos dados de forma a termos uma coluna como referência de valor (chamaremos de referência de valor o fato de ser uma proporção de instalações, ou proporção de unidades consumidoras, ou proporção de potências) e a outra coluna o respectivo valor. Para realizar essa transformação vamor “virar” a nossa tabela com a função pivot_longer do pacote dplyr. Como sempre, a prórpia programação é mais intuitiva que a sua explicação, então, vamos rodar e depois dar uma olhada. (copie os códigos e rode no seu script)

# PRÁTICA 10



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



#  Alteração na base de dados para reestruturação da matriz (selecionando apenas as variáveis de 
# interesse com a associação da função select):
prop_estados_pv_cd <- prop_estados_pv %>% 
  
  select(estado, prop_instalacoes, prop_unidades_consumidoras, prop_potencias) %>% 
  
  pivot_longer(c(prop_instalacoes, prop_unidades_consumidoras, prop_potencias), 
               
               names_to = 'referencias', values_to = 'valores')



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Vou assumir que você já entendeu o "estilo R de visualização da base":
str(prop_estados_pv_cd)
## tibble [81 x 3] (S3: tbl_df/tbl/data.frame)
##  $ estado     : chr [1:81] "AC" "AC" "AC" "AL" ...
##  $ referencias: chr [1:81] "prop_instalacoes" "prop_unidades_consumidoras" "prop_potencias" "prop_instalacoes" ...
##  $ valores    : num [1:81] 0.18 0.14 0.18 0.65 0.89 0.72 0.39 0.38 0.48 0.08 ...
# Mas nesse caso é legal dar uma olhada "estilo excel" (dessa vez eu deixo):
View(prop_estados_pv_cd)

A partir da programação anterior já é possível rodar o novo gráfico de barras, com todas as informações em uma mesma geomtria. É a modificação é simples, basta referenciarmos as cores das barras pelas colunas de referências que acabamos de criar. veja abaixo: (copie os códigos e rode no seu script)

# PRÁTICA 11



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# Alteramos o arugmento fill para dentro do parâmetro aes e indexamos a uma das colunas criadas:
ggplot(prop_estados_pv_cd) + 
  
  geom_col(mapping = aes(x = reorder(estado, valores), y = valores, fill = referencias)) +
  
  labs(title = 'Proporção de Geradores Distribuídos Fotovoltaicos por Estado',
       
       x = 'Estados',
       
       y =  'Proporção (em % do total)',
       
       caption = 'ANEEL, Geração Distribuída') +
  
  coord_flip() +
  
  theme_dark()

# OBS: caso ainda não tenha entendido a lógica, me contate.

Poxa vida, nem tudo na vida são flores mesmo. Ainda podemos deixar o gráfico mais intuitivo ao quebrar as barras e, para tanto, utilizaremos um novo parâmetro da geometria (o position com a opção dodge). Além disso, vai ser necessário alterar a posição das legendas e também os nomes e, para tanto, será utilizado . Por fim, acho que as cores estão feias demais, “sejamos mais on” (assim como o pai está) e vamos alterar a escala de cores (para se inspirar nas cores, visite esse site). (copie os códigos e rode no seu script)

# PRÁTICA 12



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# Adicionamos um parâmetro de posição da legenda e, em seguida, formatamos os componentes dentro da
# legenda:
ggplot(prop_estados_pv_cd) + 
  
  geom_col(mapping = aes(x = reorder(estado, valores), y = valores, fill = referencias),
           
           position = 'dodge') +
  
  labs(title = 'Proporção de Geradores Fotovoltaicos (Geração Distribuída) por Estado',
       
       x = 'Estados',
       
       y =  'Proporção (em % do total)',
       
       caption = 'ANEEL, Geração Distribuída') +
  
  coord_flip() +
  
  theme_dark() + 
  
  theme(legend.position = 'bottom') + 
  
  scale_fill_manual(name = 'Referência de Valores:',
                    
                    values = c('#048A81', '#E0CA3C', '#2D3047'),
                    
                    breaks = c('prop_instalacoes', 'prop_potencias', 'prop_unidades_consumidoras'),
                    
                    labels = c('Instalações', 'Potências', 'Unidades Consumidoras'))

# OBS: caso ainda não tenha entendido a lógica, me contate.

Antes de mostrar um último desafio dessa versão de docuemnto de orientação, está na hora de você colocar um pouco a mão na massa e praticar. Vamos aos exercícios:

QUESTÃO 1 - Rode o gráfico de barras por critéio de concessionária.

QUESTÃO 2 - Rode o gráfico de barras por critéio de classe de consumo.

QUESTÃO 3 - Rode o gráfico de barras por critéio de grupo de consumo.

QUESTÃO 4 - Rode o gráfico de barras por critéio de modalidade de consumo.

Após terminar todas essas questões vamos para um último desafio antes de iniciar a análise de série temporais (SERÁ ENVIADO EM UM PRÓXIMO DOCUMENTO).

DESAFIO DE GEORREFERENCIAMENTO

Visão Geral

Rodamos um gráfico de barras com base nos estados, mas a visualização não ficou legal e isso ocorre pois são muitos estados (muita informação em uma mesma figura). Imagine se eu pedisse para você rodar um gráfico de barras com base nos municípios (precisaríamos de umas 300 páginas só para um gráfico) e o resultado prático disso é: nenhuma facilidade de informação.

Um jeito alternativo seria apresentar um mapa com as informações dos estados e isso está muito na moda. São os famosos gráficos de georreferenciamento em que associamos alguma informação quantitativa/qualitativa ao mapa. Esse desafio foi estruturado para que você dê os primeiros passos nesse sentido.

Importação

O primeiro passo é importar o mapa do Brasil, visto que, as informações a serem associadas ao mapa já foram devidamente importadas, arrumadas e tratadas nas seções anteriores. Para baixar os mapas do Brasil com abrangência estadual e municipal utilizaremos as funções read_state e read_municipality do pacote geobr, respectivamente. Dê uma olhada na explicação do pacote geobr ao clicar aqui.

A forma de usar é muito simples, veja a programação abaixo: (copie os códigos e rode no seu script)

# PRÁTICA 13



# Pacote a ser carregado da biblioteca:
library(geobr)



# Criando um objeto com os mapas do Brasil com abrangência estadual (última referência administrativa 
# do IBGE é do ano de 2018):
estados <- read_state(year = 2018)



# Criando um objeto com os mapas do Brasil com abrangência estadual (última referência administrativa 
# do IBGE é do ano de 2018):
municipios <- read_municipality(year = 2018)



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Dê uma olhada "estilo excel" (dessa vez eu deixo pra vc ver como o pc fica lento quando a base é 
# grande):
View(estados)



# Dê uma olhada "estilo excel" (dessa vez eu deixo pra vc ver como o pc fica lento quando a base é 
# grande):
View(municipios)

Eu sei que ainda não é a fase de visualização, mas só com isso você já conseguiria rodar os mapas com uma das geometrias do pacote ggplot2 (a geometria geom_sf). Veja no comando abaixo: (copie os códigos e rode no seu script)

# PRÁTICA 14



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# gerando o mapa do Brasil com algumas formatações para melhorar a visualização:
ggplot(estados) +
  
  geom_sf(fill = '#048A81', color= '#E0CA3C', size=.15, show.legend = FALSE) +
  
  labs(title = 'Mapa do Brasil (Estados)') +
  
  theme_minimal() +
  
  theme(axis.title=element_blank(),
        
        axis.text=element_blank(),
        
        axis.ticks=element_blank())

# OBS: caso ainda não tenha entendido a lógica, me contate.

QUESTÃO 1 - Rode o gráfico com abrangência municipal.

Mas o mapa pelo mapa não resolve tudo. Ainda é necessário associar os dados da análise e incluir no mapa e, para isso, será necessário um percurso de arrumação.

Tratamento

Basicamente o que vamos fazer é literalmente juntar a base de dados do mapa e a base de dados que queremos analisar. Por exemplo, em primeiro lugar juntaremos a análise dos estados, a partir do objeto prop_estados_pv já criado (lembre-se que esse objeto possui uma coluna com uma sigla de
referência dos estados e ela será a base para a junção entre as bases).

Para juntar as bases utilizaremos a função inner_join do pacote dplyr. Para uma boa compreensão das variantes da função join veja esta boa página de resumo clicando áqui. É óbvio e evidente que a explicação detalhada também pode ser encontrada tanto no livro R for Data Science, quanto no material da Curso-r.

Basicamente o que temos que ter para juntar as duas bases é uma coluna de referência em ambas. Veja na programação abaixo: (copie os códigos e rode no seu script)

# PRÁTICA 15



# Pacotes a serem carregados da biblioteca:
library(magrittr)

library(dplyr)



# Juntando o mapa dos estados com as informações de geração distribuída de cada um dos estados:
infomapa_estado <- inner_join(estados, prop_estados_pv, by = c('abbrev_state' = 'estado'))



# OBS: caso ainda não tenha entendido a lógica, me contate.



# Dê uma olhada "estilo excel" (dessa vez eu deixo pra vc ver como o pc fica lento quando a base é 
# grande e só piora):
View(infomapa_estado)

QUESTÃO 1 - Junte a base com abrangência municipal.

Agora que o tratamento já foi realizado, resta rodar o mapa e será similar ao que foi feito acima. Porém, alguns ajustes são necessários para realização das análises, vejamos como fica…

Visualização

Assim como no gráfico de barras, a modificação necessária é baseada na mudança das cores do mapa de acordo com algum critério. No nosso primeirp exemplo, utilizemos o critério de proporção de instalações por estado.

# PRÁTICA 16



# Pacote a ser carregado da biblioteca:
library(ggplot2)



# gerando o mapa do Brasil associado a análise de geração distribuída e adição de  algumas 
# formatações para melhorar a visualização:
ggplot(infomapa_estado) +
  
  geom_sf(aes(fill = prop_instalacoes), color = NA, size = .15) +
  
  labs(title = 'Geradores Fotovoltaicos (Geração Distribuída)',
       
       subtitle = 'Proporção de Instalações por Estado',
       
       caption = 'ANEEL, Geração Distribuída',
       
       size = 5) +
  
  scale_fill_distiller(palette = 'Blues',
                       
                       limits = c(min(infomapa_estado$prop_instalacoes),
                                  
                                  max(infomapa_estado$prop_instalacoes)),
                       
                       direction = 1,
                       
                       name = '(%)') +
  
  theme_minimal() +
  
  theme(axis.title=element_blank(),
        
        axis.text=element_blank(),
        
        axis.ticks=element_blank())

# OBS: caso ainda não tenha entendido a lógica, me contate.

Perceba como a interpretação da figura ficou mais intuitiva e já gera importantes discussões, por exemplo, por qual motivo minas ganhou essa importância? por qual motivo o sul (pior irradiação) possui mais geradores que o norte/nordeste (maior irradiação)? Nós incluiremos todas essas discussões no seu trabalho. Mas por hora, o trabalho de interpretação deve ser adiado.

QUESTÃO 1 - Rode o gráfico por critério de proporção de potência.

QUESTÃO 2 - Rode o gráfico por critério de proporção de unidades consumidoras.

QUESTÃO 3 - Rode os mapas três mapas acima (do exemplo e dos exercícios) para uma abrangência municial.

DESAFIO - Rode mapa de atuação da concessionária por município.