Come creare un sistema di valutazione Elo basato sui dati per giochi 2v2

Creazione di un sistema di valutazione Elo 2v2 basato sui dati

Mettere la matematica sul tavolo: da algoritmi alla follia del calcio balilla, la ricerca del campione ufficio.

Foto di Pascal Swier su Unsplash

Ciao e benvenuto!

Il mio nome è Lazare e ho appena terminato il mio secondo laurea triennale in Business Data Analysis. Questo articolo si basa sul lavoro che ho svolto per la mia tesi di laurea.

Dai match amichevoli alla competizione intensa, il calcio balilla ha trovato il suo spazio nella cultura aziendale, offrendo un modo unico per le squadre di connettersi e competere.

Questo articolo esplora la matematica dietro un sistema di punteggio basato su Elo per il 2v2 che può essere applicato al calcio balilla o a qualsiasi altro gioco 2v2. Esamina anche l’architettura che supporta l’elaborazione dei dati e presenta la creazione di un’applicazione web che fornisce una classifica in tempo reale e un’analisi dei dati utilizzando Python.

Il Ranking Elo

Il sistema di valutazione Elo è un metodo utilizzato per determinare il livello di abilità relativo di un giocatore in giochi a somma zero. È stato sviluppato per la prima volta per gli scacchi, ma ora viene utilizzato come sistema di valutazione in una varietà di altri sport come baseball, basket, vari giochi da tavolo e sport elettronici.

Un esempio ben noto di questo sistema si trova negli scacchi, dove il sistema di valutazione Elo viene utilizzato per classificare i giocatori a livello mondiale. Magnus Carlsen, noto anche come il “Mozart degli Scacchi”, detiene il punteggio Elo più alto al mondo con un punteggio di 2.853 nel 2023, dimostrando le sue straordinarie abilità nel gioco.

La formula del punteggio Elo è una formula a due parti: prima calcola l’esito previsto per un dato gruppo di giocatori e quindi determina l’aggiustamento del punteggio in base all’esito della partita e all’esito previsto.

Calcolo dell’Esito Previsto

Considera il seguente esempio negli scacchi con il Giocatore A e il Giocatore B con i punteggi R𝖠 e R𝖡 rispettivamente. L’equazione per il punteggio previsto del Giocatore A contro il Giocatore B è la seguente:

L’algoritmo Elo utilizza una variabile che può essere regolata per controllare come la probabilità di vittoria sia influenzata dai punteggi dei giocatori. In questo esempio, è impostata su 400, che è tipico per la maggior parte degli sport, compresi gli scacchi.

Ora diamo un’occhiata a un esempio più realistico, dove il giocatore A ha un punteggio di 1.500 e il giocatore B 1.200.

La stessa equazione vista in precedenza può calcolare il punteggio previsto del Giocatore A contro il Giocatore B:

Con questo calcolo, sappiamo che il Giocatore A ha una probabilità dell’84,9% di vincere contro il Giocatore B.

Per trovare la probabilità stimata del Giocatore B di vincere contro il Giocatore A, viene utilizzata la stessa formula, ma l’ordine dei punteggi viene invertito:

La somma delle probabilità di vittoria del Giocatore A e del Giocatore B è pari a 1 (0,849 + 0,151 = 1). In questo scenario, il Giocatore A ha quindi un’84,9% di probabilità di vincere, lasciando al Giocatore B solo una probabilità del 15,1%.

Calcolo del Punteggio

La differenza di punteggio tra il vincitore e il perdente determina il numero totale di punti vinti o persi dopo ogni partita.

  • Se un giocatore con un punteggio Elo molto più alto vince, riceverà meno punti per la sua vittoria e il suo avversario perderà solo pochi punti per la sua sconfitta.
  • Al contrario, se il giocatore con un punteggio più basso vince, questo risultato viene considerato molto più significativo, quindi la ricompensa è maggiore e l’avversario con un punteggio più alto viene penalizzato di conseguenza.

La formula per calcolare il nuovo rating del Giocatore A che gioca contro il Giocatore B è la seguente:

