ファンタジーフットボールにはどれほどの予測可能性があるのか?私のような熱狂的なフットボールファンは、ファンタジーリーグで安定した成功を収める道筋があるのか、毎年疑問に思っています。JMPを使って調べてみましょう!
JMPのPython統合機能が強化されたことで、ファンタジーフットボールリーグのデータをJMPに取り込むのがこれまで以上に簡単になりました。ESPNやSleeperなどのファンタジーフットボールプロバイダーのドキュメント化されたAPIにアクセスするためにJMPのネイティブHTTPリクエスト機能を使用する方法を簡単に紹介した後、この講演では、Pythonコミュニティの既存のAPIラッパーを使用してファンタジーリーグから何年分ものデータを取得する方法に焦点を当てます。リーグ順位、プレーオフ結果、NFL選手の統計、ファンタジー出力から、ファンタジードラフトの掘り出し物や失敗まで、探索できるデータは膨大です。
データがインポートされ、表に整理されたら、JMPの統計的発見ツールを使用して、リーグ固有のデータを探索および分析し、優位性を得るための潜在的な傾向やパターンを見つける作業に取り掛かることができます。
成功の鍵はドラフトの成功なのか、それとも年間を通してのトレードや選手獲得なのか? 選手のファンタジーリーグでの目覚ましい活躍は、毎年再現できるものなのか? チームにファンタジーリーグでトップ3に入る選手がいることは、どれほど重要なのか? ランニングバックは依然としてファンタジーリーグで最も影響力のあるポジションなのか、それともワイドレシーバーやクォーターバックに有利な方向に変化したのか? これらの疑問を掘り下げ、JMPがあなたの次のリーグでの勝利に役立つかどうかを探ります。
皆さん、こんにちは。ニック・ホームズと申します。JMPのテストエンジニアです。本日はご参加いただきありがとうございます。今日は、JMPを使ってファンタジーフットボールリーグで勝つ方法についてお話しします。「もしかしたら」と言ったのは、ファンタジーフットボールに絶対の保証はないからです。今日は、ファンタジーフットボールのデータをJMPに取り込み、分析を実行し、何が分かるかを見ていきましょう。
自己紹介を少しさせてください。私はファンタジーフットボールの大ファンです。2015年頃から開催されている12人制のドラフトリーグのコミッショナーを務めています。今日の例や分析では、主にそのリーグのデータを使用しています。今回のプレゼンテーション、あるいはこのプロジェクトの動機は、2022年にリーグ優勝を果たしたにもかかわらず、2023年には最下位に終わってしまったことです。ファンタジーフットボールでの結果を予測するのに役立つような、何らかの予測可能性や分析方法を探しているのです。
私は統計学者ではありませんが、全力を尽くします。ESPNとSleeperの両方のデータを使用します。ESPNは皆さんご存知だと思いますが、ファンタジーフットボールのプロバイダーです。Sleeperも同様で、ファンタジーフットボールリーグを開催するためのプラットフォームが異なるだけです。これら2つのプラットフォームからデータをインポートし、分析に使用します。
私は2015年から2020年頃までSPNを、2021年から現在までSleeperを使用していたので、両方のプラットフォームからデータを取得する必要がありました。今日は、このデータをJMPに取り込んで分析するために何をするかについて簡単に説明します。まず、データをインポートするためにAPIを使用する必要があります。これには2つの方法があり、1つは新しいHTTPリクエストを使用する方法、もう1つはJMP-Python統合を使用する方法です。
次に、これらのリクエストをJMPクラスまたはJMPクラスオブジェクトに整理する方法を説明します。JMPにデータが取り込まれたら、それをJMPデータテーブルに整理する必要があります。これにはいくつかの方法がありますが、ここではJMPに標準搭載されているJSONからデータテーブルへの変換機能、連想配列の操作、JSLを使用したJMPデータテーブルの作成方法について概説します。
データがJMPデータテーブルに格納されたら、次に探索と分析を行います。まず最初に、データテーブルの操作を行います。ワークフロービルダーを使用してその操作方法を説明し、その後、JMPのプラットフォーム上でJMPの視覚化と分析を行います。
さて、APIとは何でしょうか?APIの定義は横に表示されていますが、簡単に言うと、APIとはWebサーバーからデータを取得する方法です。HTTPにはget、post、delete、putなどいくつかのメソッドがありますが、今日は恐らく最もシンプルなGETに焦点を当てます。URLまたはAPIエンドポイントにgetリクエストを送信すると、サーバーからJSON文字列が返されます。このJSON文字列を使用して、JMPで連想配列を作成したり、JMPデータテーブルを作成したりします。
新しい HTTP リクエストは、JMP の関数で、JSL を使用して REST API と通信することを可能にします。この関数では、前述のとおり、get、post、put、delete を使用できます。今回は主に get に焦点を当て、新しい HTTP リクエストを使用してデータを JMP に取り込むのがいかに簡単かを見ていきます。
まず、ファンタジーリーグ「スリーパー」からデータを取得する方法をご紹介します。GoogleでAPIを検索すれば、使用するHTTPリクエストエンドポイントと取得できるデータの種類を正確に説明した、非常に優れたドキュメントが見つかるはずです。
API を利用する上で、プロバイダーが非常に明確な API と取得できるデータの種類を提供し、非常に分かりやすいドキュメントを提供してくれるのが理想的なシナリオです。ドキュメントをご覧いただければ分かるように、リーグデータやロスターデータを JMP に取り込む方法の概要が示されています。ほとんどの場合、URL に適用する必要がある情報はリーグ ID だけのようです。
この例では、JMP での処理の概要を示しています。まず、独自のリーグ ID を指定し、それを URL 変数として定義します。次に、新しい HTTP リクエストを使用して、get メソッドの URL を指定してリクエストを送信します。リクエストを送信すると、JMP に返送された JSON を解析します。
このリクエストがどのようなものかを確認したところで、JMP での動作を見てみましょう。ここに JMP スクリプト ウィンドウが開いています。定義されている URL を見ると、リーグ ID とスライドで見たリクエストが含まれています。ここでこれを実行すると、JSON 文字列が返されます。JMP でこのデータをより適切に操作するために、これを JMP の連想配列に変換する必要があります。これが、ここにある Parsed JSON 関数の目的です。
ご覧のとおり、連想配列が割り当てられます。この連想配列を見て、添え字を使ってリーグ名を取得すると、リーグ名である「league-certified fantasy football」が返されることがわかります。非常にシンプルなデモをお見せしたので、次に、リクエスト、つまり HTTP リクエストを整理するために、クエリを JMP クラスに操作または整理する方法をお見せしたいと思います。これを閉じて、プロジェクト ファイルを開きましょう。このプロジェクト ファイルを見ると、クエリを整理するためにクラスが定義されていることがわかります。
リーグクラスがあります。この参照からわかるように、これは実際には私がアウトラインを借用したPython APIから作成されており、JMP Python統合について説明する際に、これについてもう少し詳しく解説します。このクラスを見てみると、リーグユーザー、プレイヤー、ドラフト、統計に関するクラスがあることがわかります。バックエンドのこれらのクラスはすべて、このスーパークラスベースのAPIを呼び出しており、これがバックグラウンドで新しいHTTPリクエストを作成しています。
このクラスを使ってデータを取得する方法を見ていきましょう。このクラス定義を実行してから、下までスクロールして例をいくつか見ていきます。スクロールで目が回ったらごめんなさい。ここで、リーグオブジェクトを定義しているのがわかります。ここでも、リーグIDを指定しています。ここにクラス定義があり、そのオブジェクト用に定義されたメソッドを使ってリーグの名簿を取得できます。リーグのユーザーも取得できます。これらはすべて連想配列で返されます。
現時点では、そこに何が入っているかを正確に調べることは気にせず、取得したデータだけをお見せします。これで、ユーザー、プレーヤー、カーテンについても同じデータが得られました。これらの内容はすべて、スライドとともにプレゼンテーション資料としてJMPコミュニティと共有します。後ほどお見せするクラスを使って、JMPにデータをインポートできるはずです。
Sleeperの場合、データの取得は非常に簡単でした。HTTPリクエストを作成するために使用できる、明確に定義されたAPIが用意されていたからです。残念ながら、ESPNの場合はそうではないようです。ESPN APIまたはESPN fantasy APIで検索してみると、誰かが作成したPythonクラスしか見つかりません。彼らのAPIに関する公開ドキュメントは存在しないようです。
では、どうすればいいのでしょうか?さて、JMP 18 の新しい Python 統合についてお話しする絶好の機会です。JMP 18 では、Python が JMP にインストールされています。最小限の設定で Python パッケージを利用できます。以前ご紹介した Sleeper のクラスや Python クラスを参考に作成したクラスでは、クラスやメソッド定義を自分で作成する代わりに、ここに表示されているスクリプトを使用して Python パッケージをインストールし、Python と連携してデータを JMP に取り込むことができます。
ESPN向けにこれが既に存在するので、ESPN向けにも同じことができます。また、ESPN向けの適切なドキュメントがないため、既に誰かが作成した既存のPython APIに頼ることができます。Python統合を使用するメリットは何でしょうか?面倒な作業はすべて既に済んでいます。API呼び出しのロジックや、作成したい関数のためのその他のデータ操作をコーディングする必要はありません。他の人がPythonで作成した関数とドキュメントに頼るだけで済みます。
Python 関数を呼び出して、そのデータを JMP に送り返すだけです。その例を簡単に示します。少し見づらいかもしれませんが、画面にすべて収まるようにしたかったのです。これらのスライドは後で参照できるように添付しますが、関数定義のサイズを見ればわかります。独自の get scoreboard 関数を見つけるのは、Python 統合を使用して、誰かが Python で既に定義した get_scoreboard 関数を呼び出すよりもはるかに複雑です。
それでは、ESP と Python の統合における sleeper がどのように見えるかを見てみましょう。これでこの説明は終わりです。これらの sleeper クラスをもう一度見ていきますが、今回は Python との統合です。リーグ クラスからわかるように、既存の Python API とやり取りするために、一連の Python submit および Python get ステートメントを使用しています。
リーグ情報を取得するには、Pythonのsubmit文を実行してリーグ情報変数を定義します。次に、そのリーグ情報変数を使ってget_league関数でその変数に対応する情報を取得し、Pythonのget関数を使ってその変数をJMPに送り返します。
これらの関数はすべて、以前の JSL 実装の新しい HTTP リクエストとまったく同じように動作しますが、HTTP リクエストが抽象化され、Python レベルで実行されるようになったため、そのクラスはなくなりました。これにより、クラスのメソッド定義がはるかにシンプルになります。次に、おそらく皆さんが最もよく知っているプラットフォームである ESPN を見てみましょう。ご覧のとおり、ESPN にも同じまたは類似のクラスがあります。
ただし、Python API の構築方法からすると、これはオブジェクト指向のアプローチであり、リーグはチームオブジェクト、プレイヤーオブジェクトなどを返します。そして、それらのオブジェクトに対してメソッドを使用して属性にアクセスします。このクラス定義を実行して、ESPN からデータを取得する方法と、それらのオブジェクト、つまりクラスオブジェクトを操作する方法の例をいくつか見てみましょう。
ここで、プライベートリーグの情報を取得します。オブジェクトが定義されていることがわかります。リーグの get teams メソッドを使用して、チーム情報を取得します。これで、連想配列が定義されました。この連想配列を for each を使用して解析し、すべてのチームの名前を出力します。ご覧のとおり、これが私のチームの名前です。チームにアクセスしたい場合は、teams 変数に添え字を付けてチームを取得します。次に、そのチームで get wins を実行すると、シーズン 7 で何勝したかがわかります。かなり平凡です。
さて、そのチームのロスターを確認したい場合は、get roster 関数を使用して、そのロスターを解析し、選手名を取得します。すると、ご覧のように、そのシーズンに登録したすべての選手が表示されます。先ほども述べたように、これらのクラスは利用可能です。私は時間をかけて、自分のチーム情報にアクセスできるように、かなり丁寧にコメントを付けました。
JMPにデータを取り込んだので、分析を行うには、データをJMPのデータテーブルに格納する必要があります。これにはいくつかの方法がありますが、前述したように、APIからデータを呼び出すと、通常はJSON文字列の形式でデータが返されます。JMPには「JSONからデータテーブルへ」という組み込み関数があり、この関数を使用して、この例に示すように、JSON文字列からデータテーブルを作成できます。
これが恐らく最も簡単な方法でしょう。JMPにはJSONインポートウィザードもあり、これを使って取り込む列やテーブルから取得したい特定のデータをカスタマイズできます。また、ESPNデータはオブジェクト指向なので、ご想像のとおり、JSLを使ってテーブルを手動で定義し、オブジェクトメソッドを使って列にデータを入力するという方法も考えられます。
ご覧のとおり、リーグに所属するチームを取得するために、チームオブジェクトをループ処理しています。チームオブジェクトをループ処理し、特定の列のデータを定義するために、その列にデータを入力するのに必要なメソッドを使用します。勝利数列の場合は、勝利数、敗北数、敗北数などを取得します。ネストされたオブジェクトがある場合は、それらのオブジェクトをループ処理して、たとえば列に使用するプレイヤーIDのリストを作成できます。
それぞれの式についてそれがわかります。それでは、JMP でこれらのデータ テーブルを取得する方法をお見せしましょう。スリーパー データと ESPN データを取得するために、それぞれ別のファイルを用意しています。スリーパー データについては、データを取得するために使用するメソッドなので、クラスをインポートしていることがわかります。ここをざっとスクロールしますが、先ほど説明した JSON からデータ テーブルへのメソッドを強調表示します。ここでそれを使用して列を定義し、リーグのチームのデータ テーブルを作成していることがわかります。
繰り返しになりますが、これらのファイルを皆さんと共有します。うまくいけば、スリーパーリーグのデータをお持ちの場合は、リーグが存在するすべての年のデータを取得するには、この最後の行を実行するだけで済みます。この行は、このファイルで以前に定義されたすべての関数を使用します。これらの関数は、ご自身の都合の良いときに確認できます。ESPNについても同様のものがあります。スライドで強調表示されているように、ここではテーブルを少し異なる方法で作成していることに気づくでしょう。JSLでテーブルを定義し、オブジェクトメソッドを使用してそれらのテーブルにデータを入力します。
繰り返しますが、ESPN のデータをすべて取得するには、最後にこの行を実行するだけで済むはずです。JMP でこのデータがどのように表示されるかを見てみましょう。これらのファイルを実行すると、リーグ名と同じ名前のディレクトリが作成されます。リーグの各年ごとに、ドラフト テーブル、メンバー テーブル、チーム テーブル、およびリーグ内の各ユーザーの個人名簿というテーブルが作成されます。
それらを見ていきましょう。チームの一覧が表示されています。これらの列を拡大できるか試してみます。これで十分読みやすいといいのですが。各チームには、ユーザーの表示名が表示されます。もう少し見やすくするために、少し小さくします。各チームには、リーグのメンバー、勝利数、敗北数が表示されます。この「選手」列をクリックすると、特定のロスターの選手一覧をハイライト表示できます。
ドラフトと、ラウンドと指名番号別に指名された選手に関するデータテーブルを用意します。ユーザーをクリックすると、その選手がどのドラフトで指名されたかを確認できます。また、リーグメンバーのテーブルもあります。これらのテーブルを使ってどのような分析ができるか、想像してみてください。
分析に入る前に、先ほど予告したように、分析の動機について少しお話ししたいと思います。2022年にはリーグで1位になりましたが、2023年には残念ながら最下位になってしまいました。ここでは予測可能性と結果を求めています。左側の散布図を見ると、トップクラスのタイトエンドとトップクラスのクォーターバックがいたのに対し、最下位になったリーグでは、その2つのポジションがトップ5に入っていなかったことがわかります。
しかし、私はより優れたワイドレシーバーを擁していたので、これら 2 つのグラフを見ても、ある年と別の年で成功した原因を正確に判断することはできません。これが私の分析のきっかけです。今日は何を見ていくのでしょうか? まず最初に見ていくのは、ファンタジーリーグはドラフトから始まるということです。ドラフトには、他の場所よりも優れた指名位置がいくつかあります。
次に、過去10年間でファンタジーフットボールにどのようなトレンドや変化があったかを見ていきましょう。どのようなドラフト戦略が勝利の可能性を最も高めるのでしょうか?保守的なアプローチか、リスクの高いアプローチか。そして一番下には、ごく一般的な私のリーグ構成があります。クォーターバック1人、右レシーバー2人、ランニングバック2人、フレックス枠2つ、キッカー1人、そしてハーフPPRスコアリングのディフェンスです。これらはかなり標準的なリーグ設定だと思います。
今回の分析から得られた知見が、皆さんのリーグにも役立つことを願っています。ドラフト順位は成功に影響を与えるのでしょうか?先ほどお見せしたデータテーブルを使って、分析を行っていきます。そのためには、ワークフロービルダーを使用して、テーブルの整理方法や分析の実行手順を概観していきます。
ワークフローはここで確認できます。まず、リーグ名を定義する初期設定ステップがあります。これは、ワークフローがどこからデータを取得するかを指定するものです。最初にこのステップを順を追って説明します。リーグの各年について、以下の手順を実行します。ドラフトテーブルを開きます。チームテーブルを開きます。
さて、ドラフトテーブルについては、リーグのユーザー数でサブセット化して、特定のユーザーに関連付けられた指名番号を取得します。申し訳ありませんが、これは次のようになります。次に、このデータテーブルをチームテーブルに結合して、次のようなテーブルを作成します。このテーブルには、そのプレイヤーまたはリーグメンバーの勝利数と、ドラフトでの指名順位が含まれています。これをリーグの各年について実行し、テーブルを連結して分析を行います。
残りの手順については、ここで説明します。これらの表の一部は別の画面に表示されますが、ここでは最終的な出力表と分析結果のみをお見せします。このグラフをご覧いただくとわかるように、X軸にはピック番号、Y軸にはチームの勝利数と最終順位が表示されています。
このグラフを見ると、ドラフト順位と最終順位の間に大きな乖離や相関関係は見られません。ここでは勝利数に注目しています。ドラフトで早い順位で指名すると、私のリーグの歴史における平均勝利数がわずかに高くなる傾向があり、その後、ドラフトの前半から中盤にかけて勝利数がやや減少する傾向が見られます。このことから私が解釈するのは、ドラフト順位に関わらず、自分の所属するリーグで優勝するチャンスがあるということです。
それでは、私のリーグの9年間の歴史の中で、ドラフト戦略がどのように変化してきたかを見ていきましょう。時間を節約するために、私たちが使用している手順をお見せします。基本的には、すべてのドラフトテーブルを開いて連結し、いくつかのサブセットを作成しますが、時間を節約するために、このワークフローを順に実行して出力をお見せします。
ここに2つの出力グラフがあります。詳しく見ていきましょう。まずはこちらのメインのグラフについて説明しますので、興味があれば横にあるこちらのグラフもご覧ください。これは、バイアラウンドの内訳を示したものです。基本的に、X軸は年、Y軸は上位4ラウンドで特定のポジションで指名された選手の数を表しています。
このグラフを見ると、リーグ全体の数字、つまりリーグ全体で、上位4ラウンドで指名されたクォーターバック、ランニングバック、タイトエンド、ワイドレシーバーの数を確認できます。2015年から2020年にかけて、ランニングバックの指名数が増加し、ここ3年間でかなり減少していることがわかります。つまり、上位4ラウンドで指名されたランニングバックの数は減っています。レシーバーもランニングバックと同様の傾向を示し、ここで横ばいになり、ランニングバックより少し高い位置を維持していることがわかります。クォーターバックはドラフトで人気が下がっており、ドラフト序盤での人気は最近わずかに上昇していることがわかります。
タイトエンドの指名数は、ここ数年でわずかに増加したものの、ほぼ横ばい状態が続いています。このグラフをご覧いただければわかるように、ラウンドごとの内訳がありますので、詳しく知りたい方はコミュニティの皆様と共有したいと思います。
さて、ドラフト戦略が長年にわたってどのように変化してきたかを見てきましたが、今度は、ドラフト戦略の変更が機能するかどうかを見ていきたいと思います。この分析では、最初の6ラウンドで各ポジションで指名された選手の数を調べます。これは過去3年間のみを対象とします。この分析の手順はここにあります。セットアップ手順を実行します。各年について、ドラフトテーブルを開きます。チームテーブルを開きます。このドラフトテーブルから最初の6ラウンドを抽出します。次に、各ユーザーについて各ポジションで指名された選手の数を示すサマリーテーブルを作成します。これを各年について行い、分析を実行するためにそれらを連結します。
まず、こちらのグラフビルダーのプロットを見てみましょう。最初の6ラウンドで指名されたランニングバックの数は、勝利数とわずかに負の相関関係にあることがわかります。これは、前回の分析で確認した、指名されるランニングバックの数が減少しているという傾向を裏付けています。ワイドレシーバーについては、最初の6ラウンドで2人が指名されピークに達した後、少し減少し、3人が指名されたことがわかります。
ここで最も急な傾きが見られるのはタイトエンドで、これについては後ほど詳しく説明しますが、最初の6ラウンドでタイトエンドを選ぶと、シーズンで期待できる勝利数とかなり正の相関関係があることがわかります。クォーターバックも同様ですが、傾きは少し緩やかです。フィットモデルを使用して、これを統計的に見てみましょう。ここで、タイトエンドについて非常に急な傾きが見られることがわかります。左下隅にあるパラメーター推定値を見てみましょう。
統計的に有意な結果から、最初の6ラウンドでタイトエンドを指名することと、シーズン中に期待できる勝利数の間には、かなり強い正の相関関係があることが分かります。この分析から得られる最大の教訓は、ランニングバックの指名数を減らすべきである一方で、この負の相関関係からも分かるように、最初の6ラウンドでタイトエンドを指名することは、シーズン中の勝利数を予測する上でかなり強い相関関係があるということです。
次に、トッププレイヤーの成績が毎年予測可能かどうかを検証したいと思います。具体的には、ポジション別のファンタジーポイント上位12名のうち、毎年同じ成績を残している選手の割合を調べ、ドラフトでどの選手に注目すべきかのヒントが得られるかどうかを見ていきます。
ここでも少し時間を節約するために、このワークフローをざっと説明します。実行中は、画面の横に手順が表示されます。実行には少し時間がかかります。ワークフローを分析に活用するメリットについてお話しします。ワークフローを使うことで、分析のさまざまなステップを繰り返し実行し、問題点を特定することができます。
また、同僚があなたが扱っているデータに簡単にアクセスできる場合、彼らはあなたの分析と、その分析結果を作成する手順を非常に簡単に再現できます。ここでは、この分析によって生成されたグラフとデータをお見せします。横にあるデータを見ると、これは基本的に、各ポジションの上位12人のうち、前年と同じ割合が何パーセントだったかを前年比で示しています。
このグラフを見ると、ランニングバックの数(この青い線)はここ数年減少傾向にあると言えるでしょう。つまり、ランニングバックの年間成績は前年に比べてやや予測しにくくなっているということです。一方、レシーバーやタイトエンドの成績はやや予測しやすくなっています。ここで私が注目したいのは、例えば2023年に活躍したトップランニングバックの場合、上位12人の成績上位選手の過去2年間のキャリー率はわずか33%だったということです。これらのポジションは、ワイドレシーバーやタイトエンドなどに比べて、予測がやや難しいのかもしれません。
最後に、ドラフトで誰を指名すべきかを見ていきましょう。これらのトレンドやパターンをすべて見ていきます。ドラフト戦略はどうあるべきでしょうか?この分析では、ドラフトの価値と、ドラフト順位に基づいて期待以上の活躍をする選手がチームの成功にどのような影響を与えるかを見ていきます。この分析はかなり興味深いと思うので、もう少し詳しく見ていきたいと思います。
セットアップ手順の後、再び各年をループ処理します。まずドラフトテーブルを開き、次にチームテーブルを開きます。次の2つの手順は無視しても構いません。単なる事務処理です。次に、ドラフトテーブルに対して二変量解析を実行し、ポジションごとに特定の選手の指名番号と獲得した合計ポイントの関係を調べます。
変数分析を用いてこれを見てみると、ポジションごとに内訳が表示され、X軸にはその選手が獲得した合計ポイントが示されています。私が特に注目しているのは、期待値、あるいは回帰分析で示されたそのポジションの期待値よりも上回っている点と下回っている点です。
予測された線形近似値より上と下のこれらのパフォーマンスが、勝利の可能性にどのように影響するかを確認したいと思います。この分析の残りの部分では、それを行います。ご覧のように、これらのプロットから回帰値と残差をドラフトテーブルに保存します。次に、ラウンドを早期、中期、後期にグループ化します。ラウンド列を簡単に再コード化してください。
これで、序盤、中盤、終盤の内訳が分かりました。ラウンドのカテゴリー別に、パフォーマンスがオーバーまたはアンダーの選手が勝敗にどう影響するかが分かります。この分析の残りの部分を説明します。データが表示されるまで少しお待ちください。遅れて申し訳ありません。もうすぐです。これで、データテーブルが残りました。これは、その年のすべてのデータが含まれている結合データテーブルです。これで、特定の年における各ユーザーのラウンドのカテゴリー別の極端なオーバーパフォーマーの数が分かりました。このデータはすべての年についてあります。この分析のポイントは、ドラフトされた特定のラウンドでの極端なオーバーパフォーマーまたはアンダーパフォーマーが、勝率にどう影響するかを確認することです。
ここで、この適合モデルプロットを見てみましょう。これは、今日一番興味深い分析だと思います。ここで、いくつかのレバレッジプロットを見てみましょう。特に、中盤ラウンドでの極端なオーバーパフォーマーと、序盤ラウンドでの極端なアンダーパフォーマーに注目してください。ここでパラメータ推定値を見ると、統計的に有意な、中盤ラウンドでのオーバーパフォーマーは、シーズンでの勝利数を予測する上でかなり正の相関関係にあることがわかります。オーバーパフォーマーの数が多いほど、中盤ラウンドでのオーバーパフォーマーの数が多いほど、ファンタジー勝利数が増える可能性が高くなります。
対照的に、序盤のラウンドで極端に期待外れの成績を残した選手は、シーズンを通して予測できる勝利数と非常に負の相関関係にある。ここから得られる教訓は、中盤のラウンドでは思い切った挑戦をしてみるということだ。例えば、ホームランを打つような選手を指名してみようと思う。そして、たとえ失敗しても、それほど心配する必要はない。ご覧のとおり、中盤のラウンドで極端に期待外れの成績を残した選手を獲得しても、それほど大きな損失にはならないようだ。
思い切って、リーグでの活躍が期待でき、優勝の可能性が最も高い選手を獲得しようと努力するのも良いでしょう。特に、そうした選手を指名し損ねても、それほど大きなペナルティはないのですから。逆に、ドラフト序盤で選手を指名し損ね、怪我をしやすい選手を選んでしまうと、ファンタジーフットボールでの成功に非常に悪影響を及ぼす可能性があります。
分析にお付き合いいただきありがとうございました。以下に、私がまとめた要点をいくつかご紹介します。昨年の成績は二度と再現されません。分析でご覧いただいたように、特にランニングバックの場合、あるシーズンのファンタジーポイント上位選手は、シーズンごとに予測するのが非常に難しくなります。
一般的なフォーマットでは、ランニングバックの価値は低下しており、前述したように予測も難しくなっています。一方、ワイドレシーバーの価値は少し高まり、ランニングバックよりも確実に予測しやすくなっています。QB、特にタイトエンドのポジションはもはや無視できません。ご覧のとおり、ドラフトの早い段階でタイトエンドを指名すると、リーグの成功につながる傾向があります。ドラフトの早い段階で指名してもリーグ優勝はできませんが、負ける可能性はあります。そして、リーグは中盤のラウンドで決まることが多いのです。
先に述べた理由から、高いポテンシャルを持つ選手にリスクを取って投資しましょう。さあ、今度は皆さんの番です。SleeperとESPNのデータをJMPにインポートするために私が使用しているクラスとAPIを皆さんに提供しました。これらのAPIを使用して、JMPコミュニティで独自の分析結果を共有できます。ファンタジーリーグがSleeperやESPNに含まれていない場合は、Python統合の概要を参考に、見つけたPythonリポジトリを使用してJMPにデータを取り込んで分析を実行できます。
今日は貴重なお時間をいただき、本当にありがとうございました。皆さんの分析結果を見るのがとても楽しみです。そして、皆さんのアドバイスのおかげで、次のファンタジーフットボールリーグで優勝できることを願っています。ありがとうございました。