見出し画像

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ファイルだけほしいという方はぜひご利用になってください。

ここから先は

0字 / 2ファイル
この記事のみ ¥ 380

よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。