エンジニア データサイエンティスト

Python機械学習「ホームラン数予測③」データ分析編!

2020年11月26日

Python機械学習

 

ホームラン数を予測できるように機械学習させたいけど、
どんな情報を渡せば良いんだろう。。
片っ端から渡して色々と試せばいいんだろうか。。

 

こんにちは、古賀です!

 

本記事は、

はてな

「Python機械学習でホームラン数を予測する」のデータ分析編

です!

 

機械学習をするために「データ」を取ってきた後は、

そのデータを分析して、機械に渡すための材料を選ぶ必要があります。

材料選びを間違えると、正しく「ホームラン数」を予測することができません。

正しく「ホームラン数」を予測できるように「データ分析」の基本を学びましょう!

 

前回の続きになりますので、

前回の記事を読まれていない方はこちらをご覧ください!

Python機械学習
Python機械学習「ホームラン数予測②」データ収集「WEBスクレイピング」編!

  PythonのプログラミングでWEBサイトの情報を取ってきたいけど、 どうやってやればいいんだろう。。 CSVデータに出力したいんだけど。。   こんにちは、古賀です! &nb ...

続きを見る

 

また、実行環境は「JupyterLab」を使っていきますので、

「JupyterLab」の記事を読まれていない方は、こちらもご確認ください!

JupyterLab
JupyterLabとは?Python実行環境「JupyterLab」の概要と基本的な使い方!

  Pythonの実行環境「JupyterLab」が起動できるところまできたけど、 どういう風に使っていけばいいんだろう?? そもそも「JupyterLab」ってなんだ??   こ ...

続きを見る

 

自己紹介が遅れましたが、

わたしは大学卒業後、上場IT企業に就職し、プログラマー、システムエンジニアとして

約10年間働いておりまして、その後は様々な活動をしております。

プロフィールの詳細はこちらです。

野球
プロフィール

こんにちは、古賀正雄です。現在36歳です。 簡単ではありますが、こちらのページで自己紹介とこのブログについてお話します。 高校時代 学生時代は主に野球をしていました。 進学先の高校も野球で選びました。 ...

続きを見る

 

※YouTubeに同内容を公開しております。

Python機械学習「データ分析」の概要

グラフ

前回の記事で、WEBサイトから「2020年のプロ野球データ」をCSVファイルに出力しました。

今回はそのデータを使って、「ホームラン数」と関連性が高い項目を調べて、

「説明変数(特徴量)」を作成します。

 

用語のおさらいですが「説明変数(特徴量)」は、

予測するためのデータ「試合数」や「打席数」、「ヒット数」といった項目です。

 

この「説明変数(特徴量)」が適切でないと、

予測精度が低くなってしまうので、

ホームランを予測する際に必要のないデータは省いて、

ホームラン数を予測する際に関連性のあるデータだけを渡す必要があります。

 

「ホームランと関連性の高いデータをどのように調べるか?」

についてですが、「相関係数」を使います。

 

「相関係数」のおさらいですが、

「-1~1」を取る値のことで、

「-1」に近ければ負の相関があると言って、片方の値が小さければもう片方の数値が大きくなります。

逆に「1」に近ければ正の相関があると言って、片方の値が大きければもう片方の数値も大きくなります。

相関係数が「0」付近であれば、ホームランの数には影響しないデータなので、

「説明変数(特徴量)」からは外すようにします。

 

野球に詳しい方は、

「どの項目がホームラン数と相関が強いか?」

予想してみてください!

 

具体的な手順としては、

  1. プロ野球データを保存したCSVデータを読み込む
  2. データを巨人と11球団のデータに分ける
  3. ホームラン数と各項目の相関係数を調べる
  4. どのデータを説明変数(特徴量)とするか選ぶ

です!

Python機械学習「データ分析」をしてみる!

グラフ

今回のコード全体です。

今からこのコードを1から説明していきます!

途中、分析用に他のコードも書いていきます!

# 表形式データを扱うライブラリ
import pandas as pd

# CSVデータ読み込み
df = pd.read_csv('playerData.csv', sep = ',')