In questa formula, ( S𝖠 — E𝖠 ) rappresenta la differenza tra il punteggio effettivo del Giocatore A e il punteggio previsto. La variabile aggiuntiva K determina approssimativamente quanto può cambiare il rating di un giocatore dopo una singola partita. Negli scacchi, questa variabile è impostata a 32.

Se il Giocatore A vince, il punteggio effettivo, che in questo caso è 1, sarà maggiore del punteggio previsto di 0.849, creando una varianza positiva.

Ciò indica che il Giocatore A ha ottenuto una prestazione migliore rispetto a quanto inizialmente previsto. Di conseguenza, il sistema di rating Elo ricalibra i rating per entrambi i giocatori:

  • Il rating del Giocatore A aumenterà a causa della vittoria
  • Il rating del Giocatore B diminuirà a causa della sconfitta

Ancora una volta, questa stessa equazione può calcolare il nuovo rating del Giocatore A e del Giocatore B:

In sintesi, il sistema di rating Elo offre un metodo robusto ed efficiente per valutare e confrontare dinamicamente e in modo equo le competenze dei giocatori. Aggiorna continuamente il rating di un giocatore dopo ogni partita, considerando la differenza di abilità tra i due avversari.

Questo approccio premia il coraggio, poiché vincere contro un giocatore con un rating più alto comporta un aumento più significativo del rating del giocatore, come mostrato nella tabella qui sotto:

FIGURA I: Esempio del Sistema Elo negli Scacchi | Tabella dell'autore

D’altra parte, se un giocatore con un rating più alto va contro la sua probabilità di vincita e perde contro un giocatore con un rating più basso, il suo rating sarà significativamente influenzato: perderà più punti e il suo avversario ne guadagnerà di più.

In sintesi, quando un giocatore vince una partita, più bassa è la sua probabilità di vittoria, maggiore sarà il numero di punti che può guadagnare.

Nel suo stato attuale, questa formula di rating, originariamente progettata per gli scacchi, non è completamente adattata al calcio balilla.

Infatti, il calcio balilla ha più variabili degli scacchi, come ad esempio:

  • È un gioco a quattro giocatori con squadre di due (2v2)
  • Ogni membro della squadra può influenzare positivamente o negativamente il proprio compagno di squadra
  • A differenza dell’esito binario negli scacchi, la scala della vittoria o della sconfitta nel calcio balilla può variare considerevolmente a seconda dei punteggi delle squadre

Esplorazione dell’Algoritmo di Rating

Qui l’attenzione è rivolta all’adattamento del sistema di rating Elo ai requisiti unici delle partite di calcio balilla, che coinvolgono quattro giocatori divisi in due squadre.

Probabilità di Vittoria

Per iniziare a calcolare i nuovi rating dei giocatori, è necessario stabilire una formula raffinata per determinare l’esito previsto di una partita che coinvolge quattro giocatori in due squadre.

Per dimostrarlo, consideriamo uno scenario ipotetico di una partita di calcio balilla con quattro giocatori: Giocatore 1, Giocatore 2, Giocatore 3 e Giocatore 4, ciascuno con un rating diverso che rappresenta il loro livello di abilità.

FIGURA II: Scenario con 4 Giocatori che Giocano a Calcio Balilla | Tabella dell'autore

Per calcolare il punteggio previsto della Squadra 1 contro la Squadra 2 nel sistema di rating Elo rivisto, è necessario determinare il punteggio previsto di ogni giocatore coinvolto nella partita.

Il rating previsto del Giocatore 1, indicato con E𝖯𝟣, può essere calcolato facendo la media della somma del rating di ogni avversario utilizzando la formula del rating Elo come segue:

Dopo numerosi test, è stato deciso che sarebbe appropriato per la formula del punteggio previsto impostare la variabile utilizzata per dividere la differenza di punteggio a 500, anziché al valore tradizionale di 400 utilizzato negli scacchi. Questo valore aumentato significa che il punteggio di un giocatore avrà un impatto minore sul suo punteggio previsto.

Una ragione principale per questo aggiustamento è che, a differenza degli scacchi, nel calcio balilla c’è un leggero elemento di fortuna. Utilizzando un valore di 500, gli esiti delle partite possono essere previsti in modo più accurato e può essere sviluppato un sistema di valutazione affidabile.

Per calcolare il punteggio previsto del Giocatore 2 indicato con E𝖯𝟤, contro il Giocatore 3 e il Giocatore 4, può essere utilizzato lo stesso metodo utilizzato per il Giocatore 1.

Il punteggio previsto della Squadra indicato con E𝖳𝟣 può quindi essere calcolato prendendo la media di E𝖯𝟣 ed E𝖯𝟤:

Una volta calcolati i punteggi previsti per ogni giocatore, possono quindi essere utilizzati per calcolare l’esito della partita. La squadra con il punteggio previsto più alto ha maggiori probabilità di vincere. Mediando i punteggi previsti per ogni membro della squadra, il problema delle differenze di abilità all’interno della squadra può quindi essere risolto!

La tabella qui sotto mostra i punteggi previsti del Giocatore 1 e 2 contro i Giocatori 3 e 4.

  • I punteggi previsti del P1 contro il P3 e il P4 sono 0.091 e 0.201, corrispondenti a una probabilità di vittoria del 14.6%
  • I punteggi previsti del P2 contro il P3 e il P4 sono 0.201 e 0.387, dando una probabilità combinata di vittoria del 29.4%
  • Per il P1, collaborare con un giocatore più forte come il P2 può aumentare le loro probabilità complessive di vittoria, come dimostrato dal 22%
FIGURA III: Punteggio Previsto Basato sullo Scenario Mostrato nella Figura II | Tabella dell'autore

Se la squadra di P1 e P2 vince, il P1 guadagna meno punti di quanto suggerirebbe il suo punteggio previsto individuale, poiché il P2, che è più alto in classifica, contribuisce anche alla vittoria e abbassa la loro probabilità complessiva di vittoria.

D’altra parte, il P2 guadagna più punti a causa di avere un compagno di squadra con una classifica inferiore. In caso di vittoria, il P2 viene premiato per aver assunto un rischio, mentre il P1 guadagna meno punti, poiché si presume che il P2 abbia contribuito in modo più significativo alla vittoria, e viceversa in caso di sconfitta.

Parametri di Valutazione

Ora che l’esito previsto di una partita a quattro giocatori è stato determinato, queste informazioni possono essere incorporate in una nuova formula che tiene conto di molteplici variabili che influenzano la partita e i punteggi dei giocatori.

Come discusso in precedenza, il valore K può essere modificato per adattarsi meglio alle esigenze del sistema di valutazione. Questa nuova formula tiene conto del numero di partite giocate da ciascun giocatore, riflettendo la loro anzianità e il risultato della partita.

Ad esempio, nella semifinale della Coppa del Mondo del 2014, la Germania ha sconfitto il Brasile con un punteggio di 7-1. Questo è stato uno dei risultati più scioccanti e umilianti nella storia della Coppa del Mondo, poiché il Brasile era la nazione ospitante e non aveva mai perso una partita competitiva in casa dal 1975.

Se applicassimo il sistema di valutazione a questa partita, ci aspetteremmo che la Germania guadagni un numero significativo di punti, mentre il Brasile ne perda una grande quantità, riflettendo la differenza nelle loro prestazioni e nel loro livello di abilità.

Valore KIl valore K, indicato come K𝟣 per il Giocatore 1 in questo caso, determina quanto cambierà il punteggio di un giocatore dopo una partita. Questo valore K rivisto tiene conto del numero di partite che il giocatore ha giocato per bilanciare l’effetto di ogni partita sul suo punteggio. Dopo aver condotto numerosi test, è stata sviluppata una formula per calcolare il valore K per ciascun giocatore.

Per il Giocatore 1, ciò è espresso come:

Questa formula per il valore K è progettata per avere un maggiore impatto sulla valutazione dei nuovi giocatori, garantendo al contempo stabilità e minor fluttuazione della valutazione per i giocatori esperti. In particolare, dopo aver disputato 300 partite, la valutazione di un giocatore diventa più rappresentativa del suo livello di abilità.

