統計学入門⑥ 標本と抽出手法

f:id:monozukuri-bu:20190520224024j:plain

猫に会いたくて猫スポットに出かけたのに全く出会えませんでした。
現実は厳しい。kibaraです。

さて、今回は標本とその抽出手法について学びます。

標本

辞書で「標本」と調べると、「代表的な例」などと出てきます。
統計学においては、調査したい対象となる集団を母集団と呼び、
母集団から選ばれた一部の集団を標本と呼びます。
この母集団の全てに対して調査を行うことを全数調査
母集団から標本を抽出して調査を行うことを標本調査とそれぞれ呼びます。

例えば、アビシニアンという種類の猫の平均体長を知りたいとします。
全てのアビシニアンの体長を計測して平均すれば算出可能ですが、
それは現実的ではありません。

実現可能な代替案としては、(地域差、食料量などの生育条件を考慮しないとすれば、)
手あたり次第100匹ほど計測すればそこそこまともな平均値が算出できそうです。

この例では世界中に生息するアビシニアン全体を母集団と言い、
手あたり次第計測した100匹が標本となります。
また、標本を抽出して調査を行っているので標本調査であり、
全世界のアビシニアンを本当に調べることができれば全数調査となります。

標本の抽出手法

標本の抽出にはいくつかの手法が存在し、
母集団のデータ構成、傾向に合った抽出手法を選択する必要があります。

各手法について簡単に解説と実装をしてみましょう。
なお、ここでは実装からイメージを掴むことを重視していますので、参考程度に眺めてください。

単純無作為抽出法

最も基本的な手法で、母集団全体から完全に無作為に抽出する手法です。
母集団の規模が大きい場合は抽出が難しい場合もあります。

import numpy as np

# 母集団:0~99で構成される100個の整数
parent_set = np.random.permutation(np.arange(100))

# 単純無作為抽出法
## 全ての要素が同じ確率で選ばれる
sample1_index = np.random.randint(0, 100, 10)
sample1 = parent_set[sample1_index]
print("単純無作為抽出法: ", sample1)
# 単純無作為抽出法:  [18  9 51  8 95 12 53 82 63 34]

系統抽出法

母集団から何らかの規則に従って抽出する手法です。
等間隔に抽出する方法が基本的なものになりますね。(等間隔法)
単純無作為抽出法よりは抽出コストが抑えられますが、 母集団の並びに規則性があると標本に偏りが生じる場合があります。

import numpy as np

parent_set = np.random.permutation(np.arange(100))

# 系統抽出法
## 最初だけ無作為で、それ以降は等間隔に選ぶ
start_point = np.random.randint(0,10)
sample2_index = np.arange(start_point, 100, 10)
sample2 = parent_set[sample2_index]
print("系統抽出法\t: ", sample2)
# 系統抽出法      :  [37  3 89  8 17 70 91 64 35 77]
# 母集団がソートされていた場合は以下のような結果に。
# 系統抽出法      :  [3  13 23 33 43 53 63 73 83 93]

集落抽出法

母集団をいくつかの集落に分割して、無作為抽出法または系統抽出法などで調査対象とする集落を決定する抽出手法です。
例えば、全国の市町村から調査対象とするエリアをいくつかピックアップするような場合に使用します。

import numpy as np

parent_set = np.random.permutation(np.arange(100))

# 集落抽出法
## 母集団をいくつかの集落に区切り、いずれかの集落を選ぶ
cluster_A = parent_set[:10]
cluster_B = parent_set[10:20]
##  ・・・
cluster_J = parent_set[90:100]

sample3 = cluster_B
print("集落抽出法\t: ", sample3)
# 集落抽出法      :  [ 3 60  2 55 68 71 54 21 19 23]

多段抽出法

段階的に抽出していく(調査対象を絞っていく)方法です。
抽出効率は良いですが、標本に偏りが生じる場合があります。

import numpy as np

parent_set = np.random.permutation(np.arange(100))

# 多段抽出法
## 母集団をいくつかのグループに分け、段階的に標本を抽出する
## 1段階目:母集団を3分割して無作為抽出する
group_1 = parent_set[:33]
group_2 = parent_set[33:67]
group_3 = parent_set[67:]
selected_group_A = np.random.permutation([group_1, group_2, group_3])[0]

## 2段階目:選んだ層をさらに3分割し、無作為抽出する
group_4 = selected_group_A[:11]
group_5 = selected_group_A[11:22]
group_6 = selected_group_A[22:]
selected_group_B = np.random.permutation([group_4, group_5, group_6])[0]

## 3段階目:選んだ層からさらに無作為に選ぶ
sample4_index = np.random.randint(0, len(selected_group_B), 10)
sample4 = selected_group_B[sample4_index]
print("多段抽出法\t: ", sample4)
# 多段抽出法      :  [18 58 56 32 36 75 74 35 75 38]
# 30番台、50番台、70番台で偏ってますね…

層化抽出法

母集団を特定のグループに分類し、それぞれから抽出します。
各グループの構成比で抽出数を決定する比例分配法と、構成比に加えて標準偏差も加味したネイマン法があります。
予め母集団の構成がわかっている必要があります

import numpy as np

parent_set = np.random.permutation(np.arange(100))

# 層化抽出法
## 母集団を層(レイヤー)に分けてそれぞれから抽出する
## 比例分配法
## 奇数と偶数のグループをつくる
odd_layer = np.sort(parent_set)[0:99:2]
even_layer = np.sort(parent_set)[1:100:2]

# それぞれ50個ずつなので、5個ずつ無作為に抽出する
odd_index = np.random.randint(0, len(odd_layer), 5)
even_index = np.random.randint(0, len(even_layer), 5)

sample_odd = odd_layer[odd_index]
sample_even = even_layer[even_index]

sample5 = np.hstack((sample_odd, sample_even))
print("層化抽出法\t: ", sample5)
# 層化抽出法      :  [ 2 48 72 96 34 87 63 81 13 71]
# 偶数と奇数が同数ずつ抽出できているのがポイント。

まとめ

今回は標本とその抽出手法について学習しました。
次回はこの標本を使った点推定、および区間推定にチャレンジします。