[機械学習 実践]プロ野球選手の年俸を査定するAIを作成|LightGBM|Machine Learning|Python
機械学習の実践例として、プロ野球選手の成績と年俸のデータを使って、機械学習モデルの作成・予測実行してみました。
イメージは以下のとおりです。
準備
Pythonの設定
プログラムはPythonを使用し、機械学習のアルゴリズムは、Kaggle等のデータ分析コンペでも人気のLightGBMを使用します。
Pythonの設定方法・使い方については、必要に応じて過去の記事をご確認ください。
データサイエンティストを目指す方向け Pythonセットアップ方法(Windows版) - Kevin's Data Analytics Blog
Jupyter Notebook:データサイエンティストを目指す方にオススメのPython実行環境 - Kevin's Data Analytics Blog
【初心者向け】Pandas入門 これだけは押さえておくべき基本操作|データ分析で必須 - Kevin's Data Analytics Blog
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選手(投手・野手)は、以下のとおりでした。
投手
選手名 | チーム | 背番号 | 年齢 | 年数 | 防御率 | 試合 | 勝利 | 敗北 | セーブ | ホールド | 勝率 | 打者 | 投球回 | 被安打 | 被本塁打 | 与四球 | 与死球 | 奪三振 | 失点 | 自責点 | WHIP | DIPS | 年俸 | 年俸(AI) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
田中 将大 | E | 18 | 33 | 8 | 3.01 | 23 | 4 | 9 | 0 | 0 | 0.308 | 624 | 155.2 | 131 | 17 | 29 | 5 | 126 | 54 | 52 | 1.03 | 3.58 | 90000 | 34551 |
大野 雄大 | D | 22 | 33 | 11 | 2.95 | 22 | 7 | 11 | 0 | 0 | 0.389 | 566 | 143.1 | 121 | 12 | 26 | 2 | 118 | 48 | 47 | 1.03 | 3.13 | 30000 | 31805 |
平野 佳寿 | B | 16 | 37 | 13 | 2.3 | 46 | 1 | 3 | 29 | 3 | 0.25 | 163 | 43 | 30 | 4 | 9 | 0 | 37 | 11 | 11 | 0.91 | 3.24 | 15000 | 31591 |
則本 昂大 | E | 14 | 31 | 9 | 3.17 | 23 | 11 | 5 | 0 | 0 | 0.688 | 584 | 144.2 | 123 | 18 | 35 | 3 | 152 | 56 | 51 | 1.09 | 3.42 | 30000 | 29512 |
マルティネス | H | 37 | 31 | 4 | 1.6 | 21 | 9 | 4 | 0 | 0 | 0.692 | 553 | 140.2 | 108 | 6 | 38 | 5 | 138 | 25 | 25 | 1.04 | 2.63 | 10000 | 27793 |
野手
選手名 | チーム | 背番号 | 年齢 | 年数 | 打率 | 試合 | 打席数 | 打数 | 安打 | 本塁打 | 打点 | 盗塁 | 四球 | 死球 | 三振 | 犠打 | 併殺打 | 出塁率 | 長打率 | OPS | RC27 | XR27 | 年俸 | 年俸(AI) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
鈴木 誠也 | C | 1 | 27 | 9 | 0.317 | 132 | 533 | 435 | 138 | 38 | 88 | 9 | 87 | 6 | 88 | 0 | 7 | 0.433 | 0.639 | 1.072 | 10.03 | 9.77 | 31000 | 36256 |
柳田 悠岐 | H | 9 | 33 | 11 | 0.3 | 141 | 593 | 516 | 155 | 28 | 80 | 6 | 69 | 6 | 122 | 0 | 6 | 0.388 | 0.541 | 0.929 | 7.89 | 7.59 | 61000 | 34681 |
島内 宏明 | E | 35 | 31 | 10 | 0.257 | 141 | 599 | 486 | 125 | 21 | 96 | 2 | 97 | 8 | 87 | 2 | 15 | 0.385 | 0.477 | 0.863 | 6.39 | 6.38 | 12000 | 34395 |
丸 佳浩 | G | 8 | 32 | 14 | 0.265 | 118 | 457 | 392 | 104 | 23 | 55 | 5 | 63 | 0 | 120 | 0 | 5 | 0.365 | 0.495 | 0.86 | 6.5 | 6.49 | 45000 | 33422 |
山田 哲人 | S | 1 | 29 | 11 | 0.272 | 137 | 581 | 493 | 134 | 34 | 101 | 4 | 76 | 5 | 100 | 0 | 10 | 0.37 | 0.515 | 0.885 | 6.71 | 6.84 | 50000 | 30991 |