FIGURA IV: Valore K nel tempo | Grafico dell'autore

La Figura IV mostra l’effetto del numero di partite giocate sul valore K. Partendo da 50, questo grafico mostra che il valore K diminuisce man mano che il numero di partite giocate aumenta, raggiungendo un valore dimezzato di 25 dopo 300 partite. Questo garantisce che l’impatto di ogni partita sulla valutazione di un giocatore diminuisca con l’esperienza.

Fattore PuntiPer considerare i punti segnati da ciascuna squadra, è stata introdotta una nuova variabile chiamata “fattore punti” nell’equazione. Questo fattore moltiplica il parametro K di ciascun giocatore e si basa sulla differenza assoluta di punti tra le due squadre. L’impatto di una partita deve essere maggiore quando una squadra vince con un largo margine, cioè una vittoria schiacciante.

Per calcolare il fattore punti, è stata utilizzata la seguente formula:

Questa formula prende la differenza assoluta tra i punteggi delle due squadre, aggiunge 1 e calcola il logaritmo in base 10 del risultato. Questo valore viene quindi elevato al cubo e 2 viene aggiunto al risultato per ottenere il valore finale del fattore punti.

FIGURA V: Fattore Punti | Grafico dell'autore

Calcolo del Rating Finale

Dopo aver regolato tutte le variabili necessarie, è stata sviluppata una formula migliorata per calcolare il nuovo ranking di ciascun giocatore coinvolto in una partita.

Ora, la valutazione di ciascun giocatore tiene conto del suo precedente rating, del rating dei suoi avversari, dell’impatto dei suoi compagni di squadra, della sua storia di gioco e del punteggio della partita. Questa formula garantisce che ogni giocatore venga premiato in base alle sue vere prestazioni, tenendo conto dell’equità di ogni match.

Andando avanti con l’esempio precedente, la nuova formula per il ranking del giocatore A è la seguente:

Questa formula migliorata premia i giocatori in base alle loro effettive prestazioni, incoraggia il prendere rischi e fornisce un sistema di valutazione più equilibrato sia per i giocatori nuovi che per quelli esperti.

Ora che abbiamo un algoritmo Elo, possiamo passare alla modellazione del database.

Progettazione e Modellazione del Database

Il modello di database proposto adotta un approccio relazionale, organizzando i dati in tabelle interconnesse tramite l’uso di Chiavi Primarie (PK) e Chiavi Esterne (FK). Questa organizzazione strutturata facilita la gestione e l’analisi dei dati, rendendo PostgreSQL una scelta appropriata come sistema di gestione del database. Le PK e le FK aiutano a mantenere la coerenza dei dati e a ridurre al minimo la ridondanza all’interno del database.

FIGURA VI: Modello a Diagramma del Database | Immagine dell'autore

In questo modello di database esistono due tipi di relazioni tra le tabelle: uno-a-molti e molti-a-molti.

La relazione tra la tabella ‘Giocatore’ e la tabella ‘Partita’ è di tipo molti-a-molti, poiché un giocatore può partecipare a numerose partite e più giocatori possono essere coinvolti in una singola partita. Una tabella di giunzione chiamata ‘GiocatorePartita’ collega questa relazione, contenendo due chiavi esterne: ‘player_id’ (che fa riferimento al giocatore partecipante) e ‘match_id’ (che fa riferimento alla partita corrispondente).

Questa struttura garantisce l’associazione accurata di giocatori e partite come mostrato nel codice sottostante:

CREATE TABLE PlayerMatch (player_match_id serial PRIMARY KEY,player_id INT NOT NULL REFERENCES Player(player_id),match_id INT NOT NULL REFERENCES Match(match_id));

Una logica simile si applica alla tabella ‘TeamMatch’, che funge da collegamento tra le tabelle ‘Match’ e ‘Team’, consentendo a più squadre di giocare una partita e una partita di coinvolgere più squadre.

Sono state progettate tabelle separate per ‘PlayerRating’ e ‘TeamRating’ per semplificare l’analisi del ranking nel tempo. Queste tabelle si collegano rispettivamente alle tabelle ‘PlayerMatch’ e ‘TeamMatch’ tramite ‘player_match_id’ e ‘team_match_id’.

