コピュラで異なる変数間の依存関係をモデル化する

コピュラとは?

コピュラは、異なる変数がどのように関連しているかを示すための数学的な方法です。簡単に言うと、複数の変数が互いにどのように影響を及ぼし合っているかを分析するために使われます。それぞれの変数がどんな分布をしているかは別として、変数間の「つながり」だけを見ます。

この記事では、コピュラを使用して2つの変数間の依存関係をモデル化し、その依存関係を保持したまま新しい合成データを生成してみます。

コピュラモデルのモデルには下記のライブラリを利用します。

ライブラリのインストール

!pip install copulas

サンプルデータの生成

np.random.multivariate_normal を使用して、2つの変数 X1 と X2 を持つ多変量正規分布から500サンプルのデータを生成します。

X1 と X2の間の共分散が0.8であることから、正の相関があることが期待されます。

import numpy as np
import pandas as pd

np.random.seed(42)
data = np.random.multivariate_normal(mean=[0, 0], cov=[[1, 0.8], [0.8, 1]], size=500)
df = pd.DataFrame(data, columns=['X1', 'X2'])

サンプルデータの可視化

サンプルデータの可視化を行ってみます。

import matplotlib.pyplot as plt

plt.scatter(df['X1'], df['X2'], alpha=0.5)
plt.title('Original Data')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

期待通り正の相関が確認できます。

コピュラモデル

コピュラモデルを作成し、元データにフィッティングさせます。このステップで、X1 と X2 の間の依存関係がモデル化されます。

from copulas.multivariate import GaussianMultivariate

model = GaussianMultivariate()
model.fit(df)

コピュラモデルから新しいデータをサンプリング

新しいデータをサンプリングします。新しいデータは元データと同じ依存関係を持っていることが期待されます。

新しいデータのサイズを元データと同じ500サンプルに設定しています。
さらに可視化を行い、依存関係がどの程度保持されているかを確認してみます。

synthetic_data = model.sample(500)
synthetic_df = pd.DataFrame(synthetic_data, columns=['X1', 'X2'])

plt.scatter(synthetic_df['X1'], synthetic_df['X2'], alpha=0.5)
plt.title('Synthetic Data')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

新しいデータが元データと同じ正の相関を持っていることが確認できます。