引き続き統計学のお話。
前回までは1変量(x)だったのですが、これから2変量(x、y)に。
ちょっと前進した気分です。
次に覚えるのは「相関係数」。
2変量なので、
xとyの相関関係を表すデータが必要になってくるということなんだろね。
(イメージしやすいのは「座標軸」?)
>>>
相関係数を計算する時に、最初に求めるのは「共分散」。
各値について、
「偏差x × 偏差y」を足しこんだ合計を、
「値の個数-1」で割ったものである。
1変量の分散は
「偏差x × 偏差x」(偏差xの2乗)を足しこんだ合計を、
「値の個数-1」で割ったものだった。
再度四角形の面積で考えるなら、
「正方形→長方形」に変わってくる。
n _ _
共分散 Cov xy = Σ (xi - x)*(yi - y) / (n - 1)
i=1
[プログラム]
--------------------------------------------
// サンプルの値
const int n = 3; // 値の個数が3個で
int xy[n][n]={ {1,10} , {2,20} , {3,30} }; // 値(x,y)が「1,10」「2,20」「3,30」の例
--------------------------------------------
// xの平均値を求める
double sx=0.0; // xの合計を初期化
for (int i=0; i<n; i++) sx += xy[i][0]; // 値x[0]~値x[2](3個)の合計を加算していく
double mx = sx/n; // xの平均値(値の合計/値の個数)を計算
--------------------------------------------
// yの平均値を求める
double sy=0.0; // yの合計を初期化
for (int i=0; i<n; i++) sy += xy[i][1]; // 値y[0]~値y[2](3個)の合計を加算していく
double my = sy/n; // yの平均値(値の合計/値の個数)を計算
--------------------------------------------
// 共分散を計算
double covxy = 0.0; // 共分散を初期化
for (int i=0; i<n; i++) {
covxy += (xy[i][0]-mx) * (xy[i][1]-my); // xの偏差とyの偏差をかけたものを合計
}
covxy /= n-1; // 合計を(値の個数-1)で割る
--------------------------------------------
>>>
相関係数は
「共分散を、『(xの標準偏差)×(yの標準偏差)』で割ったもの」
である。
相関係数 r xy = Cov xy / (Sx × Sy)
--------------------------------------------
// xの標準偏差を計算
sx = 0.0; // xの標準偏差を初期化
for (int i=0; i<n; i++) {
sx += (xy[i][0]-mx) * (xy[i][0]-mx); // xの偏差の2乗を合計する
}
sx /= n-1; // 分散を求める
sx = sqrt(sx); // 標準偏差を求める
--------------------------------------------
// yの標準偏差を計算
sy = 0.0; // yの標準偏差を初期化
for (int i=0; i<n; i++) {
sy += (xy[i][1]-my) * (xy[i][1]-my); // yの偏差の2乗を合計する
}
sy /= n-1; // 分散を求める
sy = sqrt(sy); // 標準偏差を求める
--------------------------------------------
// 相関係数を計算
double rxy = covxy / (sx * sy);
--------------------------------------------
相関係数から、以下のことがわかる。
正(>0)であれば、右上がりの相関。
負(<0)であれば、右下がりの相関。
絶対値が1に近ければ近いほど、相関が強い。(ちらばりが少なく、まとまっている)
絶対値が1の場合は「完全相関」と言い、値が直線上に並ぶ。
絶対値が0に近ければ近いほど、相関が弱い。(ちらばりが大きく、まとまっていない)
0の場合は「無相関」。もちろん値はバラバラである。
>>>
続きの日記は、相関関係を直線で表す
「回帰直線」
についてまとめたいと思います。