Integrità dei dati

Oltre all’uso di PK e FK, questo modello di database utilizza anche tipi di dati appropriati e vincoli di controllo per l’integrità dei dati:

  • Le colonne ‘winning_team_score’ e ‘losing_team_score’ nella tabella ‘Match’ sono di tipo intero, impedendo l’inserimento di voci non numeriche
  • I vincoli di controllo impongono che ‘winning_team_score’ sia esattamente 11
  • I vincoli di controllo impongono che ‘losing_team_score’ sia compreso tra 0 e 10, rispettando le regole del gioco

Come si può vedere nel frammento di codice sottostante, l’uso di sequenze per ogni chiave primaria è stato implementato nella creazione del database per facilitare l’inserimento dei dati. Questa automazione semplifica la procedura complessiva quando si utilizza successivamente il ciclo Python per il processo di inserimento dei dati.

CREATE SEQUENCE player_id_seq START 1;CREATE SEQUENCE team_id_seq START 1;CREATE SEQUENCE match_id_seq START 1;CREATE SEQUENCE player_match_id_seq START 1;CREATE SEQUENCE player_rating_id_seq START 1;CREATE SEQUENCE team_match_id_seq START 1;CREATE SEQUENCE team_rating_id_seq START 1;

Elaborazione dei dati

La sfida principale era trovare un modo per elaborare i dati delle partite in una sequenza che consentisse di recuperare gli ID dai dati iniziali che venivano elaborati e inseriti nel database.

Questi ID particolari potevano quindi fungere da chiavi esterne per gestire i dati rimanenti, creando le relazioni necessarie nel processo. In altre parole, il primo passo era identificare e memorizzare dati specifici (ID) dai dati grezzi, e poi utilizzare questi ID come ponte per collegare e elaborare il resto dei dati.

I dati sono stati elaborati passo dopo passo, utilizzando cicli Python sempre più complessi. Ogni nuova voce è stata assegnata a una chiave primaria unica generata dalla sequenza della tabella.

  1. Il primo passo è stato gestire i singoli giocatori e ottenere i loro ID.
  2. Successivamente, le squadre sono state elaborate utilizzando gli ID dei giocatori. Per ogni coppia unica di giocatori in una partita, è stata creata un’entrata nella tabella ‘Team’ (FK giocatori)
  3. In seguito, sono state gestite le partite utilizzando gli ID delle squadre vincitrici e perdenti. Dopo l’elaborazione delle partite, sono state affrontate le tabelle ‘PlayerMatch’ e ‘TeamMatch’ recuperando le corrispondenti partite, giocatori e ID delle squadre
  4. Una volta elaborati tutti i dati necessari, gli ID di ‘PlayerMatch’ e ‘TeamMatch’, insieme ai timestamp delle ‘partite’, sono stati utilizzati nelle tabelle ‘PlayerRating’ e ‘TeamRating’ per tenere traccia dell’evoluzione dei punteggi nel tempo.

Sviluppo di applicazioni web

L’obiettivo dell’applicazione web è consentire agli utenti di inserire i risultati dei giochi, verificare i dati e interagire direttamente con il database. Ciò garantisce che i dati siano aggiornati e offerti in tempo reale in modo che gli utenti possano sempre accedere al ranking o visualizzare le loro metriche.

Inoltre, ho voluto rendere l’applicazione web responsive, perché chi vorrebbe trascinare un laptop in giro per giocare a calcio balilla? Non sarebbe molto pratico o divertente.

Tecnologie utilizzate

BackendDopo aver confrontato Django e Flask, due popolari framework web per la costruzione di applicazioni web in Python, è stato scelto Flask per il suo approccio adatto ai principianti. Il framework web Flask viene utilizzato per gestire le richieste degli utenti, elaborare i dati e interagire con il database PostgreSQL.