# 巨人以外の11球団データを抽出
df11 = df[df['チーム'] != '巨人']
# 巨人のデータ
df_g = df[df['チーム'] == '巨人']

# 本塁打との相関係数をDataFrameとして変数に保存
df_homerun = pd.DataFrame(df11.corr()['本塁打'])

# 相関係数「0.8」以上の項目名を抽出
X_columns = df_homerun[df_homerun['本塁打'] >= 0.8].index.tolist()
# 本塁打は目的変数のため除外
X_columns.remove('本塁打')

# 説明変数と目的変数をセット
X = df11[X_columns]
y = df11['本塁打']

CSVファイルの読み込み

まずは、前回ファイル出力した「2020年プロ野球データ」を保存しているCSVファイルを読み込みます。

# 表形式データを扱うライブラリ
import pandas as pd

# CSVデータ読み込み
df = pd.read_csv('playerData.csv', sep = ',')

1行目は前回もお話しましたが、表形式データを扱うためのライブラリ「Pandas」を宣言しています。

 

2行目で前回出力したCSVファイルを読み込んでいます。

列の項目名を変えたり、読み込むデータのデータ型を指定できたりと、

色々とオプションがあるのですが、

今回は単純に「ファイル名」と「区切り文字(CSVなのでカンマ)」を指定して、

CSVファイルを読み込みます。

 

読み込んだ結果は表形式データ「DataFrame」型で変数に格納しています。

前回もお話した「type」関数を使って確認してみると、

# データ型確認
print(type(df))

結果
<class 'pandas.core.frame.DataFrame'>

「DataFrame」型だということが確認できます。

 

読み込んだデータを色々と確認してみましょう。

まず読み込んだ「項目名」と「データ型」を「DataFrame変数.dtypes」で確認できます。

実行結果を確認すると、こんな感じです。

# 項目名とデータ型
print(df.dtypes)

結果
順位       int64
選手名     object
チーム     object
打率       float64
試合       int64
打席数     int64
打数       int64
得点       int64
安打       int64
二塁打     int64
三塁打     int64
本塁打     int64
塁打       int64
打点       int64
盗塁       int64
盗塁刺     int64
犠打       int64
犠飛       int64
四球       int64
敬遠       int64
死球       int64
三振       int64
併殺打     int64
出塁率     float64
長打率     float64
dtype: object

 

続いて「データ数」と「項目数」を「DataFrame変数.shape」で確認できます。

# データ数と項目数確認
print(df.shape)

結果
(328, 25)

結果を確認すると、「328行のデータがあって、25列の項目がある」ということがわかります。

 

最後にデータの中身を確認します。

「DataFrame」の変数を直接見てみると、

#データの中身を確認
print(df)

結果
      順位    選手名     チーム     打率   試合  打席数   打数  得点   安打  二塁打  ...  盗塁刺  犠打  犠飛  \
0      1  鈴木 大地      楽天  0.297  119  541  474  71  141   27  ...    3  12   3   
1      2  大島 洋平      中日  0.316  118  525  462  58  146   21  ...    8   9   3   
2      3  浅村 栄斗      楽天  0.282  119  524  429  71  121   25  ...    1   0   2   
3      4  西川 遥輝    日本ハム  0.307  114  518  417  82  128   16  ...    7   4   3   
4      5  柳田 悠岐  ソフトバンク  0.341  118  511  425  89  145   23  ...    2   0   3   
..   ...    ...     ...    ...  ...  ...  ...  ..  ...  ...  ...  ...  ..  ..   
323  321  山崎 勝己   オリックス  0.000    2    1    1   0    0    0  ...    0   0   0   
324  321  吉田 裕太     ロッテ  0.000    1    1    0   0    0    0  ...    0   1   0   
325  321  加藤 脩平      巨人  0.000    1    1    1   0    0    0  ...    0   0   0   
326  327  白崎 浩之   オリックス  0.000    3    0    0   1    0    0  ...    0   0   0   
327  327   細谷 圭     ロッテ  0.000    1    0    0   0    0    0  ...    0   0   0   

     四球  敬遠  死球   三振  併殺打    出塁率    長打率  
