見出し画像

10年間のプロ野球選手成績データをマージするぞ!

前回プロ野球成績データを片っ端からデータ取得しました。
このままでは複数のファイルですので分析をする上では扱いづらいです。
今回は取得したデータを加工して、分析のためのデータの持ち方にしようと思います。
前回は投手は2つのデータセット、野手は3つのデータセットを取りました。
年収データセットもマージして、分析用のデータを野手用と投手用の2種類を作成します。

データの取得に関する記事は以下になりますので興味ある方はぜひ!


全体の流れ

処理の流れは前回取ったデータを読み込み、マージして必要な特徴量を選びます。
最後にカラム名を整理して、csvファイルの保存して終了いたします。

野手のデータマージのコード

野手のデータセットを作っていくコードを説明します。
全体としては以下のコードになります。
選手名と年の項目をキーにしてデータを結合していきます。

import pandas as pd

h_data_1=pd.read_csv('hitter_dataset_normal.csv')
h_data_2=pd.read_csv('hitter_dataset_total.csv')
h_data_3=pd.read_csv('hitter_dataset_other.csv')
h_data_4=pd.read_csv('scrapingProfile.csv')

merge_1 = pd.merge(h_data_1,h_data_2,on=['選手名','年'])
merge_2 = pd.merge(merge_1,h_data_3,on=['選手名','年'])
merge_3 = pd.merge(merge_2,h_data_4,on=['選手名','年'])

data = merge_3[['No.', '選手名', '背番号', '守備', '生年月日', '年齢', '年数', '身長', '体重', '血液型', '投打', '出身地',
      '年俸(推定)', 'BMI', 'チーム_y', '年', '打席数_x', 
      '盗塁_x', '四死球', '三振_x', '本塁打率', '三振率', '四球率', 'PSN',
      'BB/K','出塁率_x', '長打率_x', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD', 'RC', 'RC27',
      'XR', 'XR27', 'BABIP', 'SecA', 'TA', '打率', '試合',
      '打数', '得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点',
      '盗塁刺', '犠打', '犠飛', '四球', '敬遠', '死球', '併殺打']]

data2 = data.rename(columns={'チーム_y':'チーム', '打席数_x':'打席数','出塁率_x':'出塁率', '長打率_x':'長打率','三振_x':'三振','盗塁_x':'盗塁'})

data2=data2[['No.', '選手名', '背番号', 'チーム', '守備', '生年月日', '年齢', '年数', '身長', '体重', '血液型', '投打',
      '出身地', '年俸(推定)', 'BMI', '年', '打席数', '盗塁', '四死球', '三振', '本塁打率', '三振率',
      '四球率', 'PSN', 'BB/K', '出塁率', '長打率', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD',
      'RC', 'RC27', 'XR', 'XR27', 'BABIP', 'SecA', 'TA', '打率', '試合', '打数',
      '得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点', '盗塁刺', '犠打', '犠飛', '四球',
      '敬遠', '死球', '併殺打']]

data2.to_csv('npb_merged_data_hitter.csv',index=False)

1行目、今回はpandasの機能のみ使うので、importはpandasのみです。

import pandas as pd

各データセットを読み込みます。
野手のデータセットは合計4つになります。
一つ目のデータセットは野手の基本成績です。
一般的な打率などの成績が入っています、。
二つ目のデータセットは総合成績です。
セイバーメトリクス指標などが入っています。
三つ目のデータセットはその他の指標です。
最後のデータセットが年俸のデータが入っているプロフィールデータになります。
それぞれのデータセットを読み込みます。

h_data_1=pd.read_csv('hitter_dataset_normal.csv')
h_data_2=pd.read_csv('hitter_dataset_total.csv')
h_data_3=pd.read_csv('hitter_dataset_other.csv')
h_data_4=pd.read_csv('scrapingProfile.csv')

ひとつずつデータセットを結合していきます。
キーは選手名と年の二つで結合することで、その年の選手の成績と年俸を持つデータを作っていきます。
データの同じ項目で不整合がないので結合する順番は特に今回は問題ありません。(不整合があるとそれはどのように扱うか大変です・・・。)

merge_1 = pd.merge(h_data_1,h_data_2,on=['選手名','年'])
merge_2 = pd.merge(merge_1,h_data_3,on=['選手名','年'])
merge_3 = pd.merge(merge_2,h_data_4,on=['選手名','年'])

必要なデータを絞り込みます。
データの項目名を直接指定します。