FrontendIl frontend è composto da file HTML e CSS statici, che definiscono la struttura e lo stile dell’applicazione web. JavaScript viene utilizzato per la validazione dei form e la gestione delle interazioni degli utenti. Ciò garantisce che i dati inviati dagli utenti siano coerenti e accurati prima di essere inviati al backend.

Visualizzazione dei datiQuando si tratta di visualizzazione dei dati, la sfida più grande è avere dati sempre aggiornati. Per superare questa limitazione, il livello di visualizzazione dei dati utilizza Plotly, una libreria Python, per generare grafici interattivi che visualizzano le valutazioni dei giocatori nel tempo. Questo componente riceve dati dal backend, li elabora e li presenta agli utenti in un formato intuitivo.

DatabasePostgreSQL è stato utilizzato sia nell’ambiente di sviluppo locale che nell’ambiente di produzione su AWS, tramite Heroku. I backup automatici del database sono facilitati da Heroku, garantendo che i dati siano protetti e possano essere ripristinati facilmente se necessario.

Ricerca UI/UX

Per il design UI/UX, l’ispirazione è stata tratta dai design web moderni di Spotify e del nuovo motore di ricerca Bing. L’obiettivo era creare un’esperienza utente familiare e intuitiva.

FIGURA VII: Mockup dell'applicazione | Immagine dell'autore

Funzionalità dell’applicazione

Esaminiamo le funzionalità dell’applicazione con uno scenario concreto. Il Team 1 (Matthieu e Gabriel) vuole giocare contro il Team 2 (Wissam e Malik). Tutti i giocatori hanno una valutazione diversa che rappresenta il loro livello di abilità, come mostrato di seguito.

Calcola le probabilità

La prima cosa che i giocatori vogliono fare prima di qualsiasi partita è calcolare la probabilità di vittoria.

Per fare ciò, la vista “Calcola probabilità” consente agli utenti di selezionare quattro giocatori utilizzando il menu a tendina e generare la probabilità di vittoria per le squadre selezionate.

FIGURA VIII: Calcola le probabilità | Immagine dell'autore

Questa funzionalità viene utilizzata principalmente prima di una partita per verificare che la partita sia equilibrata e per informare i giocatori sulla loro probabilità di vittoria. Ad esempio, il Team 1 ha una maggiore probabilità di vittoria (64,19%) rispetto al Team 2 che ha una probabilità del 35,81% di vittoria. Questa vista informa ogni giocatore degli enigmi e del rischio assunto.

Dopo l’invio del modulo, l’applicazione calcola solo la prima parte dell’algoritmo, che consiste nel calcolare l’esito previsto di una partita dati i quattro giocatori selezionati.

Carica una partita

La vista “Carica una partita” serve come home page dell’applicazione. È progettata per la comodità dell’utente, consentendo di caricare una partita immediatamente all’apertura dell’app.

FIGURA IX: Carica una partita e partita caricata | Immagine dell'autore

Prima dell’invio del modulo, l’applicazione effettua una convalida dei dati utilizzando JavaScript per garantire che:

  • Siano selezionati quattro giocatori diversi
  • I punteggi siano interi non negativi
  • Esista solo una squadra vincente con un punteggio esattamente 11, senza pareggi

Quando la convalida ha successo, l’applicazione elabora i dati utilizzando l’intero algoritmo, aggiorna le tabelle corrispondenti nel database e fornisce agli utenti una conferma del caricamento.

La vista “Match Uploaded” è progettata per mostrare agli utenti l’effetto di ogni partita sul loro rating individuale. Calcola la differenza tra il rating dei giocatori prima e dopo che la partita è stata caricata.

Come mostrato sopra, il gioco non ha lo stesso effetto sul rating di ciascun giocatore. Questo è dovuto ai parametri individuali dell’algoritmo su ciascun giocatore: il punteggio atteso, il numero di partite, il compagno di squadra e la squadra avversaria.

Classifica Elo

La vista “Player Ranking” consente agli utenti di accedere alla classifica mensile in tempo reale e confrontarsi con altri giocatori. Gli utenti possono vedere il loro rating, il numero di partite giocate durante il mese e l’ultima partita giocata che mostra il loro ultimo rating.