0    46   0   6   57   17  0.365  0.384  
1    47   3   4   51    5  0.382  0.381  
2    89   2   4  108   15  0.408  0.564  
3    92   1   2   84    5  0.432  0.396  
4    82   8   1  103    2  0.446  0.616  
..   ..  ..  ..  ...  ...    ...    ...  
323   0   0   0    0    0  0.000  0.000  
324   0   0   0    0    0  0.000  0.000  
325   0   0   0    1    0  0.000  0.000  
326   0   0   0    0    0  0.000  0.000  
327   0   0   0    0    0  0.000  0.000  

[328 rows x 25 columns]

前回取ってきたプロ野球選手のデータが読み込めています。

これで今回の第一段階クリアです!

データを巨人と11球団のデータに分ける

読み込んだプロ野球選手データですが、現状だと全12球団のデータがひとまとまりになっています。

改めて確認ですが、今回のゴールは、

「11球団のデータを使って機械学習させて、巨人の選手のホームラン数を当てる!」

ことです。

 

なので、機械学習を終えるまで、一旦巨人のデータは別に退避させておいて、

「教師データ」となる「11球団のデータ」と分けておく必要があります。

おさらいになりますが「教師データ」は機械学習するためのデータのことです。

以下のように「11球団のデータ」と「巨人のデータ」を別々の変数にセットします。

# 巨人以外の11球団データを抽出
df11 = df[df['チーム'] != '巨人']
# 巨人のデータ
df_g = df[df['チーム'] == '巨人']

このように書くことで、それぞれ「df11」、「df_g」の変数にデータを分けることができます。

 

もう少し「DataFrame」の操作を細かく説明しておきます。

先程、CSVファイルから読み込んだデータの中身を確認しましたが、

一部の項目だけ確認したい場合は「df[列名]」とすることで、指定した項目だけ確認することができます。

「チーム」のみ確認したい場合は、このような感じです。

# チーム名のみ表示
print(df['チーム'])

結果
0          楽天
1          中日
2          楽天
3        日本ハム
4      ソフトバンク
        ...  
323     オリックス
324       ロッテ
325        巨人
326     オリックス
327       ロッテ
Name: チーム, Length: 328, dtype: object

ちなみに「1列のみ」、「1行のみ」取り出したデータは、

「DataFrame」型ではなく「Series」型と呼ばれるので覚えておきましょう!

 

複数列指定したい場合は、「df[[列名,列名,・・・,列名]]」

と列指定を配列型とすることで、複数列のデータを確認できます。

※配列については、前回の記事で説明しています。

「選手名」と「チーム」を指定すると、このような感じです。

# 選手名、チームを表示
print(df[['選手名','チーム']])

結果
       選手名     チーム
0    鈴木 大地      楽天
1    大島 洋平      中日
2    浅村 栄斗      楽天
3    西川 遥輝    日本ハム
4    柳田 悠岐  ソフトバンク
..     ...     ...
323  山崎 勝己   オリックス
324  吉田 裕太     ロッテ
325  加藤 脩平      巨人
326  白崎 浩之   オリックス
327   細谷 圭     ロッテ

[328 rows x 2 columns]

 

これを踏まえて上で、巨人以外のデータを取り出したい場合を考えます。

まず各行データが「巨人以外」か調べたい時は、

# 巨人以外の行データを調べる
print(df['チーム'] != '巨人')

結果
0       True
1       True
2       True
3       True
4       True
       ...  
323     True
324     True
325    False
326     True
327     True
Name: チーム, Length: 328, dtype: bool

とこのようにすることで、「巨人以外」であれば「True」が返ってきます。

 

そして「df[ ]」の中に、この結果を入れるとファルターの役割を果たしてくれるので、

# 巨人以外の11球団データを抽出
print(df[df['チーム'] != '巨人'])

結果
  順位    選手名     チーム     打率   試合  打席数   打数  得点   安打  二塁打  ...  盗塁刺  犠打  犠飛  \