data = merge_3[['No.', '選手名', '背番号', '守備', '生年月日', '年齢', '年数', '身長', '体重', '血液型', '投打', '出身地',
      '年俸(推定)', 'BMI', 'チーム_y', '年', '打席数_x', 
      '盗塁_x', '四死球', '三振_x', '本塁打率', '三振率', '四球率', 'PSN',
      'BB/K','出塁率_x', '長打率_x', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD', 'RC', 'RC27',
      'XR', 'XR27', 'BABIP', 'SecA', 'TA', '打率', '試合',
      '打数', '得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点',
      '盗塁刺', '犠打', '犠飛', '四球', '敬遠', '死球', '併殺打']]
      

項目名が重なっている場合、サフィックスが自動でついているので、サフィックスを外します。

data2 = data.rename(columns={'チーム_y':'チーム', '打席数_x':'打席数','出塁率_x':'出塁率', '長打率_x':'長打率','三振_x':'三振','盗塁_x':'盗塁'})

最後に項目の順番も考慮して、項目を整理します。
ここはあってもなくてもいいのですが、横に数十個も項目があると見切れなくなるので、よく見る項目は最初のほうに持ってきたほうが良かったりします。
ここら辺はお好みで。

data2=data2[['No.', '選手名', '背番号', 'チーム', '守備', '生年月日', '年齢', '年数', '身長', '体重', '血液型', '投打',
      '出身地', '年俸(推定)', 'BMI', '年', '打席数', '盗塁', '四死球', '三振', '本塁打率', '三振率',
      '四球率', 'PSN', 'BB/K', '出塁率', '長打率', 'OPS', 'NOI', 'GPA', 'IsoP', 'IsoD',
      'RC', 'RC27', 'XR', 'XR27', 'BABIP', 'SecA', 'TA', '打率', '試合', '打数',
      '得点', '安打', '二塁打', '三塁打', '本塁打', '塁打', '打点', '盗塁刺', '犠打', '犠飛', '四球',
      '敬遠', '死球', '併殺打']]

最後にcsv出力します。

data2.to_csv('npb_merged_data_hitter.csv',index=False)

投手のデータマージのコード

野手のデータのマージとやり方は同じです。
そのため、解説は割愛させていただきます。
処理内容が全く同じですのでw
投手のほうがデータセットが野手より一つ少ない分項目が少なくなります。

import pandas as pd
import numpy as np

p_data_1=pd.read_csv('pitcher_dataset_normal.csv')
p_data_2=pd.read_csv('pitcher_dataset_total.csv')
p_data_3=pd.read_csv('scrapingProfile.csv')

merged_1=pd.merge(p_data_1,p_data_2,on=['選手名','年'])

merged_2=pd.merge(merged_1,p_data_3,left_on=['選手名','年'],right_on=['選手名','年'])

merged_3=merged_2[['No.','年', '選手名','背番号_x','チーム', '守備', '生年月日','年齢', '年数', '身長', '体重', '血液型', '投打', 
                  '出身地', '年俸(推定)', 'BMI', '防御率_x', '試合', '勝利_x', '敗北_x','セlブ_x', 'ホlルド_x', 'HP', '完投',
                  '完封勝', '無四球', '勝率', '打者', '投球回_x', '被安打_x', '被本塁打_x', '与四球', '敬遠',
                  '与死球', '奪三振_x', '暴投', 'ボlク', '失点', '自責点_x',
                  'WHIP', '被安打率', '被本打率', '奪三振率','与四死率', 'DIPS', 'K/BB', 'HldR', 'PFR']]

data = merged_3.rename(columns={'背番号_x':'背番号','防御率_x':'防御率','勝利_x':'勝利', '敗北_x':'敗北','セlブ_x':'セーブ', 'ホlルド_x':'ホールド','奪三振_x':'奪三振','自責点_x':'自責点', '投球回_x':'投球回', '被安打_x':'被安打','被本塁打_x':'被本塁打'})

data.to_csv('npb_merged_data.csv',index=False)


まとめ

10行程度でデータセットをマージすることができました。
やっとデータセットが分析用の形に整いました。
これで自由に分析ができるようになってくるのではないでしょうか。

今回のコードとデータはこちら!(有料)

今回の作成したデータをまじするコードはこちらになります。
マージするためのデータはございませんのでご注意ください。
冒頭で紹介した10年分のプロフィールデータを取得する記事と成績データを取得する記事からご購入いただくか、コードを参考にスクレイピングすることで基データを入手できます。
今回のマージしたデータを欲しいという方、コードを参考にしてみたい方はぜひダウンロードしてみてください!

ここから先は

72字 / 4ファイル
この記事のみ ¥ 100

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