前提・実現したいこと
np.random.seed()の使い方について
下記のプログラムでは、np.random.seedを計3回読み込んでいます。
3回目のnp.random.seedを追加するかどうかによって、2つ目のプログラムの結果が変わってしまいます。
(プログラムは①サンプルサイズを変えた時の標本平均の分布を比べる、②サンプルサイズを変えた時の
標準偏差の変化を比べる)という2つを実行しており、実行結果をグラフでそれぞれplt.show()で2回表示しています。
3回もnp.random.seed(1)を読み込まずとも最初に1回読み込めば乱数シードは固定されてその後の結果は
変わらないと思っていましたが、なぜ3個目のnp.random.seed(1)を記述しなければ、②のプログラムの結果が
変わってしまうのか知りたいです。
発生している問題・エラーメッセージ
3つ目のnp.random.seed(1)の記述の有無によって、②のプログラムの実行結果が変化してしまう。
該当のソースコード
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
%precision 3
population = stats.norm(loc=4, scale=0.8)
np.random.seed(1)
def calc_sample_mean(size, n_trial):
sample_mean_array = np.zeros(n_trial)
for i in range(0, n_trial):
sample = population.rvs(size=size)
sample_mean_array[i] = np.mean(sample)
return(sample_mean_array)
np.random.seed(1)
size_10 = calc_sample_mean(10, 10000)
size_10_df = pd.DataFrame({
"sample_mean":size_10,
"size":np.tile("size_10", 10000)
})
sns.violinplot(x="size", y="sample_mean", data=size_10_df, color="gray")
plt.show()
size_array = np.arange(start = 2, stop = 102, step = 2)
np.random.seed(1) #今回問題となっている箇所
sample_mean_std_array = np.zeros(len(size_array))
for i in range(0, len(size_array)):
sample_mean = calc_sample_mean(size=size_array[i], n_trial=100)
sample_mean_std_array[i] = np.std(sample_mean, ddof=1)
plt.plot(size_array, sample_mean_std_array, color="black")
plt.xlabel("sample size")
plt.ylabel("mean_std value")
plt.show()
試したこと
np.random.seed(1)の記述を追加、削除する等して試しましたが、結果は上記のとおりでした。
補足情報(FW/ツールのバージョンなど)
特にありません。
よろしくお願いいたします。