Up

相関係数の動的シミュレーション

matplotlibの利用

 

相関係数がである母集団から個の独立なサンプルを採ったときの標本相関係数の様子を見るシミュレーションスクリプトをリストのように作成してみた。

リスト1では、実行開始時に次のコードでサンプル数と相関係数の入力を求めている。

 

n = int(input('n = '))

rho = float(input('rho = '))

 

個数nと相関係数rhoに対して、次のコードでデータxyを得ている。

 

xy = rng.multivariate_normal([0, 0],[[1,rho], [rho,1]], n)

 

得られたサンプルの散布図を次のコードで描いている。

 

plt.plot(xy.T[0], xy.T[1], 'o', markerfacecolor='none')

 

アニメーションは次のコードで実行している。引数のplotは、上のサンプリングと散布図を描く関数である。

 

anim = animation.FuncAnimation(fig, plot, interval=3000, cache_frame_data=False)

 

リスト1のスクリプトを実行して、以下のように個数と相関係数を与えてみる。

 

n = 9

rho = 0.5

 

図1のようなアニメーションが表示される。

 

図1

 

アニメーションを終了するときは、アニメーション表示Windowの右上のX印ボタンをクリックすればよい。

 

 

リスト1 シミュレーションのスクリプト

 

import numpy as np

import scipy.stats as ss

import matplotlib.pyplot as plt

import matplotlib.animation as animation

import time

 

n = int(input('n = '))

rho = float(input('rho = '))

if abs(rho) > 1:

    print('abs(rho) should not be larger than 1')

    import sys

    sys.exit()

 

rng = np.random.default_rng()

fig = plt.figure(figsize=(5,5))

def plot(data):

    xy = rng.multivariate_normal([0, 0],[[1,rho], [rho,1]], n)

    r = ss.pearsonr(xy.T[0], xy.T[1]).statistic

   

    plt.clf()

    plt.plot(xy.T[0], xy.T[1], 'o', markerfacecolor='none')

    plt.xticks(np.arange(-5, 5.1, 1))

    plt.xlabel('X', fontsize=16)

    plt.yticks(np.arange(-5, 5.1, 1))

    plt.ylabel('Y', fontsize=16)

    plt.title(fr'r = {r:.3f},   $\rho$ = {rho},   n = {n}', fontsize= 16)

    plt.tight_layout()

             

anim = animation.FuncAnimation(fig, plot, interval=3000, cache_frame_data=False)

plt.show()

 

 

 

Home