プレミアリーグを得点時間帯ごとにクラスタリングする
概要
スポーツの結果予想のために、最近、少しずつ機械学習に取り組んでいる。
今日は、機械学習 k-means(k平均法)を用いたクラスタリングを試してみる。
素材は、サッカーの時間帯別の得点率で、これを使いチームをクラスタリングする。
テスト用に作成した素材はLive scores, results, fixtures, tables, statistics and news - Soccerwayから、取得して、加工した。
これは、総得点のうち、15分刻みの特定の時間帯に得点する割合を示している。
実装
K-meansでクラスタリングする最適なクラスタ数の決定方法には、X-meansという方法もあるが、
時間がかかりそうだったので、適当に4に設定してみた。
#coding: utf-8 import pandas as pd import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt df = pd.read_csv('uk-soccer-goal-rate-per-time-20161205.csv') array = np.array([ df['0to15'].tolist(), df['15to30'].tolist(), df['30to45'].tolist(), df['45to60'].tolist(), df['60to75'].tolist(), df['75to90'].tolist(), ], np.float) array = array.T predict = KMeans(n_clusters=4).fit_predict(array) df['cluster_id'] = predict print(df.sort_values(["cluster_id"])[["cluster_id", "Team"]]) clusterinfo = pd.DataFrame() for i in range(4): clusterinfo['cluster' + str(i)] = df[df['cluster_id'] == i].mean() clusterinfo = clusterinfo.drop('cluster_id') my_plot = clusterinfo.T.plot(kind='bar', stacked=True, title="Stacked bar by cluster") plt.show()
このスクリプトを実行すると、クラスタのIDとチーム名が表示される。
python k-means.py cluster_id Team 17 0 sunderland 2 1 liverpool 5 1 manchester_united 0 2 chelsea 16 2 west_ham_united 15 2 middlebrough 13 2 burnley 12 2 crystal_palace 11 2 southampton 9 2 afc_bournemauth 6 2 west_bromwich 3 2 manchester_city 1 2 arsenal 19 2 swansea_city 10 3 watford 8 3 stoke_city 7 3 everton 14 3 leicester_city 4 3 tottenham 18 3 hull_city
また、グラフも表示され、こんな感じになった。
前半、後半に強いチームがあるのが分かるくらいで、実際の成績ともそこまで、相関はなさそう。 本当なら、試合結果を予測するのに使えるデータがほしいが、まだ、難しそうだ。
# 参考