【Python】相関係数の求め方を初心者向けに解説
はじめに
Pythonで統計やデータ分析を行う場面で、相関係数という言葉を目にすることがあるかもしれません。
相関係数は、2つの変数の関係性がどの程度強いかを数値で表すものです。ある変数が増えれば、もう一方の変数も増える(あるいは減る)といった関係を把握するのに役立ちます。
例えば、売上と広告費、気温とアイスクリームの売れ行きなど、多くの場面で変数同士の関連性を見たいと思うことがあるでしょう。Pythonには、この相関係数を求めるための便利なライブラリやメソッドが用意されています。
今回は、相関係数の概念を初心者の方にもわかるように整理しつつ、Pythonでの計算手順を丁寧に解説していきます。
抽象的な説明ではなく、実際のコード例を通して「どのように計算するのか」「結果をどう解釈するのか」を具体的に見ていきましょう。
さらに、実務での活用シーンにも触れながら、どのように日々の分析業務に役立てられるかを紹介します。
基本的なところから順を追って説明しますので、初めて相関係数を扱う方でもご安心ください。
この記事を読むとわかること
- Pythonにおける相関係数の基本的な概念
- 相関係数の種類と特徴
- Pythonを使った具体的な計算方法 (NumPy、Pandas、SciPy)
- 実務で役立つ相関係数の読み方と注意点
Pythonで扱う相関係数とは?
まずは相関係数がどのようなものかを、大まかにイメージしてみましょう。
相関係数は通常、-1から+1の範囲で表されます。正の値に近いほど「片方の値が上がると、もう片方の値も上がる」関係が強いことを示し、負の値に近いほど「片方が上がるともう片方は下がる」関係が強いことを意味します。
たとえば、ある商品の売上数と広告費のデータを記録しておき、これらの相関を調べることがあります。相関係数が0.8程度であれば、広告費が高い月は売上も高い傾向が強いと言えます。
逆に-0.8のような値であれば、一方が増えるともう一方が減るという傾向が強いということです。
0に近い場合は、「関連性がほとんど見られない」という解釈になります。
相関係数の基本
相関係数を語るときによく登場するのが ピアソンの積率相関係数 (Pearson’s correlation coefficient)です。
数式としては少し複雑に見えますが、要は2つの変数が同時にどのように動くかを、標準偏差で正規化して数値化したものだと捉えると理解しやすいでしょう。
統計の世界では、ピアソン相関係数だけでなく、 スピアマンの順位相関係数 (Spearman’s rank correlation coefficient)など、順位をベースにした計算方法も存在します。それぞれが得意とするケースが少し違います。
相関係数の種類
Pythonでよく使われる相関係数の種類は、主に以下の2つです。
ピアソン相関係数
連続的な数値データに対して広く使われています。外れ値に弱い性質があります。
スピアマン相関係数
順位を利用して相関を測るので、外れ値に対して比較的頑健(がんけん)とされています。非線形の関係をある程度捉える場合にも用いられることがあります。
分析したいデータの特性によってどちらを使うかを判断する場合があります。ピアソン相関係数は線形関係の強弱を見る際に便利であり、スピアマン相関係数はデータに外れ値が多かったり、厳密な線形性が期待できない場合に有用です。
実務での活用シーン
相関係数は実務において、さまざまな場面で使用されます。
例えば、売上と広告費、体重と身長、気温と売上など「二つの変数間の関連性」を把握したいケースは幅広いです。具体的な活用例としては、以下のようなシーンが挙げられます。
マーケティング
広告費と売上の相関を見ることで、広告投資がどの程度効果を発揮しているかの目安にする。
製造業
温度と機械の故障率など、製造ラインの品質管理や異常検知の一環で、環境要因との関連性を探る。
人事データの分析
社員の研修コストと業績評価の関係性などを見て、組織マネジメントの指針を得る。
これらの場面では、Pythonを使ってデータを集計・加工し、相関係数を算出して意思決定に役立てることが少なくありません。
それでは、実際にPythonでどのように相関係数を計算すればよいのでしょうか。次のセクションでは具体的な方法を順番に確認していきます。
Pythonで相関係数を計算する方法
Pythonには、データ分析に便利なライブラリが多数あります。ここでは次の3つの方法を見てみましょう。
- NumPy
- Pandas
- SciPy
どれも有名なライブラリで、環境によっては最初からインストールされている場合もあります。順番にコード例を通じて説明していきます。
NumPyでの相関係数計算
NumPyは数値計算のためのライブラリです。行列演算などを高速に行えるため、統計関連の処理でもよく使われます。
相関係数を計算するために使用する代表的な関数は numpy.corrcoef()
です。下記の例では、2つの配列の相関係数を求めています。
import numpy as np # サンプルデータを用意 x = np.array([10, 20, 30, 40, 50]) y = np.array([15, 25, 35, 45, 60]) # 相関係数の計算 corr_matrix = np.corrcoef(x, y) print(corr_matrix)
corr_matrix
は2×2の行列として出力され、対角成分は1(自分自身との相関なので当たり前)、オフダイアゴナルの要素が x と y の相関関係を表す数値です。
例えば [0,1]
や [1,0]
の位置にある値が、x と y の相関係数になります。
NumPyを使う場合は配列をそのまま渡せばよいのがシンプルですが、データフレームをメインに扱う方は次に紹介するPandasの corr()
メソッドの方が使いやすいかもしれません。
Pandasでの相関係数計算
Pandasは表形式のデータ(DataFrame)を扱うのが得意なライブラリです。CSVやExcelファイルなどで取得したデータをDataFrameとして読み込み、そのまま corr()
メソッドを使って相関係数を計算することができます。
以下のコード例では、2つの列を持つデータフレームを生成し、相関係数を計算しています。
import pandas as pd # サンプルデータを作成 data = { 'temperature': [22, 25, 28, 30, 32], 'ice_cream_sales': [110, 150, 180, 200, 220] } df = pd.DataFrame(data) # 相関係数を計算 corr_result = df.corr() print(corr_result)
出力結果は、温度(temperature)とアイスクリーム売上(ice_cream_sales)の相関係数を行列形式で表示します。このとき corr_result
の中身はPandasのDataFrameになっており、そのままExcel風に表として確認することもできます。
デフォルトではピアソン相関係数を計算していますが、スピアマン相関などを計算したい場合は df.corr(method='spearman')
のように引数を指定することで切り替えることが可能です。
SciPyでの相関係数計算
SciPyには統計分析に便利な関数が多数含まれています。相関係数を計算する場合、以下のように scipy.stats
モジュールの pearsonr
や spearmanr
を利用することができます。
import numpy as np from scipy.stats import pearsonr, spearmanr # サンプルデータ x = np.array([10, 20, 30, 40, 50]) y = np.array([9, 21, 33, 47, 52]) # ピアソン相関係数 pearson_corr, pearson_p = pearsonr(x, y) print("Pearson相関係数:", pearson_corr) print("p値:", pearson_p) # スピアマン相関係数 spearman_corr, spearman_p = spearmanr(x, y) print("Spearman相関係数:", spearman_corr) print("p値:", spearman_p)
pearsonr()
や spearmanr()
は、相関係数だけでなくp値も返してくれるのが特徴です。p値とは、統計学における有意性を判断する際の指標のひとつです。例えば、p値がある閾値(よく使われるのは0.05など)よりも小さい場合には「統計学的に有意な相関がある」とみなせる場合があります。
ただし、p値はサンプルサイズやデータの分布に強く影響を受けるので、一概に「p値が小さい=絶対的な因果がある」とは言い切れません。後述の注意点でも説明しますが、相関と因果は別物なので、p値の解釈には十分気を配りましょう。
相関分析をさらに深める
相関係数を計算するだけでは、データの関係性をすべて把握できるわけではありません。相関分析を行う際には、以下の点に注目すると理解が深まります。
ピアソン相関係数とスピアマン相関係数
先ほども述べたように、ピアソン相関係数は線形関係を前提とします。一方で、スピアマン相関係数はデータの順位を使うため、直線的でない関係をある程度捉えることもあります。
例えば、ある変数 x が増えれば y もある程度増えるのだが、その関係が曲線的に変化する場合などはピアソン相関では正確に把握しきれないかもしれません。スピアマン相関係数は、値そのものではなく順位で見るため、極端な外れ値に対しても影響が緩和されるという特徴があります。
どちらが優れているかではなく、データの性質や分析の目的によって使い分けるのが大切です。もしデータに外れ値が多い場合や、分布に偏りがあると感じたらスピアマン相関も検討してみましょう。
相関行列の作成と活用
変数が2つだけなら、相関係数を1つ計算するだけで事足りる場合が多いです。しかし、実際の分析では複数の変数がある状況も少なくありません。そんなときに便利なのが相関行列です。
Pandasの DataFrame.corr()
を使って、データフレーム全体の列同士の相関を一括で計算するのはよくあるパターンです。例えば以下のようにすると、列が複数あるデータフレームでも、一気に相関関係を把握できます。
import pandas as pd data = { 'temperature': [22, 25, 28, 30, 32], 'ice_cream_sales': [110, 150, 180, 200, 220], 'cold_drink_sales': [90, 120, 140, 160, 185] } df = pd.DataFrame(data) corr_matrix = df.corr() print(corr_matrix)
出力される行列では、各列同士の相関が一目でわかります。
もし特定の組み合わせで相関係数が高いものがあれば、そこに注目して分析を掘り下げるといった流れになります。
p値の考え方
相関係数そのものよりも、ビジネス上では「それがどの程度信頼できるか」を知るほうが重要という場面があります。そこではp値の考え方が関係してきます。
p値は、簡単に言うと「偶然によって、たまたまこれくらいの相関が出ている可能性」がどれほどあるかを数値化したものです。p値が小さいほど、偶然ではなく何らかの要因で相関が高い(または低い)と推定できます。
ただし、p値が小さいからといって「絶対に因果がある」とは言い切れません。また、p値が大きいからといって「まったく関係ない」とも言えません。相関はあくまで「変数間の連動」を示すものであり、そこに因果関係があるとは限らないからです。
注意点:相関と因果は別物
しばしば「相関が高いからといって、必ずしも因果関係があるわけではない」という点が強調されます。
例えば、アイスクリームの売上と日焼け止めの売上に相関が見られたとしても、それらは気温や日照時間といった別の要因に左右されているだけかもしれません。そのため、統計解析や機械学習の現場では、相関分析を行ったあとに追加の検証をすることが多いです。
相関係数が大きいとつい「これが原因だ」と思い込みがちですが、背後に別の要素が絡んでいる可能性は否定できません。結論を急がず、追加の検証や実験を行うことが重要です。
実務での具体的活用例
ここまでで、相関係数の計算方法や読み方について概要がつかめたかと思います。
実務の現場では、多くの変数が存在し、それぞれが複雑に絡み合っているケースが多いです。以下では、いくつか代表的な活用例を挙げます。
売上と各種要因の相関を探索
マーケティングの現場では、売上を予測したり分析したりするときに、広告費やSNSでの発信回数、特定キャンペーンの有無など、さまざまな変数を整理し、相関係数を計算することがあります。
例えば、以下のような複数の変数を含むデータフレームを作成し、 df.corr()
で一気に相関行列を作ることが考えられます。
- 広告費
- キャンペーンの数
- SNS投稿の回数
- 平均客単価
- 温度
- 売上
すると、どの要因が売上と特に強い相関を持っているのかを俯瞰できるため、次の施策を検討するときの一つの材料にしやすくなります。
機械故障率や品質データの管理
製造業では、機械の故障率や製造ラインの品質データといった変数同士の関係を調べることがあります。
例えば、稼働時間、温度、湿度、人員配置など、さまざまな要因が重なって機械の故障率や製品の不良率が変化する可能性があるでしょう。
ここでも、Pythonで取得したログデータやセンサーデータをDataFrameにまとめて、相関行列を作成するのが有効です。もし特定のセンサー値と故障率に強い相関が見られれば、先回りして点検できるかもしれません。
顧客満足度やアンケート結果の分析
アンケートや顧客満足度(CS)調査を行う場合も、複数の質問項目を横断的に分析してみると、思わぬ傾向が見つかることがあります。
顧客満足度を「総合評価」として集計し、質問項目ごとの評価と照らし合わせて相関が高い項目があれば、その項目を強化すると総合評価が上がりやすい可能性を推察できます。
ただし、アンケート結果は数字が必ずしも連続値ではない場合があります。そのような場合は、ピアソン相関係数よりもスピアマン相関係数を使うほうが適切なシーンがあるかもしれません。
さらに踏み込んだ分析の方向性
相関係数を使って変数同士の関連をざっと把握したら、もう少し踏み込んだ分析に進むことも考えられます。ここでは、いくつかの方向性を示しておきます。
回帰分析との併用
相関が高いとわかった変数同士に対し、より具体的な回帰モデルを組み立てることで、将来予測や要因分析につなげることができます。例えば、売上と広告費に強い相関があるとわかったら、単回帰や重回帰を実行して広告費と売上の関係式を求めるといった流れです。
部分相関や多変量解析
部分相関は「ある変数を固定したうえで、他の2つの変数の相関を見る」という手法です。複数の変数が相互に影響し合うような状況では、単純な相関係数では見えにくい関係を捉えられることがあります。Pythonでは、ライブラリを活用すると部分相関の計算も可能です。
可視化
相関行列をヒートマップで表示するなど、視覚的に確認する方法は多くの場面で利用されています。Pandasと合わせて使えるSeabornやMatplotlibなどを活用して、ヒートマップを描くのも有効です。色の濃淡で相関の強さが直感的にわかるため、大量の変数を扱う場合には特に便利でしょう。
ヒートマップを用いると、高相関や低相関の部分を視覚的に把握しやすいです。見落としを減らす工夫として、ぜひ取り入れてみてください。
まとめ
Pythonで相関係数を求める手順や考え方について、初心者の方でも取り組みやすいように解説してきました。
- 相関係数は -1 ~ +1 の範囲で表され、値の大きさや正負によって変数間の強い連動がどの程度あるかを示す。
- ピアソン相関係数は線形関係に着目した解析に向いており、スピアマン相関係数は順位をベースにして外れ値に強いといった特徴を持つ。
- NumPy、Pandas、SciPy などのライブラリを使って手軽に計算でき、特にPandasの
DataFrame.corr()
は複数変数の相関をまとめて確認できるため便利。 - p値をチェックすることで、統計的に有意な相関かどうかの目安がわかる。ただし、相関は因果関係を証明するものではない。
実務で相関係数を活用する場面は幅広く、売上や広告費の分析、製造業での品質管理や故障予測、アンケート結果の分析など、さまざまなシーンで応用可能です。
ただし、相関係数が高いからといって必ずしも原因と結果が直結しているとは限りません。データを正しく扱い、追加の検証を行うことが大切です。
これをきっかけに、ぜひ自分の手元にあるデータで相関係数を計算してみてください。ちょっとした分析や確認作業にも役立ちますし、次のステップとして回帰分析や機械学習モデルの構築などに踏み出しやすくなります。
Pythonの強みは、数値演算やデータ可視化などの強力なライブラリを活かして、短いコードでデータ分析をさくさく進められる点です。相関係数を理解しながら、さらに高度な分析に挑戦するヒントを見つけていきましょう。