pandas.DataFrameのcorr関数は、相関係数を求める関数です。
ここから、seabornでヒートマップで表示というのは私はよくやるのですが、相関を求めるとはいえ、具体的に何をやっているのかはよく理解してませんでした。
相関係数にもいくつか方法がある
上記サイトにまとめてあり、pandas.DataFrame.corrを今後も使っていけば良さそうです。
この関数はmethod引数の指定で、3種類の相関関数を算出することができます。
- ピアソンの積立相関係数 pandasDataFrame.corr(method="pearson") もしくは method引数を省略
- スピアマンの順位相関係数 pandasDataFrame.corr(method="spearman")
- ケンドールの順位相関係数 pandasDataFrame.corr(method="kendall")
実際にピアソンの積率相関係数を実装してみる
Pythonで実装しようとすると甘えが出てコピペで終わりそうなので、C#で実装することにします。
数式だけ見ると、「うわっ」という感じですね。
/// <summary> /// ピアソンの積率相関係数を計算します。 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public static double SampleCorrelationCoefficient(IList<double> x, IList<double> y) { var averageX = x.Average(); var averageY = y.Average(); var numerator = Enumerable.Range(0, x.Count).Sum(i => (x[i] - averageX) * (y[i] - averageY)); var denominator = Math.Pow(x.Sum(i => Math.Pow(i - averageX, 2)) * y.Sum(i => Math.Pow(i - averageY, 2)), 0.5); return numerator / denominator; }
実装自体はそこまで難しくありませんでした。
数式を見ると投げ出したくなるので、今後もプログラムに書き起こして、数式と向き合う努力をした方が良さそうですね。
取りうる値は-1〜1です。
片方の値が増えるに従い、もう片方も比例的に増加するのであれば、1となります。片方の値が増えるに従い、もう片方が比例的に減少するのであれば-1となります。
このあたりも、値を調整して動きを観察すると、理解が深まります。
最後に
スピアマンの順位相関係数については、順位を元に算出します。
タイになった場合の計算がややこしそうです。
算出方法を見た感じだけで判断すると、当面はピアソンの積率相関係数で良さそう。