0      1  鈴木 大地      楽天  0.297  119  541  474  71  141   27  ...    3  12   3   
1      2  大島 洋平      中日  0.316  118  525  462  58  146   21  ...    8   9   3   
2      3  浅村 栄斗      楽天  0.282  119  524  429  71  121   25  ...    1   0   2   
3      4  西川 遥輝    日本ハム  0.307  114  518  417  82  128   16  ...    7   4   3   
4      5  柳田 悠岐  ソフトバンク  0.341  118  511  425  89  145   23  ...    2   0   3   
..   ...    ...     ...    ...  ...  ...  ...  ..  ...  ...  ...  ...  ..  ..   
322  321  白濱 裕太      広島  0.000    2    1    1   0    0    0  ...    0   0   0   
323  321  山崎 勝己   オリックス  0.000    2    1    1   0    0    0  ...    0   0   0   
324  321  吉田 裕太     ロッテ  0.000    1    1    0   0    0    0  ...    0   1   0   
326  327  白崎 浩之   オリックス  0.000    3    0    0   1    0    0  ...    0   0   0   
327  327   細谷 圭     ロッテ  0.000    1    0    0   0    0    0  ...    0   0   0   

     四球  敬遠  死球   三振  併殺打    出塁率    長打率  
0    46   0   6   57   17  0.365  0.384  
1    47   3   4   51    5  0.382  0.381  
2    89   2   4  108   15  0.408  0.564  
3    92   1   2   84    5  0.432  0.396  
4    82   8   1  103    2  0.446  0.616  
..   ..  ..  ..  ...  ...    ...    ...  
322   0   0   0    0    0  0.000  0.000  
323   0   0   0    0    0  0.000  0.000  
324   0   0   0    0    0  0.000  0.000  
326   0   0   0    0    0  0.000  0.000  
327   0   0   0    0    0  0.000  0.000  

[301 rows x 25 columns]

「巨人以外」のデータを抽出することができます。

これを別の変数「df11」に格納しています。

 

「巨人のみ」を取り出したい場合は、条件文を逆にするだけです。

これで、「11球団」のデータ、「巨人」のデータの2つに分けることができました。

ホームラン数との相関係数を調べる

ようやく今回の本題に入ります。

ホームラン数と各項目の相関の強弱を調べていきます。

相関の強弱を調べる方法はいくつかありますが、その中の1つ「散布図」を見ることで確認することができます。

 

下記のように書くと、「打席数」と「ホームラン数」の散布図を確認できます。

グラフを表示したい場合は「matplotlib」ライブラリを使います。

散布図を表示させるための「scatter」関数の引数に、

11球団データをセットしている変数から「打席数」と「本塁打」のデータを列名を指定して渡しています。

# グラフ可視化ランブラリ
from matplotlib import pyplot as plt
# JupyterLabでグラフを表示させるための記述
%matplotlib inline

# 散布図
plt.scatter(x = df11['打席数'], y = df11['本塁打'])
# グラフ表示
plt.show()

打席数と本塁打の散布図

グラフを見ると、こんな感じです。

 

散布図は数学の授業で習ったと思いますが、綺麗な右肩あがりになっていれば相関が強いと言えます。

逆に右肩下がりになっていると、負の相関が強いと言えて、

各点がバラバラだと相関がないと判断できます。

 

このグラフを見ると、綺麗な右肩あがりではないですが、多少の相関があると言えそうです。

野球の知識の目線から考えても、打席数が多ければ、当然ホームランの数も増えるので、

相関があることは当然です。

 

ただ、このように各項目とホームラン数との相関を1つずつ散布図で確認するとなると、

ちょっと大変です。しかも、目視で相関があるかないか判断する必要があります。

 

そこで、冒頭に説明した「相関係数」を調べて、相関の強弱を数値で表しましょう!

「corr」という関数を使う事で、各項目の相関係数を一気に確認することができるので便利です。

実行してみると、

# 各項目間の相関係数
print(df11.corr())

結果
           順位        打率        試合       打席数        打数        得点        安打  \
