サッカーを通じて観戦力と分析力を上げていくブログ

基本的にはサッカー×データに関して試してみたことをまとめています。最近はもっぱらPythonを使った可視化中心。時々自分の好きなガジェットも。

【データ分析 × Python】いわきFC2019年新加入選手のBMIを見てみる

先日ふといわきFCのサイトに訪れたところ、選手情報が最新の情報へ更新されていたので、改めてBMI値を見てみたいと思います。ちなみに2018年末時点でのBMIはこんな感じでした。

96lovefootball.hatenablog.com

いわきFC選手のBMI2019年最新版

BMI(縦)と年齢(横)軸で早速可視化してみると、下記のようになりました。紺色が既存選手、赤色が新加入選手となっています。

f:id:virgilvd:20190114175559p:plain

今話題のバスケスバイロン選手(グラフ左上)を含め、やはり全体的には新加入選手の方がBMIは小さめですね。ただ、似鳥選手や白岡選手(共にGK)、附木選手など既にそれなりのフィジカルを持った選手も加入しているので、これからどのように成長していくのか楽しみです。

可視化した方法

今回の可視化に使用した方法をメモしておきます。具体的には、「既存選手と新規選手の色分け方法」と「散布図内の各点に選手の名前を表示させる方法」の2つをメモしておきます。使用したPythonの環境は毎度おなじみ「Google Colab(グーグル コラボレイトリー)」です。

96lovefootball.hatenablog.com

 ・使用したデータ

今回使用したデータは、いわきFC公式サイトの選手情報ページからからコピペし少し整形したものになります。

iwakifc.com

f:id:virgilvd:20190114183456p:plain

▲データをまとめたcsvはこのような感じ。

このデータをPythonでDataFrame形式で読み込んでいます。その後「身長/体重」列と「生年月日」列を整形して準備完了です。整形の仕方は下記を参考にしていただければと思います。生年月日がこの形でもPythonでは手間なく扱えるのは素晴らしいですね。 

96lovefootball.hatenablog.com

・既存選手と新規選手の色分け方法

データを準備出来たら、matplotlibライブラリを使用して可視化していきます。今回色分けするために、いわきFC選手のデータを既存選手と新規選手のデータに分けて、その後それぞれを重ねて表示することで実現しています。

データの分け方は、元のデータに.query( )で取り出す条件を指定し、.reset_index( )でインデックスを振り直します。.reset_index( )は、引数にdrop=Trueを指定しないと元のインデックス列が1列追加されてしまいます。

df_newPlayer=df_iwaki.query('新加入==1').reset_index(drop=True)

f:id:virgilvd:20190114185630p:plain

f:id:virgilvd:20190114185748p:plain

▲.reset_index( )で何も指定しないとこんな感じでindex列が追加されます。

こうして出来た既存選手と新規選手のデータをmatplotlibのscatterを使って、重ねて描画します。

ライブラリのインストールとおまじない。

import matplotlib.pyplot as plt
%matplotlib inline

scatterで重ねて描画。

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1,1,1)

ax.scatter(df_newPlayer['年齢'], df_newPlayer['BMI'], marker='o', color='crimson')
ax.scatter(df_exPlayer['年齢'], df_exPlayer['BMI'], marker='o', color='navy')

ax.set_xlabel('Age')
ax.set_ylabel('BMI')

plt.legend() plt.show()

f:id:virgilvd:20190114192323p:plain

・散布図内の各点に選手の名前を表示させる方法

こちらはネット上に落ちていたコードを参考に、for文と.text( )を組み合わせる方法で実現しています。

data_label=df_exPlayer['選手名(英語)']
x_coords=df_exPlayer['体重']
y_coords=df_exPlayer['身長']

data_label_n=df_newPlayer['選手名(英語)']
x_coords_n=df_newPlayer['体重']
y_coords_n=df_newPlayer['身長']

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1,1,1)

for i,type in enumerate(data_label):
    x = x_coords[i]
    y = y_coords[i]
    ax.scatter(x, y, marker='o', color='navy')
    ax.text(x+0.1, y+0.1, type, fontsize=8)
    
for i,type in enumerate(data_label_n):
    x = x_coords_n[i]
    y = y_coords_n[i]
    ax.scatter(x, y, marker='o', color='crimson')
    ax.text(x+0.1, y+0.1, type, fontsize=8)
    
ax.set_xlabel('Weight')
ax.set_ylabel('Height')

plt.show()

f:id:virgilvd:20190114175559p:plain

戦術や分析に関して、こういう見方もあるよ、こうして見た方がいいよ、などご意見等ありましたら、コメントで教えていただけると幸いです。ぜひよろしくお願いいたします!