相関係数の動的シミュレーション
matplotlibの利用
相関係数が
である母集団から
個の独立なサンプルを採ったときの標本相関係数の様子を見るシミュレーションスクリプトをリスト1のように作成してみた。
リスト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印ボタンをクリックすればよい。
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()