Python学習編63回目です。
前回は不偏標準偏差のn-1で割ることに対して疑問が浮かんだところ。今回は検証の実験をしてみよう。ChatGPTに聞けばやり方教えてくれるだろうけど、まずは自分で考えてみよう。
入力:上記の実験を行うために、以下のコードを書きました。誤りや改善点があれば指摘してください。
import numpy as np
bo_syuudan = np.random.rand(200,5) #標本集団5個ずつ、母集団合計で要素1000の配列を作成
bo_hoyujunhensa = np.std(bo_syuudan) #母集団の標準偏差を計算
hyouhon_hoyujunhensa = np.zeros(200) #標本集団の標準偏差を記録するための配列を作成
huhen_hoyujunhensa = np.zeros(200) #標本集団の不偏標準偏差を記録するための配列を作成
for i in range(len(bo_syuudan)):
hyouhon_hoyujunhensa[i] = (np.std(bo_syuudan[i])) #標本集団の標準偏差を配列に格納
average_hyouhon_hoyujunhensa = hyouhon_hoyujunhensa.mean() #標本集団の標準偏差を格納した配列の平均を求める
for i in range(len(bo_syuudan)): #上と同じ操作を不偏昇順偏差で行う
huhen_hoyujunhensa[i] = (np.std(bo_syuudan[i], ddof = 1))
average_huhen_hyoujunhensa =huhen_hoyujunhensa.mean()
print(bo_hoyujunhensa)
print(average_hyouhon_hoyujunhensa)
print(average_huhen_hyoujunhensa)
出力:
あなたのコードは実験の基本的なアイデアを適切に反映していますが、いくつかの誤りや改善点があります。具体的に指摘して改善案を提案します。
誤りや改善点
- 母集団の標準偏差の計算:
bo_hoyujunhensa = np.std(bo_syuudan)
この行では、200×5の配列全体の標準偏差を計算していますが、これは母集団の標準偏差とは異なります。母集団の標準偏差を正確に計算するには、最初に全ての値を含む配列を生成し、その配列の標準偏差を計算する必要があります。 - 母集団の生成: 現在のコードでは、200×5の配列を生成しており、これは合計で1000個のデータポイントを持つことになりますが、これらは個別の標本として扱われます。本来の意図としては、1000個のデータポイントからなる母集団から、5個のデータポイントを含む200個の標本を抽出することだと思われます。これを正確に実現するには、最初に1000個のデータポイントからなる配列を生成し、そこからランダムに5個のデータポイントを選んで標本とする必要があります。
- 標準偏差と不偏標準偏差の計算: あなたは正しく
ddof=1
を使用して不偏標準偏差を計算しています。しかし、hyouhon_hoyujunhensa[i] = (np.std(bo_syuudan[i]))
で通常の標準偏差を計算する際にddof=0
を明示的に設定することを推奨します(これはデフォルト値ですが、明示することでコードの意図がより明確になります)。
改善されたコード
以下に改善されたコードの例を示します。この例では、最初に1000個のデータポイントからなる母集団を生成し、そこからランダムに5個のデータポイントを選んで200個の標本を抽出する方法を採用しています。
import numpy as np
# 母集団の生成
mother_population = np.random.rand(1000) # 母集団:0~1のランダムな1000個の数字
bo_hoyujunhensa = np.std(mother_population) # 母集団の標準偏差を計算
# 標本集団の標準偏差と不偏標準偏差を記録する配列
hyouhon_hoyujunhensa = np.zeros(200)
huhen_hoyujunhensa = np.zeros(200)
for i in range(200):
sample = np.random.choice(mother_population, 5, replace=False) # 母集団からランダムに5個選択
hyouhon_hoyujunhensa[i] = np.std(sample, ddof=0) # 標本集団の標準偏差
huhen_hoyujunhensa[i] = np.std(sample, ddof=1) # 標本集団の不偏標準偏差
# 平均値の計算
average_hyouhon_hoyujunhensa = hyouhon_hoyujunhensa.mean()
average_huhen_hyoujunhensa = huhen_hoyujunhensa.mean()
# 結果の表示
print("母集団の標準偏差:", bo_hoyujunhensa)
print("標本集団の標準偏差の平均:", average_hyouhon_hoyujunhensa)
print("標本集団の不偏標準偏差の平均:", average_huhen_hyoujunhensa)
このコードは、母集団からのランダムな標本抽出を正確に行い、それぞれの標準偏差と不偏標準偏差を計算しています。結果として、母集団の標準偏差と標本集団の標準偏差及び不偏標準偏差の平均値を比較することで、不偏標準偏差の効果を検証できます。
どうせ5個の標本集団を扱うのだからハナから200×5の配列としたのがお気に召さなかったっぽい。元のコードと改善提案コードで結果は同じっぽいがどうだろう。掘って見るか。
次回に続く