【R】-基本統計- 相関と共分散

スポンサーリンク

はじめに

こんにちは!ひらちんです!Rを使った統計について自分の勉強も兼ねて記事にしています。

今回は、相関共分散についてです!

スポンサーリンク

相関とは

相関とは、対になっている2つのデータが一方が変化した時に他方も変化するように、相互に関係しあっていることを言います。

統計では、これを相関係数という指標で表します。

相関係数は、-1から1の間を取り、1に近ければ2つのデータ間に強い正の相関が見られ、-1に近ければ強い負の相関を意味します。0に近ければ相関が無いことになります。

相関係数を計算する公式は以下のようになります。

【対象データが母集団全体の場合】

【対象データが母集団からのサンプルの場合】

公式の分母の部分を見て下さい。

これはそれぞれ、データxとyの標準偏差になっていますね。

次に分子の部分です。

これは、後で出てくる共分散になります。

つまり、相関係数は

共分散をxとyの標準偏差で割ったもの

になっています。

スポンサーリンク

共分散とは

では、次に共分散についてです。

共分散とは、2組の対応するデータの関係表す指標です。

共分散を求めるには、2つの変数の偏差の積の平均を計算します。

共分散が正の値の場合は、一方の値が増加するともう一方の値が増加する傾向にある正の相関があると言えます。負の値の場合は、一方の値が増加するともう一方の値が減少する負の相関があると言えます。

相関係数との違いは、相関係数の値が-1から0の間を取るのに比べて、共分散はそうとは限らないというところです。

相関係数は、共分散を別のデータとも比較出来るように標準偏差で割って単位を揃えた指標と言えるます。

相関係数のところで出てきた数式の再掲です。

【データが母集団全体を対象にしている場合】

【データが母集団からのサンプルを対象にしている場合】

また、次の公式でも求めることが出来ます。

xとyの積の平均から、それぞれの平均の積を引いたものです。

こっちの方が計算が楽かもしれないですね。

Rで相関係数を計算する

Rで相関係数を計算するには、 cor関数を使います。

ggplot2パッケージの中のeconomicsデータを使います。

require(ggplot2)
head(economics)

実行すると次のような結果が出力されます。

カラムのpceは個人消費支出、psavertは個人貯蓄率です。

この2つの相関関係を計算してみます。

先程のコードの続きに

cor(economics$pce, economics$psavert)

を追加して下記のようにして実行します。

require(ggplot2)
head(economics)

cor(economics$pce, economics$psavert)

結果は以下のようになります。

-0.7928546とかなり低い相関係数になりました。

消費と貯蓄は相反する関係になっているので納得出来ますね(^^)

Rで共分散を計算する

Rで共分散を計算するには、 cov関数を使います。

先程と同じく、ggplot2パッケージの中のeconomicsデータを使います。

require(ggplot2)
head(economics)

このコードの続きに

cov(economics$pce, economics$psavert)

を追記して実行します。

require(ggplot2)
head(economics)

cov(economics$pce, economics$psavert)

結果は以下のようになります。

-8359.069ですね。

マイナスの数値が出ているので、これはpceが増加すると、psavertが現象するような関係にあるといえます。

検算

念のため、他の計算方法でも同じ結果になるか分解して計算してみましょう!

以下は最初に紹介した、相関係数を計算する公式(対象データが母集団からのサンプルの場合)の再掲です。

これに沿って分解していきましょう!

この公式は、以下のように組みたっていました。

まずは、分子にある x(pce)とy(psavert)の共分散を cov関数を使わずに計算します。

をxp、をypとして新たな列を作成します。

xp <- economics$pce – mean(economics$pce)
yp <- economics$psavert – mean(economics$psavert)

をコードに追加します。

require(ggplot2)
head(economics)

xp <- economics$pce - mean(economics$pce)
yp <- economics$psavert - mean(economics$psavert)

次に、n-1 つまりデータ数引く1を計算しておきます。

データの行数を計算するには、 nrow関数を使います。

先程のデータの続きに

nMinusOne <- (nrow(economics) – 1)

を追記します。

require(ggplot2)
head(economics)

xp <- economics$pce - mean(economics$pce)
yp <- economics$psavert - mean(economics$psavert)

nMinusOne <- (nrow(economics) - 1)

これで共分散を計算する材料はそろいました。

では計算します。

sum(xp * yp) / nMinusOne

xp と yp をかけたものを合計して、nMuinusOneで割ればいいですね(^^)

コードに追記して実行します。

require(ggplot2)
head(economics)

xp <- economics$pce - mean(economics$pce)
yp <- economics$psavert - mean(economics$psavert)

nMinusOne <- (nrow(economics) - 1)

sum(xp * yp) / nMinusOne

結果は以下のようになります。

-8359.069 で、 cov関数で計算したときと同じになりましたね!

続いて、分母の x(pce)とy(psavert) それぞれの標準偏差を計算します。

xの標準偏差

これのの部分は、先程 xp として計算しました。

これのの部分も同じですね。

材料は揃っているので、計算しちゃいましょう!

xの標準偏差を、sd_pce yの標準偏差を sd_psavert とします。

あ、ついでにさっき計算したxとyの共分散も cov_pce_psavert として変数に入れておきます。

次のコードを追記します。

cov_pce_psavert <- sum(xp * yp) / nMinusOne

sd_pce <- sqrt(sum(xp ^ 2) / nMinusOne)

sd_psavert <- sqrt(sum(yp ^ 2) / nMinusOne)

Rで2乗を計算するには、「x ^ 2」か「x ** 2」とチルダかアスタリスク2個を使います。

また、平方根の計算には、 sqrt関数を使います。

今、コードはこんな感じ

require(ggplot2)
head(economics)

xp <- economics$pce - mean(economics$pce)
yp <- economics$psavert - mean(economics$psavert)

nMinusOne <- (nrow(economics) - 1)

cov_pce_psavert <- sum(xp * yp) / nMinusOne
sd_pce <- sqrt(sum(xp ^ 2) / nMinusOne)
sd_psavert <- sqrt(sum(yp ^ 2) / nMinusOne)

最後に、cov_pce_psavert と sd_pce と sd_psavert を使って、相関係数を計算します。

これなので、

cov_pce_psavert / (sd_pce * sd_psavert)

これですね。

コードに追記して最終はこんな形になります。

実行しましょう!

require(ggplot2)
head(economics)

xp <- economics$pce - mean(economics$pce)
yp <- economics$psavert - mean(economics$psavert)

nMinusOne <- (nrow(economics) - 1)

cov_pce_psavert <- sum(xp * yp) / nMinusOne
sd_pce <- sqrt(sum(xp ^ 2) / nMinusOne)
sd_psavert <- sqrt(sum(yp ^ 2) / nMinusOne)

cov_pce_psavert / (sd_pce * sd_psavert)

実行結果は

-0.7928546 cor関数で計算した結果と同じになりました!

まとめ

今回は、相関共分散について勉強しました!

コメント

タイトルとURLをコピーしました