Pythonで統計量関数(平均、中央値、分散、相関係数)を作り、可視化しよう

どうも、木村(@kimu3_slime)です。

Pythonで、平均、中央値、分散、相関係数などの統計量関数を作り、可視化する方法を紹介します。

statisticsモジュール、pandasモジュールにこれらは含まれますが、今回は統計学の勉強、統計量の意味の理解のため、定義式に戻って計算してみました。

 

平均、中央値、分散、標準偏差

\(x=(x_1,\dots, x_n)\)を調べたいデータとします。

この\(n\)個のデータの特徴を引き出すのが、種々の統計量(statistic)です。

最初に、定義とそのプログラム例を紹介しましょう。最後に、具体的なデータで統計量の値を計算します。

 

平均(mean)は、データの各成分を足しデータサイズで割ったものです。

\[\mathrm{m}(x) = \frac{\sum_{i=1} ^n x_i}{n}\]

Pythonの組み込み関数sumはデータの各成分の総和、lenはデータのサイズ\(n\)を求めてくれます。

 

 

中央値(median)は、データの成分を小さい順に並び替えて、順番的に中央に来る成分の値です。

中央とは約\(n/2\)のこと。\(n\)が奇数のときはピッタリ中央が存在するのでその値を使います。\(n\)が偶数のときは、ピッタリ中央が存在しないので、中央2つの値の平均を使いましょう。

 

平均や中央値は、データで目立って見られる値を示すもので、代表値と呼ばれます。一方、データの散らばり具合を調べるにはどうしたら良いでしょうか。

もっとも簡単な量は範囲(range)で、データの最大値から最小値を引いたものです。

分散(variance)は、データの平均からのずれを測れる量で、データの散らばり具合を表します。

\[\mathrm{v}(x) = \frac{\sum_{i=1} ^n (x_i – \mathrm{m}(x))^2} {n}\]

偏差\(x_i – \mathrm{m}\)の二乗の平均とも言えますね。(二乗せずに足し合わせる式を考えると、常に0になってしまいます)

分散の平方根を、標準偏差(standard deviation)と呼びます。

分子の和を取るために、for文による反復を用いました。

 

共分散、相関係数

2つのデータ\(x,y\)に規則性、特に線形的な関係があるかどうかを調べましょう。

次の量を、ピアソンの相関係数(Pearson correlation coefficient)と呼びます。

\[\mathrm{cor}(x,y) = \frac{\mathrm{cov}(x,y)}{\mathrm{v}(x)\mathrm{v}(y)}\]

分母は分散の積ですが、分子は共分散(covariance)と呼ばれるものです。

\[\mathrm{cov}(x,y) = \frac{\sum _{i=1}^n (x_i -\mathrm{m}(x))(y_i – \mathrm{m}(y))}{n}\]

共分散の分子は、\(x,y\)それぞれの平均と成分の離れ具合を計算してかけたもので、符号付きで足し合わせていることになります。

画像引用:東京大学出版会「統計学入門」 p.50

相関係数はその定義により、\( 0\leq |\mathrm{cor}(x,y)| \leq 1\)となります。0に近いときは相関関係がない、1に近いときは正の相関関係がある、-1に近いときは負の相関関係がある、と言うわけです。

(相関関係があることは、因果関係があることを意味しません。これは別の記事でいつか書くかと思います。)

平均、分散、標準偏差、共分散……と計算していけば、相関係数の計算で難しいことはありませんね。

 

具体例とその可視化

今までの関数を、具体的なデータを入れて使ってみましょう。

乱数の生成にrandomモジュール、可視化にmatplotlibを使います。

参考:random — 擬似乱数を生成する – Pythonドキュメント1.4. Matplotlib: 作図 – Scipy Lecture Notes

その実行結果の例は次の通り。(乱数を使っているので、結果は毎回違います)

\(x\)については平均と中央値が完全に一致していますが、\(y\)ではそうではありません。範囲、分散、標準偏差は\(x\)の方が明らかに大きいですね。

また、\(x,y\)の相関係数は約0.01で、ほとんど相関がないことがわかります。

データ\(y\)について右側の図は、ヒストグラム(histgram)または度数分布(frequency distribution)と呼ばれます。横軸はデータの取りうる値を0~1,1~2,…,9~10といったように階級(class)に分けたもの。その階級ごとの\(y\)の成分の個数、すなわち頻度(frequency)が縦軸に棒グラフとして描かれているわけです。階級の個数、区切りの細かさはビン(bin)と呼ばれ、Pythonの描写でも指定できます。

データ\(x,y\)について左側の図は、横軸に\(x\)、縦軸に\(y\)を取り、\((x_i,y_i)\)をプロットしたもので、散布図(scatter plot)と呼ばれるものです。

 

少しだけデータを変えてみましょう。

y = sorted(y)として、yを小さい順に並び替えたデータでプログラムを実行してみました。

並び替えによって、\(x\)が増えるにつれ\(y\)が単調に増えるようになったことが、散布図からわかります。

相関係数は約1で、強い正の相関があることがきちんと示されていますね。(\(x,y\)に線形関係があるならば相関係数の大きさが約1になりますが、逆は必ずしも成り立たないことに注意)

 

冒頭で書きましたが、今回紹介した統計量はモジュールを使ってできあがったものをすぐ使うことができます。

しかし、定義式を理解しないまま使っても、数字は出せるでしょうが、その意味の理解は難しくなります。

Pythonとセットで統計を学びたいときは、今回紹介したように定義式に戻ってプログラムを書いてみてはいかがでしょうか。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

 

Pythonからはじめる数学入門
Amit Saha
オライリージャパン
売り上げランキング: 62,016

 

統計学入門 (基礎統計学Ⅰ)
東京大学出版会
売り上げランキング: 2,827

 

入門数理統計学
入門数理統計学

posted with amazlet at 19.09.11
P.G.ホーエル
培風館
売り上げランキング: 110,871

 

こちらもおすすめ

統計学の手法に違いはあっても対立はない 「9つの確率・統計学物語」レビュー

数学・科学における「線形・非線形」の違いを詳しく解説

2次方程式をプログラムで解くときに気をつける「誤差」とは?

論理に関するド・モルガンの法則を真偽値の計算(プログラミング)で確かめる

「AならばB」は「Aでない、またはB」を真偽値の計算(プログラミング)で確かめる