0
0

Python3ではじめるシステムトレード:カテゴリカルデータと相関行列

Last updated at Posted at 2024-05-03

分割表を学ぶ際にカテゴリカルデータを分析していること、カテゴリカルデータの分布とその特性値を理解していることが3元分割表の理解を加速することがわかっているので、カテゴリカルデータの相関の計算の方法を学習する。通常の相関係数(ピアソンの相関係数)はカテゴリカルデータにおいては、直接適用できない。

本記事を読む前に

https://qiita.com/innovation1005/items/c8c6560fbafbd8a1d126
Python3ではじめるシステムトレード:3元分割表

を読むことが必須。

相関行列

生成されたデータの特性を理解するために相関行列を計算することは、因子間の関連性を定量的に評価する上で非常に有用だ。ここでは、カテゴリカルデータに基づいて相関行列を計算する手順を説明する。

カテゴリカルデータの相関行列

クラメールのV統計量などが使用される。クラメールのVはカイ二乗統計量に基づいており、カテゴリ間の関連の強さを測るのに適している。

解析的計算

実際の相関行列を解析的に導出するには、カテゴリカルデータに適した相関の尺度を計算する必要がある。クラメールのVを計算するためには:

  1. カイ二乗統計量の計算:

    • 2つのカテゴリカル変数間のカイ二乗統計量を計算する。これは、観測度数と期待度数の差の二乗和を自由度で割る。
  2. クラメールのVの計算:

    • カイ二乗統計量からクラメールのVを計算するには、次の式を用いる:
      $$
      V = \sqrt{\frac{\chi^2}{n \times \min(k-1, r-1)}}
      $$
      ここで、$ \chi^2 $はカイ二乗統計量、$ n$はサンプルサイズ、$k$と$r$はそれぞれ列と行のカテゴリ数だ。

PythonによるクラメールのVの計算例

import numpy as np
from scipy.stats import chi2_contingency

def cramers_v(contingency_table):
    chi2, _, _, _ = chi2_contingency(contingency_table)
    n = contingency_table.sum()
    phi2 = chi2 / n
    r, k = contingency_table.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))    
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))

# 例として2つの因子のカイ二乗検定結果を用いたクラメールのVの計算
table = np.array([[10, 20], [20, 40]])
print("Cramer's V for the table:", cramers_v(table))

このコードは、与えられた分割表に対してクラメールのVを計算し、因子間の関連の強さを評価する。つぎの方法は、生成された多項分布データの相関行列を解析的に理解するための一つのアプローチだ。全体の相関行列を導出するには、すべての因子ペアに対してこの計算を繰り返し実行する必要がある。

import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency

# サンプルデータを生成(A, B, Cはそれぞれ2カテゴリー)
np.random.seed(0)
sample_size = 300
p = [0.5, 0.3, 0.2]  # 各カテゴリが発生する確率
data = np.random.multinomial(1, p, size=sample_size)  # 多項分布からサンプリング

df = pd.DataFrame(data, columns=['A', 'B', 'C'])

# クラメールのVを計算する関数
def cramers_v(x, y):
    confusion_matrix = pd.crosstab(x, y)
    chi2 = chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    return np.sqrt(chi2 / (n * (min(confusion_matrix.shape) - 1)))

# 相関行列の計算
correlation_matrix = pd.DataFrame({
    'A': [1, cramers_v(df['A'], df['B']), cramers_v(df['A'], df['C'])],
    'B': [cramers_v(df['B'], df['A']), 1, cramers_v(df['B'], df['C'])],
    'C': [cramers_v(df['C'], df['A']), cramers_v(df['C'], df['B']), 1]
}, index=['A', 'B', 'C'])

print("相関行列:")
print(correlation_matrix)

image.png

独立ではないデータは異なる確率の設定$p$から得られます。この$p$からデータの相関を計算するのは厄介ですが、多項分布から得られた既知の相関のデータは、完全独立モデル、周辺独立モデル、条件付独立モデルと3元分割表の関係を知るのに重要であり、質的データの階層構造の理解に欠かせません。

Python3ではじめるシステムトレード【第2版】環境構築と売買戦略

「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。

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