Rで学ぶ統計学(共分散・相関係数)

プログラミング

Rを用いて統計学を解説します!

今回は記述統計のなかでも、共分散・相関係数と呼ばれるものについて解説し、Rでの実践方法もお伝えします。

2つの変数をもつデータについてこれから扱っていくので、変数同士の関係が見えてくるでしょう。

その他の記事はこちらから↓

Rで学ぶ統計学 基本から統計とプログラミングを学ぶ!
はじめての人でもわかるように、Rで統計学を実践的に解説します!

統計の理論

2つの変数同士の関係を見るってどういうこと?

この記事では、「2変数の関係を考察する方法」、つまりある値とある値の間にどのような特徴があるのかを考える方法を解説します。

例えば、数学のテストと統計のテストをあるクラスで行ったとします。2つのデータを見たところ、「数学のテストが高いほど、統計のテストが高い」という傾向があったとしましょう。この傾向をデータから見抜くために、データから特徴を数値化すること、つまり数値要約をすることが今回の目的です。

このように、数値をもつデータ同士の関係のことを相関といいます。2変数(xとyとします)のデータの相関関係としては、以下の3パターンが考えられます。

  • xが大きいほどyも大きい(正の相関
  • xの大きさとyの大きさに関連がない(無相関
  • xが大きいほどyはちいさい(負の相関

数値要約をすることで、これらのうちのどの相関関係なのかを見抜くことができます。

相関の様子を一つの数値で表す指標として共分散相関係数があります。どちらも2変数の関係の強さを表す指標となるので、以下で学んでいきましょう!

共分散とは

共分散とは「偏差の積の平均」です。2変数それぞれの偏差の積を計算し、平均を取ったものが共分散となります。はじめに公式を載せておきましょう。


\begin{align}
共分散 &= (x の偏差 \times yの偏差)の平均 \\[8pt]
&= \frac{\sum_{i=0}^n (x_i の偏差 \times y_i の偏差)}{n} \\[8pt]
&= \frac{\sum_{i=0}^n \{ (x_i – \bar{x})  \cdot (y_i – \bar{y})\}}{n}
\end{align}


ここでは、変数\(x\)と変数\(y\)について\(n\)個のデータがあり、平均をそれぞれ\(\bar{x}\), \(\bar{y}\)としています。

この共分散が本当に相関関係を表しているのかを考えてみましょう。

正の相関が強い時を考えてみます。
\(x\)の偏差がプラスの時、正の相関があるので\(y\)の偏差もプラスになりやすいです。よって、これらの掛け算をするとプラスになります。
\(x\)の偏差がマイナスの時、\(y\)の偏差もマイナスになりやすいです。よって、これらの掛け算もプラスになります。
これらの平均をとるので、共分散は正の相関が強いとプラスの値を取ります

負の相関が強い時を考えてみます。今度は先程と逆になります。
\(x\)の偏差がプラスの時、負の相関があるので\(y\)の偏差もマイナスになりやすいです。よって、これらの掛け算をするとマイナスになります。
\(x\)の偏差がマイナスの時、\(y\)の偏差もプラスになりやすいです。よって、これらの掛け算もマイナスになります。
これらの平均をとるので、共分散は負の相関が強いとマイナスの値を取ります

相関係数とは

まずは式から見てみましょう。変数\(x\)と変数\(y\)の共分散を\(\sigma _{xy}\)、変数\(x\)と変数\(y\)の標準偏差を\(\sigma _{x}\), \(\sigma _{y}\)とすると、


\[相関係数 = \frac{\sigma _{xy}}{\sigma _{x} \sigma _{y}}\]


となります。

実は、普通、相関関係を見るために使われるのは相関係数となります。共分散は相関係数を求めるために使われることがほとんどです。なぜでしょうか?

例えば、100点満点のテスト2つの共分散と、1000点満点のテスト2つの共分散を考えてみましょう。分布がほぼ変わらない場合、後者は偏差が10倍になるので、共分散の値が100倍近くなってしまいます。これでは、「共分散が10以上だと正の相関が強い」などと言うことはできません。

100点満点のテストでも、1000点満点のテストでも、相関係数の値は-1以上1以下になるように調整されています。相関係数が1に近ければ強い正の相関があり、-1に近ければ強い負の相関があるといえるのです。このように、値をひと目見ただけでどんな相関関係があるかがすぐにわかるのが相関係数なのです。

なぜ-1以上1以下になるのかは、長くなってしまうのでここでは割愛します。

Rで実践

データの準備

まずはデータの準備をしましょう。30人分の数学のテストと統計学のテストの点数を使います。

> math_test <- c(62, 51, 52, 65, 77, 67, 38, 49, 77, 56, 58, 52, 44, 65, 84, 61, 71, 43, 65, 63, 53, 45, 53, 68, 66, 38, 36, 61, 78, 58)
> statistic_test <- c(60, 48, 48, 60, 88, 50, 53, 55, 72, 40, 66, 53, 40, 60, 81, 59, 69, 44, 73, 47, 59, 70, 55, 60, 54, 44, 39, 38, 61, 56)

それぞれのベクトルの1番目(数学は62点, 統計は60点)がa君の点数、ベクトルの2番目(数学は51点, 統計は48点)がb君の点数…などと対応します。

Rで共分散

共分散は「偏差の積の平均」でした。これを計算してみましょう。

> covariance <- sum((math_test - mean(math_test)) * (statistic_test - mean(statistic_test))) / length(math_test)
> covariance #共分散
[1] 97.97556

sum()で合計値を計算し、lengthでデータの個数を数え上げてくれるのでした。これらを使えば平均値を計算できます。

しかしそれらを使わなくても、mean()を使えば一発で平均値を計算できました。

> covariance <- mean((math_test - mean(math_test)) * (statistic_test - mean(statistic_test)))
> covariance #共分散
[1] 97.97556

ですが、毎回このように共分散を計算するのは面倒です。Rでは共分散を計算できるcov()という関数があります。

> cov(math_test, statistic_test)
[1] 101.354

さきほどと値が異なってしまいました。なぜでしょうか?

実は、cov()ではデータの個数nで割るのではなく、n-1で割って共分散を求めています。これは不偏共分散と呼ばれることもあります。なので、n-1をかけて、nで割ると同じ値になります。

> cov(math_test, statistic_test) * (length(math_test)-1) / length(math_test)
[1] 97.97556

Rで相関係数

相関係数の計算をしてみましょう。二通りの計算方法があります。まずは先程の共分散を求める関数cov()を用いて計算してみましょう。

> cov(math_test, statistic_test) / (sd(math_test) * sd(statistic_test))
[1] 0.6553046

式は、\(相関係数 = \frac{\sigma _{xy}}{\sigma _{x} \sigma _{y}}\)となるのでした。cov()は不偏共分散なので、\(\sigma _{xy}\)と値が違います。計算式が異なってしまいますが大丈夫です。

Rで学ぶ統計学(平均・分散・標準偏差)でもやりましたが、sd()も単なる標準偏差ではありません。sd()で求まる値を\(\sqrt{\frac{データ数-1}{データ数}}\)倍することで標準偏差になります。
分子分母ともに、\(データ数-1\)で割り算することになるので、結果的に同じ値になるのです。

上記のような計算をしなくても、cor()という関数を使えば相関係数はすぐに求まります。

> cor(math_test, statistic_test)
[1] 0.6553046

相関係数の評価ですが、大まかな判定基準を説明しておきます。対象となるデータの種類によって変わってくるので、あくまで参考程度にしてください。相関係数をrとすると以下のようになります。

相関係数相関の強さ
\(0\leq |r| \leq 0.2\)ほぼなし
\(0.2< |r| \leq 0.4\)弱い
\(0.4< |r| \leq 0.7\)普通
\(0.7<|r| \leq 0.1\)強い

 

次の記事はこちら↓

Rで学ぶ統計学(確率変数・確率分布・正規分布)
統計学の【確率変数・確率分布・正規分布】について、Rで実践しながら解説!

コメント・質問