こんにちは
今回は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は外してあります。各自で入力してください。

表示をするとこのような感じになります。
分析用にデータを整理する(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'})

チーム名や列名も英語になり、データ分析できそう(?)な雰囲気が出てきました。
ヒストグラムを表示する(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()

2018年度の規定打席到達者60人をヒストグラムにまとめました。
やはり年間を通じて試合に出ている選手だけあって、.800前半の値を最頻値に高水準にまとまっています。
ただ、レギュラー選手なのにも関わらず、OPSが.600を下回っている選手が何人かいます。低OPSの選手をレギュラーとして使わざるを得ないのか、それとも他の選手よりも明確な強みがあるため、打撃に目をつむっているのかわかりませんが、今回整理したデータを使って、もう少し分析をしてみようと思います。