
Raggruppare le abitazioni in base ai profili energetici
In Clevergy offriamo agli utenti diverse funzionalità per risparmiare energia. Mostriamo come consumano in casa e come migliorare il loro rapporto con l’energia. Li aiutiamo fornendo informazioni come la suddivisione dei consumi per elettrodomestico, i consumi orari per fascia, la stima del consumo espressa come costo in bolletta, le possibilità di risparmio modificando la potenza contrattuale o cambiando fornitore di elettricità e molti altri consigli energetici.
Il problema
Questa volta perfezioneremo una funzionalità che permette di capire quanto si spende rispetto ad abitazioni «simili» alla propria. 120 kWh non sono né tanti né pochi: sono un dato, ed è fondamentale capire se si possa migliorarlo. Per risolvere questo problema abbiamo affrontato la sfida di classificare le abitazioni dei nostri clienti in gruppi simili dal punto di vista del profilo energetico. Una volta creati i gruppi, abbiamo collocato ogni abitazione in un percentile di spesa rispetto alle altre, permettendo all’utente di capire quanto bene stia gestendo i propri consumi.
La prima cosa da definire è: che cosa significa «abitazioni simili»?
In questo caso affrontiamo la questione da un punto di vista multifattoriale.
Abitazioni simili non possono essere semplicemente abitazioni con consumi simili. Una casa piccola che consuma n kWh in un luogo freddo, principalmente per un consumo di base del riscaldamento, non ha nulla a che vedere con una casa grande che consuma la stessa energia nelle ore di punta a causa degli elettrodomestici della cucina.
D’altra parte, non possiamo nemmeno classificare le abitazioni in base alla vicinanza geografica, perché case molto vicine possono non avere nulla in comune dal punto di vista dei consumi energetici.
Pre-elaborazione dei dati
Abbiamo studiato fattori confrontabili per classificare le abitazioni e individuato diversi elementi chiave per raggrupparle.
- Metri quadrati. Dal punto di vista energetico, è utile classificare le abitazioni innanzitutto in base alle dimensioni.
- Potenziale di consumo elettrico. Abbiamo osservato che, per quanto le case abbiano caratteristiche simili, non ha senso raggruppare come simili, per esempio, una casa con riscaldamento a gas e una con riscaldamento elettrico: gli studi statistici indicano che il riscaldamento elettrico rappresenta quasi il 50% dei consumi domestici. Proponiamo quindi di stimare una quantità di kW «disponibili», moltiplicando il numero dei dispositivi che sappiamo essere presenti in casa per la rispettiva potenza nominale media.
- Profilo climatico. La Spagna è un paese in cui possiamo trovare profili climatici molto diversi anche all’interno delle stesse suddivisioni regionali. Per il raggruppamento abbiamo utilizzato i profili mediterraneo, interno freddo, interno caldo, atlantico e cantabrico. Abbiamo assegnato ogni provincia, nella sua interezza, a uno di questi climi.
- Tipologia di abitazione. Sappiamo che è un’ipotesi che può richiedere alcune precisazioni, ma preferiamo utilizzarla per caratterizzare il livello di prestazione energetica, distinguendo le case unifamiliari dagli appartamenti.
Per questa prima versione utilizziamo soltanto queste poche caratteristiche, ma stiamo lavorando su funzionalità davvero interessanti per arricchire il nostro dataset di abitazioni: profilo climatico in tempo reale, informazioni pubbliche sugli immobili, profilo energetico — livello di isolamento — e immagini satellitari per identificare le superfici dei tetti nelle case con produzione solare.
Una volta calcolate queste colonne per ogni casa, procediamo a raggruppare le abitazioni in base a tali caratteristiche.
Un primo approccio alla soluzione
Nel primo approccio abbiamo ipotizzato di utilizzare le librerie matematiche di Python per costruire un servizio che eseguisse la classificazione in tre passaggi:
- - Una PCA, analisi delle componenti principali. Questo filtro avrebbe modificato le dimensioni del dataset rendendolo bidimensionale, da due colonne a una singola coppia di valori, per poter eseguire K-means su un vettore bidimensionale.
- - Uno studio del possibile numero di centroidi. Per ottenere un risultato ottimale abbiamo eseguito una simulazione di clustering per diversi valori del numero totale di centroidi, calcolando l’errore di ogni esecuzione e conservando quella con lo scostamento minore.
- - Assegnazione di un cluster a ciascuna abitazione tramite K-means.
Una volta assegnati gli ID dei cluster, le abitazioni vengono nuovamente salvate in modo persistente, così da recuperare ciascun insieme e i suoi consumi dai servizi che compongono l’applicazione. Poiché questo processo può essere oneroso, viene eseguito periodicamente in background.
Ottenuta la classificazione, utilizziamo Vertex AI di GCP per addestrare un modello di classificazione che ci mette a disposizione un’API da interrogare quando arrivano abitazioni non ancora raggruppate. L’API restituisce il cluster più simile alla nuova casa.
Più semplice è meglio
Completata la prova di fattibilità del classificatore, ci siamo accorti che il processo di classificazione basato su Vertex AI, pur essendo molto comodo per noi, introduce l’errore intrinseco del modello, che si somma a quello introdotto dall’algoritmo K-means. Abbiamo quindi deciso di eliminarlo dall’equazione, calcolando direttamente il cluster di una nuova casa attraverso la distanza minima dai centroidi.
Inoltre, considerando che la nostra prova di fattibilità non aveva sufficiente autonomia né corrispondeva pienamente a un dominio specifico, abbiamo deciso di eliminare il servizio separato e includerlo in uno dei nostri servizi.
Poiché i nostri servizi sono programmati in Kotlin, abbiamo deciso di usare WEKA, che ci permette anche di eliminare la fase di analisi delle componenti principali e di effettuare il clustering su più dimensioni.
In questo modo eliminiamo quasi tutta la complessità e otteniamo risultati straordinari. E lo abbiamo fatto con 4 righe di codice!
Conclusioni
In un processo analitico non supervisionato, come l’applicazione dell’algoritmo K-means, è essenziale effettuare iterazioni che consentano di analizzare la qualità della soluzione. In questo contesto abbiamo dedicato molto lavoro alla preparazione del dataset in ingresso, con dati elaborati in ogni colonna per ottenere un risultato ideale.
Utilizziamo sempre metriche di controllo per capire se i nostri sistemi guadagnano precisione. In questo caso specifico lavoriamo con una baseline che ci permette di sapere se dobbiamo ottimizzare il numero di cluster in base agli errori accumulati a ogni iterazione.
In ingegneria, rifattorizzare un processo è un’ottima decisione, indipendentemente da quanto sia costato svilupparlo, se il risultato sarà più leggero e semplice. È fondamentale non avere paura di smontare e rifare, quando vi sono garanzie che il refactoring permetterà una manutenzione più facile e una migliore tolleranza ai guasti.


