01.8.2 高校生向け
層化抽出(高校生向け)
stratify)として毎日のように使われています。ただし層の分け方が調べたいことと無関係なら、効果はほとんどありません。こんな場面を想像してみよう #
生徒会が「文化祭の満足度アンケート」を全校 600 人のうち 60 人に取ることになりました。学年の人数は 1 年 300 人、2 年 200 人、3 年 100 人です。
名簿から 60 人をくじで選ぶと、3 年生は何人になるでしょう。比率どおりなら \(60 \times 100/600 = 10\) 人です。しかし、くじですから毎回 10 人になるわけではありません。確率で考えると、1 人が 3 年生である確率は \(1/6\) なので、60 人の中の 3 年生の人数は平均 10 人、標準偏差およそ 2.9 人。つまり、ふつうに起こる範囲で4 人から 16 人まで揺れます。3 年生だけが文化祭に不満だったとしても、4 人しか選ばれなければその声は埋もれてしまいます。
| 母集団 | 比率 | 単純な無作為抽出(60 人) | 層化抽出(60 人) | |
|---|---|---|---|---|
| 1 年 | 300 | 50 % | 25〜35 人くらいで揺れる | 30 人 |
| 2 年 | 200 | 33 % | 14〜26 人くらいで揺れる | 20 人 |
| 3 年 | 100 | 17 % | 4〜16 人くらいで揺れる | 10 人 |
右の列が層化抽出です。学年ごとの人数を 30・20・10 と最初に決めてしまい、各学年の中だけでくじを引く。4〜16 人と揺れていた 3 年生の人数が、毎回ぴたりと 10 人になります。
仕組み:先に割り振り、あとでくじ #
まず、層を決めます。全員が必ずどこか 1 つに入る分け方(学年・クラス・地域など)を選びます。次に、各層の人数を母集団の比率(50 %・33 %・17 %)どおりに割り振ります。標本の大きさ \(n\) に層の比率 \(N_h / N\) を掛けて \(n_h = n \times N_h / N\) とする計算です。続けて、各層の中で無作為抽出します。1 年の名簿から 30 人、2 年から 20 人、3 年から 10 人を、それぞれくじで選びます。最後に全部合わせて 60 人の標本にすると、学年の比率は母集団と同じで、層の中はくじなのでほかの偏りも入りません。
学年ごとの割り振りを、そのまま Python で計算してみます。
| |
機械学習では、「学年」のかわりに正解ラベルを層にします。迷惑メールが全体の 10 % しかないデータを訓練用 80 %・テスト用 20 % に分けるとき、層化しておけばテスト側にも迷惑メールがちょうど 10 % 入ります。層化しないと、運が悪ければテスト側の迷惑メールが数通しかなく、モデルの良し悪しをまともに測れなくなります。
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
最初の注意は、層が調べたいこと(ここでは文化祭の満足度)と無関係なら意味がないことです。「名簿の出席番号が奇数か偶数か」で層を作っても、満足度の推定は何も良くなりません。層の中の人が似ていて、層どうしがちがうほど、層化で 4〜16 人の揺れを消す効果が大きく出ます。二つ目は、層の中は必ず無作為(ランダム)に選ぶことです。「3 年生は仲のよい 10 人に頼む」では層化抽出になりません。比率を保つのは手段であって、「くじ引き」という偶然に任せる部分を残すことが層化抽出の本質です。三つ目は、小さすぎる層は割り振りが 0 人や 1 人になることです。母集団に 5 人しかいない層から 60 人中 0.5 人分を取ることはできないので、層を統合するか、意図的に多めに取って後で重みをつけるなどの工夫が必要です。四つ目は、層化しても標本が 60 人のように小さければ推定は粗いということです。比率を保つ効果と、人数を 600 人に増やす効果は別物です。
やってみよう #
最初の課題は、自分の学校の学年別人数を調べ、全校から 50 人を選ぶときの学年ごとの割り振りを計算することです。端数(12.5 人など)が出たらどう丸めるか考えてみましょう。二つ目は、サイコロを 60 回ふって「1 が出た回数」を数える実験を 5 回やってみることです。平均 10 回のまわりでどのくらい揺れるかが、単純な無作為抽出で 3 年生の人数が揺れる様子の再現になります。三つ目は、「層を間違えて決めた例」を 1 つ考えることです。たとえば血液型(A・B・O・AB)で層を作って文化祭の満足度を調べたとき、なぜ効果が出ないのか説明してみましょう。
つぎに読む #
scikit-learn の train_test_split(stratify=) と pandas での実装、ほかの抽出法との比較表は 標準版の層化抽出 で扱っています。中学で習う標本調査から復習したいときは 層化抽出(中学生向け) が入口になります。層化を「何回も分割を繰り返す」評価法に応用したものが 層化 K 分割交差検証 です。