【プロ野球スクレイピング】データを取得する(read.html、to.excel)

こんにちは

悟です。(@rxf7oqjSU4v473O

今回はpythonを用いてデータ分析を行おうと思います。

自分の練習と、その記録も兼ねていますが、どうぞお付き合いください。

データ分析の素材には日本プロ野球(NPB)のデータを使います。

やはり、自分の好きなものを使って練習しないと面白くないと思うでの、野球好きでPythonを勉強したい方は楽しめるかもしれません。

※上級者の方から見ると、決してスマートな方法ではないと思います。

あくまで「初心者がやってみた」程度ですので、そこまで期待しないでください。

【書評】セイバーメトリクスの落とし穴 マネーボールを抱える野球論(お股本)

今回の流れ
  • データをweb上から取ってくる
  • 分析できるようにデータを綺麗にする
  • 簡単にまとめてみる

1回目なので、とりあえずいじれるような状態まで持っていくことを目指します。

データを取り込む(read.html)

 当初はスクレイピングを目標にしていたのですが、プロ野球のデータは大体、表形式にまとまっています。

表形式であれば簡単に取ってくることができます。

今回は2018年NPBで規定打席到達者を対象にデータを取ってきます。

データはNPB公式を利用しました。機械的に大量のwebサイトを漁るのは多くのwebサイトで禁止されており、利用も個人利用に制限されています。今回は、何度もwebサイトにアクセスしなくて済むようにcsvファイルへ保存してから分析を行います。

# インポートします 
import pandas as pd import matplotlib.pyplot as plt 
# 目的とするwebページへアプローチ 
url = '欲しい表が表示されているurl' 
# ページ上のhtmlテーブルを読み込む 
dfs = pd.read_html(url) 
# このままだとリスト形式のままなので、
pandasデータフレームへ変換 df = dfs[0]

urlは外してあります。各自で入力してください。

NPB2018_hitters

表示をするとこのような感じになります。

 

分析用にデータを整理する(to.excel、replace)

なぜか打率や打席数などのカラム名が2つになっていました。現在のままだと、分析ができないので、整理していきます。

整理項目

0番目の行を消す

順位の列を消す

日本語のカラムをMLBと同じ英名に変更

 

# 0行目(1番上の行を削除します)
df = df.drop([0])
# 順位 の列を削除します
del df["順位"]
# rename を用いてカラム(列)名を変更します。ここでは一括で
df_columns_rename=df.rename(columns={'選手名': 'Player', 'チーム': 'Team', '打率': 'AVG', '試合': 'G', '打席数': 'PA', '打数': 'AB', '安打': 'R',
                   '本塁打': 'HR', '打点': 'RBI', '盗塁': 'SB', '四球': 'BB', '死球': 'HBP', '三振': 'SO', '犠打': 'SH',
                   '併殺打': 'GDP', '出塁率': 'OBP', '長打率': 'SLG'})
# チーム名も英語の略称に変更しておきます。
df_team_name_replace=df_columns_rename.replace({'西武': 'L','広島': 'C','中日': 'D','ロッテ': 'M','阪神': 'T','ヤクルト': 'Ys',
            '日本ハム': 'F','ソフトバンク': 'SB','巨人': 'G','DeNA': 'De','オリックス': 'Bs','楽天': 'E'})
NPB2018_hitters_new

チーム名や列名も英語になり、データ分析できそう(?)な雰囲気が出てきました。

ヒストグラムを表示する(plt.hist)

せっかくここまで整理したので、ヒストグラムで表示してみます。

# 図表を表示
fig=plt.figure()
ax=fig.add_subplot(111)
# データフレーム名(表示するデータ,range(軸の最小値,最大値),各棒を白線で区切る)
ax.hist(df["OPS"],range=(0.5,1.2),rwidth=0.9)
# タイトル
ax.set_title("OPS(2018)")
plt.show()
OPS(2018)

2018年度の規定打席到達者60人をヒストグラムにまとめました。

やはり年間を通じて試合に出ている選手だけあって、.800前半の値を最頻値に高水準にまとまっています。

ただ、レギュラー選手なのにも関わらず、OPSが.600を下回っている選手が何人かいます。低OPSの選手をレギュラーとして使わざるを得ないのか、それとも他の選手よりも明確な強みがあるため、打撃に目をつむっているのかわかりませんが、今回整理したデータを使って、もう少し分析をしてみようと思います。