Consigliare un viaggio di surf dove non esiste alcuna previsione
Nalu, prodotto interno. Codice e dati pubblici.
Un surfista non prende le ferie in base al meteo del fine settimana. Le prende con tre mesi di anticipo, quando non esiste alcuna previsione di swell. Nalu risponde in un altro modo: misura su quattro anni di archivio la probabilità che uno spot funzioni a ottobre, poi incrocia questa probabilità con il prezzo del biglietto in partenza da Parigi.
20spot, ciascuno con la sua fonte e il suo livello di confidenza
240coppie spot × mese riclassificate a ogni movimento del cursore
701 280ore di swell nella cache versionata160 file parquet, 11,8 MB
0 €di costo totale, vincolo posto prima della prima riga
01 / Il problema
Tre mesi di anticipo, dieci giorni di previsione
L'orizzonte decisionale di un viaggio è di tre mesi. Quello di una previsione di swell è di dieci giorni. Tra i due non c'è nulla, e le guide di surf riempiono il vuoto con affermazioni non verificabili, mai incrociate con il prezzo del biglietto, che pure decide il viaggio quanto l'onda.
A questo orizzonte, l'unica cosa che si possa scrivere onestamente è una probabilità: «su quattro anni di archivio, questo spot ha funzionato tante ore a ottobre» anziché «ci sarà swell». La prima frase si può verificare.
02 / L'approccio
Una probabilità, un prezzo, un solo cursore
Una sola misura di qualità: la probabilità che un'ora di luce sia surfabile, valutata ora per ora su quattro anni. Nessun punteggio composito, nessuna ponderazione di esperto, perché non si somma una probabilità a una grandezza non limitata.
Il prezzo entra come secondo asse, e i due si confrontano in ranghi percentili sulle 240 coppie, mai tramite una normalizzazione min-max. Un solo valore anomalo basterebbe a schiacciare la scala e a rendere inerte il cursore. Una proprietà testata lo garantisce: aggiungere un prezzo assurdo non cambia l'ordine degli altri.
P_surf(s,m) = ore surfabili / ore di luce
Q(s,m) = P_surf(s,m)
Score(s,m) = α · rango(Q) + (1−α) · rango(−prezzo)
Q è una probabilità pura. L'intensità dello swell viene calcolata e mostrata, ma non entra nel punteggio, perché non si somma una probabilità a una grandezza non limitata. I ranghi sono percentili calcolati sulle 240 coppie spot × mese. Il cursore sposta α tra 0 e 1: a 1 conta solo l'onda; a 0 conta solo il biglietto.
03 / Cosa è stato costruito
Quattro componenti, ciascuna retta da un test
Il repository è scritto per essere letto, non per girare in produzione: ogni ipotesi del modello è isolata, tipizzata e giustificata in una frase. E le regole che contano non vivono in un documento, vivono nei test. Infrangerne una fa fallire la suite.
Schema del principio. Da ogni spot vengono lanciati 180 raggi con passo di 2° contro i poligoni delle coste; l'arco più ampio che raggiunge 500 km di oceano libero diventa la finestra di esposizione. Quindici spot su venti ritrovano così la direzione pubblicata nelle guide, senza interventi. Gli altri cinque portano una correzione manuale accompagnata da una motivazione scritta. Senza motivazione, il modello si rifiuta di caricarsi.
Acquisizione
Client Open-Meteo ufficiale, nessun client HTTP né backoff artigianale. La quota è ponderata e non contata in richieste: 2.296 unità consumate in 8 chiamate e 196 secondi per riempire l'intero archivio.
Geometria degli spot
Le finestre di esposizione allo swell non sono dichiarate, sono calcolate: 180 raggi per spot lanciati contro i poligoni delle coste, soglia di 500 km di oceano aperto. Quindici su venti ritrovano la direzione pubblicata senza interventi.
Calcolo della classifica
Espressioni vettorizzate, nessun ciclo riga per riga. 1,75 milioni di righe elaborate in meno di 60 secondi. Un test di prestazione fallirebbe su un'implementazione ingenua, il che rende la regola vincolante anziché dichiarativa.
Applicazione
Dashboard poggiata su una cache parquet versionata: zero chiamate di rete in esecuzione, verificato da un test che chiude il socket. La demo funziona senza internet, il che protegge una dimostrazione fatta presso un cliente.
04 / Cosa ha corretto la misura
Cinque decisioni prese contro il piano iniziale
Il piano di partenza è stato modificato cinque volte dalla misura. Ogni scostamento è rimasto scritto nel repository anziché riscritto a posteriori: ciò che si decide una volta noto il risultato non è più una decisione, è una giustificazione.
01
Dieci anni di archivio abbandonati per quattro
La rianalisi ERA5-Ocean non fornisce alcuno swell puro prima di dicembre 2021: il campo è vuoto, anno dopo anno, contrariamente a quanto dichiara la sua documentazione. Restava la scelta tra dieci anni di mare totale, swell e onde da vento confusi insieme, e quattro anni di solo swell. Il mare totale sovrastima lo swell di 22 cm in mediana, e di oltre 50 cm sul 14 % delle ore. Ho tenuto i quattro anni.
02
La validazione esterna fallisce, e la soglia non si è spostata
Il modello ritrova l'alta stagione pubblicata su 10 spot su 20. La soglia richiesta, 70 %, era stata scritta prima della misura, e non è stata spostata dopo. Il dettaglio è più istruttivo del tasso: l'errore mediano è nullo, quindi quando il modello ci prende, ci prende esattamente. Sei fallimenti su dieci si giocano a un mese di distanza. E un test vieta di raggiungere la metrica togliendo gli spot che la peggiorano.
03
Il bias tariffario, misurato prima di essere subito
I prezzi provengono dalla cache di ricerca di una piattaforma di affiliazione, quindi la copertura segue di fatto l'afflusso turistico. Correlazione di rango misurata: +0,78. Le cinque destinazioni senza alcun prezzo sono esattamente le cinque di popolarità minima. Il passaggio al rango percentile avrebbe reso questo bias invisibile senza eliminarlo, e la classifica avrebbe finito per ricopiare l'afflusso turistico senza che nessuno se ne accorgesse. Questi cinque spot restano visibili, e segnalati come tali.
04
Un dodicesimo parametro nato da una confusione di vocabolario
Le guide di surf pubblicano un periodo di picco; la fonte fornisce solo un periodo medio. Confondere i due rendeva Uluwatu surfabile il 14 % del tempo e le Maldive lo 0 %. Un fattore di conversione esplicito, applicato prima di qualsiasi confronto, ha portato il modello da undici a dodici parametri. Vivono tutti in un solo file, ciascuno seguito dalla frase che lo giustifica, e un test rifiuta l'aggiunta di un parametro senza giustificazione.
05
Una condizione di vento che dichiarava surfabile un vento di 45 nodi
La regola iniziale combinava il settore del vento e la sua velocità con un OR. Un vento di terra a 45 nodi superava quindi il test. È stata corretta in una condizione annidata (se il vento viene da terra, allora un tetto, altrimenti un altro, più basso) al momento della revisione, prima della prima riga di codice. È il tipo di errore che nessun test recupera a posteriori, perché il risultato resta plausibile.
05 / Risultati
Perché uno spot allo 0,7 % vince il mese di gennaio
Cursore al centro, a gennaio, Ponta Preta è in testa con lo 0,7 % di ore surfabili: dieci ore sulle 1.364 ore di luce che gennaio totalizza su quattro anni. Vince perché il biglietto costa 301 €.
La Gravière ha il miglior swell del mese di tutta la classifica e chiude al terzo posto, perché non era disponibile alcun prezzo. Uno spot senza prezzo riceve il rango 0, il che lo penalizza invece di neutralizzarlo. È una scelta consapevole, e la tabella la mostra invece di seppellirla nel codice.
Posizione
Spot
Surfabile
Rango qualità
Prezzo A/R
Rango prezzo
Punteggio
1
Ponta Preta
0,7 %
0,326
301 €
0,768
0,547
2
Uluwatu
2,2 %
0,494
683 €
0,580
0,537
3
La Gravière
28,3 %
0,992
n.d.
0,000
0,496
Gennaio, cursore a metà corsa (α = 0,5). Ranghi percentili calcolati sulle 240 coppie spot × mese.
06 / I limiti
Cosa non fa il modello
Nessuna marea. È decisiva sulla maggior parte dei reef, ma nessuna fonte gratuita la copre su scala mondiale su più anni di archivio.
Né batimetria né rifrazione, fuori portata per una maglia di 50 chilometri.
Altezze al largo, non dimensioni dell'onda. Le soglie portano nomi che lo dicono, così l'abuso di linguaggio non può insinuarsi per distrazione.
Quattro anni sottocampionano la variabilità tra le annate. Un episodio El Niño pesa di più su quattro anni che su dieci.
Venti spot, non cinquanta. Le soglie sono l'asset centrale del prodotto, e venti spot documentati valgono più di cinquanta indovinati.
Cosa dice Nalu di un incarico presso di Lei
Questo progetto non ha un cliente. Ciò che mostra è un metodo: misurare prima di affermare, scrivere la soglia prima di conoscere il risultato, pubblicare lo scarto quando resta. Applico lo stesso a un dato aziendale.