より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

pandas.DataFrameのcorr関数について

pandas.DataFrameのcorr関数は、相関係数を求める関数です。

pandas.pydata.org

ここから、seabornでヒートマップで表示というのは私はよくやるのですが、相関を求めるとはいえ、具体的に何をやっているのかはよく理解してませんでした。

相関係数にもいくつか方法がある

www.monotalk.xyz

上記サイトにまとめてあり、pandas.DataFrame.corrを今後も使っていけば良さそうです。

この関数はmethod引数の指定で、3種類の相関関数を算出することができます。

  • ピアソンの積立相関係数 pandasDataFrame.corr(method="pearson") もしくは method引数を省略
  • スピアマンの順位相関係数 pandasDataFrame.corr(method="spearman")
  • ケンドールの順位相関係数 pandasDataFrame.corr(method="kendall")

実際にピアソンの積率相関係数を実装してみる

Pythonで実装しようとすると甘えが出てコピペで終わりそうなので、C#で実装することにします。

f:id:rimever:20190114170529p:plain

Wikipediaより

数式だけ見ると、「うわっ」という感じですね。

/// <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となります。

このあたりも、値を調整して動きを観察すると、理解が深まります。

f:id:rimever:20190114173400p:plain

最後に

スピアマンの順位相関係数については、順位を元に算出します。

タイになった場合の計算がややこしそうです。

スピアマンの順位相関係数 - Wikipedia

算出方法を見た感じだけで判断すると、当面はピアソンの積率相関係数で良さそう。