順位   1.000000 -0.407034 -0.934417 -0.934977 -0.935255 -0.860108 -0.900221   
打率  -0.407034  1.000000  0.366004  0.388513  0.389626  0.390378  0.424232   
試合  -0.934417  0.366004  1.000000  0.922792  0.921952  0.868782  0.889536   
打席数 -0.934977  0.388513  0.922792  1.000000  0.998208  0.944063  0.983963   
打数  -0.935255  0.389626  0.921952  0.998208  1.000000  0.936799  0.984953   
得点  -0.860108  0.390378  0.868782  0.944063  0.936799  1.000000  0.950077   
安打  -0.900221  0.424232  0.889536  0.983963  0.984953  0.950077  1.000000   
二塁打 -0.843887  0.395273  0.828466  0.924497  0.923328  0.892092  0.940341   
三塁打 -0.495558  0.244762  0.493597  0.536260  0.542186  0.555815  0.552179   
本塁打 -0.678139  0.294984  0.661433  0.764071  0.758635  0.769061  0.754315   
塁打  -0.882355  0.408799  0.868877  0.971135  0.970267  0.948251  0.980858   
打点  -0.818896  0.361392  0.809607  0.910505  0.906890  0.868322  0.903396   
盗塁  -0.423355  0.197726  0.451352  0.450689  0.443318  0.549285  0.457709   
盗塁刺 -0.537767  0.245504  0.561521  0.576515  0.573605  0.630112  0.574919   
犠打  -0.403369  0.086484  0.427915  0.353001  0.344342  0.312046  0.292700   
犠飛  -0.649831  0.236060  0.647798  0.708958  0.702771  0.636142  0.678164   
四球  -0.811754  0.349452  0.803113  0.900199  0.875558  0.896145  0.880956   
敬遠  -0.461168  0.240239  0.469577  0.544601  0.532487  0.561683  0.581294   
死球  -0.597036  0.245212  0.587231  0.627717  0.612601  0.610905  0.592740   
三振  -0.883647  0.335602  0.865667  0.919998  0.917096  0.859531  0.874721   
併殺打 -0.737975  0.284621  0.710598  0.794022  0.797227  0.696335  0.776520   
出塁率 -0.497143  0.925239  0.448031  0.457353  0.448859  0.462939  0.473222   
長打率 -0.478139  0.843386  0.406216  0.462812  0.462631  0.467340  0.486966   

          二塁打       三塁打       本塁打  ...       盗塁刺        犠打        犠飛  \
順位  -0.843887 -0.495558 -0.678139  ... -0.537767 -0.403369 -0.649831   
打率   0.395273  0.244762  0.294984  ...  0.245504  0.086484  0.236060   
試合   0.828466  0.493597  0.661433  ...  0.561521  0.427915  0.647798   
打席数  0.924497  0.536260  0.764071  ...  0.576515  0.353001  0.708958   
打数   0.923328  0.542186  0.758635  ...  0.573605  0.344342  0.702771   
得点   0.892092  0.555815  0.769061  ...  0.630112  0.312046  0.636142   
安打   0.940341  0.552179  0.754315  ...  0.574919  0.292700  0.678164   
二塁打  1.000000  0.449028  0.745479  ...  0.473280  0.248414  0.641879   
三塁打  0.449028  1.000000  0.274924  ...  0.509776  0.373842  0.276446   
本塁打  0.745479  0.274924  1.000000  ...  0.229921 -0.033971  0.575423   
塁打   0.943711  0.519432  0.864265  ...  0.504151  0.217994  0.680445   
打点   0.884380  0.384544  0.923236  ...  0.354050  0.104097  0.723225   
盗塁   0.354910  0.547908  0.138545  ...  0.724176  0.397880  0.236131   
盗塁刺  0.473280  0.509776  0.229921  ...  1.000000  0.456809  0.314738   
犠打   0.248414  0.373842 -0.033971  ...  0.456809  1.000000  0.187193   
犠飛   0.641879  0.276446  0.575423  ...  0.314738  0.187193  1.000000   
四球   0.848303  0.410133  0.769491  ...  0.489593  0.205390  0.651867   
敬遠   0.561524  0.237957  0.599605  ...  0.291735 -0.033799  0.357820   
死球   0.558686  0.261623  0.551520  ...  0.348905  0.195932  0.438145   
三振   0.840638  0.499156  0.802282  ...  0.483813  0.290622  0.626104   
併殺打  0.757420  0.201916  0.733118  ...  0.298469  0.135071  0.650338   
出塁率  0.447319  0.243483  0.361484  ...  0.290539  0.107659  0.288040   
長打率  0.485034  0.265860  0.510274  ...  0.190801  0.022464  0.295525   

           四球        敬遠        死球        三振       併殺打       出塁率       長打率  
