確率の問題

http://www.nyasoku.com/archives/50352203.html
上のリンクで,問題の内容とそれに関する議論の傾向を十分把握した上で今日のブログを読むことを強くお勧めします.というか,そうしないと理解が難しい内容になっています.あらかじめご容赦ください.
この問題に関してググると私のブログの記事が上位に来るからか,
id:Cryolite:20050609
id:Cryolite:20050610
に対していくつかリンクが張られ,そのリンクで飛んでくる方が大勢いらしたのですが,どうもリンク元では私の上記のページの内容で私が伝えたかったことが正しく伝わっていないことが多いようです.特に,上記のページでは「10/49という答えに異論がない」という前提から話が始まっているにも関わらず,10/49な考え方の論拠(1/4な方々に対する説得材料)として引用されていたり,挙句には「10/49な人の一部に見られる論理に納得いかない」という1文を曲解したのか,なぜか「10/49という答えに納得できない」例としてリンクされ,さすがにちょっとよろしくないため,自分の意見を明確に以下に述べておきます.っていうかぶっちゃけちょっとぷんすかぷんなので多少煽り気味になっています.その点,ご容赦ください.

問題文


ジョーカーを除いたトランプ52枚の中から1枚のカードを抜き出し、表を見ないで箱の中にしまった。そして、残りのカードをよく切ってから3枚抜き出したところ、3枚ともダイアであった。

このとき、箱の中のカードがダイヤである確率はいくらか。

問題文の日本語の解釈

私の問題文の日本語に対する解釈,特に「このとき」が指示する内容についての解釈は次にとおりです.
「『このとき』という言葉が指す内容は1文目,及び2文目の内容を指す.」
これだけです.


ひよりちゃんはじぶんのおうちにいました.
そして,ひよりちゃんはゆきちゃんのおうちにあそびにいきました.
このとき,ひよりちゃんはどこにいますか?
という文章が与えられたときに,

「このとき」というのは,1つ前の文の事実は指さずに,2つ前の文の事実だけを指します.ですから,答えは「このときひよりちゃんはじぶんのおうちにいる」です.
という解答が通用する道理は無い,と思うからです.これ以上に説明のしようがないです.

「確率試行の結果が〜〜であった」という事実

「確率試行の結果が〜〜であった」,この場合「51枚から3枚引いたらダイアだった」というのは「ひよりちゃんはゆきちゃんのおうちにあそびにいきました」というのと全く同等に扱われるべき厳然たる事実であり,この意味において特別視される道理は全くないと私は考えます.また,この文章の2文目が述べている内容は,51枚から3枚を引くという試行を何度も繰り返し,そのうち3枚がダイアでなかった場合を棄却してきた,「このとき」というわけでは決してないと私は理解します(これと問題文に対する統計実験の方法を混同してはならないです).たまたま3枚引いたら3枚ともダイアだった,それ以上もそれ以下も意味していないと私は解釈します.
たまたま引いた3枚がダイアだった,という情報が得られたとしてそれがどうなるというのか?それが箱の中の1枚がダイアであるかどうかに何の意味があるのか?あります.極めて有用な情報がそこから得られます.これは以下に説明します.

より直感的に理解しやすい問題での説明


表が青のカードが1枚,赤のカードが4枚あります.これら5枚を裏向けて良く切った後,1枚を箱の中に入れます.
さて,あなたが今残りの4枚から3枚引いたとします.その3枚は全て赤でした.あなたはその事実からどういう論理を展開するでしょうか?私なら,例えば以下のように考えます.
「今,箱の中のカードが青であるか青でないかの可能性がある.今,箱の中が青でない場合,当然残りの山札に青のカードが1枚入っているはずである.ところが,その残りの山札から3枚引いたら赤しか得られなかった.この事実は残りの山札に青が入っていない可能性が高い,ということを示しているのではないだろうか?もちろん,残りの山札において確認しなかった1枚が青の可能性もあるが,その可能性は低い.ここから,箱の中のカードが青である可能性は高いと予測できるのではないだろうか?」
そして,実際に確率は 1/2 と計算されます.予測したとおり,元々の 1/5 より上がっています.
さて,ここで終わりません.この後,引いた3枚を引かなかった1枚と混ぜ,再び4枚として良くシャッフルします.そして,もう一度それら4枚から3枚を引くとまた3枚とも赤でした.
さて,あなたはこの事実を元に何を考えるでしょうか?私なら,例えば以下のように考えます.
「また3枚とも赤だ.先と同様な推論によって,いよいよ箱の中のカードが青である可能性が高くなったといえるだろう.もちろん,今回も4枚の中で引かなかった1枚が青の可能性があるのだけれども,前回と今回,ともに青が引かなかった1枚に入る可能性はかなり低い.ここから,箱の中にあるカードの色が青である可能性は相当高いのではないだろうか?」
さて,実際に箱の中のカードが青である確率を計算すると 4/5 となり,推論どおりさきほどよりさらに確率が上がっています.
ここで注意してほしいのは,この確率の計算ではもはや「2枚のうちのどちらかが1枚が青なので1/2」などという問題の置き換えを行えない,ということです.4枚から3枚を引いたら全て赤だったという確率試行の結果それ単体が,箱の中のカードが青である確率に影響を与えている,ということが示されています.
上記のように,確率試行の結果を確認するという行為はさらに繰り返し行え,そこから何らかの結果が得られた,という事実それ単体が箱の中のカードが青である確率に影響を与え続けます.
例えば,この4枚を良くシャッフルして3枚抜き出すと3枚とも赤だった,という事実が5回繰り返し得られた場合,箱の中の1枚が青である確率は 256/257 と極めて高いものになります.

