相関係数

Takami Torao
  • このエントリーをはてなブックマークに追加

定義と性質

相関係数 (correlation coefficient) は確率変数 に対する別の確率変数 の線形従属性を示す尺度。最も一般的なものは線形相関係数 (linear correlation coefficient) で積率相関係数 (product-moment correlation coefficient)、Peason の (Pearson's r) とも呼ばれる。

母相関係数 は共分散をそれぞれの変数の周辺分布の分散の積の平方根で割った比で表すことができる。

相関係数 は -1 から 1 までの値を取る。 のとき「完全な正の相関」であり、すべてのデータは正の傾きを持つ直線上に並ぶ。同様に の場合は「完全な負の相関」で負の傾きを持つ直線上に並ぶ。 のとき 無相関 (uncorrelation) である。

相関係数は順位付けのために比較することができるが等比ではない。つまり の時に「 に比べて正/負の相関が高い」は正しいが「 に比べて二倍の相関がある」という考え方はできない。

が独立であれば相関係数 は 0 となる。ただし は線形関係のみを表しているため だとしても独立とは限らない。

標本相関係数

個の無作為標本 に対しては標本相関係数 で考える。ここで標本平均をそれぞれ とすると以下のように表すことができる。このとき 標本共分散という。

帰無仮説による 検定

サンプリング調査から求める標本相関係数は母集団の相関係数と異なっていることが多い。特にサンプルが少ないケースでは無相関な母集団からたまたま高い標本相関係数が得られることもある。この対処として、標本相関係数 に対して母相関係数が という帰無仮説 (null hypothesis) を検定することで、無相関な母集団からたまたま得られた標本相関係数である可能性を排除する方法がある。

帰無仮説として母相関係数 、対立仮説として を考えたとき、標本相関係数 から求めた の値は自由度 の t 分布に従うことが分かっている。ここで は標本数を表す。上記 の値が t 分布表での対応する自由度における危険確率 (5% など実施者が想定するしきい値) より大きければ帰無仮説は棄却されたことを意味する。

標本数 がある程度の大きさを持つ場合 t 分布は正規分布 に近似する。慣例的に であれば正規分布として区間推定を行って良い。

フィッシャーの -変換

フィッシャーの -変換 (Fisher's -transformation) は標本相関係数 から真の母相関係数 の信頼区間を導出する。つまり「母相関係数は 95% の確率でこの範囲に存在する」といった確率分布を表す。統計量 は以下の式で与えられる。

この は特に の 2 変量正規分布からの標本数に対して以下の平均 、分散 を持つ正規分布 に近似する。ここで は標本数で は母相関係数である。この変換は非常に頑健性 (robustness) が高い。

アルゴリズム

線形相関係数の実装

の標本をから線形相関係数 を算出する関数。

def pearson(x:Array[Double], y:Array[Double]):(Double,Double,Double) = {
  val n = x.length
  if(n != y.length || n == 0){
    throw new IllegalArgumentException("")
  }

  // 平均を求める
  var ax = 0.0
  var ay = 0.0
  for(i <- 0 until x.length){
    ax += x(i)
    ay += y(i)
  }
  ax /= n
  ay /= n

  var sxx = 0.0
  var syy = 0.0
  var sxy = 0.0
  for(i <- 0 until x.length){
    val dx = x(i) - ax
    val dy = y(i) - ay
    sxx += dx * dx
    syy += dy * dy
    sxy += dx * dy
  }

  sxy / math.sqrt(sxx * syy)
}

無相関確率の実装

線形相関係数 と標本数 から帰無仮定の -検定で元の標本 が無相関である確率を算出する。

def prob(r:Double, n:Int):Double = {
  val epsilon = Double.MinPositiveValue
  val df = n - 2
  val t = r * math.sqrt(df / ((1 - r + epsilon) * (1 + r + epsilon)))
  不完全ベータ関数(a = 0.5 * df, b = 0.5, x = df / (df + t * t))
}

フィッシャーの -変換の実装

線形相関係数 からフィッシャーの を算出する。

def fishersZ(r:Double):Double = {
  val epsilon = Double.MinPositiveValue
  0.5 * math.log((1 + r + epsilon) / (1 - r + epsilon))
}