順位  -0.811754 -0.461168 -0.597036 -0.883647 -0.737975 -0.497143 -0.478139  
打率   0.349452  0.240239  0.245212  0.335602  0.284621  0.925239  0.843386  
試合   0.803113  0.469577  0.587231  0.865667  0.710598  0.448031  0.406216  
打席数  0.900199  0.544601  0.627717  0.919998  0.794022  0.457353  0.462812  
打数   0.875558  0.532487  0.612601  0.917096  0.797227  0.448859  0.462631  
得点   0.896145  0.561683  0.610905  0.859531  0.696335  0.462939  0.467340  
安打   0.880956  0.581294  0.592740  0.874721  0.776520  0.473222  0.486966  
二塁打  0.848303  0.561524  0.558686  0.840638  0.757420  0.447319  0.485034  
三塁打  0.410133  0.237957  0.261623  0.499156  0.201916  0.243483  0.265860  
本塁打  0.769491  0.599605  0.551520  0.802282  0.733118  0.361484  0.510274  
塁打   0.894044  0.615646  0.609416  0.902293  0.798908  0.465056  0.522403  
打点   0.869742  0.603727  0.601443  0.885161  0.828535  0.426280  0.508422  
盗塁   0.415637  0.159772  0.251690  0.401064  0.146354  0.234763  0.147142  
盗塁刺  0.489593  0.291735  0.348905  0.483813  0.298469  0.290539  0.190801  
犠打   0.205390 -0.033799  0.195932  0.290622  0.135071  0.107659  0.022464  
犠飛   0.651867  0.357820  0.438145  0.626104  0.650338  0.288040  0.295525  
四球   1.000000  0.604869  0.601912  0.848648  0.702899  0.475188  0.439219  
敬遠   0.604869  1.000000  0.483248  0.468371  0.434543  0.295121  0.322468  
死球   0.601912  0.483248  1.000000  0.560026  0.504295  0.350018  0.323654  
三振   0.848648  0.468371  0.560026  1.000000  0.728055  0.417665  0.458401  
併殺打  0.702899  0.434543  0.504295  0.728055  1.000000  0.341181  0.393600  
出塁率  0.475188  0.295121  0.350018  0.417665  0.341181  1.000000  0.824454  
長打率  0.439219  0.322468  0.323654  0.458401  0.393600  0.824454  1.000000  

[23 rows x 23 columns]

こんな感じです。

「corr」を使うと、全ての項目同士の相関係数が見れます。

今回欲しい情報は「本塁打」と「各項目」の相関係数ですので、上記の実行結果に対して「本塁打」お列を指定しましょう。

# 本塁打と各項目間の相関係数
print(df11.corr()['本塁打'])

結果
順位    -0.678139
打率     0.294984
試合     0.661433
打席数    0.764071
打数     0.758635
得点     0.769061
安打     0.754315
二塁打    0.745479
三塁打    0.274924
本塁打    1.000000
塁打     0.864265
打点     0.923236
盗塁     0.138545
盗塁刺    0.229921
犠打    -0.033971
犠飛     0.575423
四球     0.769491
敬遠     0.599605
死球     0.551520
三振     0.802282
併殺打    0.733118
出塁率    0.361484
長打率    0.510274
Name: 本塁打, dtype: float64