元の問題に戻って

先の赤青のカードの例で示したとおり,確率試行の結果それ単体が,他の事象の確率に影響を与えます.元の問題文の「そして、残りのカードをよく切ってから3枚抜き出したところ、3枚ともダイアであった。」というのは,確率試行の結果が〜〜であったという事実であり,これは他の事象の確率を変えうる重要な情報を提供します.
ここで注意してほしいのは,3枚引いたときにダイアが3枚出たという場合以外の事実が得られた場合も箱の中の1枚がダイアかどうかに関する重要な情報が得られる,ということです.
例えば,3枚ともダイアでないという事実を確認した場合,残りの山札51枚において本来よりも若干ダイアが出にくい,つまり51枚からダイアが出る確率が1/4より小さいということの,弱いけれどもしかし確かな証拠なのではないだろうか?と考えられるわけです.つまりダイアの枚数が13枚である確率は下がり,12枚である確率は上がるのではないだろうか?と推論することができ,これから間接的に箱の中のカードがダイアである確率が上がると考えられるわけです.
また別の場合,例えばダイアが3枚中に1枚出た場合は,山札51枚においてダイアが若干出やすい傾向にあると考えられるわけです.というのは本来はトランプの山からダイアが出る確率は1/4で,3枚中1枚ダイアが出たというのは本来よりもダイアが出やすいということの,弱いけれどもしかし確実な証拠なわけです,つまりダイアの枚数が13枚である確率は上がり,12枚である確率は下がる,そしてそれは間接的に箱の中のカードがダイアである確率を下げる,以上のように推論することができるのではないかということです.
3枚中2枚がダイアだった場合は,3枚中1枚がダイアだった場合よりもさらに強く箱の中のカードがダイアでないという方向に働く証拠ではないだろうか?と考えられるわけです.
さて問題文は,これらの可能性がある中であえて3枚中3枚がダイアだった,そのような厳然とした事実が得られた中で,さて「このとき」と尋ねているわけです.3枚中3枚ダイアであるという事実は,上に列挙した考えから類推されるように「3枚中2枚がダイアだった場合よりもさらに強く箱の中のカードがダイアでないという方向に働く事実ではないだろうか?」と考察されるわけです.そして,「このとき」と問われているわけですから,「このとき」が指す内容として「3枚引いたら3枚ともダイアだった」という事実を除外する道理は無いと私は考えます.

1/4な方に賭けのお誘い

