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

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

【データ分析 × Python】欧州5大リーグ所属選手の身長が正規分布に近似できるか確認してみる

引き続き、データ遊びをしていきます。最近、大学時代にかじっていた統計学を改めて勉強し直しています。数式のオンパレードで途中血へどを吐きそうになりましたが、なんとかインプットした内容をアウトプットしていきます。まずは、今回から数回に渡りPythonを使って統計的推定を理解していきたいと思います。参考資料はいつもの「Pythonで理解する統計解析の基礎」です。

 

正規分布とは

統計的推定では母集団の確率分布をどう仮定するかでその手法が変わってきますが、今回は一番ベーシックな正規分布を対象に行っていきます。正規分布は自然界の多くの現象で近似できる(身長やテストの点数がよく例で出てきます)と言われている確率分布で、平均を中心に左右対称の釣り鐘型が特徴的です。密度関数は下記になります。

f(x)=\dfrac {1}{\sqrt{2\pi}\sigma}\exp\biggl\{ -\dfrac {(x-\mu)^2}{2\sigma^2}\biggr\}

なんのこっちゃ分からないかもしれませんが、重要なのは確率変数の平均μと分散σ^2によって関数が決まるところです。この複雑な式でもPythonでは簡単に利用できます。試しに平均値が2、分散が0.25(=標準偏差が0.5)の正規分布を表示して見たいと思います。SciPyと呼ばれるライブラリのstatsモジュールを使用します。

まずは諸々のインポートとおまじない。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

%precision 3
%matplotlib inline

正規分布に従う確率関数は、statsモジュールのnorm関数によって作ることができます。第一引数と第二引数に、それぞれ平均と標準偏差を指定するだけです。matplotlibでの表示と併せてやって見ます。

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

n_test = np.arange(0, 4, 0.01)
rv_test = stats.norm(2, 0.5)
ax.plot(n_test, rv_test.pdf(n_test))

plt.show()

 f:id:virgilvd:20181127231427p:plain

NumPyのarrange関数で0から4までの0.01刻みの配列を作成しています。SciPyのpdfメソッドを使って、作成した正規分布の確率関数の計算(y軸の値の計算)を行なっています。備忘録的なメモですが、ax.pltは第一引数で与えられたxの値に対して、第二引数のyの値を出力しているので、第一引数で与えた配列数を少なくするとカクカクなグラフになります。

f:id:virgilvd:20181127232331p:plain

▲np.arange(0, 4, 0.2)にした時のグラフ

とにかくPythonを使うと式が複雑なグラフでも簡単にかけますね。

 

サッカー選手の身長は正規分布になっているのか

さて、正規分布は自然界の現象を近似できるとのことですが、実際に身長が正規分布と近似できそうな形になっているのか確かめてみたいと思います。まずは以前から使用しているプレミアリーグ所属選手の身長データを使って確認します。これまでと同様の手順で身長データをNumPyの配列arrayに格納しておきます。

正規分布の形を決定する平均値と分散を求めます。

p_mean = np.mean(height)
p_var = np.var(height)

f:id:virgilvd:20181128002650p:plain

これらを元にした正規分布と実際の分布を重ねて表示してみます。

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

xs = np.arange(150,210,1)
rv = stats.norm(p_mean, np.sqrt(p_var))
ax.plot(xs, rv.pdf(xs), color='gray')
ax.hist(height, bins=60, range=(150, 210), density=True)

plt.show()

f:id:virgilvd:20181128003919p:plain

 ・・・なんとも言えない感じで出力されてきました。正規分布に近似できそうな傾向は見られますが、真の正規分布のグラフに比べてスカスカで、差がかなりある気がします。対象データが561件と比較的少ないことが影響していると思われます。

そこで今度は対象の範囲を拡大してみます。プレミアリーグ に加えてラ・リーガセリエAブンデスリーガリーグ・アンの欧州5大リーグのデータで同様の作業を行なってみます。データは2789件にまで増えています。

・平均値・分散

f:id:virgilvd:20181128004610p:plain

正規分布ヒストグラムの表示

 f:id:virgilvd:20181128004627p:plain

プレミアリーグだけのデータと比べると正規分布に近い形になっています。左半分の山が小さいですが、先ほどのグラフのような歯抜け感がありません。さらにデータを増やせば正規分布により近づきそうです。

こうして実際のデータをPythonを使って動かしてみることで、知識として学んだ統計をサクッと感覚的に理解していけるのは非常に良いですね。次回はこの(正規分布と近似できる)データを使って統計的推定を行ってみたいと思います。

 

追記

色々このデータを使って検証してみると、どうやらこのデータは正規分布では無いようです。この検証内容も今度まとめようと思います。

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