Kevin's Data Analytics Blog

データサイエンティスト、AIエンジニアを目指す方に向けて情報発信していきます。

[機械学習 実践]プロ野球選手の年俸を査定するAIを作成|LightGBM|Machine Learning|Python

機械学習の実践例として、プロ野球選手の成績と年俸のデータを使って、機械学習モデルの作成・予測実行してみました。

イメージは以下のとおりです。
f:id:dskevin:20220116104836p:plain:h320
f:id:dskevin:20220116104850p:plain:h320
f:id:dskevin:20220116104905p:plain:h320

準備

lightgbmパッケージのインストール

LightGBMを使うためには、lightgbmパッケージが必要です。インストールしていない場合は、コマンドプロンプトを開いて、以下のコマンドを実行するとインストールできます。

pip install lightgbm

sweetvizパッケージのインストール

データの可視化で、Sweetvizを使用します。日本語データを扱うための設定が若干複雑でしたので、今回は説明は割愛します。(別の機会に紹介します。)
もし、インストール済でない場合、機械学習モデルの作成自体はできますので、スキップしても大丈夫です。

データの取得

機会学習に必要な数値を以下のサイトから取得し、CSVファイルに保存します。欠損値データの除去などの前処理も事前に行います。
プロ野球データFreak

実装

1. ライブラリのインポート

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# データ可視化用ライブラリ →未インストールの場合はインポート不要
import sweetviz as sv
sv.config_parser.read('sweetviz_setting.ini')

# 機械学習用ライブラリ LightGBM
import lightgbm as lgb

# テストデータ分割用ライブラリ
from sklearn.model_selection import LeaveOneOut

# 評価用ライブラリ
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

2. データの読み込み・確認

pitcher = pd.read_csv('../data/npb_stats_salary_pitcher.csv', encoding='cp932')
pitcher
pitcher[pitcher['年']==2021]
# Sweetviz →未インストールの場合はスキップ
sv_out = sv.analyze(pitcher)
sv_out.show_html('../output/sv_report.html')

3. 機械学習の適用

# 説明変数用カラム
X_columns = pitcher.columns[3:-1]
X_columns
# 説明変数
X = pitcher[X_columns].copy()
# 目的変数
y = pitcher['年俸']
X
y
# モデル学習、予測
# モデルのインスタンスの作成
model = lgb.LGBMRegressor()

# Leave one out法で、モデルの学習と予測を繰り返す
loo = LeaveOneOut()
actual = []
pred = []
cnt = 0
for train_index, test_index in loo.split(X):
    # データの分割
    x_train, x_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # モデルの学習
    model.fit(x_train, y_train) # モデルの学習

    # テストデータの予測
    y_pred = model.predict(x_test)
    actual.append(y_test.values[0])
    pred.append(y_pred[0])

    # 340人分(2021年データ)で終了
    cnt+=1
    if cnt == 340:
        break
# 散布図を描画(実値 vs 予測値)
plt.plot(actual, actual, color = 'red', label = 'x=y') # 直線y = x
plt.scatter(actual, pred) # 散布図のプロット
plt.xlabel('y_actual') # x軸ラベル
plt.ylabel('y_pred') # y軸ラベル
plt.title('y_actual vs y_pred') # グラフタイトル
# モデル評価
# rmse: 平均二乗誤差の平方根
mse = mean_squared_error(actual, pred)
rmse = np.sqrt(mse)
print('RMSE :',rmse)

# r2: 決定係数
r2 = r2_score(actual,pred)
print('R2 :',r2)

4. 結果の出力

# 2021年の340人分に結合
pitcher_v2 = pitcher.head(340).copy()
pitcher_v2['年俸(AI)'] = pred
pitcher_v2
# CSVファイルに出力
pitcher_v2.to_csv('../output/npb_stats_salary_pitcher_output.csv', index=False, encoding='cp932')

結果

機械学習で算出した年俸額の上位5選手(投手・野手)は、以下のとおりでした。

投手

選手名チーム背番号年齢年数防御率試合勝利敗北セーブホールド勝率打者投球回被安打本塁打与四球死球奪三振失点自責点WHIPDIPS年俸年俸(AI)
田中 将大E183383.012349000.308624155.21311729512654521.033.589000034551
大野 雄大D2233112.9522711000.389566143.11211226211848471.033.133000031805
平野 佳寿B1637132.346132930.2516343304903711110.913.241500031591
則本 昂大E143193.1723115000.688584144.21231835315256511.093.423000029512
マルティネスH373141.62194000.692553140.2108638513825251.042.631000027793

野手

選手名チーム背番号年齢年数打率試合打席数打数安打本塁打打点盗塁四球死球三振犠打併殺打出塁率長打率OPSRC27XR27年俸年俸(AI)
鈴木 誠也C12790.3171325334351383888987688070.4330.6391.07210.039.773100036256
柳田 悠岐H933110.314159351615528806696122060.3880.5410.9297.897.596100034681
島内 宏明E3531100.25714159948612521962978872150.3850.4770.8636.396.381200034395
丸 佳浩G832140.26511845739210423555630120050.3650.4950.866.56.494500033422
山田 哲人S129110.2721375814931343410147651000100.370.5150.8856.716.845000030991
※実際には、様々な要素が年俸に反映されていると思いますので、こちらの結果自体は参考値として捉えていただけると助かります。

まとめ

プロ野球選手の成績・年俸を題材として機械学習の使い方を紹介しました。Pythonで用意されているライブラリ関数を使うことで、複雑なプログラミング無しで機械学習を使った処理が実装できると感じていただけたと思います。今回扱ったLightGBM以外にも、たくさんの機械学習アルゴリズムPythonで用意されていますが、使い方は同様です。今後また紹介していきたいと思います。

今回の内容を動画でも紹介していますので、もしよければこちらもご覧ください。
youtu.be

本記事が皆様のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました!