はじめに
データ分析を行う際、変数同士の関係を理解するために相関係数が広く用いられます。しかし、相関係数だけでは「他の変数の影響を受けていないか」については判断することができません。
そこで役立つのが、偏相関係数(partial correlation coefficient) です。偏相関係数を用いることで、特定の変数の影響を取り除いた上で、2変数間の関係をより正確に評価できます。
本記事では、通常の相関係数と偏相関係数について、具体例を用いて比較・考察します。
例題データ
以下の例題データについて、通常の相関係数と偏相関係数を比較してみましょう。
ID | x: 勉強時間 [h] | y: テストスコア [点] | z: 世帯年収 [万円] |
---|---|---|---|
1 | 3 | 65 | 400 |
2 | 5 | 80 | 550 |
3 | 2 | 55 | 300 |
4 | 8 | 90 | 800 |
5 | 7 | 85 | 700 |
6 | 6 | 78 | 600 |
7 | 9 | 92 | 900 |
8 | 4 | 60 | 450 |
9 | 5 | 72 | 500 |
10 | 6 | 75 | 650 |
通常の相関係数
$$
r_{xy} = \frac{{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})
(y_i - \overline{y})}}{\sqrt{{\displaystyle \sum_{i = 1}^n
(x_i - \overline{x})^2}} \sqrt{{\displaystyle \sum_{i = 1}^n
(y_i - \overline{y})^2}}} = \frac{s_{xy}}{s_xs_y}
$$
図1. 各データの散布図. (a) x-y, (b) y-z, (c) z-x.
相関関係 | 値 |
---|---|
$\ r_{xy} $(勉強時間とテストスコア) | 0.949 |
$\ r_{yz} $(テストスコアと世帯年収) | 0.946 |
$\ r_{zx} $(世帯年収と勉強時間) | 0.993 |
この結果から、すべての変数同士が強い相関を持っていることがわかります。
- 勉強時間が長いほどテストの点数が高い
- テストの点数が高いほど世帯年収が高い
- 世帯年収が高いほど勉強時間が長い
しかし、この関係が本当に直接的なものであるかは、通常の相関係数では判断できません。
偏相関係数(他の変数の影響を取り除いた場合)
$$
r_{xy \cdot z} = \frac{r_{xy} - r_{zx}r_{yz}}{\sqrt{(1 - r_{zx}^2)(1 - r_{yz}^2)}}
$$
偏相関関係 | 値 |
---|---|
$\ r_{xy\cdot z} $(勉強時間とテストスコア, 世帯年収の影響を除去) | 0.255 |
$\ r_{yz\cdot x} $(テストスコアと世帯年収, 勉強時間の影響を除去) | 0.105 |
$\ r_{zx\cdot y} $(世帯年収と勉強時間, テストスコアの影響を除去) | 0.927 |
考察:偏相関係数から見えるデータの性質
① 勉強時間とテストスコアの関係(世帯年収を制御)
- 偏相関係数が 0.255 と低いため、「勉強時間が長いほどテストの点数が高い」という関係は、実は 世帯年収の影響を強く受けていた ことがわかります。
- つまり、世帯年収が高い家庭ほど学習環境が整っており、その結果として勉強時間がテストの点数に与える影響が大きくなった可能性があります。
② テストスコアと世帯年収の関係(勉強時間を制御)
- 偏相関係数が 0.105 とさらに低く、「世帯年収が高いほどテストスコアが高い」という関係は、実際には 勉強時間が介在することで見かけ上強くなっていた ことがわかります。
- つまり、世帯年収が直接テストスコアを決めるのではなく、勉強時間の増加を通じて影響を与えていた可能性が高いです。
③ 勉強時間と世帯年収の関係(テストスコアを制御)
- 偏相関係数が 0.927 と非常に高く、「世帯年収が高いと勉強時間が長い」という関係は、テストスコアの影響を取り除いてもなお強く存在しています。
- つまり、世帯年収が高いと、学習環境の整備や家庭の教育方針によって勉強時間が長くなる傾向がある ことを示唆しています。
偏相関関係の可視化 -ヒートマップ-
偏相関係数を数値だけで見ると直感的に理解しにくいですが、ヒートマップを用いることで変数関係が視覚的にわかりやすくなります。
・ヒートマップを描画するためのPythonスクリプト
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
# データを作成
df = pd.DataFrame({
'勉強時間': [3, 5, 2, 8, 7, 6, 9, 4, 5, 6],
'テストの点数': [65, 80, 55, 90, 85, 78, 92, 60, 72, 75],
'世帯年収': [400, 550, 300, 800, 700, 600, 900, 450, 500, 650]
})
# 偏相関係数の算出
def partial_corr(df):
inv_corr = np.linalg.inv(df.corr().values)
d = np.sqrt(np.diag(inv_corr))
p_corr = -inv_corr / np.outer(d, d)
np.fill_diagonal(p_corr, 1.0)
return pd.DataFrame(p_corr, index=df.columns, columns=df.columns)
# 偏相関行列を計算
partial_corr_matrix = partial_corr(df)
# ヒートマップを表示
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
sns.heatmap(partial_corr_matrix, annot=True, cmap='coolwarm', center=0, fmt='.3f')
plt.title('偏相関係数を反映した相関マトリクス')
plt.show()
- 真っ赤なマス → 2変数は強い正の相関
- 白っぽいマス → 2変数間にほとんど相関がない
- 青系のマス → 一方の変数が増えると他方が減る負の相関(今回はありません)
今回のサンプルデータにおける「勉強時間 ↔ 世帯年収」は $\ r_{zx\cdot y} $= 0.927 と強い正の相関を持つため、ヒートマップでは濃い赤色になります。一方、「テストの点数↔世帯年収」では$\ r_{yz\cdot x} $= 0.105と小さいため、ほぼ白っぽく表示されます。
偏相関係数を使う際の注意点
偏相関係数は非常に有効な手法ですが、使用する際に注意すべき点があります。
1. 線形関係の仮定
- 偏相関係数は、変数間に線形の関係があることを前提としています。そのため、非線形の関係がある場合には、偏相関係数ではその関係を適切に捉えることができません。
2. 交絡因子の選択が重要
- 偏相関係数を計算する際には、どの変数を交絡因子として取り除くかが極めて重要です。変数を適切に選定しないと、誤った結論を導きます。
3. 因果関係を保証するものではない
- 偏相関係数が高くても、因果関係を直接証明するわけではありません。因果関係を調べるには、実験や因果推論に基づく追加の解析が必要です。
まとめ:偏相関係数を用いる意義
この記事では、通常の相関係数と偏相関係数の違いを学び、実際のデータを用いてその重要性について考察しました。
-
相関係数が大きいからといって、必ずしも直接的な関係があるとは限らない。 交絡因子(隠れた影響を与える変数)を考慮しないと、誤った結論に至る可能性がある。
-
偏相関係数を使うことで、データの本質的な関係をより正確に理解できる。
-
データ分析においては、単なる相関を見るだけでなく、適切な統計手法を選択し、背景要因を考慮することが重要である。
統計解析を行う際には、単に数値を比較するのではなく、「なぜこの相関が生じているのか?」を慎重に考えることが不可欠です。偏相関係数は、そのための強力なツールのひとつであり、データの解釈をより深めるために活用すべき手法であるといえます。