リサンプリング(再標本化) | package入門(rpnマイスター編) [講座] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 講座 | package入門 | ポテンシャルを飛躍的に高めるrpnパッケージを学習。

HOME > 講座 > package入門 > rpnマイスター編 > リサンプリング(再標本化)

hatena twitter facebook rss ソーシャルブックマーク

リサンプリング(再標本化)

 収集したデータの中から再度、データを抽出したい場合があります。例えば収集データが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式はリサンプリング数だけを指定する方法です。

  >rpn 3 -c sample <data.txt
  157
  104
  119


30件のデータから3つがランダムに取り出されていますね。次はデータ数を指定する方法です。事前にdata.txtに格納されているデータ数を調べておきます。上記のrpn式と同様に3つ取り出されています(実行毎に結果は異なります)。

  >rpn 30 3 -c sample <data.txt
  115
  145
  2


通常は最初の使い方のほうが楽ですが、data.txtのデータ数が1000程度までしか扱えません。その場合は後者の方法を使用します。ただし、後者の方法でもリサンプリングできる数は1000程度までになります。

メモリ制約をなるべく回避するための仕様です。少量データならリサンプリング数だけを、大量データならデータ数とリサンプリング数を指定することで、かなりの範囲のリサンプリングに対応できます。

リサンプリングとブートストラップ法

 さて、収集したデータは大抵な何らかの分布に従います。学業の成績などはガウス分布に従うことが知られていますし、故障が発生する分布も特定の分布に従います。

しかし、場合によっては分布がどのようになるのか分からないことがあります。大量のデータがあれば何とか推定はできるかもしれませんが、永遠にデータを収集し続けることはできませんし、調査費用の面からもある程度のデータ数で満足するしかありません。

分布の仮定があれば、厳密に平均値の信頼区間(95%の確率で確からしい範囲)を求めたりできるのですが、分布が分からないと厳しいものがあります。ただでさえ、分布が不明なのに少量のデータで平均値の推定なんてもっと無理なようにも思えます。

そんな時、便利な方法がブートストラップ法です。ブートストラップ法は標本集団(サンプル)からデータ抽出(リサンプリング)を繰り返して、母集団の性質を推定する面白い方法です。

正確にはノンパラメトリック・ブートストラップ法。

先のsampleプログラムでは重複のないデータを抽出しましたが、ブートストラップ法では重複ありのデータ抽出を行ないます。この処理に便利なのがsamplerプログラムです。

重複ありのリサンプリング

 ブートストラップ法では標本数と同数をリサンプリングします。実際の例を見ると分かりやすいでしょう。30年の黒点データから30個データをリサンプリングしてみます。まずは30年の黒点データを再掲します。

  >rpn 10 -c fold' <data.txt
  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個をリサンプリングしてみます。

  >rpn 30 -c sampler <data.txt | rpn 10 -c fold'
  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


いくつか同じデータが選ばれていることが分かります。以下の指定でも同様な結果になります(実行毎に結果は異なります)。

  >rpn 30 30 -c sampler <data.txt | rpn 10 -c fold'
  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プログラムの制約に準じます。なお、仕様上はデータ数≧リサンプリング数であれば異なった数値を指定してもかまいません。

リサンプリングしたデータの平均を計算してみます。

  >rpn 30 -c sampler <data.txt | rpn -c mean
  79.0333


平均は79.0333個です。当然、実行するごとに平均値は変動します。

ブートストラップ法をrpnで実行

 この計算を何度も繰り返して、リサンプリング集団の平均値を集めます。以下のようなrpn式でmean.txtファイルに平均値を格納していきます。

  >rpn 30 -c sampler <data.txt | rpn -c mean >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 30 -c sampler <data.txt | rpn -c mean >mean.txt
  >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として保存して、コマンド実行します。

  >boot1000.bat
      :
   (実行中)
      :
  >


バッチ処理が終了したら、データ行数と最後の5行を確認してみます。

  >rpn -c count <mean.txt
  1000

  >rpn 5 -c tail <mean.txt
  71.8667
  70.0333
  77.8
  63
  82.9667


正常に平均値が記録されているようですね。では、全部の平均を求めてみましょう。

  >rpn -c mean <mean.txt
  71.7192


約72個が黒点数の年間平均数のようですね。

ブートストラップ法で黒点数の母平均を推定

 さて、計算結果を母集団の平均としてみた場合、どのくらいの信頼性があるのでしょうか。リサンプリング集団から計算した平均値が母平均とぴったり同じと考えるのは楽観的過ぎます。

そこで、ある程度の危険率を許容した平均値の範囲(信頼区間)が分かると便利です。ブートストラップ法ではパーセンタイル法を使うことで、この信頼区間を求めることができます。

まず、リサンプリングして計算した平均値を昇順に並べ替えます。そして、95%信頼区間を考えるのであれば、2.5%と97.5%の位置にある数値を求めればOKです。とても簡単ですね。

2.5%と97.5%に位置する数値はちょっとしたrpn式の結合で、すぐに出てきます。

  >rpn -c sort <mean.txt | rpn 25 -c head | rpn 1 -c tail
  54


平均値のファイルをソートして、最初の25行(1000回の2.5%に相当)を取り出して、そして最後の1行を取り出せば、それが2.5%に位置する数値です。

  >rpn -c sort <mean.txt | rpn 25 -c tail | rpn 1 -c head
  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の姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

rpnマイスターパッケージ

マイスター

ユーティリティー

カレンダー

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn標準版(2kリビジョン)はダブルクォートで囲って下さい。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS」を参照ください。

注意rpnの障害情報と対策はこちら