これで「各項目」と「本塁打」の相関係数を確認することができました。

これを見ると、「塁打」や「打点」に正の強い相関があって、

「盗塁」や「犠打」といった項目には相関がなさそうです。

「順位」に負のやや強い相関がありますが、これはWEBサイト上の行番号なので無視してよさそうです。

「本塁打」の項目が「1.0」と表示されていますが、これは本塁打同士の相関なので当たり前ですね。

 

野球に詳しい方であれば、「三振」や「併殺」が「本塁打」と相関が強いことに違和感を感じると思います。

詳しくない方向けに簡単に説明すると、「三振」や「併殺」は打者にとってはマイナスの数値です。

それが「本塁打」と相関が強いので、以外な結果ですね。

三振や併殺を恐れずにしっかりスイングしている証拠なのかもしれませんが、

このあたりが「データ分析」の面白いところかなと思います。

説明変数(特徴量)を選ぶ

相関係数を調べ終えたところで、相関が強い項目を選んで「説明変数(特徴量)」を作成しましょう。

一般的に相関係数が「0.7」以上だと「相関がかなり強い」と判断されますが、

とりあえず今回は、もう1つ上の「0.8」以上の項目を「説明変数(特徴量)」としましょう。

 

相関係数が「0.8」以上の項目は先程の結果を見ると、

「塁打」、「打点」、「三振」と「本塁打」自身です。

「説明変数(特徴量)」の作成を直接列名を書き込んで、

# 説明変数を直接列名を指定
print(df11[['塁打', '打点', '三振']])

結果
   塁打   打点   三振
0    182   55   57
1    176   30   51
2    242  104  108
3    165   38   84
4    262   84  103
..   ...  ...  ...
322    0    0    0
323    0    0    0
324    0    0    0
326    0    0    0
327    0    0    0

としても良いのですが、せっかくなのでもう少しかっこよく書いていきましょう!

 

# 本塁打との相関係数をDataFrameとして変数に保存
df_homerun = pd.DataFrame(df11.corr()['本塁打'])
# 相関係数「0.8」以上の項目名を抽出
X_columns = df_homerun[df_homerun['本塁打'] >= 0.8].index.tolist()
# 本塁打は目的変数のため除外
X_columns.remove('本塁打')
# 説明変数と目的変数をセット
X = df11[X_columns]
y = df11['本塁打']

これで今回のゴール「説明変数(特徴量)」の作成が完了です。

 

1行目で先程確認した「各項目」と「本塁打」との相関係数の結果を「DataFrame」型として、

変数にセットしています。

 

2行目で相関係数が「0.8」以上の項目名を配列型で抽出して、変数に格納しているのですが、

まず、

# 相関係数が「0.8」以上のデータ
print(df_homerun[df_homerun['本塁打'] >= 0.8])

結果
          本塁打
本塁打  1.000000
塁打   0.864265
打点   0.923236
三振   0.802282

で、相関係数が「0.8」以上の行データを取り出しています。

この書き方は先程「11球団」のデータと「巨人」のデータを分けた時と一緒です。

欲しい情報は結果の左側に表示されている項目名です。

この左側に表示されている情報は「インデックス」と呼びます。

この「インデックス」情報を取得するためには「DataFrame変数.index」で取得できて、

さらに配列型とするためには「tolist()」を加えます。

# 相関係数0.8以上のインデックス項目名を配列型で取得
print(df_homerun[df_homerun['本塁打'] >= 0.8].index.tolist())

結果
['本塁打', '塁打', '打点', '三振']

 

後は「本塁打」は「目的変数」なので、この配列型変数から除外する必要があります。

3行目の「remove('本塁打')」で除外しています。

これで「説明変数(特徴量)」の項目名を取得できたので、

最後「説明変数(特徴量)」の変数「X(複数データなので大文字にする風習があります)」に相関の強いデータを、

「目的変数」の変数「y」に「本塁打」データをセットしています。

# 説明変数と目的変数をセット
X = df11[X_columns]
y = df11['本塁打']

print(X)
print(y)

