今回、2022年度の打者のデータを阪神タイガースと阪神タイガース以外の11球団に分け機械学習を行いました。
その上で、2023年の結果と照らし合わし、精度を確認した後2024年シーズンの予測も行います。
①CSVファイルを取得(WEBスクレイピング)
homerun.ipynb
# WEB上のデータ(HTML)にアクセス&取得するために使用
import urllib
#HTMLからデータを抽出するために使用
from bs4 import BeautifulSoup
#表形式でデータ格納するために使用
import pandas as pandas
url = 'https://baseball-data.com/22/stats/hitter-all/tpa-2.html'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
#HTMLから表(tableタグ)の部分を全て取得する
table = soup.find_all('table')[0]
#テーブルから行データを取得
rows = table.find_all('tr')
#データ格納用
headData = []
playerData = []
for i, row in enumerate(rows):
#1行目
if i == 0:
#ヘッダ部取得
for headerValue in row.find_all('th'):
headData.append(headerValue.get_text())
#2行目〜最終行未満
elif(i > 0) and (i + 1 < len(rows)):
#明細部取得
playerRow = []
for playerValue in row.find_all('td'):
playerRow.append(playerValue.get_text())
playerData.append(playerRow)
#DataFrameに変換
df = pd.DataFrame(data = playerData, columns = headData)
#CSV出力
df.to_csv('playerData2022.csv', sep = ',', header = True, index = False)
上記では、対象のURLより表形式で各打者のデータをDataFrame型に変換後、CSVファイルを取得しています。
②取得したCSVファイルを読み込みデータを抽出
homerun.ipynb
# 表形式データを扱うライブラリ
import pandas as pd
# CSVデータ読み込み
df = pd.read_csv('playerData.csv', sep=',', encoding='utf-8')
# 阪神以外の11球団データを抽出
df11 = df[df['チーム'] != '阪神']
# 阪神のデータ
df_t = df[df['チーム'] == '阪神']
#本塁打との相関係数をDataFrameとして変数に保存
df.homerun = pd.DataFrame(df11.corr(numeric_only=True)['本塁打'])
#相関係数「0.7」以上の項目名を抽出
X_columns = df_homerun[df_homerun['本塁打'] >= 0.7].index.tolist()
#本塁打は目的変数のため除外
X_columns.remove('本塁打')
# 説明変数と目的変数をセット
X = df11[X_columns]
y = df11['本塁打']
上記では、取得したCSVファイルを読み込み、阪神の選手データとその他11球団のデータに分けています。
且つ、0.7以上のもの(ホームランに関係があるデータ)を抽出し、「Xにはそれを代入しています。
③モデル作成・学習
homerun.ipynb
#データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 1)
#モデルの箱の準備及び学習
lr_model = LR()
lr_model.fit(X_train, y_train)
#予測値の算出
y_pred_test = lr_model.predict(X_test)
#MSEの算出
mse_test = MSE(y_test, y_pred_test)
#RMSEの表示
rmse_test = np.sqrt(mse_test)
#阪神データ(説明変数)
X_t = df_t[X_columns]
#予測ホームラン数の算出
y_pred_t = lr_model.predict(X_t)
#予測本塁打列の追加
df_t['予測本塁打'] = np.round(y_pred_t).astype(np.int32)
---
print(df_t[['選手名', '本塁打', '予測本塁打']])
上記では、モデル(人間の脳みたいなの)のと、そのデータの評価用の学習させています。
④2023年シーズン予想結果(出力)
選手名 本塁打 予測本塁打
3 中野 拓夢 6 2
7 佐藤 輝明 20 24
11 近本 光司 3 -1
28 大山 悠輔 23 24
32 糸原 健斗 3 0
上記は2022年シーズンのデータなので2023年シーズンのデータを確認したところ、中野選手と佐藤選手はドンピシャで精度の高い予測ができていました。ただホームラン数が少ない選手の予測本数がマイナスになっているので、今後の課題にしたいと思います。
2024年シーズンを大予想!!🐯🐯
以下で予想をしました!
選手名 本塁打 予測本塁打
0 中野 拓夢 2 5
2 大山 悠輔 19 21
11 近本 光司 8 13
19 佐藤 輝明 24 29
23 ノイジー 9 12
40 木浪 聖也 1 4
なんと佐藤選手が29本!!
全体的に昨年より多い本数の予想結果となりました。
こればっかりは良い意味で大幅に裏切ってほしいですね🐯🐯
機械学習の精度を上げたい気持ちと、いっぱい打ってほしい気持ち半々です、、
今シーズンが終わった頃に、ここに戻ってきて答え合わせしてくださいね✌️