相関分析とは?

相関分析は2つの量的変数の統計的な関連性を把握する分析です。具体的には、片方の量的変数の大小ともう片方の量的変数の大小が関係しているかどうかを確かめます。こうした関係がある場合、2つの変数には相関関係があるといいます。

世の中一般にみられる相関関係の例をあげてみます。

  • 身長が高いと体重も重たくなる傾向にある。
  • 気温が高くなると冷たい飲料の販売額が伸びる。
  • 新卒入社の従業員の場合、勤続年数が大きいと年齢も高くなる。

これらは片方の変数が大きいと、もう片方の変数も大きくなるような例となっています。このような関係を「正の相関がある」といいます。

一方、上の例とは逆に、片方の量的変数が大きくなるともう片方が小さくなる事象もあります。これを「負の相関がある」といいます。具体的な例は以下のとおりです。

  • 気温が下がると入浴剤の売上が伸びる。
  • エンゲージメントが低下すると離職率が高くなる。

どのような場面で利用するの?

相関関係は予測や観察の土台になるものです。しかし、相関関係は手元にあるデータの値の連動性を記述したものにすぎません。相関関係があるからといって、必ずしも因果関係があることを意味しないので注意が必要です。

以上を踏まえて、相関分析の利用シーンを洗い出してみました。

  • データ分析の初期段階でデータに対する理解を深めるとき。
  • 回帰分析のアプローチを検討するとき。
  • 予測モデリングの特徴量の作り込みでヒントが欲しいとき。

相関分析の方法(量的変数の場合)

相関分析には相関係数を用いた分析が広く使われており、変数同士の線形な関係性を分析することができます。相関係数は2つの変数の線形の連動性を計量するもので、-1から1までの値をとります。その値の絶対値が1に近づくほど相関があり、0に近づくほど相関がないことを表しています。

散布図を用いた相関係数の例を以下に示します。相関係数の絶対値が大きいほど線形の関係が明確に表れていますね。(各図の相関係数を "r ="という形で示しています)

それでは、相関係数が0の場合はどのような関係になりそうでしょうか。

以下、相関係数が0に近い例を2つ示します。左側は正規分布に基づく乱数で生成したもので、右側は一様分布に基づく乱数で生成したものです。どちらも相関係数は似ていますが、散布図の印象は異なりますね。

Pythonで相関分析をする

Pythonで相関分析をする場合、pandasを使うと便利です。pandasはメモリ上にテーブルデータを取り込んで様々な演算や分析を行えるライブラリで、データ分析者がよく利用しています。

まずは、当サイトで提供している人事トイデータ(拡張版)をpandasのデータフレームに取り込んでみます。

import pandas as pd

# データをpandasのデータフレームに読み込む
df_hr = pd.read_csv('./hr-toydata-basic-600.csv')

それでは、いくつかの項目に絞って相関係数を算出してみましょう。

まずは働き方とエンゲージメントの関係を調べるため、時間外、年休消化率、年齢、エンゲージメントのデータを抽出して相関係数を計算してみました。pandasのデータフレームの関数corr()を利用すると一度に計算することができます。

df_hr[['時間外時間数_月平均', '年休消化率', '年齢', 'エンゲージメント']].corr()

計算結果は変数と変数の対応表の形で出力されます。この表を相関行列といいます。今回の出力結果をみると相関がくっきり出ているとは言えなさそうですね。現実のデータ分析でもバシッと相関がでるとは限りません。

一覧化する

相関行列の対角成分は同じ変数となるので1となり、対角成分を挟んで上側とした側は同じ情報を含んでいます。相関行列の重複部分を除いて一覧化すると見やすくなります。

tmp_corr = df_hr[['時間外時間数_月平均', '年休消化率', '年齢', 'エンゲージメント']].corr()

# 一度numpyに変換して下三角部分を取り出す
corr = pd.DataFrame(np.tril(tmp_corr.to_numpy(), k=-1), 
  columns=tmp_corr.columns, index=tmp_corr.index)
corr[corr == 0] = np.nan

# 横持ちから縦持ちに変換して整える
corr = pd.DataFrame(corr.stack()).reset_index()
corr.columns = ['変数1', '変数2', '相関係数']
corr

ヒートマップで可視化する

相関行列が大きい場合にはヒートマップを使って可視化すると分かりやすいです。トイデータからコンピテンシーに関する変数を抽出し、相関行列に対するヒートマップを作成してみました。

import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns

fig, ax = plt.subplots(figsize=(6,5))
sns.heatmap(df_hr.filter(like='コンピテンシー').corr(),
  annot=True, fmt='.2f', cmap='coolwarm', center=0, ax=ax)

相関係数は万能ではない

相関係数は計算が簡単にでき、ExcelやPython, Rなどを使ってすぐに結果を出すことできます。そのため、分析の初期段階で「まずは相関分析をしてみよう」とやってみる方も多いのではないでしょうか。

確かにデータの相関を考えることは代表的な統計アプローチではありますが、相関係数による分析だけに頼るのはよくないと考えています。以下、2つの観点で解説します。