さて,話は突然ガラリと変わりますが,賭けのお誘いです.1/4な方々(の一部)の中で,どなたか私と賭けをやりませんか?賭けの内容は以下のようになります.
52枚のトランプから1枚引いてそれがダイアかダイアでないか私が宣言し,私の宣言が当たれば私の勝ち,それだけです.ダイアで当たる確率とダイアでない場合で当たる確率が同じでないため,公平になるように適当に倍率を調整します.というか,私が得る賞金の期待値が多少負になるように設定してもらっても構いません.
ただし,条件があります.1/4な方の一部は,「3枚引いてたまたま〜〜だった」という事実に一切意味がないとされています.そこで私は,箱の中の1枚がダイアであるかダイアでないか,その判断を行う前に残りの51枚をよく切った上でそこからから3枚を引いてその内容を確認させていただいた上,その3枚を残り51枚の山札に戻させていただきます.この行為は,箱の中のカードがダイアであるかダイアでないかの判断材料として意味はないと主張されているので,大丈夫かと思います.
さて,先ほどの行為は箱の中のカードに関する判断に全く関係が無いため,先の行為をもう1回繰り返してもやはり箱の中の1枚がダイアかどうかの判定材料にはならない,これはよろしいでしょうか?つまり,51枚の残りの山札を十分にシャッフルしてから,もう1回3枚をランダムに引いてその内容を確認した後,その3枚を山札に戻しても,やはり箱の中のカードがダイアかどうかに関する情報は何も得られませんから大丈夫かと思います.
さて,上から容易に類推されるとおり,この51枚をシャッフルして,そこから3枚抜き出してその内容を確認した後,その3枚を山札に戻す,という行為は,何回繰り返しても決して箱の中のカードに関する情報を与えることはない,こう理解されるかと思います.
以上を根拠に,この「51枚を良くシャッフルした後,そこから3枚を抜き出してその内容を確認した後,それら3枚を元の山札に戻す」という行為を私が飽きるまでやらせていただきます.だいたい,2000回ほどこれを繰り返させてもらうことになるかと思います.
え?お前は変人かって?そんなのこのブログ読んでたら分かるでしょ.三途の河原で変人が石積みをやっているのだと笑って見ていてくださいな.
以上が,賭けの条件です.
引いた3枚がダイアでなければ賭けを無効として最初からやりなおすんじゃないの?そんな馬鹿な.それは,この問題の傍証として提示される(1/4な方々の一部が否定される)マヤカシの統計実験プログラムと同じです.そんな賭けのやり直しに納得していただけませんよね?大丈夫です.そんなことは一切行いません.3枚引いた結果がどのようになろうとも,私は賭けをやりなおすようなことなど決してしません.51枚から3枚引いたらこんなん出ました,あっそ,ふーん,という厳然たる事実のみを何度も何度も確認し積み上げましょう.そしてその「全く無駄な行為の積み重ね」を元に,私はダイアであるか,ダイアでないか,そのどちらに賭けさせていただきます.
以上の賭けを行いたい方は行いたい方はお気軽に私にお申し出ください.
あ,本当にマジでやりたい方がいらっしゃれば日本国外で行うことになりますのであしからずご了承願います.
すぐに気付かれたかと思いますが,私が上の3枚を確認する行為でスートと番号を記録していけば,箱の中の1枚以外の51枚全部を確認した瞬間に箱の中のカードのスートが判明します.これを避けるため,実際にはスートに対応した色しか付いていないカード13枚ずつ4種類,計52枚でこの賭けを行います.
最後に,やった後で文句を言われると困るので補足しておきますが,上の「全く無駄な行為」を単に2000回繰り返した「このとき」,箱の中のカードがダイアであるかどうかを,およそ95%〜99.99%の確率で当てる自信がある,と主張しておきます.
ちなみに,もし許されるなら上の行為を10000回程度はやりたいのですけれどどうでしょうか?もしそれが許されるならば,99.999999999%以上の確率で箱の中がダイアかどうかを当てられる自信があるのですけれど.え?そんなこと10000回もやるのを待ってる時間が無い?それは残念です.

プログラム

プログラムを載せておきます.このプログラムは私が上記のような賭けを持ちかける根拠となるものです.1/4という計算結果を主張される方々の一部が「情報がない,価値が無い,無駄である」と主張する,51枚をシャッフルしてから3枚引いてその結果を確認し,引いた3枚を山札に戻す,という厳然たる事実を,回数ばかり「無駄に」延々と積み重ねているだけのプログラムです.3枚全てダイアでなければやりなおす,などといったことは一切していません.出力されるのは,1つ目がその「全く無意味な」事実の積み重ねから計算される「このとき」の箱の中がダイアである確率,2番目が実際に箱の中にあったカードです.

#include <ctime>
#include <cstdlib>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iomanip>


using namespace std;



bool isSpade( int card )
{
  return 0 <= card && card < 13;
}

bool isHeart( int card )
{
  return 13 <= card && card < 26;
}

bool isDiamond( int card )
{
  return 26 <= card && card < 39;
}

bool isClub( int card )
{
  return 39 <= card && card < 52;
}



int getNumberOf( int card )
{
  return card % 13 + 1;
}



string getKindStringOf( int card )
{
  if( isSpade( card ) ){
    return string( "spade" );
  }
  else if( isHeart( card ) ){
    return string( "heart" );
  }
  else if( isDiamond( card ) ){
    return string( "diamond" );
  }

  return string( "club" );
}