結果
     塁打   打点   三振
0    182   55   57
1    176   30   51
2    242  104  108
3    165   38   84
4    262   84  103
..   ...  ...  ...
322    0    0    0
323    0    0    0
324    0    0    0
326    0    0    0
327    0    0    0

[301 rows x 3 columns]
0       4
1       1
2      32
3       5
4      28
       ..
322     0
323     0
324     0
326     0
327     0
Name: 本塁打, Length: 301, dtype: int64

次回はこの「X」「y」を使って、機械学習をします!

 

最後に今回のコード全体をもう一度見てみましょう!

# 表形式データを扱うライブラリ
import pandas as pd

# CSVデータ読み込み
df = pd.read_csv('playerData.csv', sep = ',')

# 巨人以外の11球団データを抽出
df11 = df[df['チーム'] != '巨人']
# 巨人のデータ
df_g = df[df['チーム'] == '巨人']

# 本塁打との相関係数をDataFrameとして変数に保存
df_homerun = pd.DataFrame(df11.corr()['本塁打'])

# 相関係数「0.8」以上の項目名を抽出
X_columns = df_homerun[df_homerun['本塁打'] >= 0.8].index.tolist()
# 本塁打は目的変数のため除外
X_columns.remove('本塁打')

# 説明変数と目的変数をセット
X = df11[X_columns]
y = df11['本塁打']

まとめ:Python機械学習「データ分析」

ここまでの話をまとめます。

まとめ

今回は「ホームラン数」を予測するためのデータ「説明変数(特徴量)」を相関係数を使って作成した!

今回やったことは、

  1. プロ野球データを保存したCSVデータを読み込む
  2. データを巨人と11球団のデータに分ける
  3. ホームラン数と各項目の相関係数を調べる
  4. 相関係数が「0.8」以上の項目を説明変数(特徴量)とした

機械学習に必要な「説明変数(特徴量)」「目的変数」のデータを用意することができた!

 

今回は「相関係数」を調べることで、「説明変数(特徴量)」を作成しましたが、

「データ分析」の方法は、課題によって変わってきます。

 

散布図のグラフを確認したように、様々なグラフを作成して分析する場合もあれば、

自分で新しい項目を作成する方法もあります。

 

今回の「説明変数(特徴量)」の作成が正しいかどうかは次回以降でわかります。

(※野球に詳しい方であれば、「何を渡すのが一番良いか?」わかると思いますが。。)

もし結果が悪い場合は「説明変数(特徴量)」の見直しが必要です。

 

次回は「モデル作成・モデル評価」編です!

今回作成した「説明変数(特徴量)」と「目的変数」を機械に渡して、

「予測モデル」を作成します!

 

※次の記事へ

Python機械学習
Python機械学習「ホームラン数予測④」モデル作成・モデル評価編!

  「機械学習させてAIを作る!」ってなんだか難しそう。。 自分のレベルでもできるのかな。。   こんにちは、古賀です!   本記事は、 はてな 「Python機械学習で ...

続きを見る

おすすめ記事

eSportsプラットフォームSPFans 1

  こんにちは、古賀です!   本記事では、わたしが個人開発したWEBサービス はてな eSportsプラットフォーム「SPFans」 の紹介をします。   以前に紹介し ...

成長するエンジニア 2

  エンジニアになったけど、いまいち成長を感じられないなぁ。。 作業スピードも品質も平凡。 この先成長していけるんだろうか。。   こんにちは、古賀です!   エンジニア ...

道のり 3

※本記事は、各記事のまとめ記事です。   こんにちは、古賀です!   本記事では、 「プログラミング未経験者がエンジニアとして働き、 年収1000万に到達するまでの道のり」 をご説 ...

プログラミングスクール 4

  プログラミングを本格的に勉強して仕事に繋げていきたいけど、 プログラミングスクール多すぎる。。 どういう目線で選べばいいんだ。。   こんにちは、古賀です。   プロ ...

-エンジニア, データサイエンティスト
-, ,

Copyright© Koga Masao's LifeBlog , 2024 All Rights Reserved.