Python学習編64回目です。
前回は不偏標準偏差のn-1で割ることの妥当性を検証する実験を組んだところ、「母集団を200×5の配列としたのは×で1,000の配列とすべき」といわれました。納得いかないので理由を聞いてみよう。まずは母標準偏差から。
入力:200×5の配列全体の標準偏差を計算することは、配列の全要素1000全体の標準偏差を計算することとどう違いますか?
出力:
200×5の配列全体の標準偏差を計算するとき、あなたが一つの大きなデータセットとしてこれら1000個のデータポイントを扱い、それら全体の平均値との差の二乗の平均の平方根を計算します。これは、その配列を単一の母集団と見なして標準偏差を計算することに相当します。
一方で、200×5の配列から標準偏差を個別に計算するという文脈(例えば、各行や列に対して個別に標準偏差を計算する)では、この配列を構成する小さなサブセット(この場合は200個のサブセット、それぞれ5つのデータポイントから成る)の標準偏差を計算しています。
主な違い
- 計算の観点から: 200×5の配列全体の標準偏差を計算する場合、全1000個のデータポイントを平均して、それぞれのデータポイントがその平均からどれだけ離れているかを基に計算します。これは、全データセットを一つの母集団として扱う場合の標準偏差です。
- 個別の標準偏差の計算: 各5個のデータポイントごと(例えば、各行を一つのサブセットとして)に標準偏差を計算する場合、それぞれの小さなサブセットにおけるデータポイントの平均からの偏差を基に計算します。この場合、各サブセット(標本)の標準偏差を求め、その後でこれらの標準偏差の平均値を取ることができます。これは、複数の小さな標本からなる大きなデータセットを扱う場合のアプローチです。
どう違うのか
この2つのアプローチの主な違いは、データセットの構造とデータを分析する際の目的にあります。全体の標準偏差を計算する場合は、全データセットが一つの母集団から取られた単一のサンプルであると見なします。一方、個別の標準偏差を計算する場合は、データセットを複数の異なるサンプル(このケースでは200個のサンプル)と見なし、それぞれについて分析を行います。
つまり、200×5の配列全体の標準偏差を計算することは、そのデータセットを単一の統一された母集団として見ることに対応し、個別に標準偏差を計算することは、より小さなサブセットやグループごとにデータの変動を理解しようとするアプローチです。
これ、「200×5=1,000個の要素の標準偏差」と「1,000個の要素の標準偏差」の違いを聞いたのに、「200×5=1,000個の要素の標準偏差」と5個の要素の標準偏差」を回答してるっぽいな。文脈取り違えるの珍しい。文脈直すためにコードで示すか。
入力:
bo_syuudan = np.random.rand(200,5) #標本集団5個ずつ、母集団合計で要素1000の配列を作成
bo_hoyujunhensa = np.std(bo_syuudan) #母集団の標準偏差を計算
と
bo_syuudan = np.random.rand(1000) #要素1000の配列を母集団として作成
bo_hoyujunhensa = np.std(bo_syuudan) #母集団の標準偏差を計算
で計算結果に違いは生じますか?
出力:(前略)
結果の違い
両方のケースでnp.std()
を使用して計算される標準偏差の結果には違いがありません。どちらの場合も、配列内の全データポイントに対する全体の標準偏差を計算しています。主な違いはデータの構造ですが、標準偏差を計算する際には、これらの構造的な違いは影響しません。どちらの方法でも、1000個のデータポイント全てを含むデータセットのばらつきを測定しているため、結果に差は生じません。
はい、母標準偏差は同じ。あとは標本の取り方が同じことを示せれば、200×5の配列での実験と1,000要素での実験が同じ結果を示すと示せる。
入力:配列の各要素はすべて0~1の乱数とします。
①200×5の二次元配列を生成し、各列5要素の乱数を200組生成する方法
②要素1000の乱数を生成し、1000要素から被りが無いようにランダムに5要素ずつ取り出して5要素の乱数を200組生成する方法
で結果に違いは生じますか?
出力:
①と②で生成されるデータの統計的性質に違いが生じる可能性がありますが、その違いはデータの生成方法によるものです。具体的な違いを解説します。
① 200×5の二次元配列を生成
この方法では、0から1の範囲の一様分布からランダムに選ばれた1000個の乱数を200行5列の二次元配列として直接生成します。各行は独立しており、各列も独立しています。この場合、各列の5要素は、他の列の要素とは独立に選ばれます。つまり、200回の試行でそれぞれ5要素の乱数が生成され、それぞれの試行は他の試行から独立しています。
② 1000要素の配列から5要素ずつ取り出す
ここでは、まず1000個の乱数から成る1次元配列を生成し、その後、この配列から重複がないようにランダムに5要素ずつを選び出して200組のデータを作成します。この方法の場合、一度選ばれた要素は再び選ばれることがないため、「抽出無しのサンプリング」が行われます。この制約により、後に行われる選択では、最初に選ばれた要素が選択肢から外れるため、選ばれる確率に微妙な変化が生じます。
結果の違い
- 統計的独立性: ①の方法では各試行(各行)と各試行内の要素(列)が完全に独立しています。②の方法では全体としての1000要素の中からランダムに選び出す過程で、一度選ばれた要素が次回以降の選択肢から外れるため、統計的に完全な独立性はありません。
- 均等性: ①の方法では、各要素は一様分布から独立して選ばれるため、全体としての分布も理論上は一様分布に従います。②も最初の配列は一様分布に従いますが、抽出無しの選択を行うため、全体として見たときの均等性に微妙な差が生じる可能性があります。ただし、大数の法則により、この差は非常に小さくなる可能性が高いです。
結論
理論上は差があるように思えますが、実際のところ、大数の法則や中心極限定理により、これらの方法で生成されるデータセットの統計的性質は大きく変わらない可能性が高いです。ただし、②の方法ではデータの選択過程で全体のデータ構造に微妙な偏りが生じる可能性があり、これが結果に微妙な影響を及ぼすかもしれません。これは特に小さなデータセットでの分析や、非常に精密な統計的分析を行う場合に考慮する必要があります。
一般論では差があるということだろうけど、各要素ランダムなら差は生じないはず。具体的に詰めていこう。
入力:①の結果は、0~1の乱数が格納された200×5の配列になりますか?
出力:はい、方法①で生成される結果は、0から1の範囲の一様分布に従う乱数が格納された200×5の二次元配列になります。(後略)
入力:②の結果を200×5の配列の形にした場合、各配列の要素は0~1の乱数になりますか?
出力:はい、方法②を用いて結果を200×5の配列の形にした場合でも、各配列の要素は0から1の範囲の乱数になります。
入力:①と②はいずれも配列内の要素がすべて0~1の乱数である200×5の配列になりますか?
出力:はい、①と②の方法はいずれも、配列内の要素がすべて0から1の範囲の乱数である200×5の配列を生成します。
入力:①と②の結果の配列は、用いるデータセットによって違いが生じうるが、データがすべて同一の乱数である場合は同じ結果となる、ということですか?
出力:
理解に少し混乱があるようですので、明確にしましょう。
①と②の方法で生成される200×5の配列は、いずれもその要素が0から1の範囲の乱数である点では同じですが、データの選択プロセスが異なるため、理論上は配列の構造に違いが生じ得ます。
方法①(直接生成)
- 直接、200×5の配列を生成し、各要素は独立して0から1の乱数で埋められます。
- 各要素は完全に独立しており、他の要素の選択に影響を受けません。
方法②(選択抽出)
- まず1000個の乱数を生成し、その中から重複しないように5個ずつ選んで200組のデータを作成します。
- この方法では、「一度選ばれた乱数は再度選ばれない」という制約があります。これは、特定の乱数が他のグループに再度現れることはないことを意味します。
違いの本質
- データの独立性:①の方法では、全ての要素が独立して選ばれるのに対し、②の方法では全体のセットからランダムに選択する過程で、一度選ばれた要素は排除されます。これは、一種の「サンプリング無し」の選択であり、全体セットからの選択においては、各選択が完全に独立しているわけではありません。
- 結果の違い:両方の方法で生成される配列は、それぞれの要素が0から1の範囲の乱数であるという点で同じです。しかし、②の方法では、全体の1000個の乱数の中から選択していく過程で、選択される乱数の組み合わせにおいて独立性が若干異なる可能性があります。しかし、これは乱数の統計的性質には影響を与えず、主にサンプリングのプロセスに関連する問題です。
したがって、データがすべて同一の乱数である場合という文脈では、両方の方法で生成される結果の「内容」(0から1の乱数である点)は同じですが、選択される具体的な数値の組み合わせやその配列内での配置においては異なる結果が生じ得るということです。
あー、そういうことか。
人間「両方とも配列の中身はランダムな値だから同じだろ」
GPT「ランダムな値を違うとり方するから、同じシード値使っても例えば[0][0]番地が①で0.2だったのに対し②では0.8になったりするような違いが生じるだろ」
ってことっぽいな。まぁ、いずれにせよランダムな値が出る点は認識が一致したようだ。ということで疑問が解決したので話を実験結果に戻そう。
次回に続く