Metodologia
FestivalStats pubblica classifiche non ufficiali che servono a leggere la domanda “reale” (trazione) e, nello storico, a confrontare piazzamento al Festival e successo post-festival. Le classifiche sono modelli riproducibili basati su proxy pubblici/industriali e su regole dichiarate (normalizzazione, pesi, controlli di robustezza).
0) Tre metodi, tre contesti
- Durante Sanremo (v1 / v1.1): usa radio, playlist/rank di piattaforme e YouTube (con streams 24h su Spotify).
- Post-Sanremo (v2): dopo la finale non usiamo più i rank delle playlist “Sanremo” (che tendono ad allinearsi alla classifica ufficiale), ma segnali più indipendenti: Spotify streams, Viral (Apple/Amazon), Shazam Top 200, EarOne, YouTube.
- Archivio (1951–2025): misura un proxy di successo post-festival su classifiche annuali (HitParadeItalia) e lo confronta col piazzamento.
A fine anno l’edizione corrente viene inserita nell’Archivio e trattata con lo stesso metodo storico; per gli anni più recenti l’orizzonte è necessariamente “troncato” finché non diventano disponibili le classifiche degli anni successivi.
1) Origine dati e aggiornamenti
FestivalStats usa come unica sorgente operativa un Google Sheet pubblico. Durante ogni build/deploy, il sito scarica il CSV del foglio, normalizza i campi richiesti e genera pagine HTML statiche.
La frequenza degli aggiornamenti dipende dal deploy: quando viene eseguito un nuovo deploy (manuale o automatico), i dati vengono ricaricati. Se il CSV non è raggiungibile, il sito può usare un dataset locale di fallback per mantenere online la pagina.
2) Durante Sanremo (v1 / v1.1): classifica di “trazione”
Durante il Festival, l’obiettivo è misurare una trazione “live” combinando radio, posizionamenti di piattaforme e YouTube. In questa fase, i rank in playlist/classifiche inseriti nel foglio sono considerati utilizzabili come proxy operativi.
2.1 Variabili utilizzate (input)
- Spotify (rank), Amazon Music (rank), Apple Music (rank): posizione (1 = migliore) nella playlist/classifica che inserisci nel foglio.
- Spotify (streams 24h): streamcount su finestra mobile ~24 ore (aggiornato con cadenza giornaliera dalla sorgente che utilizzi) e riportato nel foglio come valore numerico. È un segnale “di intensità” (cardinale) complementare al rank (ordinale).
- YouTube (views): visualizzazioni totali del video di riferimento.
- YouTube_1 (views): visualizzazioni su un periodo più recente (campo “momentum” che gestisci nel foglio).
- EarOne (punteggio): indice di airplay radiofonico “audience-weighted” (basato su AQH e passaggi), usato qui come proxy della forza radio. (EarOne – Methodology)
- TrendDir: campo informativo (“up”/“down”, case-insensitive) per la freccia di trend; valori diversi → trend non disponibile.
2.2 Normalizzazione (tutto su scala 0–100)
Le variabili hanno scale diverse (rank, streams, views, score radio). Per renderle confrontabili, le trasformiamo in punteggi 0–100. Uno 0 è valido: indica il valore più basso del campione corrente per quella metrica.
Nota tecnica: se per una metrica max(x) = min(x) (nessuna variabilità nel campione), la metrica non discrimina.
In quel caso assegniamo 50 a tutte le righe per quella metrica.
2.2.1 Rank → score 0–100 (Spotify / Amazon / Apple)
Con N = numero di righe/partecipanti nel CSV:
ScoreRank(rank) = 100 * (N - rank) / (N - 1) 2.2.2 Spotify streams 24h → score 0–100 (log + min-max)
Slog = ln(1 + Spotify_Streams24h)
ScoreMinMax(x) = 100 * (x - min(x)) / (max(x) - min(x))
(se max(x) = min(x), ScoreMinMax = 50 per tutte le righe)
ScoreStreams24h = ScoreMinMax(Slog) 2.2.3 Spotify (rank + streams 24h) con parametro β
ScoreSpotify = β * ScoreRank(Spotify_rank) + (1 - β) * ScoreStreams24h Impostiamo β = 0.40 come “ancoraggio” al rank: Spotify resta principalmente volume-driven (streams 24h), ma evita che oscillazioni giornaliere o code estreme dominino interamente il contributo Spotify.
Sensitivity check (trasparenza): rieseguiamo il calcolo con β ∈ {0.30, 0.40, 0.50} per verificare che i pattern principali
non dipendano in modo opportunistico dal valore scelto.
2.2.4 YouTube views → score 0–100 (log + min-max)
YTlog = ln(1 + YT_views)
YT1log = ln(1 + YT_1_views)
ScoreMinMax(x) = 100 * (x - min(x)) / (max(x) - min(x))
(se max(x) = min(x), ScoreMinMax = 50 per tutte le righe)
ScoreYT = 0.5 * ScoreMinMax(YTlog) + 0.5 * ScoreMinMax(YT1log) 2.2.5 EarOne → score 0–100 (min-max)
ScoreRadio = ScoreMinMax(EarOne_score) 2.3 Ponderazione (pesi) e razionale
2.3.1 Macro: radio vs musica in streaming (proxy “tempo medio”)
Per ancorare il modello a un ordine di grandezza realistico, usiamo un proxy basato sui minuti medi giornalieri (Italia, 16–64, 2024): 66 minuti radio e 68 minuti musica in streaming (Fig. 1.1, fonte We Are Social, riportata nel Rapporto ORES 2025). (Rapporto ORES 2025 (PDF))
w_radio_macro = 66 / (66 + 68) = 0.4925
w_stream_macro = 68 / (66 + 68) = 0.5075 2.3.2 Micro: ripartizione dello streaming tra piattaforme (proxy “acquisto/adozione”)
Dati pubblici “minuti per piattaforma” (Italia, Spotify vs Apple vs Amazon) non sono sempre accessibili in modo aperto e comparabile. Per ripartire la quota streaming tra piattaforme, usiamo un proxy di forza/adozione basato su una survey Statista Consumer Insights (multi-pick): “da quali provider hai comprato download musicali o servizi streaming negli ultimi 12 mesi?” (survey 2022; as of Nov 2023). (Digital Advertising 2023 – Statista (PDF))
Valori (Italia) usati come proxy (multi-pick → sommano oltre 100%): Amazon Music 57%, Spotify 56%, YouTube Music 32%, Apple Music 21%.
2.3.3 Pesi finali (v1)
w_radio = 0.4925373
w_spotify = 0.5074627 * (56/166) = 0.1711922
w_amazon = 0.5074627 * (57/166) = 0.1742492
w_youtube = 0.5074627 * (32/166) = 0.0978241
w_apple = 0.5074627 * (21/166) = 0.0641971 - Radio (EarOne): 49,25%
- Spotify: 17,12%
- Amazon Music: 17,42%
- YouTube (ecosistema): 9,78%
- Apple Music: 6,42%
Versione pesi: v1 (2026-02-25). Versione Spotify-score: v1.1 (2026-02-27) (streams 24h + parametro β). Se cambiano fonti/proxy o perimetro dati nel foglio, i pesi vanno aggiornati qui e nel calcolo.
2.4 Formula del punteggio finale (durante Sanremo)
ScoreFinal =
0.4925 * ScoreRadio +
0.1712 * ScoreSpotify +
0.1742 * ScoreAmazon +
0.0642 * ScoreApple +
0.0978 * ScoreYT La classifica è l’ordinamento decrescente di ScoreFinal.
2.5 Limitazioni (durante Sanremo)
- Proxy, non consumo ufficiale: YouTube views ≠ minuti ascoltati; EarOne è un indice airplay “audience-weighted”, non ore.
- Rank ≠ volumi: il rank non contiene la distanza tra posizioni (#1 vs #2), quindi è un segnale ordinale.
- Streams 24h (Spotify): metrica su finestra mobile, può essere volatile. È usata con log+min-max per ridurre dominanza degli outlier.
- Parametro β: scelta di aggregazione interna (trade-off stabilità vs intensità) verificata con sensitivity check.
- Micro-pesi streaming: ripartizione tra piattaforme basata su survey multi-pick su acquisto/adozione, non su minuti per brand.
3) Post-Sanremo (v2): trazione “indipendente” (streaming/radio/discovery)
Nella fase post-festival non usiamo più i rank delle playlist “Sanremo” sulle piattaforme, perché possono diventare un duplicato (o un riflesso) della classifica ufficiale. Usiamo invece segnali più “autonomi”: Spotify (streams), Apple/Amazon (Viral), Shazam Top 200, EarOne e YouTube.
3.1 Variabili utilizzate (input)
- Spotify (streams ~24h): streamcount su finestra mobile ~24 ore (valore numerico).
- Apple Music (Viral Chart, rank Top 50): posizione nella playlist “Viral Chart”. (Apple Music – Viral Chart)
- Amazon Music (Viral Hits, rank Top 50): posizione nella playlist “Viral Hits”. (Amazon Music – Viral Hits)
- Shazam (Top 200 Italia, rank Top 200): posizione nella chart “Top 200 Italia”. (Shazam – Top 200 Italia)
- EarOne (punteggio): indice airplay “audience-weighted” basato su AQH e passaggi. (EarOne – Methodology)
- YouTube (views) via API: per ogni brano raccogliamo le views cumulative dei video ID RAI e Vevo tramite YouTube Data API v3 (
videos,part=statistics,statistics.viewCount). (YouTube Data API – Videos)
3.2 OK / NR / ND (Top-K e “assenze”)
In post-festival alcune fonti sono per definizione Top-K (Apple/Amazon Top 50; Shazam Top 200). Quindi “non comparire” è informazione.
- OK: brano trovato nella chart (rank disponibile).
- NR (Not Ranked): chart disponibile ma brano non presente (sotto la soglia Top-K) → score della metrica = 0.
- ND (No Data): fonte non disponibile / errore fetch / match fallito → metrica esclusa dal calcolo per quel deploy (non penalizza né premia).
3.3 Normalizzazione (tutto su scala 0–100)
3.3.1 Rank Top-K → score 0–100 (Apple Viral / Amazon Viral / Shazam)
Con K = profondità della chart (Apple=50, Amazon=50, Shazam=200):
ScoreRankK(rank; K) = 100 * (K + 1 - rank) / K
Se NR → ScoreRankK = 0
Se ND → ScoreRankK = NA (escluso dal denominatore) 3.3.2 Spotify streams → score 0–100 (log + min-max)
Slog = ln(1 + Spotify_Streams24h)
ScoreMinMax(x) = 100 * (x - min(x)) / (max(x) - min(x))
(se max(x) = min(x), ScoreMinMax = 50 per tutte le righe)
ScoreSpotify = ScoreMinMax(Slog) 3.3.3 EarOne → score 0–100 (min-max)
ScoreRadio = ScoreMinMax(EarOne_score) 3.3.4 YouTube (RAI + Vevo) → score 0–100 (log + min-max, poi media)
RAIlog = ln(1 + RAI_Views)
VEVOlog = ln(1 + Vevo_Views)
ScoreYT = 0.5 * ScoreMinMax(RAIlog) + 0.5 * ScoreMinMax(VEVOlog) 3.4 Pesi e razionale (v2)
I pesi in un indicatore composito sono una scelta esplicita di modellazione (trade-off tra segnali) e vanno dichiarati e verificati con analisi di sensibilità. Per questo ci appoggiamo alle linee guida su composite indicators e robustezza dei ranking. (OECD/JRC – Handbook (PDF))
In post-festival, i segnali “core” (Spotify streams, radio, YouTube) hanno peso maggiore; i segnali “sparse” (Viral e Shazam Top-K) sono trattati come discovery/momentum e pesano meno per evitare che la semplice “assenza dalla Top-K” domini il ranking.
Sensitivity check (trasparenza): rieseguiamo il calcolo variando ciascun peso entro ±0.05 (con rinormalizzazione) e controlliamo stabilità di top-5/top-10 e correlazioni di ranking.
3.4.1 Pesi finali (v2)
w_spotify_streams = 0.40
w_radio_earone = 0.30
w_youtube = 0.15
w_shazam_top200 = 0.10
w_viral_apple = 0.025
w_viral_amazon = 0.025 3.5 Formula del punteggio finale (post-Sanremo)
Gestiamo i casi ND escludendo la metrica dal denominatore per quel brano (e quel deploy). I casi NR restano con score = 0.
ScoreFinal(i) =
( Σ w_m * Score_m(i) per m con Score_m(i) != NA )
-------------------------------------------------
( Σ w_m per m con Score_m(i) != NA ) La classifica è l’ordinamento decrescente di ScoreFinal.
3.6 Limitazioni (post-Sanremo)
- Viral e Shazam sono Top-K: molti brani sono NR (score=0) senza che questo implichi “zero ascolti”.
- Spotify streams: è una proxy di volume basata sulla finestra che utilizzi (tipicamente ~24h) e può essere sensibile a eventi (promo, social, TV).
- YouTube views: sono cumulative e non equivalgono a minuti ascoltati; la log-normalizzazione riduce l’effetto outlier.
- Pesi: scelta modellistica dichiarata; viene accompagnata da sensitivity check.
4) Archivio (1951–2025): “successo post-festival” (proxy) + regola fine anno
Oltre alle classifiche “live” e “post-festival”, FestivalStats mantiene un Archivio storico (anni 1951–2025) che confronta: rank ufficiale e successo post-festival basato su una proxy riproducibile.
Regola operativa: a fine anno l’edizione corrente viene inserita nell’Archivio e trattata con lo stesso metodo; per gli anni più recenti l’orizzonte y..y+3 può essere parziale (troncato) finché non vengono pubblicate le classifiche annuali degli anni successivi.
4.1 Dati utilizzati
- Risultati ufficiali Sanremo (input): per ogni anno, il CSV include
anno,artista,brano, e (quando disponibile)posizione finale ufficiale. - Successo post-festival (proxy): classifiche “Top Annuali Single” di HitParadeItalia
(una pagina per anno:
hpeYYYY.htm).
Nota su HitParadeItalia: le “Top Annuali” sono ricostruzioni basate su fonti storiche e su criteri proprietari e possono differire da altre classifiche di fine anno.
4.2 Normalizzazione testo (pulizia per il matching)
normalize(text) =
lowercase
remove_diacritics
remove_tokens(feat|featuring|ft|con|&|and)
remove_punctuation
collapse_spaces 4.3 Regole di matching brano↔classifica (per anno)
Matching anno per anno: (i) match primario su titolo normalizzato identico; (ii) in caso di più candidati con stesso titolo, disambiguazione tramite overlap token dell’artista.
4.4 Punteggio annuale (0–1) dal rank in classifica
Con:
rank = posizione del brano (1 = migliore)
N = numero massimo di posizioni presenti nella classifica annuale (max rank)
AnnualPoints = 1 - (rank - 1) / (N - 1)
Clamp tra 0 e 1 4.5 Orizzonte temporale e decadimento (anni y..y+3)
MAX_HORIZON = 3 (t = 0..3)
WEIGHTS = [1.00, 0.60, 0.35, 0.20]
RawSuccess = Σ_{t=0..3} WEIGHTS[t] * AnnualPoints(year = y + t)
SuccessScore = 100 * RawSuccess / Σ(WEIGHTS) Nota: per gli anni più recenti, l’orizzonte è troncato perché non si può guardare oltre l’ultimo anno per cui la classifica annuale è disponibile. In quel caso l’indicatore resta “conservativo” finché non diventano disponibili gli anni successivi.
4.6 Stati del punteggio: OK / NR / ND
- OK: almeno un match trovato nel range y..y+3 e le pagine necessarie sono disponibili.
- NR (Not Ranked): nessun match trovato pur avendo le pagine disponibili →
SuccessScore = 0. - ND (No Data): almeno una pagina annuale necessaria non è scaricabile o non parsabile → punteggio non calcolato per evitare stime parziali.
Fonti
Fonti — Durante Sanremo (v1 / v1.1)
- Rapporto ORES 2025 (I-Com): minuti medi giornalieri Italia 16–64 (2024), incl. 66 minuti radio e 68 minuti musica in streaming. PDF
- Statista Consumer Insights (as of Nov 2023), survey 2022 (multi-pick): proxy adozione/acquisto brand (Italia: Amazon 57, Spotify 56, YouTube Music 32, Apple Music 21). PDF
- EarOne: metodologia del punteggio airplay basato su AQH (Average Quarter Hour). Methodology
- OECD/JRC: Handbook on Constructing Composite Indicators (pesi come scelta esplicita; robustezza e sensitivity analysis). PDF
- European Commission (Knowledge4Policy), Composite Indicators Toolkit – Step 6: Weighting. Pagina
Fonti — Post-Sanremo (v2)
- Apple Music — Viral Chart (Top 50). Playlist
- Amazon Music — Viral Hits (Top 50). Playlist
- Shazam — Top 200 Italia. Chart
- YouTube Data API v3 — Videos (statistics.viewCount). Docs
- EarOne — metodologia AQH (airplay audience-weighted). Methodology
- OECD/JRC — Composite Indicators Handbook (pesi e sensitivity analysis). PDF