double updateBelief( double belief, int first, int second, int third )
{
  int num_diamonds = 0;
  num_diamonds += isDiamond( first ) ? 1 : 0;
  num_diamonds += isDiamond( second ) ? 1 : 0;
  num_diamonds += isDiamond( third ) ? 1 : 0;

  double p, q, r, x, y, z;

  if( num_diamonds == 0 ){
    p = 39.0;
    q = 38.0;
    r = 37.0;

    x = 38.0;
    y = 37.0;
    z = 36.0;
  }
  else if( num_diamonds == 1 ){
    p = 12.0;
    q = 39.0;
    r = 38.0;

    x = 13.0;
    y = 38.0;
    z = 37.0;
  }
  else if( num_diamonds == 2 ){
    p = 12.0;
    q = 11.0;
    r = 39.0;

    x = 13.0;
    y = 12.0;
    z = 38.0;
  }
  else if( num_diamonds == 3 ){
    p = 12.0;
    q = 11.0;
    r = 10.0;

    x = 13.0;
    y = 12.0;
    z = 11.0;
  }

  return 1.0 / ( ( 1.0 - belief ) / belief * x / p * y / q * z / r + 1.0 );
}



int main()
{
  srand( static_cast< unsigned int >( time( NULL ) ) );

  // Create the deck.
  vector< int > deck;
  for( int i = 0; i < 52; ++i ){
    deck.push_back( i );
  }

  // Shuffle the deck.
  std::random_shuffle( deck.begin(), deck.end() );

  // Put a card in the black box.
  int card_in_black_box = deck.front();
  deck.erase( deck.begin() );

  // Initial belief.
  double belief = 1.0 / 4.0;

  for( int i = 0; i < 10000; ++i ){
    std::random_shuffle( deck.begin(), deck.end() );
    //printTopThree( deck );

    belief = updateBelief( belief, deck[0], deck[1], deck[2] );
  }

  cout << setprecision( 15 )
       << "belief which the card is diamond: "
       << belief
       << endl;
  cout << "the card in the box: "
       << getKindStringOf( card_in_black_box )
       << ", "
       << getNumberOf( card_in_black_box )
       << endl;

  return EXIT_SUCCESS;
}

やっていることは極めて単純です.最初に,トランプの山 deck を用意します.次に, deck から1枚カードを抜いて箱に入れます(変数 card_in_black_box).次に変数 belief を 0.25 に設定します.これが箱の中のカードがダイアである確率です.初期値は説明するまでもないでしょう.51枚をシャッフルしてその中の3枚のスートを確認して(実際には3枚の中でダイアが何枚あるかしか見ていません),変数 belief を更新していく(updateBelief).これを延々繰り返します.終わり.
コンパイルして実行すれば分かりますが,10〜100回程度ではほとんど予測精度がありません.しかし,1000回を超えるあたりからほぼ確実な精度に達し,10000回も繰り返せば驚異的な予測精度を示すことになります.ただし,この推定法はノイズ,つまり,あまりありえない事象が起きた場合,その結果に簡単に引きずられる傾向を示します(例えば,それまで1000回の積み重ねで計算してきた確率が99%でも,ダイア3枚が出る事象が続けて2回起きただけで,推定される確率が急激に下がる).この「観測された事象に簡単に引きずられてしまう」現象をもうちょっとなんとかしようとする工夫もありますが省略.
このプログラムが示しているのは,51枚から3枚引くという確率試行の結果を確認するという行為が,箱の中のカードに関する極めて小さな,しかし確実に0ではない情報を提供する,ということです.そして,それ単体では何も情報が無いのとほとんど見分けが付かない微かな情報ですが,決して0ではありません.そしてそれらを膨大に積み上げると,それが0でないがゆえに,極めて凶悪な結果をもたらすことになる,ということを示しています.

実験結果を2つほど

「残り51枚をシャッフルして3枚サンプリングする」という,完全に事後における確率事象の結果を得るという操作のみを繰り返した場合に,箱の中がダイアである確率がどう変動するかの実験結果.つまり,上のプログラムで「箱の中のカードがダイアである確率」を各イテレーションで出力しプロットしたもの.
http://park7.wakwak.com/~cryolite/hatena/diamond.jpg
最初に引いて箱に入れた1枚が実はダイア(ダイアの2)だった場合.横軸はサンプリング回数.縦軸は箱の中の1枚がダイアかどうかの確率.
http://park7.wakwak.com/~cryolite/hatena/not_diamond.jpg
最初に引いて箱に入れた1枚が実はダイアでなかった(スペードの3の)場合.上に同じ.
上2つともに,箱にカードを入れた後の確率試行の結果のみから求めた,箱の中のカードがダイアであるかどうかの確率が,真の確率,つまりダイアである場合は1で,ダイアで無い場合は0に期待通り漸近していっています.すなわち,事後に得られる確率試行の結果というのは興味の対象である事象の確率に対する極めて重要な情報を持ちえる,ということが理解できるかと思います.

