2軍(ファーム)選手を分析してダイヤの原石を探そうぜ<データ準備編>
プロ野球選手の分析をするとき1軍の選手や有名選手を分析することがほとんどと思います。
しかし、これから活躍しそうな選手、化けそうな選手を調べたくないでしょうか?
そこで、2軍ファーム野手のバッター成績をクラスタリング分析して、クラスターごとの注目の選手を探っていきたいと思います。
ではさっそく分析をしていきたいところですが、データがないところからのスタートになります。
分析の流れは、データ準備、データ処理(クラスタリングの実装)、データ分析の3工程で行います。
3工程に合わせて記事もデータ準備編、データ処理編、データ分析編の3篇構成になります。
まずは使用するデータをサイトから収集し、スクレイピングをするデータ準備編です。
まずはライブラリをインポートします。
import pandas as pd
import matplotlib.pyplot as plt
サイトを見てみると、基本成績、総合指標、その他の指標の3つのサイトに分かれていることがわかります。
この3サイトを見てみると、2軍選手の成績とセイバーメトリクス指標が記録されています。
打撃指標のセイバーメトリクスほぼすべてあります。
取れる成績をベースで頑張って算出していた私に言ってやりたい・・・
ここにあるよと・・・(青山テルマ風)
あるデータはありがたく使わせていただきます。
基本成績、総合指標、その他の指標があるサイトのデータを取ってきます。
pandasですとそれぞれ1行です。
テーブル形式になっていないと取れない短所はありますが、
テーブル形式ですとリスト型でデータが取れ、リストの中の値を代入する形で再度格納すればDataFrame型で返ってきます。
なんと便利なんでしょう。
data1 = pd.read_html('https://baseball-data.com/19/stats-farm/hitter4-all/avg-1.html')
data2 = pd.read_html('https://baseball-data.com/19/stats-farm/hitter3-all/avg-1.html')
data3 = pd.read_html('https://baseball-data.com/19/stats-farm/hitter2-all/avg-1.html')
データが取れているか確認しましょう。
data1
結果:
[ 順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 \
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 0 0 - - -
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 0 0 - - -
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 8 0 - - 2.00
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 3 2 3.00 5.00 3.33
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 0 1 - 8.00 -
.. ... ... ... ... .. .. .. .. .. .. .. .. ... ... ...
374 365 張本 優大 ソフトバンク 0.000 1 1 0 0 0 0 0 0 - - -
375 365 日暮 矢麻人 ソフトバンク 0.000 1 1 0 0 0 0 0 0 - - -
376 365 星 孝典 西武 0.000 1 1 0 0 0 0 0 1 - 1.00 -
377 365 横田 慎太郎 阪神 0.000 0 0 0 0 0 0 0 0 - - -
378 365 清水 陸哉 ソフトバンク 0.000 0 0 0 0 0 0 0 0 - - -
PSN BB/K
PSN BB/K
0 - -
1 - -
2 - -
3 0.00 1.50
4 - 0.00
.. ... ...
374 - -
375 - -
376 - 0.00
377 - -
378 - -
[379 rows x 17 columns]]
data2
結果:
[ 順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP \
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP
0 1 大城 滉二 オリックス 0.667 3 2 0 2 0.667 1.333 ... 0.633 0.667
1 1 鶴岡 慎也 日本ハム 0.667 3 2 0 0 0.667 1.000 ... 0.550 0.333
2 3 角中 勝也 ロッテ 0.500 6 3 0 2 0.786 0.500 ... 0.479 0.000
3 3 ロメロ オリックス 0.500 6 3 2 6 0.600 1.500 ... 0.645 1.000
4 3 川島 慶三 ソフトバンク 0.500 8 4 0 0 0.500 0.500 ... 0.350 0.000
.. ... ... ... ... .. .. .. .. ... ... ... ... ...
374 365 張本 優大 ソフトバンク 0.000 1 0 0 0 0.000 0.000 ... 0.000 0.000
375 365 日暮 矢麻人 ソフトバンク 0.000 1 0 0 0 0.000 0.000 ... 0.000 0.000
376 365 星 孝典 西武 0.000 1 0 0 0 0.000 0.000 ... 0.000 0.000
377 365 横田 慎太郎 阪神 0.000 0 0 0 0 0.000 0.000 ... 0.000 0.000
378 365 清水 陸哉 ソフトバンク 0.000 0 0 0 0 0.000 0.000 ... 0.000 0.000
IsoD RC RC27 XR XR27 BABIP SecA TA
IsoD RC RC27 XR XR27 BABIP SecA TA
0 0.000 1.73 46.70 1.35 36.45 0.667 0.667 4.000
1 0.000 1.39 37.50 1.13 30.51 0.667 0.333 3.000
2 0.286 4.06 36.58 3.95 35.55 0.500 1.167 3.667
3 0.100 4.42 29.81 4.48 30.24 0.333 1.500 4.000
4 0.000 1.81 12.23 1.63 11.00 0.571 0.000 1.000
.. ... ... ... ... ... ... ... ...
374 0.000 -0.10 -2.70 -0.09 -2.43 0.000 0.000 0.000
375 0.000 -0.10 -2.70 -0.09 -2.43 0.000 0.000 0.000
376 0.000 -0.11 -2.92 -0.10 -2.70 0.000 0.000 0.000
377 0.000 0.00 0.00 0.00 0.00 0.000 0.000 0.000
378 0.000 0.00 0.00 0.00 0.00 0.000 0.000 0.000
[379 rows x 22 columns]]
data3
結果:
[ 順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 \
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球
0 1 大城 滉二 オリックス 0.667 1 3 3 0 2 2 ... 0 0 0 0 0 0
1 1 鶴岡 慎也 日本ハム 0.667 1 3 3 1 2 1 ... 0 0 0 0 0 0
2 3 角中 勝也 ロッテ 0.500 4 14 6 2 3 0 ... 0 0 0 7 0 1
3 3 ロメロ オリックス 0.500 4 10 6 3 3 0 ... 0 0 1 3 0 0
4 3 川島 慶三 ソフトバンク 0.500 3 8 8 1 4 0 ... 0 0 0 0 0 0
.. ... ... ... ... .. .. .. .. .. .. ... .. .. .. .. .. ..
374 365 張本 優大 ソフトバンク 0.000 2 1 1 0 0 0 ... 0 0 0 0 0 0
375 365 日暮 矢麻人 ソフトバンク 0.000 1 1 1 0 0 0 ... 0 0 0 0 0 0
376 365 星 孝典 西武 0.000 1 1 1 0 0 0 ... 0 0 0 0 0 0
377 365 横田 慎太郎 阪神 0.000 1 0 0 0 0 0 ... 0 0 0 0 0 0
378 365 清水 陸哉 ソフトバンク 0.000 1 0 0 0 0 0 ... 0 0 0 0 0 0
三振 併殺打 出塁率 長打率
三振 併殺打 出塁率 長打率
0 0 0 0.667 1.333
1 0 0 0.667 1.000
2 0 0 0.786 0.500
3 2 0 0.600 1.500
4 1 0 0.500 0.500
.. .. .. ... ...
374 0 0 0.000 0.000
375 0 0 0.000 0.000
376 1 0 0.000 0.000
377 0 0 0.000 0.000
378 0 0 0.000 0.000
[379 rows x 25 columns]]
リスト内のデータとして取り出すと、DataFrame型となって形が見えてきますので確認しましょう。まずはDataFrameとして格納します。
まずはDataFrameとして格納します。
data1 = data1[0]
格納したデータを確認します。
data1.head()
結果:
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 0 0 - - - - -
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 0 0 - - - - -
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 8 0 - - 2.00 - -
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 3 2 3.00 5.00 3.33 0.00 1.50
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 0 1 - 8.00 - - 0.00
列がやっぱり2重になってるじゃないか!!
他の列も格納して確認していきます。
data2 = data2[0]
data2.head()
結果:
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
0 1 大城 滉二 オリックス 0.667 3 2 0 2 0.667 1.333 ... 0.633 0.667 0.000 1.73 46.70 1.35 36.45 0.667 0.667 4.000
1 1 鶴岡 慎也 日本ハム 0.667 3 2 0 0 0.667 1.000 ... 0.550 0.333 0.000 1.39 37.50 1.13 30.51 0.667 0.333 3.000
2 3 角中 勝也 ロッテ 0.500 6 3 0 2 0.786 0.500 ... 0.479 0.000 0.286 4.06 36.58 3.95 35.55 0.500 1.167 3.667
3 3 ロメロ オリックス 0.500 6 3 2 6 0.600 1.500 ... 0.645 1.000 0.100 4.42 29.81 4.48 30.24 0.333 1.500 4.000
4 3 川島 慶三 ソフトバンク 0.500 8 4 0 0 0.500 0.500 ... 0.350 0.000 0.000 1.81 12.23 1.63 11.00 0.571 0.000 1.000
5 rows × 22 columns
data3 = data3[0]
data3.head()
結果:
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
0 1 大城 滉二 オリックス 0.667 1 3 3 0 2 2 ... 0 0 0 0 0 0 0 0 0.667 1.333
1 1 鶴岡 慎也 日本ハム 0.667 1 3 3 1 2 1 ... 0 0 0 0 0 0 0 0 0.667 1.000
2 3 角中 勝也 ロッテ 0.500 4 14 6 2 3 0 ... 0 0 0 7 0 1 0 0 0.786 0.500
3 3 ロメロ オリックス 0.500 4 10 6 3 3 0 ... 0 0 1 3 0 0 2 0 0.600 1.500
4 3 川島 慶三 ソフトバンク 0.500 3 8 8 1 4 0 ... 0 0 0 0 0 0 1 0 0.500 0.500
5 rows × 25 columns
すべての取ってきたデータが2重の列名になっています。
これを解消しなければいけませんね。
ところでお気づきでしょうか?
行の選手名が一致しています。
行が一致しているデータの場合、安心して取ってきたデータを3つ結合できます。
結局pandasのmerge関数などで結合の仕方を指定しますが、データがきれいですと失敗することも挙動がわからない動きの可能性が少なくなるので安心です。
簡単に後ろのデータも確認して、行が一致してそうか確認します。
後ろのデータの確認はtail関数です。
data1.tail()
結果:
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
374 365 張本 優大 ソフトバンク 0.0 1 1 0 0 0 0 0 0 - - - - -
375 365 日暮 矢麻人 ソフトバンク 0.0 1 1 0 0 0 0 0 0 - - - - -
376 365 星 孝典 西武 0.0 1 1 0 0 0 0 0 1 - 1.00 - - 0.00
377 365 横田 慎太郎 阪神 0.0 0 0 0 0 0 0 0 0 - - - - -
378 365 清水 陸哉 ソフトバンク 0.0 0 0 0 0 0 0 0 0 - - - - -
data2.tail()
結果:
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
374 365 張本 優大 ソフトバンク 0.0 1 0 0 0 0.0 0.0 ... 0.0 0.0 0.0 -0.10 -2.70 -0.09 -2.43 0.0 0.0 0.0
375 365 日暮 矢麻人 ソフトバンク 0.0 1 0 0 0 0.0 0.0 ... 0.0 0.0 0.0 -0.10 -2.70 -0.09 -2.43 0.0 0.0 0.0
376 365 星 孝典 西武 0.0 1 0 0 0 0.0 0.0 ... 0.0 0.0 0.0 -0.11 -2.92 -0.10 -2.70 0.0 0.0 0.0
377 365 横田 慎太郎 阪神 0.0 0 0 0 0 0.0 0.0 ... 0.0 0.0 0.0 0.00 0.00 0.00 0.00 0.0 0.0 0.0
378 365 清水 陸哉 ソフトバンク 0.0 0 0 0 0 0.0 0.0 ... 0.0 0.0 0.0 0.00 0.00 0.00 0.00 0.0 0.0 0.0
5 rows × 22 columns
data3.tail()
結果:
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
374 365 張本 優大 ソフトバンク 0.0 2 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 0.0 0.0
375 365 日暮 矢麻人 ソフトバンク 0.0 1 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 0.0 0.0
376 365 星 孝典 西武 0.0 1 1 1 0 0 0 ... 0 0 0 0 0 0 1 0 0.0 0.0
377 365 横田 慎太郎 阪神 0.0 1 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0.0 0.0
378 365 清水 陸哉 ソフトバンク 0.0 1 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0.0 0.0
5 rows × 25 columns
すべて一致している!!
なんという素晴らしいデータなのだ!
プロ野球freakさんありがとう!
安心して結合できそうです。
それでは、一番の難敵2重列名を外していきます。
カラムが2段階に作られている構造です。
本来はクロス集計などで作られる構造です。
今回は列名が2重になっているというシュールな形です。
列名を外す関数pd.columns.droplevel(0)を使います。
0は列のレベルです。0は1番下の列名、1なら2番目の列名を外すといった具合です。
data1.columns = data1.columns.droplevel(0)
確認してみましょう。
data1.head()
結果:
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 0 0 - - - - -
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 0 0 - - - - -
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 8 0 - - 2.00 - -
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 3 2 3.00 5.00 3.33 0.00 1.50
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 0 1 - 8.00 - - 0.00
きれいに取れていますね!
他のデータも同じようにします。
data2.columns = data2.columns.droplevel(0)
data2.head()
結果:
順位 選手名 チーム 打率 打数 安打 本塁打 打点 出塁率 長打率 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
0 1 大城 滉二 オリックス 0.667 3 2 0 2 0.667 1.333 ... 0.633 0.667 0.000 1.73 46.70 1.35 36.45 0.667 0.667 4.000
1 1 鶴岡 慎也 日本ハム 0.667 3 2 0 0 0.667 1.000 ... 0.550 0.333 0.000 1.39 37.50 1.13 30.51 0.667 0.333 3.000
2 3 角中 勝也 ロッテ 0.500 6 3 0 2 0.786 0.500 ... 0.479 0.000 0.286 4.06 36.58 3.95 35.55 0.500 1.167 3.667
3 3 ロメロ オリックス 0.500 6 3 2 6 0.600 1.500 ... 0.645 1.000 0.100 4.42 29.81 4.48 30.24 0.333 1.500 4.000
4 3 川島 慶三 ソフトバンク 0.500 8 4 0 0 0.500 0.500 ... 0.350 0.000 0.000 1.81 12.23 1.63 11.00 0.571 0.000 1.000
5 rows × 22 columns
data3.columns = data3.columns.droplevel(0)
data3.head()
結果:
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
0 1 大城 滉二 オリックス 0.667 1 3 3 0 2 2 ... 0 0 0 0 0 0 0 0 0.667 1.333
1 1 鶴岡 慎也 日本ハム 0.667 1 3 3 1 2 1 ... 0 0 0 0 0 0 0 0 0.667 1.000
2 3 角中 勝也 ロッテ 0.500 4 14 6 2 3 0 ... 0 0 0 7 0 1 0 0 0.786 0.500
3 3 ロメロ オリックス 0.500 4 10 6 3 3 0 ... 0 0 1 3 0 0 2 0 0.600 1.500
4 3 川島 慶三 ソフトバンク 0.500 3 8 8 1 4 0 ... 0 0 0 0 0 0 1 0 0.500 0.500
5 rows × 25 columns
すべて一致している!!
なんという素晴らしいデータなのだ!
プロ野球freakさんありがとう!
安心して結合できそうです。
それでは、一番の難敵2重列名を外していきます。
カラムが2段階に作られている構造です。
本来はクロス集計などで作られる構造です。
今回は列名が2重になっているというシュールな形です。
列名を外す関数pd.columns.droplevel(0)を使います。
0は列のレベルです。0は1番下の列名、1なら2番目の列名を外すといった具合です。
data1.head()
data1.head()
順位 選手名 チーム 打率 打席数 打数 安打 本塁打 打点 盗塁 四死球 三振 本塁打率 三振率 四球率 PSN BB/K
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 0 0 - - - - -
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 0 0 - - - - -
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 8 0 - - 2.00 - -
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 3 2 3.00 5.00 3.33 0.00 1.50
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 0 1 - 8.00 - - 0.00
きれいに取れていますね!
他のデータも同じようにします。
data3.columns = data3.columns.droplevel(0)
data3.head()
結果:
順位 選手名 チーム 打率 試合 打席数 打数 得点 安打 二塁打 ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振 併殺打 出塁率 長打率
0 1 大城 滉二 オリックス 0.667 1 3 3 0 2 2 ... 0 0 0 0 0 0 0 0 0.667 1.333
1 1 鶴岡 慎也 日本ハム 0.667 1 3 3 1 2 1 ... 0 0 0 0 0 0 0 0 0.667 1.000
2 3 角中 勝也 ロッテ 0.500 4 14 6 2 3 0 ... 0 0 0 7 0 1 0 0 0.786 0.500
3 3 ロメロ オリックス 0.500 4 10 6 3 3 0 ... 0 0 1 3 0 0 2 0 0.600 1.500
4 3 川島 慶三 ソフトバンク 0.500 3 8 8 1 4 0 ... 0 0 0 0 0 0 1 0 0.500 0.500
5 rows × 25 columns
良い感じですね。
列名が2重になっているデータの列名を解消できました。
次は3種類のデータを結合していきます。
結合にはjoin関数やmerge関数が良く使われます。
今回はmerge関数でデータを結合をしていきます。
merge関数は使うために必要な設定が多いので気を付けましょう。
形としては、
pd.merge(データフレーム1,データフレーム2,how=結合の仕方(inner,outerleft,right),on=キー列)
です。
最初の二つは結合したいデータを入れます。
howには結合の仕方です。
innerは内部結合で、キーが一致している行どうしだけつながっていきます。
outerは全部くっつけます。つながらないところはNULLにしておきます。
left左のデータに合わせます。
rightは右のデータに合わせます。
onにはキーを設定します。
どの列を軸に合わせてくっつけたいか決めます。
そのほかの引数もあるのですが詳しい情報は以下のサイトを参考にするとよいと思います。
data_2 = pd.merge(data1,data2,how='inner',on='選手名')
くっつけたデータを確認しましょう。
data_2.head()
結果:
順位_x 選手名 チーム_x 打率_x 打席数 打数_x 安打_x 本塁打_x 打点_x 盗塁 ... GPA IsoP IsoD RC RC27 XR XR27 BABIP SecA TA
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 ... 0.633 0.667 0.000 1.73 46.70 1.35 36.45 0.667 0.667 4.000
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 ... 0.550 0.333 0.000 1.39 37.50 1.13 30.51 0.667 0.333 3.000
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 ... 0.479 0.000 0.286 4.06 36.58 3.95 35.55 0.500 1.167 3.667
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 ... 0.645 1.000 0.100 4.42 29.81 4.48 30.24 0.333 1.500 4.000
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 ... 0.350 0.000 0.000 1.81 12.23 1.63 11.00 0.571 0.000 1.000
5 rows × 38 columns
つながっている感じがします。
「_x」と列名がなっているのは列名が重なっているためです。
データはすべてつながるはずですので、欠損値がないか確認します。
data_2.isnull().sum()
順位_x 0
選手名 0
チーム_x 0
打率_x 0
打席数 0
打数_x 0
安打_x 0
本塁打_x 0
打点_x 0
盗塁 0
四死球 0
三振 0
本塁打率 0
三振率 0
四球率 0
PSN 0
BB/K 0
順位_y 0
チーム_y 0
打率_y 0
打数_y 0
安打_y 0
本塁打_y 0
打点_y 0
出塁率 0
長打率 0
OPS 0
NOI 0
GPA 0
IsoP 0
IsoD 0
RC 0
RC27 0
XR 0
XR27 0
BABIP 0
SecA 0
TA 0
dtype: int64
大丈夫そうですね。
もう一つのデータを結合します。
data = pd.merge(data_2,data3,how='inner',on='選手名')
確認しましょう。
data.head()
結果:
順位_x 選手名 チーム_x 打率_x 打席数_x 打数_x 安打_x 本塁打_x 打点_x 盗塁_x ... 盗塁刺 犠打 犠飛 四球 敬遠 死球 三振_y 併殺打 出塁率_y 長打率_y
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 ... 0 0 0 0 0 0 0 0 0.667 1.333
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 ... 0 0 0 0 0 0 0 0 0.667 1.000
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 ... 0 0 0 7 0 1 0 0 0.786 0.500
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 ... 0 0 1 3 0 0 2 0 0.600 1.500
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 ... 0 0 0 0 0 0 1 0 0.500 0.500
5 rows × 62 columns
いい感じですね。
念のため欠損値を確認します。
data.isnull().sum().plot(kind='bar')
大丈夫ですね。
あえてグラフにしたのはすべての変数を表示してくれないからです。
最後に重複している列を削ります。
pd.drop([列名,列名,・・・,])で一気に削ります。
その前に列名の一覧を出しておくと列名を選びやすいです。
data.columns
結果:
Index(['順位_x', '選手名', 'チーム_x', '打率_x', '打席数_x', '打数_x', '安打_x', '本塁打_x',
'打点_x', '盗塁_x', '四死球', '三振_x', '本塁打率', '三振率', '四球率', 'PSN', 'BB/K',
'順位_y', 'チーム_y', '打率_y', '打数_y', '安打_y', '本塁打_y', '打点_y', '出塁率_x',
'長打率_x', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD', 'RC', 'RC27', 'XR',
'XR27', 'BABIP', 'SecA', 'TA', '順位', 'チーム', '打率', '試合', '打席数_y', '打数',
'得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点', '盗塁_y', '盗塁刺', '犠打', '犠飛',
'四球', '敬遠', '死球', '三振_y', '併殺打', '出塁率_y', '長打率_y'],
dtype='object')
data = data.drop(['順位_y', 'チーム_y', '打率_y', '打数_y', '安打_y', '本塁打_y','盗塁_y', '打点_y','三振_y','出塁率_y', '長打率_y','打席数_y'],axis=1)
data.columns
結果:
Index(['順位_x', '選手名', 'チーム_x', '打率_x', '打席数_x', '打数_x', '安打_x', '本塁打_x',
'打点_x', '盗塁_x', '四死球', '三振_x', '本塁打率', '三振率', '四球率', 'PSN', 'BB/K',
'出塁率_x', '長打率_x', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD', 'RC', 'RC27',
'XR', 'XR27', 'BABIP', 'SecA', 'TA', '順位', 'チーム', '打率', '試合', '打数',
'得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点', '盗塁刺', '犠打', '犠飛', '四球',
'敬遠', '死球', '併殺打'],
dtype='object')
確認しましょう。
data.head()
結果:
順位_x 選手名 チーム_x 打率_x 打席数_x 打数_x 安打_x 本塁打_x 打点_x 盗塁_x ... 本塁打 塁打 打点 盗塁刺 犠打 犠飛 四球 敬遠 死球 併殺打
0 1 大城 滉二 オリックス 0.667 3 3 2 0 2 0 ... 0 4 2 0 0 0 0 0 0 0
1 1 鶴岡 慎也 日本ハム 0.667 3 3 2 0 0 0 ... 0 3 0 0 0 0 0 0 0 0
2 3 角中 勝也 ロッテ 0.500 14 6 3 0 2 0 ... 0 3 2 0 0 0 7 0 1 0
3 3 ロメロ オリックス 0.500 10 6 3 2 6 0 ... 2 9 6 0 0 1 3 0 0 0
4 3 川島 慶三 ソフトバンク 0.500 8 8 4 0 0 0 ... 0 4 0 0 0 0 0 0 0 0
上手くいってそうですね^^
最後にcsvファイルにして完成です。
data.to_csv('2nd_grade_player.csv')
いかがだったでしょう?
難しかったでしょうか?
行った処理はいいかの順番になります。
1. データをサイトからとり、
2. データを格納、
3. 列名を削除
4. データを結合
5. いらない列を削除
6. csvに保存
これで、2軍選手のデータが揃いましたので次はデータ処理編です。
csvファイル、ipynbファイルがDLできます!(有料)
Jupyte notebookですぐに実行してみたかったり、csvファイルだけほしいという方はぜひご利用になってください。
よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。