Quanto è prevedibile il fantasy football? Molti appassionati di calcio come me si chiedono anno dopo anno se esista una formula per ottenere un successo costante nelle leghe fantasy. Scopriamolo con JMP!
Grazie ai miglioramenti apportati all'integrazione di JMP con Python, importare i dati della tua lega di fantasy football in JMP è più facile che mai. Dopo aver mostrato brevemente come utilizzare la funzionalità nativa di richiesta HTTP di JMP per accedere alle API documentate di provider di fantasy football come ESPN e Sleeper, questa presentazione si concentra su come utilizzare i wrapper API esistenti della community Python per importare anni di dati dalle leghe di fantasy football. Dalle classifiche di lega, ai risultati dei playoff, alle statistiche dei giocatori NFL, ai risultati del fantasy football, fino alle migliori e peggiori scelte al draft, ci sono tantissimi dati da esplorare!
Una volta importati e organizzati i dati in tabelle, possiamo iniziare a utilizzare gli strumenti di analisi statistica di JMP per esplorare e analizzare i dati specifici del campionato, individuando possibili tendenze e modelli che possano darci un vantaggio competitivo.
Il successo deriva principalmente da una scelta azzeccata al draft o da scambi e acquisizioni effettuate durante l'anno? Le prestazioni eccezionali dei giocatori nel fantasy football sono ripetibili anno dopo anno? Quanto è importante avere un giocatore tra i primi tre nella propria squadra per produzione fantasy? I running back sono ancora i ruoli con il maggiore impatto nel fantasy football, o la situazione si è ribaltata a favore dei wide receiver e dei quarterback? Queste sono le domande che esploriamo per scoprire se JMP può aiutarti a vincere la tua prossima lega.
Ciao a tutti. Mi chiamo Nick Holmes e sono un ingegnere collaudatore qui alla JMP. Grazie per esservi uniti a me oggi. Oggi parleremo di come potete usare JMP per vincere il vostro campionato di fantacalcio. Come potete vedere, ho detto "forse" perché, ovviamente, nel fantacalcio non ci sono garanzie. Oggi lavoreremo per importare i dati del nostro campionato di fantacalcio in JMP, eseguiremo alcune analisi e vedremo cosa possiamo scoprire.
Una breve presentazione di me stesso. Mi considero un fanatico del fantasy football, se vogliamo. Sono il commissario di una lega redraft a 12 partecipanti, attiva dal 2015 circa. Questi sono principalmente i dati che useremo per i nostri esempi e le nostre analisi di oggi. La motivazione alla base di questa presentazione, o di questo progetto, è nata dal fatto che ho vinto la lega nel 2022, per poi arrivare ultimo nel 2023. Sto cercando un modo per prevedere i risultati del fantasy football, un'analisi che mi aiuti a stimare le mie prestazioni.
Non sono uno statistico, ma farò del mio meglio. Utilizzeremo i dati sia di ESPN che di Sleeper. ESPN, probabilmente lo conoscete già, è un fornitore di fantasy football. Sleeper è la stessa cosa, è solo una piattaforma diversa per ospitare la vostra lega di fantasy football. Importeremo i dati da entrambe le piattaforme e li useremo per la nostra analisi.
Ho utilizzato SPN dal 2015 al 2020 circa e Sleeper dal 2021 ad oggi, ecco perché avevamo bisogno di ottenere dati da entrambe le piattaforme. Questa è una breve panoramica di ciò che faremo oggi per importare questi dati in JMP e poi analizzarli. Innanzitutto, dobbiamo utilizzare le API per importare i dati. Lo faremo in un paio di modi: uno utilizzando una nuova richiesta HTTP e un altro utilizzando l'integrazione JMP-Python.
Successivamente, organizzeremo, o meglio, vi mostrerò come organizzare queste richieste in classi JMP o oggetti classe JMP. Una volta ottenuti questi dati in JMP, dobbiamo organizzarli in tabelle dati JMP. Esistono diversi metodi per farlo: illustrerò la funzione di conversione da JSON a tabella dati, nativa di JMP, e parlerò anche di come lavorare con gli array associativi e di come utilizzare JSL per creare tabelle dati JMP.
Una volta che i dati saranno disponibili nelle tabelle dati di JMP, procederemo con l'esplorazione e l'analisi. La prima fase consisterà nella manipolazione delle tabelle dati. Mostrerò come fare utilizzando Workflow Builder, dopodiché realizzeremo alcune visualizzazioni e analisi in alcune delle piattaforme di JMP.
Bene, cos'è un'API? Puoi trovare la definizione di API a lato, ma in breve, un'API è un metodo che ci permette di recuperare dati da un server web. Esistono diversi metodi associati al protocollo HTTP: GET, POST, DELETE e PUT, ma oggi ci concentreremo sul più semplice, ovvero GET. Invieremo una richiesta GET a un URL o a un endpoint API, e il server ci restituirà una stringa JSON, che useremo poi per creare un array associativo in JMP e per generare le nostre tabelle dati in JMP.
La nuova richiesta HTTP è una funzione di JMP che ci permette di utilizzare JSL per comunicare con queste API REST, e questa funzione consente l'uso di, come accennato in precedenza, get, post, put e delete. Oggi ci concentreremo principalmente su get e vedremo quanto sia semplice utilizzare la nuova richiesta HTTP per importare i nostri dati in JMP.
Innanzitutto, vorrei mostrarvi come ottenere i dati da Fantasy League Sleeper. Se fate una rapida ricerca su Google per la loro API, troverete un'ottima documentazione che vi spiega esattamente quale endpoint HTTP utilizzare per la richiesta e il tipo di dati che potete aspettarvi di ricevere in risposta.
Questo è in realtà lo scenario ideale per lavorare con un'API: il fornitore ti offre un'API molto chiara, specifica il tipo di dati che riceverai in risposta e fornisce una documentazione altrettanto chiara. Come puoi vedere dalla loro documentazione, ci fornisce una panoramica su come ottenere i dati del nostro campionato e come importare i dati della nostra rosa in JMP. Sembra che per la maggior parte di questi casi, l'unica informazione che dobbiamo inserire nell'URL sia l'ID del campionato.
In questo esempio, che illustra schematicamente come potrebbe apparire in JMP, forniamo il nostro ID lega e lo definiamo come variabile URL. Quindi inviamo la richiesta tramite una nuova richiesta HTTP, specificando l'URL con il metodo GET. Inviamo la richiesta e poi analizziamo il JSON che viene restituito a JMP.
Ora che abbiamo visto come potrebbe apparire questa richiesta, vediamo come si comporta in JMP. Come potete vedere, abbiamo una finestra di script JMP aperta. Se date un'occhiata all'URL definito, vedrete che abbiamo il nostro ID lega e la richiesta che avete visto nella diapositiva. Se eseguiamo questo script, vedrete che ci viene restituita una stringa JSON. Per interagire meglio con questi dati in JMP, dovremo convertirli in un array associativo JMP, che è lo scopo di questa funzione "Parsed JSON".
Come potete vedere, ci viene assegnato un array associativo. Se diamo un'occhiata a questo array associativo e poi lo indicizziamo per ottenere il nome della nostra lega, possiamo vedere che otteniamo "league-certified fantasy football", che è il nome della lega. Ora che vi ho mostrato una demo molto semplice, voglio mostrarvi come possiamo interagire o organizzare le nostre query in classi JMP per organizzare la nostra richiesta, la nostra richiesta HTTP. Chiudiamo questa finestra e apriamo il nostro file di progetto. Dando un'occhiata a questo file di progetto, vedrete che abbiamo delle classi definite per organizzare le nostre query.
Abbiamo questa classe "lega". Come potete vedere da questo riferimento, è in realtà derivata da un'API Python di cui ho preso in prestito la struttura, e ne parleremo più dettagliatamente quando tratteremo l'integrazione di JMP con Python. Dando un'occhiata a questa classe, noterete che abbiamo classi per gli utenti della lega, i giocatori, il draft e le statistiche. Tutte queste classi nel back-end chiamano questa API di base della superclasse, che è ciò che effettua la nostra nuova richiesta HTTP in background.
Vediamo come potremmo usare questa classe per ottenere i nostri dati. Eseguirò la definizione di questa classe e poi scorrerò fino in fondo dove ho alcuni esempi. Scusate se vi gira la testa per lo scorrimento. Ora vedrete che sto definendo un oggetto lega. Anche in questo caso, fornendogli l'ID della mia lega. Come potete vedere, qui abbiamo la definizione della classe e ora possiamo usare i metodi definiti per quell'oggetto specifico per ottenere i roster della lega. Possiamo ottenere gli utenti della lega e così via. Tutto questo è stato restituito in un array associativo.
Per ora non ci preoccuperemo di analizzare nel dettaglio il contenuto, ma vi mostreremo solo i dati che riceviamo. Ora abbiamo la stessa cosa per utenti, giocatori e tende. Condividerò tutto questo con la community di JMP come materiale di presentazione insieme alle diapositive. Dovreste essere in grado di utilizzare queste classi nella presentazione che vi mostrerò più avanti per importare i vostri dati in JMP.
Abbiamo visto che per Sleeper ottenere i dati era molto semplice. C'era un'API ben definita che abbiamo potuto utilizzare per creare la nostra richiesta HTTP. Sfortunatamente, non sembra essere lo stesso per ESPN. Se si effettua una rapida ricerca per "ESPN API" o "ESPN fantasy API", si noterà che l'unico risultato è questa classe Python creata da qualcuno. Non sembra esserci alcuna documentazione pubblica disponibile per la loro API.
Cosa facciamo? Bene, ora è il momento perfetto per parlarvi di JMP, la nuova integrazione di Python in JMP 18. Ora, in JMP 18, Python è installato insieme a JMP. Possiamo utilizzare i pacchetti Python con una configurazione estremamente semplice. Con le classi che vi ho mostrato prima, provenienti da Sleeper o ispirate alle classi Python, invece di creare noi stessi le classi e le definizioni dei metodi, possiamo semplicemente installare il pacchetto Python usando quella riga di script che vedete qui e interagire con Python per importare i dati in JMP.
Visto che questa funzionalità esiste per ESPN, ora possiamo fare lo stesso anche per ESPN e, poiché non esiste una documentazione completa, possiamo affidarci all'API Python preesistente, già scritta da altri. Quali sono i vantaggi dell'integrazione con Python? Tutto il lavoro più complesso è già stato fatto. Non dobbiamo programmare la logica delle chiamate API o qualsiasi altro tipo di manipolazione dei dati per le funzioni che vogliamo creare. Possiamo semplicemente utilizzare le funzioni e la documentazione già esistenti in Python.
Semplicemente richiamiamo le funzioni Python e inviamo i dati a JMP. Ecco un semplice esempio di come potrebbe apparire. Mi scuso se è un po' difficile da vedere, ma volevo che tutto entrasse nello schermo. Anche queste slide saranno incluse per consentirvi di consultarle in seguito, ma potete farvi un'idea semplicemente guardando le dimensioni della definizione della funzione. Trovare una nostra funzione per ottenere il punteggio è molto più complicato che utilizzare l'integrazione Python per richiamare la funzione get_scoreboard che qualcuno ha già definito per noi in Python.
Ora diamo un'occhiata a come potrebbe apparire l'integrazione di ESP e Python. Chiuderemo questo argomento. Esamineremo di nuovo queste classi "sleeper", ma questa volta con l'integrazione di Python. Come potete vedere dalla nostra classe "league", stiamo utilizzando una serie di istruzioni `submit` e `get` di Python per interagire con l'API Python già esistente.
Per ottenere le informazioni sul campionato, basterebbe eseguire un'istruzione `submit` in Python per definire una variabile contenente le informazioni sul campionato. Successivamente, con questa variabile, useremmo la funzione `get_league` per recuperare le informazioni e poi invieremmo tale variabile a JMP tramite la funzione `get` di Python.
Tutte queste funzioni funzionano esattamente come prima con l'implementazione JSL che avevamo per la nuova richiesta HTTP, con la differenza che non abbiamo più quella classe perché la richiesta HTTP è stata astratta e ora avviene a livello Python. Questo semplifica notevolmente la definizione dei metodi per la nostra classe. Ora diamo un'occhiata a ESPN, che è probabilmente la piattaforma con cui la maggior parte di voi ha più familiarità, e come potete vedere abbiamo classi identiche o simili per ESPN.
Il modo in cui è strutturata l'API Python, tuttavia, segue un approccio più orientato agli oggetti, in cui la lega restituisce oggetti squadra, oggetti giocatore e così via. Quindi, con questi oggetti, useremo dei metodi per accedere ai loro attributi. Eseguirò questa definizione di classe, così possiamo vedere un paio di esempi di come potremmo ottenere i nostri dati da ESPN e come potremmo interagire con questi oggetti, questi oggetti di classe.
Qui vedrete che otterrò le informazioni sulla mia lega privata. Come potete vedere, quell'oggetto è stato definito. Useremo il metodo `getteams` sulla lega per ottenere le informazioni sulle squadre. Ora abbiamo un array associativo definito. Analizzeremo questo array associativo usando un ciclo `for each` per stampare i nomi di tutte le squadre. Come potete vedere qui, questo è il nome della mia squadra. Se voglio accedere alla mia squadra, userò l'indice della variabile `teams` per ottenere il nome della mia squadra. Ora, se voglio eseguire `getwins` su quella squadra, posso vedere quante vittorie ho avuto in quella stagione sette, quindi piuttosto mediocre.
Ora, se volessi visualizzare l'elenco dei giocatori di quella squadra, userei la funzione "get roster" e poi scorrerei l'elenco per ottenere i nomi dei giocatori. Come potete vedere qui, visualizzerei tutti i giocatori che avevo inserito nell'elenco per quella stagione. Come ho già detto, queste classi saranno a vostra disposizione. Mi sono preso la briga di commentarle, credo, abbastanza bene in modo che possiate usarle per accedere alle informazioni della vostra squadra.
Ora che abbiamo questi dati in JMP, per poterli analizzare, dobbiamo inserirli nelle tabelle dati di JMP. Ci sono un paio di modi per farlo, come accennato in precedenza, quando si richiamano dati da un'API, i dati vengono solitamente restituiti sotto forma di stringa JSON. JMP include una funzione chiamata "JSON to data table" e possiamo usarla, come si vede in questo esempio, per creare una tabella dati dalla nostra stringa JSON.
Questo è probabilmente il modo più semplice per farlo. In JMP è presente anche una procedura guidata di importazione JSON che permette di personalizzare le colonne da importare e i dati specifici da estrarre dalla tabella. Un altro modo, come potete immaginare, potrebbe essere più utile quando si lavora con i dati di ESPN, dato che sono più orientati agli oggetti, ed è quello di definire manualmente la tabella utilizzando JSL e poi usare i metodi dell'oggetto per popolare... Scusate. Per popolare quelle colonne.
Come potete vedere, stiamo scorrendo gli oggetti squadra per popolare le squadre che fanno parte di un campionato. Stiamo scorrendo gli oggetti squadra e, come potete vedere, per definire i dati per una particolare colonna, utilizziamo semplicemente il metodo necessario per popolare quella colonna. Per la colonna delle vittorie useremmo "get wins", per le sconfitte "get losses" e così via. Se ci sono oggetti annidati, possiamo scorrere questi oggetti per, ad esempio, popolare un elenco di ID dei giocatori che useremmo per una colonna.
Puoi vederlo per ogni espressione lì. Ora lascia che ti mostri come abbiamo ottenuto queste tabelle di dati in JMP. Ho file separati sia per ottenere i dati di Sleeper che per ottenere i dati di ESPN. Puoi vedere che per i dati di Sleeper stiamo importando le nostre classi perché questi sono i metodi che usiamo per ottenere i dati. Scorrerò velocemente qui, ma evidenzierò il metodo di cui abbiamo parlato prima, JSON to data table. Puoi vedere che lo usiamo qui per definire le nostre colonne e per creare una tabella di dati per le squadre di un campionato.
Anche in questo caso, condividerò questi file con voi. Spero che, se avete dati relativi a una lega "sleeper", tutto ciò che dovrete fare per ottenere tutti i dati per ogni anno di esistenza della lega sia eseguire quest'ultima riga, che utilizza tutte le funzioni definite in precedenza in questo file, che potrete esaminare a vostro piacimento. Abbiamo una procedura simile per ESPN. Noterete che qui creiamo le nostre tabelle in un modo leggermente diverso, come evidenziato nella diapositiva, dove definiamo una tabella con JSL e poi utilizziamo i metodi degli oggetti per popolare tali tabelle.
Ancora una volta, si spera che tutto ciò che dobbiate fare per ottenere tutti i vostri dati ESPN sia eseguire quest'ultima riga. Diamo un'occhiata a come appaiono questi dati in JMP. Dopo aver eseguito questi file, dovreste ottenere una directory con il nome della vostra lega. Per ogni anno della lega, dovreste avere le seguenti tabelle: la tabella del draft, la tabella dei membri, la tabella delle squadre, nonché i roster individuali per ogni utente della lega.
Diamo un'occhiata a questi. Come puoi vedere, abbiamo un elenco delle squadre. Vediamo se riesco ad espandere queste colonne. Spero che sia abbastanza leggibile. Per ogni squadra, troverai il nome visualizzato per gli utenti. Lo ridurrò un po' per renderlo più leggibile. Per ogni squadra, troverai i membri della lega, il numero di vittorie e sconfitte che hanno ottenuto. Puoi cliccare su questa colonna dei giocatori ed evidenziare l'elenco dei giocatori di una determinata formazione.
Avremo una tabella dati per il draft e i giocatori selezionati, suddivisi per round e numero di scelta. Cliccando su un utente, potrete vedere quali giocatori sono stati selezionati nel suo draft. Abbiamo anche una tabella per i membri della lega. Potete immaginare il tipo di analisi che potremmo effettuare con queste tabelle.
Prima di addentrarci nell'analisi, vorrei fornirvi alcune informazioni preliminari, come anticipato in precedenza. Nel 2022 ho concluso al primo posto nella mia lega, mentre nel 2023, purtroppo, sono arrivato ultimo. Cerco di individuare delle prevedibilità nei risultati, come potete vedere dal grafico a dispersione a sinistra: nel 2023 avevo un tight end e un quarterback di alto livello, mentre nella lega in cui sono arrivato ultimo non avevo nessuno di questi due giocatori tra i primi cinque.
Tuttavia, avevo un ricevitore migliore, quindi guardando questi due grafici, non riesco a dire con precisione cosa abbia determinato il mio successo in un anno rispetto a un altro, ed è proprio questo lo spunto per la mia analisi. Cosa analizzeremo oggi? La prima cosa che esamineremo è che la lega fantasy inizia con il draft. Ci sono alcune posizioni di scelta nel draft che sono migliori di altre.
La prossima cosa che analizzeremo è quali tendenze o cambiamenti si sono verificati nel fantasy football nell'ultimo decennio. Quali strategie di draft offrono le migliori possibilità di vincita? Un approccio conservativo o rischioso, e in fondo, ho semplicemente la struttura della mia lega, che è piuttosto tipica. Un quarterback, due wide receiver destri, due running back, due slot flex, un kicker e una difesa con punteggio half PPR. Penso che queste siano impostazioni di lega abbastanza standard.
Speriamo che le conclusioni tratte dalla nostra analisi possano essere utili anche per il vostro campionato. La posizione di scelta influisce sul successo? Lavoreremo con le tabelle di dati che vi ho mostrato in precedenza per eseguire alcune analisi. Per fare ciò, utilizzeremo un Workflow Builder per visualizzare i passaggi necessari per organizzare le tabelle ed eseguire l'analisi.
Qui puoi dare un'occhiata al flusso di lavoro. Abbiamo questa fase di configurazione iniziale, che definisce semplicemente il nome della nostra lega, indicando al flusso di lavoro da dove recuperare i dati. Inizialmente ti mostrerò come fare. Eseguiremo i seguenti passaggi per ogni anno della lega. Apriremo una tabella del draft. Apriremo una tabella delle squadre.
Ora, per la nostra tabella del draft, effettueremo un sottoinsieme in base al numero di utenti nella lega per ottenere il numero di scelta associato a un utente specifico. Scusate, e il risultato sarà più o meno questo. Ora uniremo questa tabella di dati alla nostra tabella delle squadre per ottenere una tabella come questa, che ora contiene il numero di vittorie ottenute da quel giocatore, o da quel membro della lega, e la posizione in cui ha scelto nel draft. Ripeteremo questo procedimento per ogni anno della lega e concateneremo le tabelle per poter eseguire la nostra analisi.
Spiegherò qui i passaggi rimanenti. Alcune di queste tabelle vengono visualizzate su una schermata diversa, ma vi mostrerò solo la tabella dei risultati finali e l'analisi. Come potete vedere in questo grafico, sull'asse X abbiamo il numero della nostra scelta, mentre sull'asse Y abbiamo sia il numero di vittorie ottenute dalla squadra che la sua posizione finale in classifica.
Osservando questo grafico, non vedo una grande discrepanza o correlazione tra il numero di scelta e il risultato finale. Sto guardando le vittorie qui in basso. Possiamo notare che forse, se si sceglie presto nel draft, il numero medio di vittorie nel corso della mia storia di lega è leggermente più alto, e poi c'è forse un calo nella parte centrale del draft. Quello che interpreto da questo è che, indipendentemente dalla posizione in cui si sceglie, sembra che si abbia una possibilità di vincere la propria lega di riferimento.
Ora vediamo come è cambiata la strategia di draft nel corso dei nove anni di storia della mia lega. Per risparmiare tempo, vi mostrerò i passaggi che utilizziamo. In pratica, apriamo tutte le nostre tabelle di draft, le uniamo e poi creiamo dei sottoinsiemi, ma per non dilungarmi troppo, vi illustrerò direttamente questo flusso di lavoro e vi mostrerò il risultato.
Qui abbiamo due grafici di output. Osserviamoli più da vicino. Illustrerò prima quello principale, e se siete interessati potete dare un'occhiata anche a quello a lato. Si tratta semplicemente di un'analisi dei giocatori selezionati nei primi quattro round del draft. In sostanza, sull'asse X abbiamo l'anno e sull'asse Y il numero di giocatori scelti in una determinata posizione nei primi quattro round.
Osservando questo grafico, possiamo notare che il numero di... questo dato si riferisce all'intera lega, quindi all'intera lega, ovvero quanti quarterback, running back, tight end e wide receiver sono stati selezionati nei primi quattro round. Possiamo vedere che dal 2015 al 2020 c'è stato un aumento del numero di running back selezionati, e questo è diminuito discretamente negli ultimi tre anni, quindi meno running back sono stati selezionati nei primi quattro round. Si può capire perché i wide receiver abbiano avuto un andamento simile a quello dei running back, con un plateau qui e rimanendo leggermente più alti rispetto ai running back. Si può notare che la popolarità dei quarterback è diminuita nel draft, nelle prime fasi del draft, con un leggero aumento qui di recente.
Il ruolo di tight end è rimasto piuttosto stabile, con solo un leggero aumento negli ultimi due anni. Come potete vedere in questo grafico, abbiamo una ripartizione round per round, e lo condividerò con la community se volete dare un'occhiata più da vicino.
Abbiamo visto come la strategia di draft è cambiata nel corso degli anni e ora vorrei analizzare se un cambiamento di strategia di draft funziona. Per questa analisi, prenderemo in esame il numero di giocatori selezionati per ogni posizione nei primi sei round, concentrandoci sugli ultimi tre anni. Qui potete vedere i passaggi necessari per questa analisi. Eseguirò la fase di impostazione. Per ogni anno, apriremo la tabella del draft. Apriremo una tabella delle squadre. Selezioneremo i dati dei primi sei round da questa tabella del draft. Quindi creeremo una tabella riassuntiva che mostri il numero di giocatori selezionati per ogni posizione per ogni utente. Ripeteremo questa operazione per ogni anno e poi uniremo i dati per eseguire la nostra analisi.
Diamo prima un'occhiata a questo grafico di Graph Builder. Possiamo vedere che il numero di running back scelti nei primi sei round tende ad essere leggermente correlato negativamente con il numero di vittorie. Questo conferma la tendenza che abbiamo visto nella nostra ultima analisi con il numero di running back scelti in calo. Possiamo vedere un picco nei wide receiver con due scelti nei primi sei round con un piccolo calo nei wide receiver, un piccolo calo, tre wide receiver scelti.
La pendenza più ripida che vediamo qui è quella del tight end, su cui torneremo tra un attimo, mostrando che scegliere un tight end nei primi sei round tende ad avere una correlazione abbastanza positiva con il numero di vittorie che ci si può aspettare di ottenere nella stagione. Lo stesso vale per il quarterback, ma con una pendenza leggermente inferiore. Analizziamo la situazione in modo più statistico utilizzando un modello di adattamento. Come potete vedere, abbiamo questa pendenza molto ripida per il tight end. Osservando le stime dei parametri in basso a sinistra.
Come si può notare statisticamente, esiste una correlazione positiva piuttosto forte tra la scelta di un tight end nei primi sei round e il numero di vittorie che ci si può aspettare in una stagione. Direi che questo è probabilmente l'aspetto più importante da sottolineare in questa analisi: mentre si dovrebbe scegliere meno running back, come si evince da questa correlazione negativa, la scelta di un tight end nei primi sei round è un indicatore piuttosto affidabile per prevedere il numero di vittorie che si otterranno in una stagione.
Ora vorrei analizzare se i migliori giocatori sono prevedibili di anno in anno. Più nello specifico, voglio vedere quale percentuale dei 12 migliori giocatori fantasy per posizione rimane invariata di anno in anno e capire se questo può fornire spunti utili su quali giocatori concentrarsi nel draft.
Anche in questo caso, per risparmiare un po' di tempo, illustrerò brevemente questo flusso di lavoro. Potete vedere i passaggi a lato mentre viene eseguito. L'esecuzione richiede solo un po' di tempo. Parlerò dei vantaggi dell'utilizzo dei flussi di lavoro per la vostra analisi. Vi permettono di eseguire iterativamente le diverse fasi dell'analisi e di individuare le aree problematiche.
Inoltre, se i tuoi colleghi hanno un accesso molto facile ai dati con cui stai lavorando, questo permette loro di replicare la tua analisi e i passaggi necessari per produrla con estrema facilità. Ti mostrerò qui i grafici e i dati prodotti da questa analisi. Puoi guardare i dati qui a lato: in sostanza, questo grafico indica la percentuale, anno dopo anno, dei primi 12 classificati per ogni posizione che è rimasta invariata rispetto all'anno precedente.
Osservando questo grafico, direi che il numero di running back, rappresentato dalla linea blu, tende a diminuire negli ultimi anni. Ciò significa che le prestazioni dei running back, anno dopo anno, sono diventate un po' meno prevedibili rispetto all'anno precedente. Al contrario, le prestazioni dei wide receiver e dei tight end sono diventate un po' più prevedibili. Un'osservazione che posso fare è che i migliori running back che abbiamo visto nel 2023, ad esempio, hanno avuto solo il 33% di presenze consecutive tra i primi 12 giocatori negli ultimi due anni. Queste posizioni potrebbero essere un po' più difficili da prevedere rispetto, ad esempio, a wide receiver e tight end.
Ecco la nostra ultima analisi. Analizzeremo chi dovremmo scegliere al draft. Esamineremo tutte queste tendenze e tutti questi schemi. Quali dovrebbero essere le nostre strategie di draft? Per questa analisi, esamineremo il valore del draft e come i giocatori che sovraperformano in base alla loro posizione al draft influenzano il successo della tua squadra. Vorrei soffermarmi un po' di più su questa analisi perché la trovo piuttosto interessante.
Dopo la fase di impostazione, ripeteremo il ciclo ogni anno. Per prima cosa apriremo la tabella del draft e poi la tabella delle squadre. Questi due passaggi successivi possono essere ignorati, sono solo operazioni di routine. Ora eseguiremo un'analisi bivariata sulla nostra tabella del draft per esaminare la relazione, posizione per posizione, tra il numero di scelta di un determinato giocatore e il punteggio totale ottenuto.
Analizzando i dati per variabile, abbiamo una ripartizione per ogni posizione che mostra sull'asse X il numero di scelta e il numero totale di punti segnati da quel giocatore. Sono particolarmente interessato a questi punti del grafico che si trovano al di sopra e al di sotto dei valori attesi o di quelli previsti dalla regressione per la posizione.
Voglio vedere come queste prestazioni al di sopra e al di sotto della curva lineare prevista influenzano le nostre possibilità di vittoria. Questo è ciò che farà il resto di questa analisi. Salveremo questi valori di regressione e questi residui da questi grafici nella nostra tabella di bozza, come puoi vedere qui. Poi raggrupperemo i nostri round in inizio, metà e fine. Esegui una rapida ricodifica qui per la nostra colonna dei round.
Ora abbiamo una suddivisione tra inizio, metà e fine. Possiamo vedere come le prestazioni superiori o inferiori alla media per categoria di round influenzano la vittoria. Vi spiegherò il resto dell'analisi. Attendete un attimo che si carichi. Ci scusiamo per il ritardo. Ci siamo quasi. Ora potete vedere che ci troviamo di fronte a una tabella dati che ci mostra come si tratti di una tabella dati combinata in cui sono presenti i dati di tutto l'anno. Ora abbiamo il numero di prestazioni estremamente superiori alla media per categoria per ogni utente nel corso di un determinato anno, e abbiamo questi dati per tutti i nostri anni. Lo scopo di questa analisi è vedere come le prestazioni estremamente superiori o inferiori alla media nei round specifici in cui sono stati selezionati influenzino le nostre possibilità di vittoria.
Possiamo dare un'occhiata a questo grafico del modello di adattamento. Questa, credo, sia l'analisi più interessante della giornata. Possiamo dare un'occhiata ad alcuni grafici di leva, prestando particolare attenzione a questi giocatori che sovraperformano in modo estremo nei round intermedi e a quelli che sottoperformano in modo estremo nei round iniziali. Sto guardando le nostre stime dei parametri qui, possiamo vedere che con significatività statistica, un giocatore che sovraperforma nei round intermedi ha una correlazione piuttosto positiva per prevedere il numero di vittorie che si ottengono nella stagione con un numero di giocatori che sovraperformano, avere più giocatori che sovraperformano nei round intermedi, ti dà una maggiore possibilità di avere più vittorie fantasy.
Al contrario, una prestazione estremamente deludente nei primi round ha una correlazione molto negativa con il numero di vittorie che ci si può aspettare nella stagione. Un consiglio da trarre da questo è di puntare in alto nei round intermedi. Cercherò di scegliere quei giocatori che sono dei veri fuoriclasse, per così dire, e non mi preoccupo troppo di non riuscire a prenderli. Come potete vedere, scegliere un giocatore che delude estremamente nei round intermedi non sembra essere poi così penalizzante.
Potresti anche puntare in alto e cercare di accaparrarti quei giocatori che ti offrono il maggior potenziale per la lega e le migliori possibilità di vittoria, soprattutto perché non verrai penalizzato più di tanto se non li prendi. Al contrario, sbagliare la scelta di un giocatore nelle prime fasi del draft e optare per un giocatore molto incline agli infortuni può essere molto dannoso per il tuo successo nel fantasy football.
Grazie per avermi seguito durante queste analisi, e questi sono, a mio avviso, alcuni punti chiave. L'anno scorso non si ripete mai. Come abbiamo visto in una delle nostre analisi, i migliori giocatori fantasy di una stagione, soprattutto per i running back, sono molto meno prevedibili di stagione in stagione.
Nei formati tipici, i running back stanno diventando meno preziosi e, come ho già detto, meno prevedibili, mentre i wide receiver stanno diventando un po' più preziosi e sono sicuramente più prevedibili dei running back. Non possiamo più trascurare le posizioni di QB e soprattutto di tight end, poiché, come abbiamo visto, scegliere un tight end nelle prime posizioni del draft tende a garantire il successo della lega. Le prime scelte del draft non garantiscono la vittoria in una lega, ma possono farla perdere, e le leghe si decidono nei round intermedi.
Assumetevi dei rischi puntando su giocatori con un alto potenziale per i motivi che ho spiegato in precedenza. Ora tocca a voi. Vi ho fornito le classi e le API che utilizzo per importare i dati di Sleeper e ESPN in JMP. Potete usare queste API per condividere le vostre analisi nella community di JMP. Se la vostra lega fantasy non è presente su Sleeper o ESPN, potete utilizzare lo schema di integrazione Python per usare qualsiasi repository Python troviate, importare i dati in JMP ed eseguire le vostre analisi.
Voglio ringraziarvi tantissimo per il tempo che mi avete dedicato oggi. Sono davvero curioso di vedere le vostre analisi e spero che possiate aiutarmi a vincere il mio prossimo campionato di fantacalcio. Grazie.