K_DM Book
用語集
対象者 高校生
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

層化抽出(高校生向け)

入門高校生

01.8.2 高校生向け

層化抽出(高校生向け)

最終更新 2026-11-01 読了時間 2 分
まとめ
層化抽出は、母集団を学年や地域などのグループ(層)に分け、各層から母集団と同じ比率になるように人数を割り振って、層の中では無作為に選ぶ抽出法です。単純な無作為抽出では「たまたま 3 年生が少なすぎる」ような偶然の偏りが起きますが、層化抽出は比率を先に固定するのでその偏りが消えます。機械学習では、正解ラベルの比率を保ったまま訓練データとテストデータに分ける操作(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 年30050 %25〜35 人くらいで揺れる30 人
2 年20033 %14〜26 人くらいで揺れる20 人
3 年10017 %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 人の標本にすると、学年の比率は母集団と同じで、層の中はくじなのでほかの偏りも入りません。

flowchart LR A["母集団 600 人"] --> B["1 年 300 人"] A --> C["2 年 200 人"] A --> D["3 年 100 人"] B -->|"くじで 30 人"| E["標本 60 人"] C -->|"くじで 20 人"| E D -->|"くじで 10 人"| E

学年ごとの割り振りを、そのまま Python で計算してみます。

1
2
3
4
5
pop = {"g1": 300, "g2": 200, "g3": 100}     # 学年ごとの人数
n = 60                                       # 標本の大きさ
total = sum(pop.values())
alloc = {g: round(n * c / total) for g, c in pop.items()}
print(alloc)                                 # {'g1': 30, 'g2': 20, 'g3': 10}

機械学習では、「学年」のかわりに正解ラベルを層にします。迷惑メールが全体の 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 分割交差検証 です。