0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

相関行列を表示し、ヒートマップを描画する方法

Last updated at Posted at 2024-11-16

本記事で学べる事

  • 相関行列を表示
  • ヒートマップを描画

最終的に↓のようなヒートマップを描画できるようになりましょう!!
heatmap

事前準備

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の種類分複製する。

データフレームをピボットテーブル形式に再構成する

相関行列の表示
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()

すると、ヒートマップを描画できます。
image.png
最も相関係数が高いペアは、A-Bの0.089となることがわかります。

※それぞれのコードについての説明です。

  • sns.heatmap
    • seaborn ライブラリの関数で、2次元データ(ここでは相関行列)をカラーマップで可視化する。
    • 引数の説明:
      • corr_matrix: 描画するデータ(相関行列)。行と列に株式名が対応し、各セルには相関係数が格納されている。
      • annot=True:各セルに数値(相関係数)を表示。
      • cmap="coolwarm":カラーマップを指定。青(負の相関)から赤(正の相関)へのグラデーション。
      • center=0:カラースケールの中央値を0に設定。負の相関が青、正の相関が赤で明確に分かれる。

発展~最も相関係数が高いペアのみを抜き出す~

  1. まずは、上三角行列のみを取得し、対角成分を含まないようにします。
upper_triangle = corr_matrix.where(~np.tril(np.ones(corr_matrix.shape)).astype(bool))
upper_triangle

すると、上三角行列のみの値を返し、それ以外はNaNで返します。
image.png

  1. 最大の相関を持つペアを取得します。
max_corr_pair = upper_triangle.stack().idxmax()
print("最も相関が高いペア:", max_corr_pair)

とすると、無事、最も相関係数が高いA-Bのペアを抜き出せました!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?