線形の関係しかわからない

冒頭で解説したように、相関係数は量的変数同士の線形関係を捉えようとするアプローチです。逆のにいうと、変数同士の曲線的な関係を捉えることはできません。また、外れ値の影響を受けやすい手法でもあります。

一例として、以下の散布図を見てみてください。この中で横軸と縦軸の関係が明確にあると思われるのはどれだと思いますか?

左上と左下は、何となく正の相関がありそうに見えますね。一方、右上は直線の関係はなさそうですが、曲線の関係があるといえます。右下の図はやや難しいですが、外れ値を除くとyからみてxは定数のような関係なのかもしれません。

さて、これらのデータに対して相関係数を計算すると、すべての図で0.82になりました。相関係数だけ見て分析をすると、これら4つは同じような関係だと捉えてしまう恐れがあるわけです。

今回例示したグラフは、「アンスコムの例」として知られているデータを利用して作ったものです。アンスコムの例には4つの例題データ(タイプ)が含まれていて、それぞれ散布図は大きく異なりますが、相関係数や変数の平均値や分散がほぼ一致するデータとなっています。

こうした問題を回避するためには散布図でデータを見て分析していくことが大切です。

相関は因果を意味しない

もうひとつ重要な観点は、相関関係があるということが必ずしも因果関係があることを意味しないということです。そのため、相関係数の値を見ただけで何らかの意思決定をするということは考えにくいです。

方向性

まずは分かりやすい例として、冒頭にあげた例題を取り上げます。

  • 身長が高いと体重も重たくなる傾向にある。

この例では確かに身長が高くなると、それにつれて体重が増加することはありえそうだと思いますね。では、その逆はどうでしょう。体重が重くなれば身長は高くなるのでしょうか? それはちょっと無理がありそうですね。

このように、相関関係はデータ上の数値の連動性を見ているだけで、その方向性については何も答えません。したがって、相関係数が高い場合、変数同士がどのように影響を与えているか判断するには、ドメイン知識や他の統制実験による検証が必要となります。

他の因子の存在

相関係数による分析は2つの変数の線形な関係を考察することができますが、他の変数を加味した考察を行うことができません。これが問題となるのは以下のような場面です。

  1. データが独立でなく何らかの構造やグループを持っている、もしくは、繰り返し計測されたデータであるとき。
  2. 因果関係を考察する上で交絡因子が存在しているとき。

1つ目の問題は因果関係の考察だけでなく、記述的分析や予測的分析においても問題になります。データフレームに対して相関係数を計算する前に、データの発生源や構造を今一度吟味してみることをおすすめします。

一方、2つ目の問題は因果関係を考察する上でクリティカルな問題となります。相関を測った2変数に対して影響を与えている他の因子が存在した場合、相関係数の意味合いが変わってしまうことがあります。もしその因子のデータが未観測である場合、交絡因子と呼ばれます。交絡因子がある場合、相関分析だけで因果を考察するのは説得力に欠けます。

改めて相関分析の使い所を考える

以上の注意点を踏まえ、改めて相関係数を使った相関分析の使い所を考えてみました。

データに対する理解を深めるとき

まずは、分析者自身がデータを理解するために利用するのがよいでしょう。問題設定の元でデータ分析を始めるとき、どのようなタスクであっても初期分析を行うはずです。その際、変数の種類、基本統計量の確認に加えて、量的変数の相関をざっと確認することは有益です。

また、問題設定と探索的データ分析を並行して行いながら仮説を深めていくような場面でも、議論のための情報になり得るでしょう。

いずれもデータの現況を把握するという意味で、記述的分析といえます。

変数に相関があると支障がある分析手法を使うとき

分析手法によっては、変数に相関があるとパラメータを上手く推定できないなどの問題が生じる場合があります。以下、一例をあげます。

  • 最小二乗法に基づく線形回帰モデル(重回帰)を利用する場合、説明変数に相関があると回帰係数の推定に影響を与えてしまう場合があります。この現象は多重共線性と呼ばれ、何らかの対応が必要と考えられています。
  • スパース推定法であるLassoを利用して変数選択を行う場合、説明変数の相関が高くなると、それらの変数がランダムに選択されてしまうという問題があります。分析上、変数選択に意味がある場合は、Elastic Netを利用するなど対応が必要になるでしょう。

このような分析手法を採用する際は、事前に変数の相関関係を調べておくことが大切です。

予測モデルの特徴量を工夫するとき

予測を目的としたモデリングを行う場合、予測精度がポイントになります。予測精度が目標に届かないときは様々な工夫をすることになります。その際、特徴量の改善が効くことがしばしばあります。

特徴量の工夫には(1)ドメイン知識、(2)データ観察力、(3)特徴量エンジニアリングスキルの3つが重要ですが、相関分析はデータ観察の手段の一つになります。

参考文献:

相関係数の数理的なロジックを知りたい方は以下の参考書をご参照ください。

  • 基礎統計学 I  統計学入門, 東京大学教養学部統計学教室編, 東京大学出版
  • データ解析のための数理統計入門, 久保川達也著, 共立出版