← Back

データ分析法・第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. 計算式

基本形(定義式):

r=(xixˉ)(yiyˉ)(xixˉ)2(yiyˉ)2r = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i-\bar{x})^2 \cdot \sum(y_i-\bar{y})^2}}

計算に便利な式:

r=Nxiyixiyi(Nxi2(xi)2)(Nyi2(yi)2)r = \frac{N\sum x_i y_i - \sum x_i \sum y_i}{\sqrt{(N\sum x_i^2 - (\sum x_i)^2)(N\sum y_i^2 - (\sum y_i)^2)}}

標準化済みデータ(Z得点)の場合:

r=(xi×yi)nr = \frac{\sum(x_i \times y_i)}{n}

→ 標準化後の共分散の平均値とも解釈できる。

2-3. 相関係数の解釈目安(Table 4.1)

r\vert r\vert の範囲解釈
0.0 ≦r\vert r\vert ≦ 0.2ほとんど相関なし
0.2 ≦r\vert r\vert ≦ 0.4弱い相関あり
0.4 ≦r\vert r\vert ≦ 0.7比較的強い相関あり
0.7 ≦r\vert r\vert ≦ 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の相関が見られた。しかし実際には:

  1. 人口が多い県 → コンビニも多い
  2. 人口が多い県 → 高校生も多い → 野球のレベルも上がる

つまり「人口」という第3の変数が両方に影響を与えており、コンビニと野球の強さは**見かけ上の相関(疑似相関)**に過ぎない。

4-2. 偏相関係数(partial correlation coefficient)

第3の変数(制御変数)の影響を除いた相関係数。

rxya=rxyraxray1rax21ray2r_{xy \cdot a} = \frac{r_{xy} - r_{ax} \cdot r_{ay}}{\sqrt{1 - r_{ax}^2} \cdot \sqrt{1 - r_{ay}^2}}

例:人口を制御した場合、コンビニ ↔ 甲子園勝率の偏相関は 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変数の相関係数を一括算出

解答

strokeparonpatddfwk
stroke1
paron−0.7431
pat0.774−0.2931
dd−0.3670.470−0.1981
fwk−0.1060.149−0.003−0.6351

image.png

練習問題②:ドライビングディスタンス(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 ↔ pat0.769
stroke ↔ fwk−0.472

image.png

復習例題集①:スペインリーグ成績(corr3.csv)

4変数(勝ち点・得点・失点・観客数)の相関係数:

入力コード

x <- read.csv("corr3.csv")  # xは任意の変数名、corr3は読み込むCSVファイル名
cor(x)                       # 全4変数の相関係数を一括算出

解答

勝ち点得点失点観客数
勝ち点1
得点0.9081
失点−0.752−0.4721
観客数0.6780.612−0.4711

復習例題集②:偏相関係数(制御変数あり)

入力コード(各ペアで制御変数は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() + 列削除の組み合わせが正確。