【Python】相関係数とは?初心者向けに計算方法をわかりやすく解説
はじめに
相関係数は、2つの変数の間にどの程度の関連性があるかを数値で示すための指標です。
データ分析の場面でしばしば使われますが、「何をどうやって計算すればいいのか」がイメージしにくいかもしれません。
そこで本記事では、Pythonで相関係数を計算する具体的な方法を丁寧に説明します。
簡単なコードから少し発展した例まで取り上げ、実務で使う際の注意点や活用シーンについてもあわせて紹介します。
この記事を読むとわかること
- 相関係数の基本的な仕組み
- Pythonで相関係数を計算する方法
- PearsonやSpearmanなど代表的な手法の違い
- 実務での具体的な活用シーン
- データ分析時に押さえておくべき注意点
相関係数とは何か
相関係数とは、2つの数値データがどのような関係を持っているかを表す指標です。
例えば、「身長が高いほど体重も増える傾向がある」のような場合には、正の相関があると考えられます。
一方、関係がほとんど見られないときは相関が弱い、あるいは全くないという判断になります。
相関係数は一般的に −1〜1 の範囲を取り、1 に近いほど強い正の相関、 −1 に近いほど強い負の相関、0 前後ならほぼ無関係という意味を持ちます。
相関係数の意味合い
相関係数が 0.8 など高い値の場合は「一方の値が増えると、もう一方の値も増えやすい」ことを示唆します。
マイナスに振れて −0.8 といった数値になれば「一方が増えるともう一方は減りやすい」ことを意味します。
0 に近い値であれば、関連性はあまり見られないということになります。
ただし、この数値が因果関係を示すわけではないため、「相関が高い=必ず原因と結果がある」とは限りません。
あくまで「一緒に変動しやすいか」を見る指標です。
相関係数の種類
相関係数にはいくつかの種類があります。
代表的なものを以下に示します。
Pearsonの相関係数
一般的に「相関係数」と言えばこれを指すことが多いです。正規分布に近いデータや線形的な関係があるデータで使われやすいです。
Spearmanの順位相関係数
値の「順位」に着目する相関係数です。データに外れ値が多い場合や、単調な関係(線形とは限らない)を評価したいときに用いられます。
Kendallの順位相関係数
Spearmanと似ていますが、より厳密に「順位を一致」させるかを見ます。データ量が少ないときにも使われます。
Pythonで相関係数を計算する方法
それでは、具体的にPythonで相関係数を計算する方法を見ていきましょう。
Pythonには、多様なライブラリや関数がそろっているため、いろいろな方法で相関係数を計算できます。
ここでは代表的な例として、NumPy、pandas、SciPy、scikit-learnを取り上げてみます。
NumPyを使った相関係数の計算
まずは、NumPyを使う方法です。
配列同士の相関係数を求めたいときは、NumPyの corrcoef
関数が便利です。
import numpy as np # 適当なデータを用意(身長と体重のイメージ) heights = np.array([150, 160, 165, 170, 175, 180, 185]) weights = np.array([50, 56, 58, 63, 68, 72, 77]) # 相関係数行列を計算 corr_matrix = np.corrcoef(heights, weights) print(corr_matrix)
np.corrcoef
は、2つ以上の配列を与えると「相関行列」を返してくれます。
上のコードでは (2, 2)
の行列が得られ、対角成分はそれぞれの配列との相関係数(つまり 1)、非対角成分が2つの配列間の相関係数(例えば 0.95 など)を表します。
Pythonでのデータ分析入門として、まずはこのNumPyでのシンプルな計算方法を押さえておくとよいでしょう。
pandasを使った相関係数の計算
pandasを使ってデータフレームを扱う場合、corr()
メソッドを使うのが簡単です。
pandasはデータ分析でよく用いられるので、複数の列をまとめて相関係数を確認したいときにも便利です。
import pandas as pd data = { 'height': [150, 160, 165, 170, 175, 180, 185], 'weight': [50, 56, 58, 63, 68, 72, 77] } df = pd.DataFrame(data) # デフォルトでPearsonの相関係数を計算 corr_df = df.corr() print(corr_df)
この場合 df.corr()
はすべての列同士の相関係数を求め、結果を行列として返します。
さらに、pandasの corr()
は引数で "spearman"
や "kendall"
を指定することで、順位相関係数も手軽に計算できます。
# Spearmanの相関係数 corr_spearman = df.corr(method="spearman") print(corr_spearman) # Kendallの相関係数 corr_kendall = df.corr(method="kendall") print(corr_kendall)
pandasを使うと、複数の変数を一度に可視化して比較できるので、相関の全体像を見たい場合に特に役立ちます。
SciPyでの相関係数計算
さらに、SciPyの統計ライブラリを利用することで、より高度な統計計算を行えます。
SciPyの stats
モジュールには、いくつかの便利な関数が用意されています。
import numpy as np from scipy import stats heights = np.array([150, 160, 165, 170, 175, 180, 185]) weights = np.array([50, 56, 58, 63, 68, 72, 77]) # Pearsonの相関係数とp値 pearson_corr, pearson_p = stats.pearsonr(heights, weights) print("Pearson Corr:", pearson_corr) print("Pearson p-value:", pearson_p) # Spearmanの相関係数とp値 spearman_corr, spearman_p = stats.spearmanr(heights, weights) print("Spearman Corr:", spearman_corr) print("Spearman p-value:", spearman_p) # Kendallの相関係数とp値 kendall_corr, kendall_p = stats.kendalltau(heights, weights) print("Kendall Corr:", kendall_corr) print("Kendall p-value:", kendall_p)
このように、SciPyの関数は相関係数だけでなく、 p値 (統計的な有意性を示す指標)も合わせて返します。
「単に相関が高そう」だけでなく、「統計的に見て有意な結果であるか」を判断したいケースでも便利です。
scikit-learnでの相関係数計算
機械学習ライブラリとして有名なscikit-learnにも、相関係数を計算する方法はいくつかあります。
特に metrics
モジュールの中にある関数を使うことで、回帰モデルなどを評価するときに相関係数に近い評価指標を使うことができます。
ただし直接的な相関係数を求めるよりも、回帰タスク向けに実装されている指標(R^2 スコアなど)を使うケースが多いです。
もし単純に相関係数を取得したいのであれば、scikit-learn経由よりもNumPyやpandas、SciPyを使うほうがシンプルです。
実務での活用シーン
相関係数は、さまざまな分野で使われます。
「2つの変数の関連性を知りたい」と思う場面なら、どんなところでも応用可能です。
マーケティングでの例
マーケティングの領域では、広告費と売上の関係、SNSのフォロワー数と製品購買数の関係などを確認するときに活用されることがあります。
例えば、広告費を増やすと売上がどれくらい高まる傾向があるのかを大まかに把握したいとき、相関関係をチェックするだけでも、ある程度の見通しが立つかもしれません。
ここでは相関係数が高いかどうかによって、次の施策を考える材料にすることが多いです。
ただし、相関が高くても必ずしも「広告費が増えたから売上が増えた」とは断定できないので、追加で検証が必要になる場合があります。
財務データの分析での例
財務分析でも、売上と利益、株価と取引量などの関係を見る場面でしばしば使われます。
例えば、ある企業の株価が上がるときに、世界経済指標との連動が強いかどうかを検討するときなどに相関係数が登場します。
データを取得して、Pythonで相関係数を計算すれば、すぐに「どの程度似た動きをしているか」を数値で把握できます。
ただし、ここでも相関=因果とは限らない点に注意が必要です。
その他のシーン
それ以外にも、スポーツの成績とトレーニング量の関係、Webサイトのページビューと会員登録数の関係など、いろいろな場面で相関係数が活躍します。
特に多数の変数が存在するときは、pandasの corr()
などを使って変数同士の相関行列を一度に調べるのが有効です。
そこから相関が高いものについて掘り下げる、あるいは外れ値などの確認に進むといった流れを取ることが多いです。
コード例から学ぶポイント
実際にPythonで相関係数を計算するときに意識しておきたい点があります。
ここでは、初心者の方が特につまずきやすいトピックをまとめてみます。
サンプルデータの作り方
統計分析の練習をするときは、データをどのように準備するかが最初のハードルになるかもしれません。
例えば、numpy.random
を活用して擬似データを生成し、相関があるデータ・ないデータを人工的に作るのも手です。
import numpy as np # ランダムシードの指定(例として) np.random.seed(0) # x: 0〜100 の範囲の乱数を作る x = np.random.uniform(0, 100, 50) # y: x とある程度相関があるように作る(例えば y = 2x + ノイズ) y = 2 * x + np.random.normal(0, 10, 50) # 相関の高いデータかどうかを確認 print(np.corrcoef(x, y))
このようにして、初心者の方でも簡単に「相関が高そうなデータ」を作ることができます。
反対に、相関が低いデータを作りたいなら、y
の生成式を調整してみるのもいいでしょう。
複数の変数を同時に分析する場合
変数が2つだけなら corrcoef
や pearsonr
などで問題ありません。
しかし、変数が3つ、4つ、あるいは10個以上に増えることもよくあります。
そんなときは、pandasの DataFrame
にまとめておいて df.corr()
を使うと、一発で相関行列を得られます。
表形式で見比べるだけでも、どの変数同士が相関しているかが分かりやすくなります。
正確な分析のための注意点
相関分析を行う際は、いくつか気をつけたいポイントがあります。
欠損値 (NaN) の扱い
欠損値が含まれると、計算結果がエラーになったり、意図しない結果になったりすることがあります。特にpandasで扱うデータフレームに欠損が多い場合は、前処理が大切です。
外れ値 (異常値) の影響
極端に大きな値や小さな値が混ざると、相関関係が大きく歪むことがあります。外れ値が多数含まれているときは、PearsonよりSpearmanなど順位相関係数のほうが頑健な場合があります。
因果関係との混同
相関が高いからといって、原因と結果がはっきりと分かるわけではありません。追加の検証や専門知識が必要になることがあります。
相関係数は、あくまで「データ同士の関係性の強さ」をざっくり示すものです。 ビジネス判断や科学的結論を出すときには、相関だけでなく、前後の文脈や追加の検証を組み合わせることが大切です。
相関係数の解釈と応用
ここからは、相関係数の読み方や「どう分析に生かすのか」という点をさらに掘り下げてみます。
相関係数の数値をどう読むか
前述の通り、相関係数は −1〜1 の間を取りますが、どのあたりから「強い相関」と言えるのかは分野によって異なります。
例えば、0.8 を超えれば「かなり似た変動をしている」と感じるかもしれませんが、金融の分野では 0.5 程度でも十分に関連があると見なすケースもあります。
また、サンプルサイズが大きければ、相関係数が小さくても統計的に有意になることがあるので、「数値がどのくらいか」と「データ量がどのくらいか」をあわせて考えることも必要です。
複数の変数の相関関係を一度に可視化する
データ分析では、相関を可視化することもよく行われます。
pandasの corr()
で相関行列を得たあと、seaborn の heatmap
関数などを使うと、相関の強さを色分けしたヒートマップを表示できます。
import seaborn as sns import matplotlib.pyplot as plt # df には複数の列が含まれているとする corr_matrix = df.corr() sns.heatmap(corr_matrix, annot=True, cmap="coolwarm") plt.show()
このようなヒートマップを使うと、どこが一番強い相関を持っているかが一目で分かります。
実務でも、変数が多いときに「最初に一度ヒートマップを作って、大きな相関があるペアを見つける」というステップを踏むことが多いです。
相関係数を超えた分析手法との併用
相関係数だけで不十分な場合は、回帰分析や決定木、ランダムフォレストなど、より複雑な方法で関係を掘り下げることが考えられます。
しかし、最初の段階で相関係数を確認しておくことは、データが持つ特徴を把握するうえで役立ちます。
特に、まったく関係がない変数同士を組み合わせても高度な分析は意味を成しにくいので、手間を減らすために最初に相関を見ておくと効率的です。
相関係数が高い変数だけを根拠にして結論を急ぐと、実際の原因を見誤るリスクがあります。
目的や状況に合わせて、他の統計的な検証やドメイン知識とのつながりも考えることが大事です。
Pythonコードの実務的なポイント
ここでは、Pythonで相関係数を計算するときにありがちな注意点を追加でまとめます。
データの前処理とクリーニング
実務では、生データをそのまま使えないことが多々あります。
- 不要な文字列が混じって数値として扱えない
- 欠損が多く、単純に除外するとサンプル数が足りなくなる
- 列の形式が文字列と数値で混在している
このようなときは、まずpandasを使って欠損値を除去または補完する、データ型を変換するなどの前処理が必要です。
しっかりと前処理しないと、計算した相関係数が正しく反映されません。
ライブラリの使い分け
NumPy、pandas、SciPy、scikit-learnなど、どれも相関を計算できますが目的によって使い分けると効率的です。
NumPy
単純に2つの配列間の相関を求めるだけなら、np.corrcoef
で十分です。
pandas
複数列からなるデータフレーム同士の相関行列を一気に計算・可視化したいなら、df.corr()
が便利です。
SciPy
p値を含めて結果をしっかり確認したいなら、stats.pearsonr
などを使うと細かな情報が得られます。
scikit-learn
機械学習の評価指標に似た目的で相関を扱いたい場合や、回帰タスクでの相関を参考にする場合に使われることがあります。
大規模データへの対応
データ数が非常に多い場合は、相関計算自体が時間やメモリを圧迫することがあります。
たとえば数百万件単位のデータフレームに対して直接 df.corr()
をかけると、PCのメモリを大量に消費することも考えられます。
その場合は、データをサンプリングして概算で相関を見る、あるいはより効率的な計算手法を導入するなどの検討が必要です。
実務現場では大規模データ分析が珍しくないので、この部分も忘れずに考慮したいところです。
まとめ
ここまで、Pythonで相関係数を計算する方法を中心に解説しました。
要点を振り返ると、次のようになります。
- 相関係数は2つの変数の関連度合いを示す数値指標
- PythonではNumPy、pandas、SciPyなど、さまざまな方法で計算が可能
- Pearson、Spearman、Kendallなどの種類があり、データの特徴に合わせて使い分ける
- 相関が高いからといって因果関係があるとは限らない
- 欠損値や外れ値の扱い、実務データの前処理が重要
相関係数は、最初にデータをざっと概観するときや、2つの変数がどの程度リンクしているかを把握するときによく使われます。
さらに詳細な分析が必要になったら、回帰分析などの一歩踏み込んだ方法と組み合わせるのも選択肢に入るでしょう。
最終的には目的や分野によって相関係数の解釈の仕方も変わるため、数値の大きさだけでなくデータの背景を総合的に判断すると役立ちます。
ぜひ、この記事のコード例や解説を参考にしながら、自分のデータに相関分析を試してみると理解が深まるのではないでしょうか。