最後に

私が持ちかけた「賭け」の条件における詭弁は,51枚から3枚をサンプリングしても51枚のカードの中に関する(そして箱の中の1枚に関する)情報が全く得られない,0だ,というものです.だから,これをいくら繰り返しても無価値だ,0に何をかけても0だ.だからそれをやらせてください.
全くの詭弁です.
3枚のサンプリングの結果には,極めて小さいが確実に0ではない情報が存在します.51枚中に存在するダイアは12枚なのか13枚なのか.その識別をたった3枚のサンプリングで行うのは非常に困難なことです.しかし,そのたった3枚のサンプリングから得られる情報は決して0ではないのです.1つ1つが提供する情報は極めて小さく,それ単体では賭けの成否に関してほとんどノイズ程度の価値しか持ちえません.しかし,その小さな情報は確実に0でないがゆえに,膨大な数をかき集めると賭けの成否を決定的に制する情報にまで増幅されます.掲載したプログラムはそれを傍証します.
後に得られた情報で過去の事象の確率が変わることがない,そう主張する1/4な方.私の賭けに乗りませんか?マヤカシの統計実験プログラムがやっているような,「3枚引いてダイアじゃなかったらやりなおし」などという行為は一切行いません.また,あなたがたが計算する確率に基づいて計算した場合に,私が多少不利になるように設定してもらっても構いません.それでも私は喜んで賭けに乗ります.なぜなら,その不利を実質的に確実にひっくり返せるまで,情報を増幅することが許されているのですから.
「このとき」という言葉が,1文目のみを指し,2文目の内容は指示し得ない,そう解釈される方.2文目に記述されている「そして、残りのカードをよく切ってから3枚抜き出したところ、3枚ともダイアであった。」というのは,確率試行の結果を確認したということですが,これは他の確率に大なり小なり影響しうる厳然たる事実です.「3枚引いたら3枚ともダイアが出る,という条件が満たされるまで試行をしなおした」ということでは決してありません.そんなことは問題文にはどこにも記述されていません.それは統計実験の際のやりかたで本問題文とは一切無関係です.そもそもそのような試行だとするなら,出されるべき答えは1/4です.どうして,確率試行の結果という厳然たる事実がこの問題文で無視されるのか.そんな道理はない,私はそう思います.
そして10/49な方へ.49枚のうちに10枚あるから10/49,という論理は,注意深く運用しないと極めて危険な論理の飛躍となり,下手をすると誤りへの第1歩になる危険がある,と私は思います.ダイアだったその3枚を山に戻したのち,もう1度その51枚をシャッフルして3枚抜き出してください.それが3枚ともダイアだったとします.49枚中10枚だから10/49だ,理論はこの瞬間破綻します.確率を丁寧に計算してみてください.箱の中のカードがダイアである確率は 100/607 になりませんか?ちょっと客観的に考えてみてください.もう1度ランダムに3枚引いたら3枚ともダイアだったということは,山札に13枚ダイアがある確率がより高いという証拠になると思いませんか?その貴重な情報を無視しないでください.1/4な方と全く同じ論理に陥っています.ランダムに引いた3枚が全てダイアだったからこそ意味があります.箱の中の1枚に関する情報が得られています.必然として3枚がダイアだったわけではないです.
最後にもう一度だけ問題文を掲載しておきます.


ジョーカーを除いたトランプ52枚の中から1枚のカードを抜き出し、表を見ないで箱の中にしまった。
そして、残りのカードをよく切ってから3枚抜き出したところ、3枚ともダイアであった。
1文目の行為によって,箱の中のカードがダイアである確率は1/4となります.と同時に,51枚中にダイアが12枚ある確率が1/4,13枚ある確率が3/4となります.
2文目のうち51枚から3枚を取り出すという行為は,1文目の行為によって生じた51枚の中のダイアの枚数に関する確率の分布を3枚のサンプリングによって推定し,その結果から間接的に箱の中のカードがダイアである確率を推定しようとするもの,として捉えることができるかと思います.そしてその結果が3枚ともダイアであった,という厳然たる事実が得られ,この事実から残りの山札にダイアが12枚ある確率(これはもともと1/4でした)が若干下がり,残りの山札にダイアが13枚ある確率(これはもともと3/4でした)が若干上がるのではないか,と推定されるわけです.そして,この山札の中のダイアの枚数に関する確率は,間接的に(というかほぼ直接に)箱の中の1枚がダイアかどうかの確率に影響します.
このとき,箱の中のカードがダイヤである確率はいくらか.