リサンプリング(再標本化)
収集したデータの中から再度、データを抽出したい場合があります。例えば収集データが1000件あるとして、その中から100件だけを再びランダム(無作為)に選ぶケースが当てはまります。
このように収集したデータ(標本集団)からの再抽出をリサンプリング(再標本化)と言います。後述するブートストラップ法でも使いますし、単にデータ量を軽減するためにも使います。対象とする集団の特性が変化しないなら、少量のデータで素早くデータ分析や統計処理ができます。
特定のrpnプログラムはメモリの制約上、無限にデータを処理できません。処理可能なデータ数に絞ることができればプログラムの自由度が増します。
ただ、実際にrpnでリサンプリングを行なおうとすると、手続きが意外に雑多で面倒です。そこで、rpnマイスターパッケージではsampleとsamplerプログラムを用意しました。前者は重複のないリサンプリングで、後者が重複ありのリサンプリングです。
例えば「1,2,3,4,5,6,7,8,9,10」のデータから3つのデータをリサンプリングすると、sampleプログラムでは「5,3,8」のように重複なしにデータが取り出されます。対して、samplerプログラムでは「5,5,2」のように同じデータが取り出される可能性があります。
重複なしのリサンプリング
先にsampleプログラムの説明になりますが、指定方法が2種類あります。1つはリサンプリング数を指定するだけの方法で、もう1つはデータ数も加えて指定する方法です。
実際の例で説明しましょう。ここに30年間の黒点数データ(30行×1列のデータ)がdata.txtファイルにあるとします。以下のrpn式はリサンプリング数だけを指定する方法です。
157
104
119
30件のデータから3つがランダムに取り出されていますね。次はデータ数を指定する方法です。事前にdata.txtに格納されているデータ数を調べておきます。上記のrpn式と同様に3つ取り出されています(実行毎に結果は異なります)。
115
145
2
通常は最初の使い方のほうが楽ですが、data.txtのデータ数が1000程度までしか扱えません。その場合は後者の方法を使用します。ただし、後者の方法でもリサンプリングできる数は1000程度までになります。
メモリ制約をなるべく回避するための仕様です。少量データならリサンプリング数だけを、大量データならデータ数とリサンプリング数を指定することで、かなりの範囲のリサンプリングに対応できます。
リサンプリングとブートストラップ法
さて、収集したデータは大抵な何らかの分布に従います。学業の成績などはガウス分布に従うことが知られていますし、故障が発生する分布も特定の分布に従います。
しかし、場合によっては分布がどのようになるのか分からないことがあります。大量のデータがあれば何とか推定はできるかもしれませんが、永遠にデータを収集し続けることはできませんし、調査費用の面からもある程度のデータ数で満足するしかありません。
分布の仮定があれば、厳密に平均値の信頼区間(95%の確率で確からしい範囲)を求めたりできるのですが、分布が分からないと厳しいものがあります。ただでさえ、分布が不明なのに少量のデータで平均値の推定なんてもっと無理なようにも思えます。
そんな時、便利な方法がブートストラップ法です。ブートストラップ法は標本集団(サンプル)からデータ抽出(リサンプリング)を繰り返して、母集団の性質を推定する面白い方法です。
正確にはノンパラメトリック・ブートストラップ法。
先のsampleプログラムでは重複のないデータを抽出しましたが、ブートストラップ法では重複ありのデータ抽出を行ないます。この処理に便利なのがsamplerプログラムです。
重複ありのリサンプリング
ブートストラップ法では標本数と同数をリサンプリングします。実際の例を見ると分かりやすいでしょう。30年の黒点データから30個データをリサンプリングしてみます。まずは30年の黒点データを再掲します。
155 154 140 115 66 45 17 13 29 100
157 142 145 94 54 29 17 8 21 64
93 119 111 104 63 40 29 15 7 2
30個のデータから30個をリサンプリングしてみます。
63 29 115 66 115 45 66 13 17 115
100 140 40 111 100 15 17 100 40 63
21 29 17 104 64 111 111 40 157 8
いくつか同じデータが選ばれていることが分かります。以下の指定でも同様な結果になります(実行毎に結果は異なります)。
155 154 154 140 140 115 66 66 17 13
157 142 145 94 29 17 8 8 21 64
111 104 104 40 40 40 15 7 2 2
samplerプログラムに指定するデータ数とリサンプリング数に関しては、sampleプログラムの制約に準じます。なお、仕様上はデータ数≧リサンプリング数であれば異なった数値を指定してもかまいません。
リサンプリングしたデータの平均を計算してみます。
79.0333
平均は79.0333個です。当然、実行するごとに平均値は変動します。
ブートストラップ法をrpnで実行
この計算を何度も繰り返して、リサンプリング集団の平均値を集めます。以下のようなrpn式でmean.txtファイルに平均値を格納していきます。
>rpn 30 -c sampler <data.txt | rpn -c mean >>mean.txt
:
(中略) n回繰り返す
:
>rpn 30 -c sampler <data.txt | rpn -c mean >>mean.txt
手作業で行なってもいいのですが、ブートストラップ法は通常1000回程度は繰り返すので、事前にバッチファイルを作っておいたほうが便利ですね。ただし、バッチファイルではsamplerを含むrpn式の間に1秒の空き時間を設定しています(乱数の初期化待ちのため)。
>rpn 1 -c sleep
>rpn 30 -c sampler <data.txt | rpn -c mean >>mean.txt
>rpn 1 -c sleep
:
(中略) n回繰り返す
:
>rpn 30 -c sampler <data.txt | rpn -c mean >>mean.txt
上のrpn式を1000行記録したバッチファイルをboot1000.batとして保存して、コマンド実行します。
:
(実行中)
:
>
バッチ処理が終了したら、データ行数と最後の5行を確認してみます。
1000
>rpn 5 -c tail <mean.txt
71.8667
70.0333
77.8
63
82.9667
正常に平均値が記録されているようですね。では、全部の平均を求めてみましょう。
71.7192
約72個が黒点数の年間平均数のようですね。
ブートストラップ法で黒点数の母平均を推定
さて、計算結果を母集団の平均としてみた場合、どのくらいの信頼性があるのでしょうか。リサンプリング集団から計算した平均値が母平均とぴったり同じと考えるのは楽観的過ぎます。
そこで、ある程度の危険率を許容した平均値の範囲(信頼区間)が分かると便利です。ブートストラップ法ではパーセンタイル法を使うことで、この信頼区間を求めることができます。
まず、リサンプリングして計算した平均値を昇順に並べ替えます。そして、95%信頼区間を考えるのであれば、2.5%と97.5%の位置にある数値を求めればOKです。とても簡単ですね。
2.5%と97.5%に位置する数値はちょっとしたrpn式の結合で、すぐに出てきます。
54
平均値のファイルをソートして、最初の25行(1000回の2.5%に相当)を取り出して、そして最後の1行を取り出せば、それが2.5%に位置する数値です。
90.3667
次に上記と同様にソートして、最後の25行(1000回の97.5%に相当)を取り出した後、最初の1行を取り出せば、それが97.5%に位置する数値になります。結果、母平均の95%推定区間は54個から90.3667個だと分かるわけです。
つまり、平年の黒点の年平均個数は95%の確率で、54個から90個の範囲にあります。逆に考えれば53個以下と91個以上は全体の5%しか発生しない異常な値と捉えることもできます。
ブートストラップ法は多少厳密さには欠けますが、分布を仮定せずに推定できるので、とても重宝する手法です。
sample, samplerともにリサンプリング数は1000個程度に収まるようにしてください。また、データ数を指定しない場合は標本集団のデータ数が1000個程度に収まるようにしてください。
本講座で使用したプログラムは、rpnマイスターパッケージとして購入することができます。fold', sortはユーティリティーパッケージに同梱されています。sleepはカレンダー・システムパッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。