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

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

2020年11月26日

Python機械学習

 

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

 

こんにちは、古賀です!

 

本記事は、

はてな

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

です!

 

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

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

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

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

グラフ

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

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

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

 

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

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

 

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

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

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

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

 

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

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

 

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

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

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

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

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

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

 

野球に詳しい方は、

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

予想してみてください!

 

具体的な手順としては、

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

です!

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

グラフ

今回のコード全体です。

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

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

CSVファイルの読み込み

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

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

 

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

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

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

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

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

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

ことです。

 

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

打席数と本塁打の散布図

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

 

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

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

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

 

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

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

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

 

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

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

 

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

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

実行してみると、

こんな感じです。

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

 

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

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

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

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

 

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

 

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

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

 

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

まず、

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

まとめ

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

まとめ

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

今回やったことは、

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

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

 

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

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

 

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

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

 

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

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

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

 

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

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

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

 

※次の記事へ

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

おすすめ記事

道のり 1

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

成長するエンジニア 2

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

闘病記 3

※本記事は、各記事のまとめ記事です。   こんにちは、古賀です!   わたしは25歳の時に、悪性リンパ腫になりました。 不安な気持ちになって、たくさん泣きました。 本気で「死ぬかも ...

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

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

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

Copyright© Koga Masao's LifeBlog 〜Alive Today〜 , 2021 All Rights Reserved.