本記事で学べる事
- 相関行列を表示
- ヒートマップを描画
最終的に↓のようなヒートマップを描画できるようになりましょう!!
事前準備
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
任意のデータフレームを作成
今回は、5種類の株を想定し、それぞれの株価が1か月間完全にランダムに変化する場合を考えます。そして、それぞれの株の値動きの相関を調べてみます。
まずは、適当にデータを用意します。
データフレームを作成
dates = pd.date_range("2022-01-01", periods=30, freq='D')
stocks = ['A', 'B', 'C', 'D', 'E']
data = pd.DataFrame({
'date': np.tile(dates, len(stocks)),
'stock': np.repeat(stocks, len(dates)),
'value': np.random.uniform(0, 1, len(dates) * len(stocks))
})
それぞれのコードについての説明です。
-
pd.date_range
- pandasの関数で、開始日から終了日、または特定の期間にわたる日付のリストを作成。
- 引数
-
"2022-01-01"
: 範囲の開始日。ここでは2022年1月1日から始まる。 -
periods=30
: 日付の数を指定。。ここでは30日間の日付を生成する。 -
freq='D'
: 日付の増加間隔を指定。**'D'**は「1日単位」の頻度を意味する。
-
-
np.tile(dates, len(stocks))
- NumPyの関数で、指定した配列(dates)を
stocks
の種類分複製する。
- NumPyの関数で、指定した配列(dates)を
データフレームをピボットテーブル形式に再構成する
相関行列の表示
data_pivot = data.pivot(index='date', columns='stock', values='value')
corr_matrix = data_pivot.corr()
corr_matrix
※コードについての説明です。
-
data.pivot
-
date
を行インデックスstock
を列名として、各セルにvalue
を配置したデータフレームを作成する。
-
相関行列の表示
ヒートマップの作製
ヒートマップの描画には、serborn
というライブラリを用います。
ヒートマップの描画
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", center=0)
plt.title("Stock Close Price Correlation Heatmap")
plt.show()
すると、ヒートマップを描画できます。
最も相関係数が高いペアは、A-Bの0.089となることがわかります。
※それぞれのコードについての説明です。
-
sns.heatmap
- seaborn ライブラリの関数で、2次元データ(ここでは相関行列)をカラーマップで可視化する。
- 引数の説明:
-
corr_matrix
: 描画するデータ(相関行列)。行と列に株式名が対応し、各セルには相関係数が格納されている。 -
annot=True
:各セルに数値(相関係数)を表示。 -
cmap="coolwarm"
:カラーマップを指定。青(負の相関)から赤(正の相関)へのグラデーション。 - center=0:カラースケールの中央値を0に設定。負の相関が青、正の相関が赤で明確に分かれる。
-
発展~最も相関係数が高いペアのみを抜き出す~
- まずは、上三角行列のみを取得し、対角成分を含まないようにします。
upper_triangle = corr_matrix.where(~np.tril(np.ones(corr_matrix.shape)).astype(bool))
upper_triangle
すると、上三角行列のみの値を返し、それ以外はNaN
で返します。
- 最大の相関を持つペアを取得します。
max_corr_pair = upper_triangle.stack().idxmax()
print("最も相関が高いペア:", max_corr_pair)