cor()),有意性検定を実行できる(cor.test())cor.test() の t統計量の式を,自分で導けるこの回のコードは,すべて tidyverse
を読み込んだ状態で動きます。
RStudioを起動したら,まずこれを実行してください。
毎回必要です。読み込まないまま
filter()やggplot()を使うと, 「関数が見つかりません」というエラーになります。
相関(correlation)とは,2つの変数の間にある直線的な関係の強さと方向を表す指標です。
| 相関の方向 | 意味 | 例 |
|---|---|---|
| 正の相関 | 一方が増えると他方も増える | 身長と体重 |
| 負の相関 | 一方が増えると他方は減る | 睡眠時間と疲労度 |
| 無相関 | 2変数に直線的関係がない | 誕生月と学力 |
\[r = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i - \bar{x})^2 \cdot \sum(y_i - \bar{y})^2}}\]
上の式の分子と分母を,どちらも \(n-1\) で割ってみます。値は変わりません。
分子を \(n-1\)
で割ったものが共分散です(R の cov()
と同じ定義です)。
\[\mathrm{Cov}(x,y) = \frac{1}{n-1}\sum(x_i - \bar{x})(y_i - \bar{y})\]
分母を \(n-1\)
で割ったものは,2つの標準偏差の積になります(R の sd()
と同じ定義です)。
\[\frac{1}{n-1}\sqrt{\sum(x_i-\bar{x})^2 \cdot \sum(y_i-\bar{y})^2} = \sqrt{\frac{\sum(x_i-\bar{x})^2}{n-1}} \cdot \sqrt{\frac{\sum(y_i-\bar{y})^2}{n-1}} = s_x \, s_y\]
したがって
\[r = \frac{\mathrm{Cov}(x,y)}{s_x \, s_y}\]
共分散は「2つが一緒に動く量」ですが,単位が「cm×cm」のように掛け算になっていて大きさの比較ができません。そこでそれぞれのばらつきで割って単位を消したのが \(r\) です。
各データを標準化して \(z_x = (x_i -
\bar{x})/s_x\),\(z_y = (y_i -
\bar{y})/s_y\) と置くと(R の scale()
がこの計算です),同じことが次のように書けます。
\[r = \frac{1}{n-1}\sum z_{x_i} z_{y_i}\]
\(r\) は標準化した値どうしの積を合計して \(n-1\) で割ったものである,ということです。
数値で確かめる:iris
のがく片の長さと花びらの長さ(\(n =
150\))では,本文の定義式が \(0.8717538\),cor() が \(0.8717538\),cov(x, y) / (sd(x) * sd(y))
が \(0.8717538\),\(\frac{1}{n-1}\sum z_x z_y\) も \(0.8717538\) で,すべて一致します。
単位を変えても \(r\) は変わりません。 がく片を cm から mm に(\(\times 10\)),花びらを cm からインチに(\(\div 2.54\))換算しても \(r = 0.8717538\) のままです。分子も分母も同じ倍率で変わるので,割り算で消えるからです。
\(n\) で割る流儀もあります。 教科書によっては,共分散や標準偏差を \(n-1\) ではなく \(n\) で割って定義します。 \(r\) は共分散を標準偏差の積で割った比なので,どちらの流儀でも \(0.8717538\) と同じ値になります。
この資料は R に合わせて \(n-1\) で統一します。
sd()・cov()・scale()がすべてこの定義なので, 書かれている式をそのまま R で打って確かめられます。
使った数学:平均・分散・共分散の定義と,割り算で単位が消えること。
標準化した値には,定義からすぐ出る性質が2つあります。
\[\sum z_x^2 = n-1, \qquad \sum z_y^2 = n-1, \qquad \sum z_x z_y = (n-1)\,r\]
(3つめは導出①の \(r = \frac{1}{n-1}\sum z_x z_y\) を移項しただけです。)
ここで二乗は決して負にならないという,ただそれだけの事実を使います。
\[\sum (z_x - z_y)^2 \ge 0\]
左辺を展開すると
\[\sum z_x^2 - 2\sum z_x z_y + \sum z_y^2 = (n-1) - 2(n-1)r + (n-1) = 2(n-1)(1 - r)\]
これが \(0\) 以上で,\(n \ge 2\) なら \(2(n-1) > 0\) ですから \(1 - r \ge 0\),つまり \(r \le 1\) が出ます。
同じことを足し算の側でやると
\[\sum (z_x + z_y)^2 = 2(n-1)(1 + r) \ge 0\]
から \(r \ge -1\) が出ます。あわせて \(-1 \le r \le 1\) です。
等号はいつ成り立つか。 \(\sum(z_x - z_y)^2 = 0\) になるのは,すべての個体で \(z_x = z_y\) のときだけです。これは「標準化したら完全に同じ値」,つまり \(y\) が \(x\) の1次式でぴったり書ける(すべての点が1本の右上がりの直線に乗る)場合です。\(r = -1\) は右下がりの直線です。
数値で確かめる:iris では \(n - 1 = 149\) で,\(\sum z_x^2 = 149\),\(\sum z_x z_y = 129.8913\)(\(= 149 \times 0.8717538\))です。 \(\sum(z_x - z_y)^2 = 38.2174\),理論値 \(2(n-1)(1-r) = 2 \times 149 \times (1 - 0.8717538)
= 38.2174\) で一致します。 足し算の側も \(\sum(z_x + z_y)^2 = 557.7826\),\(2(n-1)(1+r) = 557.7826\) で一致します。
scale()
で標準化すれば,そのまま手元で確かめられます。
使った数学:二乗は負にならない,という事実だけ。特別な定理は使っていません。
| r | |
|---|---|
| 0.0〜0.2 | ほとんど相関なし |
| 0.2〜0.4 | 弱い相関 |
| 0.4〜0.6 | 中程度の相関 |
| 0.6〜0.8 | 強い相関 |
| 0.8〜1.0 | 非常に強い相関 |
目安であり,分野や文脈によって解釈が変わることに注意。
# iris データ:がく片の長さと花びらの長さの散布図
ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(color = "steelblue", alpha = 0.6) +
labs(title = "散布図:がく片の長さと花びらの長さ",
x = "がく片の長さ (cm)", y = "花びらの長さ (cm)") +
theme_bw()# 種ごとに色を分ける
ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
scale_color_brewer(palette = "Dark2") +
labs(title = "種ごとの散布図と回帰直線",
x = "がく片の長さ (cm)", y = "花びらの長さ (cm)") +
theme_bw()## [1] 0.8717538
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
# 四捨五入して見やすく
iris |>
select(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) |>
cor() |>
round(2)## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.00 -0.12 0.87 0.82
## Sepal.Width -0.12 1.00 -0.43 -0.37
## Petal.Length 0.87 -0.43 1.00 0.96
## Petal.Width 0.82 -0.37 0.96 1.00
相関係数が「偶然ではなく本当に存在する」かどうかを検定します。
##
## Pearson's product-moment correlation
##
## data: iris$Sepal.Length and iris$Petal.Length
## t = 21.646, df = 148, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8270363 0.9055080
## sample estimates:
## cor
## 0.8717538
Pearson's product-moment correlation
t = 21.646, df = 148, p-value < 2.2e-16
95 percent confidence interval:
0.8270363 0.9055080
sample estimates:
cor
0.8717538
| 項目 | 意味 |
|---|---|
t |
t統計量 |
df |
自由度(n - 2) |
p-value |
p値(< 0.05 なら有意) |
95% CI |
相関係数の95%信頼区間 |
cor |
標本相関係数 r の推定値 |
cor.test() の \(t\) 値はどこから来るのか ――
「強い」と「有意」は別
cor.test() は \(r\)
から次の統計量を作り,自由度 \(n - 2\)
の \(t\) 分布と照らして \(p\) 値を出しています。
\[t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}}\]
自由度が \(n-2\) なのは,直線を当てるのに切片と傾きの2つを標本から決めているためです。
数値で確かめる:iris では \(r = 0.8717538\),\(n = 150\) なので
\[t = \frac{0.8717538 \times \sqrt{148}}{\sqrt{1 - 0.8717538^2}} = 21.6460\]
上の出力の t = 21.646, df = 148 と一致します。
この式の右辺で,\(n\) は \(r\) とは別のところに入っています。 \(r\) を固定したまま \(n\) だけ動かすと,\(t\) は \(\sqrt{n}\) におよそ比例して大きくなり,\(p\) は小さくなります。
| \(r\) | \(n\) | \(t\) | \(p\) |
|---|---|---|---|
| 0.8718 | 4 | 2.52 | 0.128 |
| 0.8718 | 5 | 3.08 | 0.054 |
| 0.8718 | 10 | 5.03 | 0.0010 |
| 0.8718 | 150 | 21.65 | \(1.0 \times 10^{-47}\) |
\(r = 0.87\) という非常に強い相関でも,\(n = 4\) なら有意になりません。
逆の方向も見てみます。iris のがく片の長さと幅は \(r = -0.1176\)(ほとんど相関なし)で,\(n = 150\) では \(t = -1.44\),\(p = 0.152\) となり有意ではありません。しかし \(r\) が同じまま \(n\) が増えると,
| \(r\) | \(n\) | \(p\) |
|---|---|---|
| −0.1176 | 150 | 0.152 |
| −0.1176 | 279 | 0.050 |
| −0.1176 | 1000 | 0.00019 |
| −0.1176 | 2000 | \(1.3 \times 10^{-7}\) |
\(n = 279\) を超えると有意になります。関係の強さは何も変わっていないのに,です。
「相関が強い」と「相関が有意」は,別のことを言っています。 \(r\) は関係の強さそのもの(\(n\) を増やしても動かない),\(p\) はその関係が偶然で説明しにくいかどうか(\(n\) を増やせば小さくなる)。だから報告では \(r\) と \(p\) を必ず両方書きます。本文5節の書き方
r(148) = .87, p < .001は,まさにその2つを並べたものです。
なお,\(t\) 分布の密度関数そのものを導くのは,この科目の範囲外です。ここでは「\(r\) と \(n\) から \(t\) が決まる」という関係だけを押さえてください。
有意であっても,強くても,因果があるという意味にはなりません。 これは標本の揺れの話だけをしていて,なぜ2つが一緒に動くのかには何も答えていないからです。第6節を必ず併せて読んでください。
使った数学:平方根と分数の変形。自由度の数え方(第10回・第13回でも同じ考え方を使います)。
論文・レポートでの記述例:
がく片の長さと花びらの長さの間には強い正の相関が見られた,r(148) = .87,p < .001。
APA形式での相関係数の書き方: - イタリック体で
r - 括弧内に自由度(= n - 2) - p 値は .001, .01, .05
の水準で報告
相関関係は因果関係を意味しない!
相関があっても,それは「一緒に変化する」ことを示すだけで, 「原因と結果」の関係があるとは限りません。
mtcars
データを使って,馬力(hp)と燃費(mpg)の散布図を作成してください。
- 回帰直線(geom_smooth(method = "lm"))を追加する -
適切なタイトル・軸ラベルをつける
mtcars の hp と mpg
の相関係数を計算してくださいcor.test()
で有意性を検定し,結果を解釈してくださいmtcars の mpg, hp,
wt,
qsec(0から1/4マイルまでの加速時間・秒)の相関行列を作成し,
どの変数の組み合わせが最も強い相関を持つか調べてください。
演習2の結果を,論文・レポートの記述として1〜2文でまとめてください。 (例:「〇〇と〇〇の間には,〇〇な相関が見られた,r(〇〇) = .〇〇, p < .〇〇。」)
このデータの \(r\) は負の値になります。符号を落とさないでください。 「馬力が大きいほど燃費が悪い」という向きを,日本語でも書き添えます。
cor() で相関係数,cor.test()
で有意性検定