データ分析法・第4回「相関分析の復習」
授業情報
| 項目 | 内容 |
|---|---|
| 科目 | データ分析法 |
| 回数 | 第4回 |
| テーマ | 相関分析の復習(相関係数・偏相関係数) |
| 日付 | 2026年6月19日 |
1. 相関関係とは
身長が高いほど体重も重くなる、というような「2つの変数の間に見られる関係性」を 相関関係(correlation) と呼ぶ。
| 種類 | 説明 |
|---|---|
| 正の相関(positive correlation) | Xが増えるとYも増える |
| 負の相関(negative correlation) | Xが増えるとYは減る |
| 無相関(no correlation) | 2変数間に関係なし |
散布図(scatter diagram)は、xy平面上に各データをプロットして両変数の関係を可視化したもの。
2. 積率相関係数(Pearson's r)
2-1. 定義
一般に「相関係数」と言えば、ピアソンの積率相関係数(product-moment correlation coefficient) を指す。記号は r。
- 比率尺度・間隔尺度に使用
- 直線的な関係性のみを示す
- 値の範囲:−1 ≦ r ≦ +1
- 絶対値が1に近いほど関係が強い
- 0 = 無相関
2-2. 計算式
基本形(定義式):
計算に便利な式:
標準化済みデータ(Z得点)の場合:
→ 標準化後の共分散の平均値とも解釈できる。
2-3. 相関係数の解釈目安(Table 4.1)
| の範囲 | 解釈 | ||
|---|---|---|---|
| 0.0 ≦ | ≦ 0.2 | ほとんど相関なし | |
| 0.2 ≦ | ≦ 0.4 | 弱い相関あり | |
| 0.4 ≦ | ≦ 0.7 | 比較的強い相関あり | |
| 0.7 ≦ | ≦ 1.0 | 強い相関あり |
3. Rによる計算
3-1. データ読み込みと相関係数の算出
x <- read.csv("corr1.csv") # xは任意の変数名、corr1は読み込むCSVファイル名
# CSVファイル読み込み
cor(x) # 全変数間の相関係数を一括算出
例題①の結果(47都道府県 × コンビニ件数・人口・甲子園勝率):
- コンビニ ↔ 人口:r = 0.988(強い正の相関)
- 人口 ↔ 甲子園勝率:r = 0.433(比較的強い正の相関)
- コンビニ ↔ 甲子園勝率:r = 0.385(弱い正の相関)
- 出力は相関行列として表示される。行と列の変数名の交点にある値を読む。
3-2. 順位相関係数のオプション
cor(x, method = "spearman") # スピアマンの順位相関係数
cor(x, method = "kendall") # ケンドールの順位相関係数
cor(x, method = "pearson") # ピアソン(デフォルトなので省略可)
# xは任意の変数名
3-3. 散布図の描画
plot() 関数で散布図を表示できる。
plot(x) # 全変数の組み合わせを一括表示
plot(x$conv, x$popu) # 特定の2変数のみ表示(xは変数名、conv・popuはデータ列名)
3-4. 無相関検定
相関係数の有意確率は cor.test() 関数で確認できる。
cor.test(x$conv, x$win) # 2変数間の無相関検定(xは変数名、conv・winはデータ列名)
⚠️ 注意:サンプルサイズが大きい場合、小さなrでも統計的に有意になりやすい。有意確率だけでなく、上の解釈目安(Table 4.1)と合わせて判断すること。
4. 疑似相関と偏相関係数
4-1. 疑似相関(spurious correlation)とは
コンビニ件数と甲子園勝率の間にr = 0.410の相関が見られた。しかし実際には:
- 人口が多い県 → コンビニも多い
- 人口が多い県 → 高校生も多い → 野球のレベルも上がる
つまり「人口」という第3の変数が両方に影響を与えており、コンビニと野球の強さは**見かけ上の相関(疑似相関)**に過ぎない。
4-2. 偏相関係数(partial correlation coefficient)
第3の変数(制御変数)の影響を除いた相関係数。
例:人口を制御した場合、コンビニ ↔ 甲子園勝率の偏相関は r = −0.318 となり、関係性が逆転することが分かる。
4-3. Rでの偏相関係数算出(ppcorパッケージ)
library(ppcor) # パッケージ読み込み
x <- read.csv("corr1.csv") # xは任意の変数名、corr1は読み込むCSVファイル名
pcor(x) # 全変数間の偏相関係数を一括算出
出力の $estimate 欄に偏相関係数が表示される。
特定の変数ペアのみ指定する場合:
pcor.test(x$conv, x$win, x$popu)
# pcor.test(計算する変数1, 計算する変数2, 制御変数)
# xは変数名、conv・win・popuはデータ列名(任意)
⚠️ 重要な注意点:
pcor.test()で制御変数を複数指定するとpcor()と結果が異なる。複数制御変数を使いたい場合は、不要な列を削除したデータフレームを作ってpcor()を使うこと。
他の統計ソフトとの比較では pcor() 関数の方が正確なので、複数の制御変数を使いたい場合は不要な列を除いたデータフレームを作成した上で pcor() を使うこと。
pcor.test(x$stroke, x$paron, x$pat+x$dd+x$fwk)のNG例(複数制御変数を+で渡した場合) stroke と paron の偏相関を求める。+で制御変数を pat・dd・fwk の3つ同時 に指定している。 ただし複数制御変数をpcor.test()で指定すると結果が不正確になる(上述の注意点)。正しくは不要な列を削除してpcor()を使うこと(下記参照)。
# 複数制御変数を正しく扱う例(corr2.csvでfwkを除外してpcor())
x_sub <- x[, -5] # 5列目(fwk)を削除
pcor(x_sub) # stroke・paron・pat・ddの4変数で偏相関を算出
列の削除方法:
[ ]内で削除する列を-(列番号)で指定する- 複数列は
-c(番号1, 番号2, ...)のようにカンマ区切りで指定する
x1 <- x[, -3] # 3列目を1つ削除(書式:変数[, -(削除列番号)])
x2 <- x[, -c(2, 3, 4)] # 2〜4列目を複数削除
💡
変数[行, 列]で行・列を指定できる。残す場合は-をつけず、何も指定しなければ全て残る。代入先は元の変数を上書きせず新しい変数名にして、元のデータを残しておくことを推奨。
5. 練習問題と解答
練習問題①:ゴルフ日本女子ツアー成績(corr2.csv)
5変数(平均ストローク・パーオン率・平均パット数・ドライビングディスタンス・フェアウェイキープ率)の積率相関係数:
入力コード
x <- read.csv("corr2.csv") # xは任意の変数名、corr2は読み込むCSVファイル名
cor(x) # 全5変数の相関係数を一括算出
解答
| stroke | paron | pat | dd | fwk | |
|---|---|---|---|---|---|
| stroke | 1 | — | — | — | — |
| paron | −0.743 | 1 | — | — | — |
| pat | 0.774 | −0.293 | 1 | — | — |
| dd | −0.367 | 0.470 | −0.198 | 1 | — |
| fwk | −0.106 | 0.149 | −0.003 | −0.635 | 1 |

練習問題②:ドライビングディスタンス(dd)を制御変数とした偏相関
入力コード(制御変数はdd 1つだけ → pcor.test() で正確に算出できる)
install.packages("ppcor") #パッケージppcorをダウンロードしておくこと
library(ppcor)
x <- read.csv("corr2.csv")
pcor.test(x$stroke, x$paron, x$dd) # stroke ↔ paron(ddを制御)
pcor.test(x$stroke, x$pat, x$dd) # stroke ↔ pat(ddを制御)
pcor.test(x$stroke, x$fwk, x$dd) # stroke ↔ fwk(ddを制御)
結果の
estimate欄の値を読む
解答
| 変数の組み合わせ | 偏相関係数 |
|---|---|
| stroke ↔ paron | −0.695 |
| stroke ↔ pat | 0.769 |
| stroke ↔ fwk | −0.472 |

復習例題集①:スペインリーグ成績(corr3.csv)
4変数(勝ち点・得点・失点・観客数)の相関係数:
入力コード
x <- read.csv("corr3.csv") # xは任意の変数名、corr3は読み込むCSVファイル名
cor(x) # 全4変数の相関係数を一括算出
解答
| 勝ち点 | 得点 | 失点 | 観客数 | |
|---|---|---|---|---|
| 勝ち点 | 1 | — | — | — |
| 得点 | 0.908 | 1 | — | — |
| 失点 | −0.752 | −0.472 | 1 | — |
| 観客数 | 0.678 | 0.612 | −0.471 | 1 |
復習例題集②:偏相関係数(制御変数あり)
入力コード(各ペアで制御変数は1つ → pcor.test() でOK)
library(ppcor)
x <- read.csv("corr3.csv")
pcor.test(x$point, x$score, x$lost) # 勝ち点↔得点(制御:失点)
pcor.test(x$point, x$lost, x$score) # 勝ち点↔失点(制御:得点)
pcor.test(x$point, x$score, x$audi) # 勝ち点↔得点(制御:観客数)
解答
| 変数の組み合わせ | 制御変数 | 偏相関係数 |
|---|---|---|
| 勝ち点 ↔ 得点 | 失点 | 0.952 |
| 勝ち点 ↔ 失点 | 得点 | −0.876 |
| 勝ち点 ↔ 得点 | 観客動員 | 0.848 |
まとめ
- 相関係数 r:2変数の直線的関係の強さを −1〜+1 で表す
- 散布図:
plot()で可視化 - 無相関検定:
cor.test()で確認(ただし解釈目安と併用) - 疑似相関:第3変数が原因の見かけ上の相関に注意
- 偏相関係数:
ppcorパッケージのpcor()で第3変数の影響を除去
複数の制御変数を使う場合は
pcor.test()ではなくpcor()+ 列削除の組み合わせが正確。