FIGURA X: Player Ranking | Immagine dell'autore

Una volta che la vista “Player Ranking” viene visualizzata o viene inviato un nuovo periodo, l’applicazione interroga il database utilizzando un approccio CTE.

Ciò comporta l’unione di tutte le tabelle necessarie e la visualizzazione dell’aggiornamento più recente della classifica, utilizzando il selettore di periodo per filtrare la query:

def get_latest_player_ratings(month=None, year=None):    now = datetime.now()    default_month = now.month    default_year = now.year    selected_year = int(year) if year else default_year    selected_month = int(month) if month else default_month    start_date = f'{selected_year}-{selected_month:02d}-01 00:00:00'    end_date = f'{selected_year}-{selected_month:02d}-{get_last_day_of_month(selected_month, selected_year):02d} 23:59:59'    query = '''        WITH max_player_rating_timestamp AS (            SELECT                 pm.player_id,                MAX(pr.player_rating_timestamp) as max_timestamp            FROM PlayerMatch pm            JOIN PlayerRating pr ON pm.player_match_id = pr.player_match_id            WHERE pr.player_rating_timestamp BETWEEN %s AND %s            GROUP BY pm.player_id        ),        filtered_player_match AS (            SELECT                 pm.player_id,                pm.match_id            FROM PlayerMatch pm            JOIN max_player_rating_timestamp mprt ON pm.player_id = mprt.player_id        ),        filtered_matches AS (            SELECT match_id            FROM Match            WHERE match_timestamp BETWEEN %s AND %s        )        SELECT             CONCAT(p.first_name, '.', SUBSTRING(p.last_name FROM 1 FOR 1)) as player_name,             pr.rating,             COUNT(DISTINCT fpm.match_id) as num_matches,            pr.player_rating_timestamp        FROM Player p        JOIN max_player_rating_timestamp mprt ON p.player_id = mprt.player_id        JOIN PlayerMatch pm ON p.player_id = pm.player_id        JOIN PlayerRating pr ON pm.player_match_id = pr.player_match_id            AND pr.player_rating_timestamp = mprt.max_timestamp        JOIN filtered_player_match fpm ON p.player_id = fpm.player_id        JOIN filtered_matches fm ON fpm.match_id = fm.match_id        GROUP BY p.player_id, pr.rating, pr.player_rating_timestamp        ORDER BY pr.rating DESC;    '''

Visualizzazione dei dati

L’obiettivo principale nello sviluppo di questa soluzione completa era fornire agli utenti un sistema di classifica in tempo reale che fungesse da rappresentazione visiva delle prestazioni di ciascun giocatore.

Anche se sono disponibili potenti strumenti come PowerBI e Qlik per la visualizzazione dei dati, è stata scelta una soluzione completamente compatibile con i dispositivi mobili, che consente agli utenti di ottenere informazioni in tempo reale sui propri dispositivi senza incorrere in costi di licenza.

Sono stati utilizzati due metodi per raggiungere questo obiettivo:

  • In primo luogo, è stato utilizzato Dash Plotly, un framework Python che consente agli sviluppatori di creare applicazioni interattive basate sui dati in cima alle applicazioni Flask
  • In secondo luogo, sono state impiegate varie query SQL e pagine HTML statiche per estrarre le informazioni dal database e visualizzarle, garantendo che gli utenti abbiano sempre accesso ai dati in tempo reale

Evoluzione del rating

Questa visualizzazione consente ai giocatori di osservare l’impatto di ogni partita sulla loro classifica e di identificare tendenze più ampie. Ad esempio, possono vedere esattamente quando qualcuno li supera o vedere l’impatto di vittorie o sconfitte consecutive.

FIGURA XI: Rating Evolution | Immagine dell'autore

Quando si accede alla vista “Evolution Rating”, l’applicazione esegue una query sul database per ogni giocatore selezionato, recuperando l’aggiornamento del ranking più recente per ogni giorno in cui è stata giocata una partita:

