
Agrupar habitações por perfis energéticos
Na Clevergy, oferecemos aos utilizadores várias funcionalidades para poupar energia. Mostramos como consomem em casa e como podem melhorar a sua relação com a energia. Ajudamo-los com informação energética, como a desagregação dos consumos por eletrodoméstico, os consumos horários por faixa, a estimativa de consumo traduzida em custo na fatura, as possibilidades de poupança através da alteração da potência contratada ou da mudança de comercializador de eletricidade, além de muitas outras recomendações.
O problema
Desta vez, vamos aperfeiçoar uma funcionalidade que permite compreender quanto se gasta em comparação com habitações «semelhantes» à nossa. 120 kWh não são muito nem pouco: são um valor, e é essencial perceber se é possível melhorá-lo. Para resolver este problema, enfrentámos o desafio de classificar as casas dos nossos clientes em grupos semelhantes em termos do respetivo perfil energético. Depois de criar os grupos, posicionámos cada casa num percentil de despesa face às outras, permitindo ao utilizador compreender se está a gerir bem os consumos.
A primeira coisa a definir é: o que significa «habitações semelhantes»?
Neste caso, abordamos a questão de um ponto de vista multifatorial.
Habitações semelhantes não podem ser simplesmente casas com consumos semelhantes. Uma casa pequena que consome n kWh num local frio, sobretudo devido a um consumo de base de aquecimento, nada tem a ver com uma casa grande que consome a mesma energia em horas de ponta devido aos eletrodomésticos da cozinha.
Por outro lado, também não podemos classificar por «vizinhança» geográfica, pois casas muito próximas podem não ter nada em comum do ponto de vista do consumo energético.
Pré-processamento dos dados
Estudámos fatores comparáveis para classificar as habitações e encontrámos vários elementos-chave para as agrupar.
- Metros quadrados. Do ponto de vista energético, é útil classificar as habitações, em primeiro lugar, pela dimensão.
- Potencial de consumo elétrico. Observámos que, por muito semelhantes que sejam as características das casas, não faz sentido agrupar como semelhantes, por exemplo, uma casa com aquecimento a gás e outra com aquecimento elétrico. Os estudos estatísticos indicam que o aquecimento elétrico representa quase 50% do consumo doméstico. Por isso, propomos estimar um volume de kW «disponíveis», multiplicando os dispositivos que sabemos existir numa casa pela respetiva potência nominal média.
- Perfil climático. Espanha é um país onde encontramos perfis climáticos muito diferentes, mesmo dentro das mesmas divisões regionais. Utilizámos no agrupamento os perfis mediterrânico, interior frio, interior quente, atlântico e cantábrico. Atribuímos cada província, na sua totalidade, a um destes climas.
- Tipo de habitação. Sabemos que esta hipótese pode ter nuances, mas preferimos utilizá-la para caracterizar o nível de desempenho energético, distinguindo moradias unifamiliares de apartamentos.
Nesta primeira versão utilizamos apenas estas características, mas estamos a trabalhar em funcionalidades muito interessantes para enriquecer o conjunto de dados das habitações: perfil climático em tempo real, informação pública sobre as propriedades dos imóveis, perfil energético — nível de isolamento — e imagens de satélite para identificar áreas de telhado em casas com produção solar.
Depois de calcular estas colunas para cada casa, passamos a calcular o agrupamento das habitações de acordo com essas características.
Uma primeira abordagem à solução
Na primeira abordagem, propusemos utilizar bibliotecas matemáticas de Python para construir um serviço que efetuasse a classificação em três etapas:
- - Uma PCA, análise de componentes principais. Este filtro alteraria as dimensões do conjunto de dados para o tornar bidimensional, passando de duas colunas a um único par de valores, de forma a executar K-means sobre um vetor bidimensional.
- - Um estudo do possível número de centroides. Para obter um resultado ótimo, executámos uma simulação de clustering para vários valores do total de centroides, calculando o erro de cada execução e guardando aquela com menor desvio.
- - Atribuição de um cluster a cada casa através de K-means.
Depois de atribuídos os identificadores dos clusters, as casas voltam a ser guardadas de forma persistente, para permitir recuperar cada conjunto e os seus consumos a partir dos serviços que compõem a aplicação. Como este processo pode ser pesado, é executado periodicamente em segundo plano.
Uma vez obtida a classificação, utilizamos o Vertex AI da GCP para treinar um modelo de classificação que nos disponibiliza uma API para consultar quando recebemos casas ainda não agrupadas. A API devolve o cluster mais semelhante à nova casa.
Mais simples é melhor
Quando terminámos a prova de conceito do classificador, percebemos que o processo de classificação baseado no Vertex AI, apesar de muito cómodo para nós, introduzia o erro inerente ao modelo, somado ao erro do algoritmo K-means. Decidimos, por isso, eliminá-lo da equação, calculando diretamente o cluster de uma nova casa através da distância mínima aos centroides.
Por outro lado, considerando que a nossa prova de conceito não tinha autonomia suficiente nem correspondia inteiramente a qualquer domínio, decidimos eliminar o serviço separado e incluí-lo num dos nossos serviços.
Como os nossos serviços são programados em Kotlin, optámos por utilizar o WEKA, que também permite eliminar a análise de componentes principais e fazer clustering em várias dimensões.
Assim, eliminamos quase toda a complexidade e obtemos resultados extraordinários. E fizemo-lo com 4 linhas de código!
Conclusões
Num processo analítico não supervisionado, como a aplicação do algoritmo K-means, é essencial realizar iterações que permitam analisar a qualidade da solução. Neste contexto, dedicámos esforço à preparação de um conjunto de dados de entrada com informação processada em cada coluna, para obter um resultado ideal.
Utilizamos sempre métricas de controlo para saber se os nossos sistemas ganham precisão. Neste caso específico, trabalhamos com uma referência de base que permite perceber se devemos otimizar o número de clusters em função dos erros acumulados em cada iteração.
Em engenharia, refatorizar um processo é uma excelente decisão, por muito dispendioso que tenha sido, se o resultado for mais leve e simples. É essencial não ter receio de desmontar e refazer quando há garantias de que a refatorização permitirá uma manutenção mais fácil e maior tolerância a falhas.


