34.55

2011-02-02

2011年2月1日の奥村先生のツィート (http://twitter.com/h_okumura/status/32318708013600768) を、ゼミの前に目にした。最初、本当に期末試験に出したのかと思ってちょっと考えたが、成人の年齢の分布を決めないとどうしようもなさそう。

http://sumi.riise.hiroshima-u.ac.jp/skitch/ks-20110202-235433.png

同僚に聞いてみたら「34.55歳というのはアレですよ。ググってみて下さい」との答え。どうも検察審査会の委員の平均年齢の話らしい。

二度の委員の平均年齢が一致している以前に、成人日本人からランダムに11人選んで平均年齢が34.55才というのが信じがたい感じなので、計算してみることに。

元になる「成人の年齢の分布」は、統計局のWebサイトから得られる。

所謂「人口ピラミッド」のデータだ。20歳から99歳までの分布は下記のようになっている。

http://sumi.riise.hiroshima-u.ac.jp/skitch/ks-20110202-233138.png

この分布(何歳までを対象に抽出するかは、別途決める)から、11名無作為抽出した場合の合計年齢の分布を計算するプログラムを作ってみた。

#! /usr/bin/perl

use strict;

# $population[0] = 20才人口
# $population[1] = 21才人口
# …
# 2009年10月1日時点の、20才-99才の各歳の日本人口(単位 千人)。
# おそらく日本在住の人口で、日本国籍を持たない人も含んでいる。
# 元データは 統計局の人口推計 http://www.stat.go.jp/data/jinsui/2009np/

my @population = (
    1302, 1347, 1388, 1414, 1463, 1490, 1494, 1478, 1490, 1551,
    1589, 1653, 1698, 1783, 1869, 1966, 2002, 1964, 1918, 1864,
    1835, 1800, 1793, 1407, 1746, 1636, 1593, 1541, 1522, 1534,
    1564, 1521, 1481, 1560, 1613, 1614, 1717, 1812, 1922, 2068,
    2266, 2247, 2131, 1335, 1434, 1747, 1695, 1735, 1682, 1526,
    1320, 1402, 1429, 1417, 1342, 1251, 1233, 1181, 1115, 1032,
    978,  914,  847,  794,  703,  598,  522,  457,  393,  362,
    256,  228,  193,  163,  129,  106,   80,   59,   40,   29
    );

# どこまでを母集団と見なすか
#my $ln = 31; # 20歳〜50歳までのデータを利用
my $ln = 41; # 20歳〜60歳までのデータを利用
#my $ln = 46; # 20歳〜65歳までのデータを利用
#my $ln = 80; # 20歳〜99歳までのデータを利用


# 各歳の確率を @pr に入れる。
my $sum = 0;

for ( my $i=0; $i<$ln; ++$i ) {
    $sum += $population[$i];
}

my @pr=();
for ( my $i=0; $i<$ln; ++$i ) {
    $pr[$i] = $population[$i]/$sum;
}

# ランダムに一人選んで x 歳となる確率を $tab[x] に。
my @tab=();
for( my $i=0;$i<$ln;++$i){
    $tab[$i+20]=$pr[$i];
}

# ランダムに n 人を選んでその合計が x 歳となる確率が tab[x] になっているとき、
# n+1 名を選んで合計 z 歳となる確率は、sum_{i=0}^{ln}{tab[z-i]*pr[i]}
# 
# 以下のループ終了後、11人の合計年齢が x 歳となる確率が @tab に入る (p=tab[x])
my @tmptab;
for ( my $n=2; $n<=11; ++$n ) {
    for(my $i=20*($n-1);$i<=$#tab;++$i){
        for(my $j=0;$j<$ln;++$j){
            $tmptab[$i+$j+20] += $tab[$i]*$pr[$j];
        }
    }
    @tab = @tmptab;
    @tmptab=();
}

# @tab を全部足すと1になるはず…
$sum = 0;
for ( my $i=220; $i<=$#tab; ++$i ) {
    printf("%d,%12.10lf\n", $i, $tab[$i]);
    $sum += $tab[$i];
}
print("=====\nTotal: $sum\n");
 

これで、母集団を20歳〜60歳として計算してみると、11名の合計年齢は以下のような分布になる。

http://sumi.riise.hiroshima-u.ac.jp/skitch/ks-20110202-234438.png

何の工夫もない結構無理矢理なプログラムだし、精度は大丈夫かとも思うが、全部足すとほとんど1なので、まあ大丈夫だろう。

合計年齢380歳以下が、平均34.55歳以下になる部分(図の赤いところ)であり、その確率は0.042。5%はないが、全く起こりえないかというとまああっても不思議ではない。

で、二度続けて同じ平均値になる確率はもちろん低くて、220歳から380歳の間で、2度同じ合計年齢になる確率だから、上のコードへ以下のように追加して計算できる。

母集団を20歳〜60歳とした場合には、0.000055 という値になる。これは普通に考えたら起こりえない確率。

# 2度抽出して平均年齢が 34.55 以下の少数第2位まで同じ値になるのは、
# 合計年齢が同じになる場合だけ。
# すなわち、求める確率は合計年齢が 220〜380 のそれぞれで2度同じ値が出現する場合の和。
my $ans=0;
for ( my $i=220; $i<=380; ++$i ) {
    $ans += $tab[$i]*$tab[$i];
}

print "$ans\n";

これを書いている間に、奥村先生からの追加ツィートが。

「封筒の裏の計算」はいかしてるなぁ。ちなみに、実際の分布から計算した場合と、一様分布から計算した場合の差は以下の程度だった。

http://sumi.riise.hiroshima-u.ac.jp/skitch/ks-20110203-001813.png


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-02-03 (木) 00:27:22 (3063d)