見出し画像

その分析結果、Webで触れるようにしてみませんか? ~Streamlit&セイバーメトリクスのすすめ~

こんにちは。B-Cat(@BreakingBallCat)と申します。

皆さんは野球に関する分析記事やツイートを見た時、こう思ったことはないでしょうか?

「自分もいろいろいじって確認してみたいな~~」

自分もそう思うことが多々あります。しかし、どうすれば同じ分析をすることができるのか分からなかったり、分かったとしてもハードルが高すぎてやる気が起きなかったりということが多く、そのまま放置してしまいます。

この記事では、過去記事で出した勝率推定式のページをもとに、野球における分析結果をStreamlitを用いてWebページで触れるようにするまでの流れを解説しています。

なお、StreamlitはPythonのライブラリですので、その性質上(ExcelでもRでもなく)Pythonで分析結果に関係するコードを書く必要があります。

この記事の想定する読者層:
・Pythonにある程度馴染みがある


Streamlitとは

Streamlitのメリット

Streamlitのメリットは、「HTMLやCSS、JavaScript等を書かなくてもPythonだけでWebアプリを作ることができる」という点です。

ここでは、勝率推定式に関する下記のページを作った際のコードをもとにして解説していきます。

①数値を入力する箇所を作る

数値を入力する窓を作るには、st.numper_input()を使います。
(下記はscoreという変数名で、得点を入力してもらう窓を作っています。最小値は1、デフォルトの値も1、窓の+-ボタンを押すと1つずつ値が増減します)

runs: int = st.number_input("得点", min_value=1, value=1, step=1)

②結果を計算する

計算部分については、Pythonを用いて通常通り計算をすればよいです。
勝率推定式のページでは、例として下記のような関数で計算しています。

def Cook(runs: int, runs_allowed: int) -> float:
    """Cookの勝率推定式"""
    return 0.484 * (runs / runs_allowed)


def Soolman(runs_average: float, runs_allowed_average: float) -> float:
    """Soolmanの勝率推定式"""
    return (0.102 * runs_average) - (0.103 * runs_allowed_average) + 0.505

③結果を表示する

結果を表示させる場合には、結果をdataframeに変換して、それをテーブルにして表示させるのが簡単です。
下記では、各メソッドの名前と計算式となる関数を対応付け、それをdataframeに変換してからテーブルとして出力しています。

def main() -> None:
    """メイン処理"""
    runs, runs_allowed, game_count = get_user_input()
    runs_average, runs_allowed_average, average_runs_per_inning, average_runs_allowed_per_inning, runs_difference, runs_per_game = calculate_stats(runs, runs_allowed, game_count)

    results: dict[str, list[str | float]] = {
        "Method": ["Cook", "Soolman", "James_2", "James_183", "Pythagenport", "Pythagenpat", "Palmer_RPW", "Tango_RPW", "Tango_RPW_RD"],
        "Winning Rate": [
            Cook(runs, runs_allowed),
            Soolman(runs_average, runs_allowed_average),
            James_2(runs, runs_allowed),
            James_183(runs, runs_allowed),
            Pythagenport(runs, runs_allowed, runs_per_game),
            Pythagenpat(runs, runs_allowed, runs_per_game),
            Palmer_RPW(average_runs_per_inning, average_runs_allowed_per_inning),
            Tango_RPW(runs_per_game),
            Tango_RPW_RD(runs_per_game, runs_difference)
        ]
    }

    df: pd.DataFrame = pd.DataFrame(results)
    st.table(df)

④Streamlitを起動し、ブラウザで確認する

コードが書けたら、Streamlitを起動します。
ファイル名がapp.pyの場合、ターミナルでstreamlit run app.pyと入力して実行します。 
ブラウザでは、右上に各種オプション等があります。
コードを修正したら、「Rerun」を押せばそのコードの修正が反映されます。

Streamlit起動後の画面

⑤デプロイする(無料)

Streamlitで作ったアプリをデプロイするためには、GitHubにリポジトリをアップロードする必要があります。
リポジトリをアップロードしたら、起動しているStreamlitの画面から「Deploy」を押せばデプロイができます。自分でサーバやクラウド上の実行環境等を用意する必要はありません。
(初回はStreamlitのコミュニティ等に登録する手続きが必要です)


その他タイトルやヘッダーのつけ方やテキストの表示、ラジオボタン・セレクトボックスの使い方等々については下記の記事などを参考にしてください。


この記事が気に入ったらサポートをしてみませんか?