RedandWhiteDays

赤、白、ときどき黒猫

DAY5 : Pandasを使ってみた

今回はwebスクレイピングから一度離れ、次回に得点予想モデルを実装するためのデータの下準備を行おう。


PythonにはPandasというデータ分析用の有名なライブラリがあり、今回はそれを使ってみることにした。


データセットは次のサイトのプレミアリーグの14/15シーズンのデータを使用している。
England Football Results Betting Odds | Premiership Results & Betting Odds
このサイトで手に入るcsvファイルは試合結果だけでなく、シュートの本数など簡単なstatsも記載されているので有用だ。どこで海外サッカーのスタッツが手に入るかはこちらに良くまとまっているので参考にされたい。
www.jokecamp.com


今回の目標はこのcsvファイルから、全20チームのHS(ホームでの平均得点)、HG(ホームでの平均失点)、AS(アウェーでの平均得点)、AG(アウェーでの平均失点)をシーズンを通して集計することである。


まずはPandasを用いてcsvファイルを展開する。

import pandas as pd
import numpy as np

data=pd.read_csv('csvdata/E01415.csv')


HomeTeamカラムを利用してチーム名の一覧を取得しよう。

teams=data["HomeTeam"]
teams=list(set(teams.head(50).tolist()))
print(teams)


このとき全てのチームがHomeTeamに少なくとも一回は登場するように多めに50個の値をとり、それをsetに一度変換してまたリストに戻すことで、重複のない、20チームのリストを得ている。

['Southampton', 'Swansea', 'Stoke', 'QPR', 'Leicester', 'Sunderland', 'Tottenham', 'Man United', 'Aston Villa', 'Everton', 'Hull', 'Chelsea', 'Liverpool', 'Newcastle', 'Arsenal', 'Burnley', 'West Ham', 'West Brom', 'Crystal Palace', 'Man City']


次にデータを記録するための空のDataFrameオブジェクト、dfを作る。

df=pd.DataFrame(index=teams,columns=['HS','HG','AS','AG'])

タテ軸でチーム名、ヨコ軸でHS,HG,AS,AGがそれぞれ指定されている、20*4の表だ。


先ほど得られたチーム名のリスト、teamsでループをまわし、dfに情報を適宜書き込んでいく。

for team in teams:
    home=data[data.HomeTeam==team][['FTHG','FTAG']]
    away=data[data.AwayTeam==team][['FTHG','FTAG']]
    homemean=home.mean()
    awaymean=away.mean()
    homemean.index = ['HS', 'HG']
    awaymean.index=['AG','AS']
    df.ix[team,:]=pd.concat([homemean, awaymean])
df=df.sort_index()


得られたdfは次のようになった。

TEAM HS HG AS AG
Arsenal 2.15789 0.736842 1.57895 1.15789
Aston Villa 0.947368 1.31579 0.684211 1.68421
Burnley 0.736842 1.10526 0.736842 1.68421
Chelsea 1.89474 0.473684 1.94737 1.21053
Crystal Palace 1.10526 1.42105 1.36842 1.26316
Everton 1.42105 1.10526 1.10526 1.52632
Hull 1 1.26316 0.736842 1.42105
Leicester 1.47368 1.15789 0.947368 1.73684
Liverpool 1.57895 1.05263 1.15789 1.47368
Man City 2.31579 0.736842 2.05263 1.26316
Man United 2.15789 0.789474 1.10526 1.15789
Newcastle 1.36842 1.42105 0.736842 1.89474
QPR 1.21053 1.26316 1 2.57895
Southampton 1.94737 0.684211 0.894737 1.05263
Stoke 1.68421 1.15789 0.842105 1.21053
Sunderland 0.842105 1.42105 0.789474 1.36842
Swansea 1.42105 1.15789 1 1.42105
Tottenham 1.63158 1.26316 1.42105 1.52632
West Brom 1.26316 1.36842 0.736842 1.31579
West Ham 1.31579 0.947368 1 1.52632


こうして見てみるとhomeかawayかで得点力に大きな違いがあるチームが多いことが分かる。
その中で、awayにおける得点がホームを上回ったChelseaは流石である。Homeでの失点率の低さも特筆すべきものがある。
我がsunderlandは残念ながら、そもそもの得点力が低いので、それほど大きな差は無い。


ちなみにこれは余談だが、はてな記法のフォーマットに表データを変換するのはawkを使うと便利だ。

awk 'BEGIN {FS="[ ]{2,}"} {print "|", $1,"|",$2,"|",$3,"|",$4,"|",$5 }' hoge.txt

FSを二文字以上の空白文字で指定することで 、'Aston Villa'などをフィールドの切れ目と認識することを回避できる。


次回はこの数値をもとに得点を予測し、試合結果を予想するモデルで遊んでみよう。