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'などをフィールドの切れ目と認識することを回避できる。
次回はこの数値をもとに得点を予測し、試合結果を予想するモデルで遊んでみよう。