SELECT DISTINCT ON (DATE_TRUNC('day', m.match_timestamp))    DATE_TRUNC('day', m.match_timestamp) AS day_start,    CASE WHEN p.first_name = '{player}' THEN pr.rating ELSE NULL END AS ratingFROM PlayerMatch pmJOIN Player p ON pm.player_id = p.player_idJOIN PlayerRating pr ON pm.player_match_id = pr.player_match_idJOIN Match m ON pm.match_id = m.match_idWHERE p.first_name = '{player}'ORDER BY DATE_TRUNC('day', m.match_timestamp) DESC, m.match_timestamp DESC

La tabella dei dati recuperati viene quindi trasformata in un grafico a linee, con le colonne convertite in assi utilizzando Dash.

Per ridurre il carico del database e semplificare la presentazione dei dati nel grafico, viene visualizzato solo l’ultimo aggiornamento del rating per ogni giorno.

Metriche del giocatore

Ispirato a Spotify Wrapped, l’idea è fornire informazioni derivate dalla raccolta costante di dati. Sebbene ci sia un enorme potenziale per visualizzare le informazioni sui giocatori, l’attenzione è rivolta alle metriche che evidenziano le prestazioni individuali e le connessioni tra i giocatori.

FIGURA XII: Metriche del giocatore | Immagine dell'autore

Queste metriche sono organizzate in tre categorie codificate con colori: partner, partite e rivali, con ciascuna metrica accompagnata da un titolo, un valore e una sotto-misura per ulteriori dettagli.

Metriche delle partiteQueste metriche sono centrate sullo schermo e visualizzate in blu per la neutralità. Includono il numero totale di partite giocate da quando è iniziata la raccolta dei dati.

Metriche del partnerLe metriche del partner appaiono sul lato sinistro dello schermo. Sono visualizzate in verde per la loro connotazione positiva.

  • La casella principale evidenzia il partner principale con cui il giocatore selezionato ha giocato più partite
  • La seconda metrica identifica il miglior partner del giocatore. Questo viene definito dal più alto percentuale di vittorie
  • La terza metrica in questa categoria è il peggior partner del giocatore selezionato. Questo viene calcolato sulla base della percentuale di vittorie più bassa (o della percentuale di sconfitte più alta)

Metriche dei rivaliLe metriche dei rivali sono visualizzate in rosso per indicare l’opposizione. Le metriche dei rivali rappresentano la relazione competitiva tra i giocatori.

  • La casella superiore mostra l’avversario più comune, con una sotto-metrica che indica il numero di partite giocate insieme, simile alle metriche del partner
  • La seconda metrica, “Rivalità più facile”, rappresenta l’avversario contro cui il giocatore ha il più alto tasso di vittorie. Questo indica un avversario più debole
  • L’ultima metrica è il giocatore contro cui il giocatore selezionato ha il tasso di vittorie più basso. Questa metrica indica l’avversario più difficile

Conclusioni

Mentre scrivo questo, l’applicazione è in uso da 6 mesi e questi sono i risultati finora:

  1. Questo sistema di classifica basato sul sistema Elo predice i risultati delle partite e classifica accuratamente i giocatori in base alle loro effettive prestazioni
  2. I giocatori sono diventati più competitivi, poiché ora sono sempre più consapevoli delle loro prestazioni grazie alla visualizzazione dei dati
  3. I giocatori sono diventati più inclusivi grazie a una formula migliorata che premia i giocatori che corrono dei rischi. I giocatori che normalmente non giocano insieme ora hanno l’incentivo a fare coppia

Adottando una strategia basata sui dati, questo progetto ha evidenziato l’influenza profonda e l’importanza dei dati.

Oltre all’analisi semplice delle prestazioni dei giocatori, questo progetto ha avviato una trasformazione nel modo in cui i giocatori affrontano le partite di calcio balilla e interagiscono con gli altri giocatori e i nuovi arrivati. Il potere dei dati ha veramente coltivato un ambiente più inclusivo e competitivo.

Grazie per aver letto fino a qui! Spero che tu abbia trovato utile questo articolo. Se sei interessato a leggere l’intero articolo, è disponibile qui. Inoltre, tutto il codice è disponibile su Github.

Non esitare a condividere le tue opinioni nei commenti 🙂