どんな情報を渡せば良いんだろう。。
片っ端から渡して色々と試せばいいんだろうか。。
こんにちは、古賀です!
本記事は、
はてな
「Python機械学習でホームラン数を予測する」のデータ分析編
です!
機械学習をするために「データ」を取ってきた後は、
そのデータを分析して、機械に渡すための材料を選ぶ必要があります。
材料選びを間違えると、正しく「ホームラン数」を予測することができません。
正しく「ホームラン数」を予測できるように「データ分析」の基本を学びましょう!
前回の続きになりますので、
前回の記事を読まれていない方はこちらをご覧ください!
-
Python機械学習「ホームラン数予測②」データ収集「WEBスクレイピング」編!
PythonのプログラミングでWEBサイトの情報を取ってきたいけど、 どうやってやればいいんだろう。。 CSVデータに出力したいんだけど。。 こんにちは、古賀です! &nb ...
続きを見る
また、実行環境は「JupyterLab」を使っていきますので、
「JupyterLab」の記事を読まれていない方は、こちらもご確認ください!
-
JupyterLabとは?Python実行環境「JupyterLab」の概要と基本的な使い方!
Pythonの実行環境「JupyterLab」が起動できるところまできたけど、 どういう風に使っていけばいいんだろう?? そもそも「JupyterLab」ってなんだ?? こ ...
続きを見る
自己紹介が遅れましたが、
わたしは大学卒業後、上場IT企業に就職し、プログラマー、システムエンジニアとして
約10年間働いておりまして、その後は様々な活動をしております。
プロフィールの詳細はこちらです。
-
プロフィール
こんにちは、古賀正雄です。現在36歳です。 簡単ではありますが、こちらのページで自己紹介とこのブログについてお話します。 高校時代 学生時代は主に野球をしていました。 進学先の高校も野球で選びました。 ...
続きを見る
※YouTubeに同内容を公開しております。
Python機械学習「データ分析」の概要
前回の記事で、WEBサイトから「2020年のプロ野球データ」をCSVファイルに出力しました。
今回はそのデータを使って、「ホームラン数」と関連性が高い項目を調べて、
「説明変数(特徴量)」を作成します。
用語のおさらいですが「説明変数(特徴量)」は、
予測するためのデータ「試合数」や「打席数」、「ヒット数」といった項目です。
この「説明変数(特徴量)」が適切でないと、
予測精度が低くなってしまうので、
ホームランを予測する際に必要のないデータは省いて、
ホームラン数を予測する際に関連性のあるデータだけを渡す必要があります。
「ホームランと関連性の高いデータをどのように調べるか?」
についてですが、「相関係数」を使います。
「相関係数」のおさらいですが、
「-1~1」を取る値のことで、
「-1」に近ければ負の相関があると言って、片方の値が小さければもう片方の数値が大きくなります。
逆に「1」に近ければ正の相関があると言って、片方の値が大きければもう片方の数値も大きくなります。
相関係数が「0」付近であれば、ホームランの数には影響しないデータなので、
「説明変数(特徴量)」からは外すようにします。
野球に詳しい方は、
「どの項目がホームラン数と相関が強いか?」
予想してみてください!
具体的な手順としては、
- プロ野球データを保存したCSVデータを読み込む
- データを巨人と11球団のデータに分ける
- ホームラン数と各項目の相関係数を調べる
- どのデータを説明変数(特徴量)とするか選ぶ
です!
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機械学習「データ分析」
ここまでの話をまとめます。
まとめ
今回は「ホームラン数」を予測するためのデータ「説明変数(特徴量)」を相関係数を使って作成した!
今回やったことは、
- プロ野球データを保存したCSVデータを読み込む
- データを巨人と11球団のデータに分ける
- ホームラン数と各項目の相関係数を調べる
- 相関係数が「0.8」以上の項目を説明変数(特徴量)とした
機械学習に必要な「説明変数(特徴量)」と「目的変数」のデータを用意することができた!
今回は「相関係数」を調べることで、「説明変数(特徴量)」を作成しましたが、
「データ分析」の方法は、課題によって変わってきます。
散布図のグラフを確認したように、様々なグラフを作成して分析する場合もあれば、
自分で新しい項目を作成する方法もあります。
今回の「説明変数(特徴量)」の作成が正しいかどうかは次回以降でわかります。
(※野球に詳しい方であれば、「何を渡すのが一番良いか?」わかると思いますが。。)
もし結果が悪い場合は「説明変数(特徴量)」の見直しが必要です。
次回は「モデル作成・モデル評価」編です!
今回作成した「説明変数(特徴量)」と「目的変数」を機械に渡して、
「予測モデル」を作成します!
※次の記事へ
-
Python機械学習「ホームラン数予測④」モデル作成・モデル評価編!
「機械学習させてAIを作る!」ってなんだか難しそう。。 自分のレベルでもできるのかな。。 こんにちは、古賀です! 本記事は、 はてな 「Python機械学習で ...
続きを見る