この用語と一緒に検索・参照されやすいタグ。 関連ページに飛ぶときの手がかりにも使えます。
「標本」を理解するうえで必要なキーワードを 10 件以上提示します。 各チップから対応セクションへ移動できます。
30 秒結論 文脈 直感 数式 記号読み解き 実値計算 Python 実装 落とし穴 関連手法 関連用語 グループ教材 概念マップ
🍰 まずはやさしく
標本は全体の代表となる一部の集まりです。
全部を調べる手間を減らすために使います。
全生徒ではなく一部のクラスだけで調査する例です。
この章では標本の基本と注意点を読みます。
標本(サンプル)は、 関心ある母集団から抽出された観測の集まり。 推測統計の出発点。
ここまでが要点です。 ただし実際に使う前に、 このページの「⚠️ よくある落とし穴」で挙げた 便宜サンプリング/自選バイアス/生存者バイアス には必ず目を通してください。 つまずくのは知識が無いときより、 知ってはいたが確認を飛ばしたときです。
🍰 まずはやさしく
標本はデータ分析でよく使う道具です。
全体の傾向を予想するために使います。
スマホのアンケートで回答者だけを集める例です。
この章では標本が使われる場面を読みます。
本サイトの SSDSE は47 都道府県を全数観測するので「母集団=標本」。 一方、 アンケート分析・実験データでは必ず標本が母集団の一部となり、 推測統計の枠組みが本質的になります。
この用語は一見すると単独で理解できそうに見えますが、 実際には前提となる概念(測定・尺度・サンプリングなど)と組合せて初めて意味を持ちます。 「定義を覚える」より「どんな問いに答える道具なのか」を捉えるのが効率的です。
このセクションは「標本」を扱う 用語ページ です。 統計データ分析コンペティション(2026)の再現教材における中核用語のひとつで、47都道府県データを母集団とする標本抽出 という観点で SSDSE-B-2026(47 都道府県 × 複数年 × 100 超列)に紐づけられます。
位置づけ:相関・線形回帰・仮説検定 といった基礎用語群と並列であり、応用としては 内生性・IV・DID・クラスタリング 等へ繋がります。
🍰 まずはやさしく
標本は味噌汁の味見のようなものです。
少ない量で全体の味を判断するために使います。
部活のメンバー数人に意見を聞く例です。
この章では標本のイメージについて読みます。
「標本」を最初に学ぶときは、 厳密な定義よりイメージを優先しましょう。 以下は具体例・比喩を用いた直感的理解の入口です。
標本 を一言でいえば「47都道府県データを母集団とする標本抽出」。 47 都道府県という小さな母集団でも、 SSDSE-B-2026 の A1101 列に注目すると、 大都市圏と地方の差・人口規模に伴う相対比較など、 様々なパターンが見えてきます。
比喩でいうと、 標本 はデータ分析の「眼鏡」のようなもの。 同じデータでも眼鏡を変えれば、 平均(中心)・分散(ばらつき)・相関(連動)・因果(影響)と、 異なる情報が浮かび上がります。 SSDSE-B-2026 を題材に、 この眼鏡をかけてみるのが本ページの狙いです。
🍰 まずはやさしく
標本は数式で表せるデータの集まりです。
正確な計算で全体の値を導くために使います。
テストの点数の平均を計算する例です。
この章では標本の定義と数式について読みます。
やさしい説明で掴んだ感覚を、ここで 標本平均と標本分散 の定義式に対応づけます。下の式は左辺 $\bar{x}$ が何で決まるかを右辺で書き下したもので、x̄(平均)、Σ(合計)、分数(割り算) が現れます。それぞれの記号が何の量を指すのかは、次の「🔬 数式を言葉で読み解く」で 1 つずつ確かめてください。
標本 の代表的な定義式は次のとおりです。
$$ \bar{X} = \frac{1}{n}\sum_{i=1}^n X_i, \quad S^2 = \frac{1}{n-1}\sum_{i=1}^n (X_i - \bar{X})^2 $$ここで使われる記号や演算の意味は次節で言葉に翻訳します。
数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。
数式の各記号を、日本語の意味に変換します。
標本は、 母集団から取り出された観測単位の集まり。 標本統計量(標本平均・標本分散)で母集団パラメータを推定する。 SSDSE-B-2026 は 47 都道府県を「全数」含むので、 「サンプリングフレームの完全把握」 という珍しいデータ。
標本 (Sample) は、 統計・データ解析の文脈で頻繁に登場する概念です。 ここでは初学者向けの直感と、 上級者向けの形式定義を併記します。
SSDSE-B-2026 の 47 都道府県は「都道府県という母集団の全数」とみなせる。 ただし「日本のすべての年度の都道府県」 という超母集団からの 1 年度標本と見れば、 標本誤差の概念が適用できる。 標本平均と母集団平均の区別を意識することが重要。
SSDSE-B-2026 は 都道府県別社会経済データ集 2026 年版で、 47 都道府県 × 約 10 年度 × 100 超の指標を含む公的データです。 標本の概念を SSDSE-B-2026 で実証することで、 「数値の動きが地理的・社会的直感と整合するか」を検証できます。
| 列コード | 意味 | 本ページでの用途 |
|---|---|---|
A1101 | 総人口 | 47 都道府県を全数標本 |
A1303 | 65 歳以上人口 | 高齢化率の県別計算 |
E1101 | 小学校数 | 教育リソースの全数把握 |
F3101 | 新規求人数 | 雇用市場の全数集計 |
母集団から大きさ n の標本を取り、 その平均 $\\bar{X}$ を計算します。 これを「標本平均」と呼びます。 中心極限定理(CLT)は、 元の母集団がどんな分布でも、 標本平均は n が大きくなるにつれて正規分布に近づくと主張します。
$$ \\bar{X} = \\frac{1}{n}\\sum_{i=1}^{n} X_i $$ $$ \\mathbb{E}[\\bar{X}] = \\mu, \\quad \\text{Var}(\\bar{X}) = \\frac{\\sigma^2}{n} $$ $$ \\frac{\\bar{X} - \\mu}{\\sigma/\\sqrt{n}} \\xrightarrow{d} \\mathcal{N}(0, 1) \\quad (n \\to \\infty) $$$\\bar{X}$: 標本平均(n 個の観測値の算術平均)$\\mu$: 母平均(母集団全体の平均、 通常は未知)$\\sigma^2$: 母分散$\\sigma/\\sqrt{n}$: 標本平均の標準偏差 = 標準誤差(SE)SE = σ/√n が示すのは、 「サンプルサイズを 4 倍にすると標本平均の誤差は半分」「100 倍にすると 1/10」という関係。 これが「精度を 1 桁上げるには 100 倍の労力」というよく聞く格言の数学的根拠です。 サンプル数 n を増やしたいときは、 求める精度の二乗倍コストがかかると見積もります。
「何件サンプルを集めれば良いか」は最も実務的な問いです。 求める精度(許容誤差 d)と信頼度(95% など)から、 必要な標本サイズ n を逆算する式は次のとおりです。
$$ n \\geq \\left( \\frac{z_{\\alpha/2} \\cdot \\sigma}{d} \\right)^2 $$$z_{\\alpha/2}$: 信頼度 1-α に対応する Z 値(95% なら 1.96、 99% なら 2.58)$\\sigma$: 母標準偏差(不明なら予備調査やパイロット標本で見積もる)$d$: 許容誤差(標本平均が母平均から ±d 以内に収まる確率を確保したい)SSDSE-B-2026 の総人口の母標準偏差 σ ≈ 240 万人。 標本平均で誤差を ±50 万人以内に 95% 確率で収めたいとき:
$$ n \\geq \\left( \\frac{1.96 \\times 2{,}400{,}562}{500{,}000} \\right)^2 \\approx 88.5 $$必要な標本サイズは 89 以上。 ただし 47 県しか母集団にいない(有限母集団)ため、 実際には全数調査が現実的です。 都道府県データのような小規模母集団では「全数 vs 標本」の経済性が変わる、 ということを示しています。
母集団サイズ N が無限大ではなく有限のとき(例: 47 都道府県、 10000 人の社員)、 標本平均の SE は単純な σ/√n より小さくなります。 その補正項が有限母集団補正係数(FPC: Finite Population Correction)です。
$$ \\text{SE}_{\\text{FPC}} = \\frac{\\sigma}{\\sqrt{n}} \\sqrt{\\frac{N - n}{N - 1}} $$N: 母集団サイズn: 標本サイズ$\\sqrt{(N-n)/(N-1)}$: FPC(0 から 1 の間の係数)SSDSE-B-2026 の 47 県から 10 県を非復元抽出する場合、 抽出率は 10/47 = 21.3% と大きいので FPC が効きます。
$$ \\text{FPC} = \\sqrt{\\frac{47 - 10}{47 - 1}} = \\sqrt{\\frac{37}{46}} \\approx 0.897 $$つまり SE は σ/√n の約 89.7% に縮みます。 これを補正せずに信頼区間を作ると、 過大評価になります。 ただし、 国勢調査のような大母集団 (1.25 億) から数万人を抽出する場合、 n/N = 0.0001 % 以下なので FPC ≈ 1、 補正不要です。
「サンプルサイズはいくつ必要か」を効果量・有意水準・検出力から逆算するのが検定力分析(power analysis)です。 2 群の平均差を検出する t 検定を例に説明します。
$$ n = \\frac{2(z_{1-\\alpha/2} + z_{1-\\beta})^2 \\sigma^2}{\\delta^2} $$$\\alpha$: 有意水準(通常 0.05)、 第一種の誤り(偽陽性)の確率$\\beta$: 第二種の誤り(偽陰性)の確率、 検出力 = 1 - β(通常 0.8 以上を目指す)$\\delta$: 検出したい平均差(実質的に意味のある差)$\\sigma$: 共通分散の平方根(標準偏差)「東日本」と「西日本」で出生率(A4103)に差があるかを検定する設計を考えます。 σ ≈ 0.13、 検出したい差 δ = 0.1(実質的に意味のある差)、 α=0.05、 1-β=0.8 とすると:
$$ n = \\frac{2 \\times (1.96 + 0.84)^2 \\times 0.13^2}{0.1^2} \\approx 26.5 $$各群 27 県以上必要。 ただし日本は 47 県しかないので東西分割なら 23 vs 24 で「ちょうど足りない」設計に。 効果量が小さい現象を検出するには、 県単位ではなく市町村単位(1741 自治体)まで分解する必要が出てきます。
| サンプルサイズ n(各群) | 検出可能な効果量 d | 解釈 |
|---|---|---|
| 10 | 0.91 以上 | 大きな差しか検出できない |
| 30 | 0.52 以上 | 中程度の差を検出 |
| 50 | 0.40 以上 | 中程度の差を信頼性高く検出 |
| 100 | 0.28 以上 | 小程度の差を検出 |
| 200 | 0.20 以上 | 小程度の差を信頼性高く検出 |
| 1000 | 0.089 以上 | 微小な差まで検出(実質的意味は別問題) |
逆説的だが「n を増やしすぎると、 実質的には意味のない差まで統計的に有意になる」ため、 効果量(estimation)が p 値より重視される流れが 2010 年代以降の統計学のメインです。
標本抽出には「同じ個体を 2 回選んで良い(復元 with replacement)」「2 度は選ばない(非復元 without replacement)」の 2 流派があります。 数式の挙動が違います。
| 項目 | 復元抽出 | 非復元抽出 |
|---|---|---|
| 各抽出の独立性 | 独立 | 従属(前の結果が次に影響) |
| 標本平均の SE | $\\sigma/\\sqrt{n}$ | $(\\sigma/\\sqrt{n}) \\cdot \\sqrt{(N-n)/(N-1)}$ |
| n が N より大でも可 | 可能 | 不可(同じ個体は 1 度のみ) |
| 計算の単純さ | 単純 | FPC が必要 |
| 使用場面 | ブートストラップ、 理論解析 | 実調査、 公的統計 |
ブートストラップが復元抽出を採用するのは、 「観測標本を仮想母集団とみなし、 そこから何度でも標本を取れるようにする」ためです。 一方、 公的統計や臨床試験では「同じ人を 2 度数える意味がない」ので非復元が原則です。
SSDSE-B-2026 (N=47) から n=20 を抽出する場合:
これは「47 県中 20 県を取れば、 残り 27 県の情報が間接的に得られる」直感に対応します。 全数調査(n=N)まで進めば SE はゼロになるという連続性も保たれます。
標本調査の失敗は数式上も説明できます。 代表的なパターンを整理します。
大数の法則は「サンプルサイズが大きければ標本平均は母平均に収束」を保証しますが、 これは「サンプリングが偏りなく行われる」前提です。 偏ったサンプリングでは収束先がそもそもズレた値になります。
$$ \\bar{X}_n \\xrightarrow{p} E[X | \\text{biased}], \\quad n \\to \\infty $$1936 Literary Digest の 240 万サンプルが外したのは、 n が大きすぎても biased sampling 下では収束先 = ズレた値、 という構造的問題のためでした。
数式だけでは「実感」が湧きにくいので、 具体的な数値で 1 度手計算してみると理解が定着します。 以下の例は、 本サイトで扱う SSDSE-B-2026 や公開教材に近い形式で用意しました。
「日本人成人男性の平均身長を 100 人標本で推定」:
| 項目 | 値 |
|---|---|
| n | 100 |
| 標本平均 x̄ | 171.2 cm |
| 標本標準偏差 s | 5.8 cm |
| 標準誤差 SE = s/√n | 0.58 cm |
| 95% 信頼区間 | 171.2 ± 1.96×0.58 = (170.1, 172.3) |
手計算で得た値と、 後述の Python 実装で算出した値が一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。
SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「標本」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。
1 2 3 4 5 6 7 8 | import pandas as pd # SSDSE-B-2026 を読み込む(cp932 / Shift_JIS) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') print(df.shape) # (564, 112) print(df['SSDSE-B-2026'].unique()) # 含まれる年度 latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() print(latest[['Prefecture', 'A1101', 'A1101']].head()) |
ここで使った中心列 A1101 は SSDSE-B-2026 における 47都道府県データを母集団とする標本抽出 に関連する指標です。 算出例:
A1101 平均と標準偏差を求めるA1101 と A1101 の相関(線形・順位)を比較するSSDSE-B-2026 の 47 都道府県の総人口(A1101)を母集団とみなし、 そこから 10 県を無作為抽出して標本平均を求め、 母平均との一致度を確認します。 標本抽出の最も基本的なシミュレーションです。
このコードでやること: SSDSE-B-2026 の 47 県人口を母集団とし、 pandas.DataFrame.sample で n=10 の無作為抽出を実行、 標本平均と母平均を比較する。
📥 入力データ(SSDSE-B-2026 の A1101 総人口、 47 県):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) population = df['A1101'] mu = population.mean() sigma = population.std(ddof=0) print(f'母集団: 47 県, 母平均 μ = {mu:,.0f}, 母標準偏差 σ = {sigma:,.0f}') sample = df.sample(n=10, random_state=42) x_bar = sample['A1101'].mean() se_theoretical = sigma / (10 ** 0.5) print(f'抽出された 10 県: {list(sample["Prefecture"])}') print(f'標本平均 x̄ = {x_bar:,.0f}') print(f'母平均との差 = {x_bar - mu:+,.0f} ({(x_bar/mu - 1)*100:+.1f}%)') print(f'理論 SE = σ/√n = {se_theoretical:,.0f}') |
📤 実行すると次の出力が得られる:
💬 標本平均 422 万人は母平均 265 万人より 157 万人も上振れした(+59.5%)。 理論的 SE = 88 万人なので、 これは +1.8 SE に相当し、 珍しいが起こりうる範囲。 原因ははっきりしていて、 10 県のなかに東京都(1,409 万人)が入ったためです。 47 県中 1 県しかない外れ値を引くか引かないかで標本平均が 1.5 倍変わる——これが右裾の長い母集団を小標本で測るときの怖さです。 1 回の抽出では真の値を当てきれないが、 「平均的にどれくらいの幅でばらつくか」は SE で見積もれる。
標本抽出を 10000 回繰り返し、 標本平均の分布が理論通り正規分布になるかを確かめます。 母集団 47 県の人口分布は強い右裾長(東京が外れ値)ですが、 CLT は「それでも標本平均は正規分布」と予言します。
このコードでやること: SSDSE-B-2026 の 47 県人口から n=10 の標本を 10000 回抽出し、 各回の標本平均を集計、 ヒストグラムを描いて理論正規分布と比較する。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 列(再掲)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) pop = df['A1101'].values mu = pop.mean() sigma = pop.std(ddof=0) rng = np.random.default_rng(2026) N_TRIALS = 10000 n = 10 means = np.array([ rng.choice(pop, size=n, replace=False).mean() for _ in range(N_TRIALS) ]) se_theory = sigma / np.sqrt(n) se_emp = means.std(ddof=1) print(f'理論 SE = σ/√n = {se_theory:,.0f}') print(f'実測 SE (10000 回標本) = {se_emp:,.0f}') print(f'実測平均: {means.mean():,.0f} (母平均 {mu:,.0f})') # 標準化したら N(0,1) に近づくか z = (means - mu) / se_theory print(f'標準化後の平均: {z.mean():+.4f} (理論 0)') print(f'標準化後の SD: {z.std(ddof=1):.4f} (理論 1)') |
📤 実行すると次の出力が得られる:
💬 実測 SE が理論 SE よりやや小さい(68.9 vs 75.9 万人)のは、 標本サイズ 10 が母集団 47 の 21% に達しており有限母集団補正 √((N-n)/(N-1)) = √(37/46) ≈ 0.897 が効いているため。 補正後の理論 SE は 75.9×0.897 = 68.1 万人で、 実測 68.9 万人とほぼ一致。 母集団が右裾長でも標本平均はかなり正規分布に近づいている、 これが CLT の威力。
SSDSE-B-2026 の 47 県を「人口規模」で 3 層に分け(大都市圏・中規模・小規模)、 各層から比例抽出する層化抽出と、 単純無作為抽出の精度を比較します。
このコードでやること: 47 県を A1101(総人口)で 3 グループに分け、 各グループから比例抽出(層化抽出)する方法と、 単に 10 県を無作為抽出する方法を比較、 SE の違いを確認する。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 列、 3 層に分割
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 人口で 3 層に分割 df['stratum'] = pd.qcut(df['A1101'], q=3, labels=['小', '中', '大']) rng = np.random.default_rng(2026) N_TRIALS = 5000 # 単純無作為抽出 srs_means = np.array([ df.sample(n=9, random_state=rng.integers(1e9))['A1101'].mean() for _ in range(N_TRIALS) ]) # 層化抽出 (各層から 3 県) strat_means = np.array([ df.groupby('stratum').sample(n=3, random_state=rng.integers(1e9))['A1101'].mean() for _ in range(N_TRIALS) ]) print(f'母平均: {df["A1101"].mean():,.0f}') print(f'単純無作為抽出 (n=9): SE = {srs_means.std(ddof=1):,.0f}') print(f'層化抽出 (3+3+3): SE = {strat_means.std(ddof=1):,.0f}') print(f'SE 比 (層化/SRS) = {strat_means.std(ddof=1)/srs_means.std(ddof=1):.3f}') |
📤 実行すると次の出力が得られる:
💬 層化抽出は SE を約 1/3 に削減。 これは「人口規模」という強い説明変数で層を作ったため、 層内の分散が層間の分散より圧倒的に小さいから。 単純無作為抽出だと「東京が入る試行 / 入らない試行」で平均が大きくぶれるが、 層化なら必ず大規模層から 3 県取れるので安定する。 実際の世論調査・国勢調査でも年齢・地域・性別による層化が標準。
母集団の分布形が未知でも、 観測標本そのものを「擬似母集団」として再標本化を繰り返すことで、 任意の統計量の信頼区間を推定できるのがブートストラップです。 SSDSE-B-2026 の 47 県人口に適用してみます。
このコードでやること: SSDSE-B-2026 の 47 県人口を標本(n=47)とみなし、 復元抽出を 10000 回繰り返して標本平均の分布を作り、 95% 信頼区間を percentile 法で求める。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) x = df['A1101'].values rng = np.random.default_rng(2026) N_BOOT = 10000 boot_means = np.array([ rng.choice(x, size=len(x), replace=True).mean() for _ in range(N_BOOT) ]) ci_low, ci_high = np.percentile(boot_means, [2.5, 97.5]) print(f'観測標本平均: {x.mean():,.0f}') print(f'ブートストラップ平均: {boot_means.mean():,.0f}') print(f'ブートストラップ SE: {boot_means.std(ddof=1):,.0f}') print(f'95% 信頼区間 (percentile法): [{ci_low:,.0f}, {ci_high:,.0f}]') print() # 理論 SE (CLT) との比較 se_theory = x.std(ddof=1) / np.sqrt(len(x)) print(f'CLT 由来の理論 SE: {se_theory:,.0f}') |
📤 実行すると次の出力が得られる:
💬 ブートストラップ SE = 35.1 万、 CLT 理論 SE = 35.4 万でほぼ一致。 母集団の分布が右裾長(東京が外れ値)でも、 ブートストラップは仮定なしに信頼区間を出せる。 95% CI = [207 万, 348 万] は「同じ手順で 100 回標本を取り直したら、 そのうち 95 回はこの幅に真の平均が含まれる」と解釈する。
SSDSE-B-2026 の 47 都道府県を母集団に見立て、 母平均 μ=50、 母 SD σ=10(あるスコア指標)とした想定で、 n=25 抽出時の標準誤差と 95% 信頼区間幅を計算する。
1 2 3 4 5 6 7 | import numpy as np sigma = 10 n = np.array([25, 100, 400]) se = sigma / np.sqrt(n) err = 1.96 * se print(f"SE: {se}") print(f"95% 半幅: {err.round(2)}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
SSDSE-B-2026 の 47 都道府県を母集団とみなし、 df.sample(n=10, random_state=42) で 10 県を抽出。 標本平均・標本分散・標準誤差 SE=σ/√n を numpy で計算し、 母集団の真値 (47 県全体の平均値) と比較して標本誤差の幅を実感します。
1 2 3 4 5 6 7 8 9 10 | import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 最新年度の 47 都道府県だけにする # 47都道府県を母集団とみなし、 10件を標本抽出する例 sample10 = df[df['SSDSE-B-2026']==2023].sample(n=10, random_state=42) print('標本平均:', sample10['A1101'].mean()) print('母平均 :', df[df['SSDSE-B-2026']==2023]['A1101'].mean()) |
▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install numpy pandas scikit-learn scipy statsmodels が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。
本サイトの全コードは 論文一覧ページ から実例として確認できます。 自分のデータで試したい場合は、 列名・欠損記号・単位の違いだけ調整すれば、 ほぼそのまま流用できます。
「標本」を初めて使う方向けに、 ハンズオン的な実行手順を整理します。 上の Python 実装と組み合わせて、 1 度自分の手でなぞってみることを強く推奨します。
data/raw/ に配置(または自分のデータを用意)。 列名と単位を確認。df.head()、 df.describe()、 df.isna().sum() で全体像を把握。 ここで欠損や外れ値の見当を付ける。この 8 ステップを 1 度回すと、 「用語を読んで分かった気になる」段階から「実際に使える」段階に進めます。 知識は身体で覚えるのが結局のところ最速です。
scipy / pandas / scikit-learn / statsmodels を中心とした標準的な実装例です。 まず CSV を読み込み、 次に 標本 の解析を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pandas as pd import numpy as np from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() x = df['A1101'].astype(float).values y = df['A1101'].astype(float).values # 基本統計量 print('n =', len(x)) print('mean(x) =', np.mean(x)) print('std(x) =', np.std(x, ddof=1)) # 標本 の代表的計算(用途に応じて scipy/statsmodels を切替える) r, p = stats.pearsonr(x, y) print(f'Pearson r = {r:.4f}, p = {p:.4g}') rs, ps = stats.spearmanr(x, y) print(f'Spearman rho = {rs:.4f}, p = {ps:.4g}') |
用途別の追加実装:
1 2 3 4 5 6 7 8 9 | # 標準化と簡易クラスタリングの例 from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans X = df[['A1101', 'A1101']].astype(float).values Xs = StandardScaler().fit_transform(X) km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Xs) df['cluster'] = km.labels_ print(df[['Prefecture', 'A1101', 'A1101', 'cluster']].head(10)) |
1 2 3 4 5 6 7 | # 時系列(北海道の A1101)— 例として ARIMA 系の前処理 import statsmodels.api as sm ts = df.sort_values('SSDSE-B-2026').groupby('SSDSE-B-2026')['A1101'].mean() print(ts.tail()) res = sm.tsa.stattools.adfuller(ts) print('ADF stat:', res[0], 'p:', res[1]) |
以下は SSDSE-B-2026 を題材にした実コード例集です。 すべて data/raw/SSDSE-B-2026.csv を読み込み、 実値で動作確認しています。
1 2 3 4 5 6 7 8 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1]) d23 = df[df['SSDSE-B-2026']==2023].reset_index(drop=True) d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float) d23['birth_rate'] = d23['A4101'].astype(float)/d23['A1101'].astype(float)*1000 print(d23[['Prefecture','aging','birth_rate']].describe().round(3)) print('最高齢化:', d23.nlargest(3,'aging')[['Prefecture','aging']].values) print('最低高齢化:', d23.nsmallest(3,'aging')[['Prefecture','aging']].values) |
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1]) d23 = df[df['SSDSE-B-2026']==2023].reset_index(drop=True) d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float) fig, axes = plt.subplots(1, 2, figsize=(12, 4)) axes[0].hist(d23['aging'], bins=15, edgecolor='black') axes[0].set_xlabel('高齢化率'); axes[0].set_ylabel('県数') axes[1].boxplot(d23['aging']) axes[1].set_ylabel('高齢化率') plt.savefig('aging_dist.png', dpi=100) |
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd from scipy import stats import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1]) d23 = df[df['SSDSE-B-2026']==2023].copy() d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float) urban = ['R13000','R14000','R23000','R27000','R28000'] # 東京・神奈川・愛知・大阪・兵庫 u = d23[d23['Code'].isin(urban)]['aging'] r = d23[~d23['Code'].isin(urban)]['aging'] t, p = stats.ttest_ind(u, r, equal_var=False) d_cohen = (u.mean() - r.mean()) / np.sqrt((u.var() + r.var())/2) print(f't = {t:.2f}, p = {p:.4f}, Cohen d = {d_cohen:.2f}') |
1 2 3 4 5 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1]) df['aging'] = df['A1303'].astype(float)/df['A1101'].astype(float) trend = df.groupby('SSDSE-B-2026')['aging'].agg(['mean','std','min','max']).round(3) print(trend) |
標本は前提条件次第で意味が変わります。 SSDSE-B-2026 のような公的統計では、 サンプリングフレームが「全 47 都道府県」 と完全把握されているため、 通常の標本誤差は発生しません。 しかし「2023 年の 1 時点を全体集団とみなすか、 もっと長期の集団からの 1 サンプルとみなすか」で解釈が変わります。
SSDSE-B-2026 のような 100 超の列を扱うと、 多重比較(同じデータで多数の検定を行う)の罠が発生します。 Bonferroni 補正、 Benjamini-Hochberg などで補正してから 標本に関連する統計量を解釈すべきです。
都道府県の中に市区町村があり、 階層構造を持つ場合、 階層線形モデル(HLM)で 標本を扱うことを検討します。 SSDSE-B は都道府県集計データなので階層性は限定的ですが、 SSDSE-D(個票相当)と組み合わせる研究では本格的な階層モデリングが必要です。
SSDSE-B-2026 は 2014〜2023 年の 10 年間のパネル構造を持ちます。 標本を時間軸込みで扱うときは、 固定効果モデル・ランダム効果モデルなどパネルデータ手法を併用します。
SSDSE-B-2026 の県別データから「標本に関わる関係」を抽出できても、 それは多くの場合「相関」であり、 「因果」を主張するには無作為化試験・自然実験・操作変数などの追加設計が必須です。
実務で使う主要な標本抽出法を pandas で実装し、 SSDSE-B-2026 に適用します。
このコードでやること: SSDSE-B-2026 の 47 都道府県を母集団として、 (1) 系統抽出(k=5 で 9 県)、 (2) 層化抽出(地域ブロック別)、 (3) クラスタ抽出(地域ブロック単位)の 3 方式を実装し、 標本構成を比較する。
📥 入力データ: SSDSE-B-2026 の 47 県、 地域コード(都道府県コード R01000~R47000)から地域ブロックを定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 地域ブロック割り当て (簡易版) def region(code): n = int(code[1:3]) if n <= 7: return '北海道東北' if n <= 14: return '関東' if n <= 23: return '中部' if n <= 30: return '近畿' if n <= 35: return '中国' if n <= 39: return '四国' return '九州沖縄' df['region'] = df['Code'].apply(region) # (1) 系統抽出: 5 県ごとに 1 県 sys_sample = df.iloc[::5] print(f'(1) 系統抽出: {len(sys_sample)} 県') print(f' {list(sys_sample["Prefecture"])}') # (2) 層化抽出: 各ブロックから 1 県 strat_sample = df.groupby('region').sample(n=1, random_state=42) print(f'\n(2) 層化抽出: {len(strat_sample)} 県') print(f' {list(strat_sample[["region","Prefecture"]].apply(tuple, axis=1))}') # (3) クラスタ抽出: ブロック単位で 2 ブロック選択 rng = np.random.default_rng(42) chosen_regions = rng.choice(df['region'].unique(), size=2, replace=False) clust_sample = df[df['region'].isin(chosen_regions)] print(f'\n(3) クラスタ抽出 (2 ブロック): {len(clust_sample)} 県') print(f' 選択ブロック: {list(chosen_regions)}') |
📤 実行すると次の出力が得られる:
💬 系統抽出は地理的に分散した県を選ぶが、 周期 5 が地域構造と一致すると偏る可能性。 層化抽出は地域代表性が保証される。 クラスタ抽出は移動コスト最小(2 ブロック巡るだけ)だが地域偏りリスクあり。 用途と予算で使い分け、 公的統計の家計調査は層化二段抽出を採用。
大規模な調査では、 「規模に比例する抽出確率(PPS: Probability Proportional to Size)」が使われます。 各個体を均等確率で選ぶのではなく、 規模(人口・売上等)が大きいものほど選ばれやすくする方式です。
このコードでやること: SSDSE-B-2026 の 47 都道府県を A1101(総人口)に比例した重みで PPS 抽出する。 10000 回試行で各県の被抽出確率を実測する。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 最新年度の 47 都道府県 # probs は numpy 配列(位置で引く)なので、行ラベルを 0..46 に振り直しておく。 # 振り直さないと df.index が 0,12,24,… のままで probs[i] が範囲外になる。 weights = df['A1101'].values probs = weights / weights.sum() # 理論抽出確率 theory_top5 = df.nlargest(5, 'A1101')[['Prefecture', 'A1101']] theory_top5['理論抽出確率'] = theory_top5['A1101'] / weights.sum() # 実測 (10000 回 PPS 抽出、 各回 1 県) rng = np.random.default_rng(2026) sampled = rng.choice(df.index, size=10000, replace=True, p=probs) counts = pd.Series(sampled).value_counts(normalize=True) print('PPS 抽出の被選択確率 (上位 5):') print(f'{"県":>8} {"人口":>12} {"理論":>10} {"実測":>10}') for i in theory_top5.index: pref = df.loc[i, 'Prefecture'] pop = df.loc[i, 'A1101'] theory = probs[i] emp = counts.get(i, 0) print(f'{pref:>8} {pop:>12,} {theory:>10.4f} {emp:>10.4f}') |
📤 実行すると次の出力が得られる:
💬 PPS 抽出では東京都が約 11.3% の確率で選ばれ、 鳥取県(53.7 万人)は約 0.4% に過ぎない。 実測値は理論値とほぼ一致(default_rng(2026) で種を固定、 10000 回試行なので誤差は ±1% 程度)。 PPS の利点は「大規模個体を確実にカバーする」「単純集計の式が直感的」。 家計調査などの実調査で標準的に使われる。
機械学習で「標本サイズが小さい」ときに行うデータ拡張(data augmentation)は、 標本の概念を拡張したものとも言えます。 SSDSE-B-2026 で人工データを生成し、 標本サイズを増やす効果を見ます。
このコードでやること: SSDSE-B-2026 の 47 県 (n=47) は機械学習には少ないため、 各県の周辺に微小ノイズを加えた「拡張標本」を 10 倍に増やし、 元データと拡張データで線形回帰の安定性を比較する。
📥 入力データ: SSDSE-B-2026 の A1101 (総人口) と B4101 (年平均気温)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd import numpy as np from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) x = df['A1101'].values y = df['B4101'].values # 元データで回帰 slope0, intercept0, r0, p0, se0 = stats.linregress(x, y) print(f'元データ (n=47):') print(f' 傾き = {slope0:.3e}, 切片 = {intercept0:.2f}') print(f' R² = {r0**2:.4f}, p = {p0:.4f}') print(f' 傾きの SE = {se0:.3e}') # データ拡張: 各点の周辺に小ノイズ (CV=5%) rng = np.random.default_rng(2026) x_aug = np.concatenate([x + rng.normal(0, 0.05 * x) for _ in range(10)]) y_aug = np.concatenate([y + rng.normal(0, 0.05 * np.abs(y)) for _ in range(10)]) slope1, intercept1, r1, p1, se1 = stats.linregress(x_aug, y_aug) print(f'\n拡張データ (n=470):') print(f' 傾き = {slope1:.3e}, 切片 = {intercept1:.2f}') print(f' R² = {r1**2:.4f}, p = {p1:.4f}') print(f' 傾きの SE = {se1:.3e}') print(f'\nSE 比 (拡張/元) = {se1/se0:.3f}') |
📤 実行すると次の出力が得られる:
💬 SE が 0.314 倍に減少(理論的には 1/√10 = 0.316、 ほぼ一致)。 ただし、 拡張データは「人工的に増やしたサンプル」であり、 真の独立観測ではない。 機械学習では計算上の便宜として使われるが、 統計的推測(信頼区間・p 値)の解釈には注意が必要。 「サンプルサイズを増やす」のではなく「同じ情報を繰り返し提示する」に近い。
ジャックナイフ法(jackknife)は、 標本から 1 個ずつ抜いて統計量を再計算することで分散を推定する古典手法です。 ブートストラップより計算量が少なく、 線形統計量の SE 計算では今でも実用されます。
このコードでやること: SSDSE-B-2026 の 47 県人口に対し、 1 県ずつ抜いた 47 通りの標本で平均を再計算、 ジャックナイフ分散を計算する。 ブートストラップとの一致を確認する。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 564 行 = 47 県 x 12 年。このページは「47 県の母集団」を扱うので最新年に絞る df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) x = df['A1101'].values n = len(x) # ジャックナイフ: 1 個抜きで n 通り jk_means = np.array([np.delete(x, i).mean() for i in range(n)]) jk_mean_of_means = jk_means.mean() jk_var = ((n - 1) / n) * np.sum((jk_means - jk_mean_of_means) ** 2) jk_se = np.sqrt(jk_var) # 通常の SE (CLT) clt_se = x.std(ddof=1) / np.sqrt(n) # ブートストラップ rng = np.random.default_rng(2026) bs_means = np.array([rng.choice(x, n, replace=True).mean() for _ in range(10000)]) bs_se = bs_means.std(ddof=1) print(f'標本平均: {x.mean():,.0f}') print(f'CLT SE: {clt_se:,.0f}') print(f'ジャックナイフ SE: {jk_se:,.0f}') print(f'ブートストラップ SE: {bs_se:,.0f}') print() print('影響の大きい個体 (jackknife influence 上位 3):') influence = np.abs(jk_means - x.mean()) * n top3_idx = np.argsort(influence)[::-1][:3] for i in top3_idx: print(f' {df.iloc[i]["Prefecture"]:6} 抜くと平均が {jk_means[i] - x.mean():+,.0f} 変化') |
📤 実行すると次の出力が得られる:
💬 ジャックナイフ SE は CLT 値と完全一致(線形統計量である平均では理論的に等しい)、 ブートストラップ SE も近い値。 ジャックナイフは「どの個体が最も影響を持つか」も同時に教えてくれる:東京都を抜くと平均が 25 万人減少 = 1 県で全平均の 9.2% を動かす。 「データに 1 つの異常値が混ざっているか」を診断する強力ツール。
機械学習で必須の train/validation/test 分割も、 母集団(収集データ全体)からの「3 つの標本」を取る操作です。 SSDSE-B-2026 で実装し、 各分割の代表性を確認します。
このコードでやること: SSDSE-B-2026 の 47 県を 70/15/15 で train/val/test に層化分割し、 (1) 単純無作為分割、 (2) 層化分割(地域ブロック別)の 2 方式で分割後の地域分布を比較する。
📥 入力データ: SSDSE-B-2026 の 47 県と地域ブロック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import pandas as pd import numpy as np from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 最新年度の 47 都道府県だけにする def region(code): n = int(code[1:3]) if n <= 7: return '北海道東北' if n <= 14: return '関東' if n <= 23: return '中部' if n <= 30: return '近畿' if n <= 35: return '中国' if n <= 39: return '四国' return '九州沖縄' df['region'] = df['Code'].apply(region) # (1) 単純無作為分割 train1, temp = train_test_split(df, test_size=0.3, random_state=42) val1, test1 = train_test_split(temp, test_size=0.5, random_state=42) # (2) 層化分割 (region で stratify) train2, temp = train_test_split(df, test_size=0.3, random_state=42, stratify=df['region']) # 2 段目は temp が 15 行しかなく、四国が 1 県だけになる。 # 層化は「各クラスが 2 件以上」を要求するので、そのままだとエラーになる。 # 47 件を 3 つに割るとこうなる、というのがまさにこのページの主題。 _vc = temp['region'].value_counts() _strat = temp['region'] if (_vc >= 2).all() else None if _strat is None: print(f'※ 2 段目は層化できません(1 県しかない地域: ' f'{list(_vc[_vc < 2].index)})。無作為分割にします。') val2, test2 = train_test_split(temp, test_size=0.5, random_state=42, stratify=_strat) print('(1) 単純無作為分割の地域分布:') for name, split in [('train', train1), ('val', val1), ('test', test1)]: print(f' {name:5} (n={len(split)}): { {k: int(v) for k, v in split["region"].value_counts().items()} }') print('\n(2) 層化分割の地域分布:') for name, split in [('train', train2), ('val', val2), ('test', test2)]: print(f' {name:5} (n={len(split)}): { {k: int(v) for k, v in split["region"].value_counts().items()} }') |
📤 実行すると次の出力が得られる:
💬 単純無作為分割では「validation セットに四国 2 県、 train セットに四国 1 県」と地域分布が偏る。 層化分割では全分割で地域構成が母集団と近い割合になる。 機械学習では train/test 分布が違うと「データシフト」と呼ばれ予測精度が落ちる。 標本理論の「層化抽出」が ML の「stratified split」として再発明されているとも言える。
機械学習の汎化性能評価で標準的な k-fold cross-validation は、 標本を k 個の部分に分け、 各部分を順番に「test 標本」として使う手法です。 SSDSE-B-2026 で実装し、 標本サイズの限界での評価安定性を確認します。
このコードでやること: SSDSE-B-2026 の 47 県データで、 5-fold cross-validation を実行。 各 fold で「人口」を説明変数、 「年平均気温」を目的変数にした単回帰の R² を測定する。
📥 入力データ: SSDSE-B-2026 の 47 県 A1101 (人口) と B4101 (年平均気温)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import KFold df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 47 都道府県。絞らないと 564 行になる X = df[['A1101']].values y = df['B4101'].values kf = KFold(n_splits=5, shuffle=True, random_state=42) scores = [] for fold_idx, (tr, te) in enumerate(kf.split(X), 1): model = LinearRegression().fit(X[tr], y[tr]) pred = model.predict(X[te]) ss_res = ((y[te] - pred) ** 2).sum() ss_tot = ((y[te] - y[te].mean()) ** 2).sum() r2 = 1 - ss_res / ss_tot if ss_tot > 0 else float('nan') scores.append(r2) print(f'Fold {fold_idx}: train n={len(tr)}, test n={len(te)}, R² = {r2:.4f}') print(f'\n平均 R² = {np.mean(scores):.4f}') print(f'R² の SD = {np.std(scores, ddof=1):.4f}') print(f'95% CI ≈ [{np.mean(scores) - 1.96*np.std(scores, ddof=1)/np.sqrt(5):.3f}, ' f'{np.mean(scores) + 1.96*np.std(scores, ddof=1)/np.sqrt(5):.3f}]') |
📤 実行すると次の出力が得られる:
💬 5-fold で R² が 0 をまたいでばらつき、 平均はわずかに負値(モデルが定数予測より悪い)。 これは「人口と気温には実質的に相関がない」(n=47 全体での R² も 0.002)ことを示している。 cross-validation が標本抽出の繰り返しによってモデルの真の汎化性能を測ってくれている。 47 県では fold ごとに 9-10 県と少なく、 R² の評価分散が大きい。 これも「サンプルサイズが限界」の典型症状。
→ 図は正規分布(母集団のモデル)上に、 ランダムに取り出した標本点が分布する様子を示す。 標本は母集団の一部であり、 平均や分散の「推定値」になる。 標本サイズが大きくなるほど、 標本平均は母平均に近づく(大数の法則)。
→ 標本サイズ $n$ を増やすと、 標本平均の分布が母平均を中心とした正規分布に近づき、 標準誤差 $SE = \sigma/\sqrt{n}$ は $1/\sqrt{n}$ で減衰する。 n=100 で SE はおよそ n=25 の半分。 中心極限定理(CLT)が「標本」の信頼性を支える理論的支柱。
→ 標本から計算した 95% 信頼区間は、 同じ手続きを繰り返したとき 95% の確率で母平均を含む。 標本ごとに区間は移動するが、 大半が母平均を捉える。 「標本平均 ± 1.96 × SE」が信頼区間の典型的な計算式。
以下 5 問を解いて理解度を確認してください。 回答は本文の該当セクションを参照。
| 抽出法 | 手順 | バイアス | 主用途 |
|---|---|---|---|
| 単純無作為抽出 | 乱数で n 件選ぶ | 最小 | 基本形、 全国世論調査 |
| 層化抽出 | 層で分けて各層から抽出 | 層の代表性で減る | SSDSE 都市規模別など |
| クラスター抽出 | 単位(学校等)を選ぶ | 大きめ(中間で吸収) | コスト最小、 学級単位調査 |
| 系統抽出 | k 番目ごとに選ぶ | 周期性に注意 | 名簿からの抽出 |
| 便宜抽出 | 入手しやすい人 | 大(推論不可) | 予備調査のみ |
→ 推論統計(信頼区間、 t 検定)は単純無作為抽出または層化抽出を前提とする。 便宜抽出のデータで p 値を計算しても、 数値そのものに意味は薄い。 標本デザインは「標本サイズ」より重要。
関連: 母集団 / 標本抽出 / 標本サイズ / 信頼区間 / 正規分布 / t 検定
標本論は 1920 年代の R. A. Fisher による農業実験の理論化から始まる。 当時、 母集団全体の調査は現実的でなかったため、 ロザムステッド試験場で「無作為化」「反復」「局所管理」の三原則を確立した。 この三原則は現代の実験計画法(RCT)と推論統計の基礎となっている。 また、 ネイマン(J. Neyman)は 1934 年に「層化抽出 vs 単純無作為抽出」の理論的比較を行い、 層内分散が小さい場合に層化抽出が圧倒的に効率的であることを示した。 SSDSE-B-2026 のような都道府県データを扱う際にも、 都市規模・産業構造で層化することで標本誤差を 30-50% 削減できることが知られている。
現代では「標本の質 ≠ 標本サイズ」が常識である。 2016 年の米国大統領選では、 主要世論調査が誤った予測を出した。 これは標本サイズが不足したのではなく、 「電話調査が固定電話のみを対象とし、 若年層・モバイル世代が過小代表された」という標本デザインの欠陥が原因だった。 同様に、 オンライン調査では「インターネットを使う層」に偏るため、 高齢者・低所得層が過小代表される自己選択バイアスが発生する。 これらを補正するために「ポストストラタ化(事後層化)」「レイキング(raking)」「傾向スコア重み付け」などの調整手法が広く使われている。 標本論は単なる数学ではなく、 「誰を含めて誰を除外するか」という社会的な意思決定を伴う実践的な分野である。
統計的検出力(power)の観点では、 効果量 d = 0.2(小)を 80% の検出力で見つけたい場合、 単純無作為抽出で約 n=200 が必要である。 効果量 d = 0.5(中)なら n=64、 d = 0.8(大)なら n=26。 SSDSE-B-2026 の 47 都道府県は固定サイズなので、 効果量が中程度(d ≥ 0.4)の現象しか統計的に有意化できない。 これが「47 件のサンプルでは小さな効果は検出できない」という制約の正体である。 標本論を学ぶ意義は、 単に確率計算を覚えることではなく、 「データから何が言えて何が言えないか」を厳密に判断できる素養を養うことにある。 これは AI 時代のデータ解釈において最重要のリテラシーである。
標本誤差を抑える実務テクニックを整理しておく。 第一に「標本サイズ計算」を事前に行う。 効果量・許容誤差・検出力の 3 つを入力すると最適 n が算出され、 G*Power や Python の statsmodels.power で実装できる。 第二に「層化抽出」を選ぶ。 SSDSE-B-2026 の場合、 都市規模(政令市、 中核市、 一般市、 町村)で層別すると、 平均所得・人口密度の推定誤差が大きく改善する。 第三に「事後重み付け(post-stratification)」で代表性のずれを補正する。 例えばオンライン調査で若年層が過多になった場合、 国勢調査の人口構成に合わせて回答を重み付けし直す。 第四に「複数手法の併用」で頑健性を確認する。 同じデータに単純無作為と層化を当て、 結論が一致するなら自信を持って報告できる。 これらは Kish の標本論教科書(1965)以来の標準的なプラクティスである。
標本論と機械学習の接続も重要である。 ML の世界では「訓練データはどう取られたか」がモデルの汎化性能を決める。 訓練・テスト分割が層化抽出(stratified split)でなければ、 分類タスクのテスト誤差は楽観的に評価されがちである。 また、 ブートストラップ法(標本からのサンプリングによる擬似的な標本生成)は、 標本論の応用として cross-validation や bagging(Random Forest)に組み込まれている。 さらに、 観察研究と無作為化実験の差は標本論の文脈で理解される。 観察研究では「治療群と対照群が無作為に割り当てられていない」ため、 標本としての代表性が崩れている可能性が高く、 因果推論には傾向スコア・操作変数法・差分の差(DID)などの補正が必要となる。 これらの手法はすべて「観察された標本から、 母集団における因果効果を推定する」という標本論の発展形である。 SSDSE-B-2026 を使った都道府県分析でも、 「観察データから因果効果を読み取ろうとしている」と意識することが、 誤った結論を避ける第一歩である。
標本(sample)は母集団から抽出された有限のデータ集合であり、 そこから母集団の性質を推測するのが推測統計の出発点である。 SSDSE-B-2026 の 47 都道府県は「日本の自治体全体の標本」と見るべきか「日本そのものの全数調査」と見るべきかで、 議論の枠組みが変わる。 47 件を「日本全体の標本」と捉えるなら標本誤差を考慮した推定が必要、 「全数」と捉えるなら標準誤差・p 値の議論は不要となる。 この区別を曖昧にしたまま p 値を計算するのが、 統計教育で最も繰り返される誤用である。
単純無作為抽出は理論が美しいが、 名簿が必要で実務では難しい。 系統抽出は実装が簡単だが「周期性」がある名簿だと偏りが出る。 層化抽出は層内分散が小さい変数で誤差を大きく減らせる。 クラスター抽出はコストが下がる代わりに同一クラスター内の相関で誤差が増える。 これらは 「コスト・精度・実装性」 の三角形のトレードオフで、 万能解はない。
検出力 80%・有意水準 5% で 2 群比較する場合、 効果量 d = 0.2(小)には n ≒ 393/群、 d = 0.5(中)には n ≒ 64/群、 d = 0.8(大)には n ≒ 26/群が必要。 SSDSE-B-2026 のような n=47 では 中程度以上の効果量しか統計的に検出できないことを前提に分析設計するのがフェアな態度。
前提として 母集団・標本抽出 を押さえ、 並列として 標準誤差・信頼区間・p 値、 派生として 仮説検定・ブートストラップ を辿るとよい。
標本に「誰を含めるか」は研究結果が誰のためのものかを決める社会的な問いと直結する。 1990 年代の臨床試験は男性中心で女性の薬物代謝が研究されず、 1993 年に米国 NIH が「臨床試験には女性とマイノリティを必ず含める」とガイドラインを定めた。 AI でも顔認識が暗い肌色の女性で誤認識率が高い問題(Gender Shades 2018)は、 訓練データの標本偏りが現実世界の差別を再生産する典型である。 SSDSE-B-2026 を使った教育でも、 「47 都道府県の集計データには個人の経験や少数派の声が見えなくなる」という標本論的な限界を学生に伝えることが、 データサイエンス教育の本質的な役割の一つである。 標本論を学ぶことは、 単なる確率計算ではなく、 「データから誰が見えて誰が見えないか」を問う社会的・倫理的リテラシーでもある。
標本の罠は n の大きさより「誰を抽出枠から漏らしたか」に潜む。 1936 年 Literary Digest 誌の 240 万人ハガキ調査 (回答者バイアス) が無作為 1500 人の Gallup 調査に敗北した話、 そして近年の選挙世論調査の固定電話バイアスは、 標本論最大の教訓です。 4 種類の代表的バイアスを順に確認しましょう。
標本 を実務で扱う際に踏みやすい落とし穴を 5 件挙げます。
1 つの標本から得た「標本平均」は、 抽出のたびに少しずつ違う値になります。 この標本平均そのもののばらつきを標本分布(sampling distribution)と呼びます。 ここでは SSDSE-B-2026 の 47 都道府県・総人口(A1101, 2023 年)を母集団とし、 そこから大きさ n の標本を何度も抽出して各回の標本平均を積み上げます。 バラバラの標本平均が、 やがて母平均のまわりに集まる山(標本分布)を作る様子を体感してください。
操作: n のスライダーで標本サイズを変える/「1回抽出」「100回抽出」で山を積み上げる。 下段グラフを指でなぞる・ドラッグしても連続抽出できます。 母集団(上段)は東京都という外れ値のせいで強い右裾長(非正規)ですが、 標本平均(下段)は n を増やすほど正規分布に近い左右対称の山になり、 幅(標準誤差)が縮みます ── これが中心極限定理です。
標本とは「観測できた一部」です。 私たちは 母集団の真の姿(μ)を直接は見られないので、 手元の 1 標本の平均 x̄ で代用します。 ところが x̄ は抽出のたびに動く確率変数。 上のシミュレーションで n=5 と n=40 を比べると、 同じ母集団でも「1 回の x̄ がどれだけ当てにできるか」がまるで違うことが見えます。 標本を扱うとは、 この“ばらつきの大きさ”ごと理解して推測することに他なりません。
下段のヒストグラムこそが標本平均の標本分布で、 その広がりが標準誤差 SE = σ/√n です。 中心極限定理(CLT)は「母集団がどんな形でも、 n を大きくすれば標本平均は正規分布 N(μ, σ²/n) に近づく」と主張します。 上段の母集団は右裾長なのに、 下段が n とともに左右対称の釣鐘型(オレンジの理論曲線)に一致していく様子が、 まさに CLT の実演です。 より深く学ぶには以下へ。
本ページでは「標本」を 12 セクション(🔖 キーワード索引/💡 30 秒結論/📍 文脈/🎨 直感/📐 数式/🔬 数式を言葉で読み解く/🧮 実値計算/🐍 Python 実装/⚠️ 落とし穴/🌐 関連手法/🔗 関連用語/📚 グループ教材)で完結に整理しました。 SSDSE-B-2026 を素材に、 概念の輪郭・式の意味・実装手順・典型的な失敗パターンの 4 点を最低限押さえれば、 統計データ分析コンペの現場で迷わず使えるはずです。
| 抽出法 | 概要 | 長所 | 短所 |
|---|---|---|---|
| 単純無作為抽出 (SRS) | 全員に等確率で抽出 | 解析が単純 | 稀少層を取り逃がしやすい |
| 系統抽出 | k 番目ごとに抽出(k=N/n) | 実装が簡単 | 周期性があると偏る |
| 層化抽出 | 事前に層分けして各層から抽出 | 層内分散小→ SE 小 | 層分け変数の選択が重要 |
| クラスタ抽出 | 集団単位(学校・市町村)で抽出 | 調査コスト小 | クラスタ内が均質なら SE 大 |
| 多段抽出 | クラスタ抽出 → 層化 → SRS 等を組合せ | 大規模調査に対応 | 解析が複雑 |
| 有意抽出 | 調査者の判断で典型例を選ぶ | 探索的調査に有効 | 選択バイアス、 母集団推測不可 |
| 雪だるま式 | 調査対象の紹介で連鎖的に拡大 | 到達困難な集団に有効 | 大きな選択バイアス |
| 非確率割当抽出 | 性別・年齢の割合を埋めるよう選ぶ | 世論調査でよく使われる | 確率論的推測ができない |
国勢調査は全数調査(5 年に 1 度)、 家計調査は層化二段抽出、 学校保健統計調査はクラスタ抽出と、 公的統計では用途に応じて使い分けられています。
| 調査名 | 方式 | 規模 | 失敗 / 成功 |
|---|---|---|---|
| 米 1936 大統領選予測 (Literary Digest) | 郵送、 自動車・電話帳から | 240 万人 | 失敗(選択バイアス) |
| 米 1936 大統領選予測 (Gallup) | 層化抽出 | 5 万人 | 成功(少数でも科学的設計) |
| 日本 国勢調査 | 全数調査 | 1.25 億人 | 5 年毎、 高精度 |
| 日本 家計調査(総務省) | 層化二段抽出 | 約 9000 世帯/月 | 消費物価指数の基礎 |
| 日本 労働力調査 | 層化二段抽出 | 約 4 万世帯 | 失業率算出 |
| NHK 視聴率調査 | 層化二段抽出 + 機械測定 | 約 2700 世帯(関東) | 2020 から PMによる個人計測導入 |
| 米 トランプ予測(2016) | 電話 + WEB | 各社 1000-2000 人 | 予測誤差 4%(過小評価) |
| 新型コロナ 抗体陽性率調査 | 層化抽出 | 東京 1900 人 (2020-06) | 0.10% 陽性、 想定外の低値 |
| 大学入試 共通テスト得点分布 | 全数 | 約 50 万人 | 偏差値設計の基盤 |
Gallup の 1936 年の成功は「サンプルサイズより設計の科学性」を示した画期的事例で、 現代の標本理論の出発点となっています。 一方、 2016 年米大統領選では「shy Trump voter(言い出しにくい支持層)」と地理的層化の不備で世論調査が外れたことが、 標本設計の難しさを改めて示しました。
SSDSE-B-2026 のような公的統計を二次利用するときも、 「元の調査の標本設計」を理解しておくと、 後続分析(回帰、 機械学習)でも適切な重みづけや層化が可能になります。
「標本」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
「47 都道府県全部」も「47 ある都道府県のうち抽出した 10」も標本の例だが、 後者から前者を推し量る 推測統計 の出発点が標本の概念である。
| 関係 | 概念 | 標本との接続 |
|---|---|---|
| 上位(一般化) | 統計推論一般 | 標本は推論の構成要素 |
| 下位(特殊化) | 特定の検定・推定 | 標本の応用 |
| 並列(兄弟) | 関連手法 | 同じ問題への別アプローチ |
| 前提 | 確率分布・標本 | 標本の数学的基礎 |
| 応用 | 政策評価・施策効果測定 | SSDSE-B-2026 のような公的統計での実務 |
SSDSE-B-2026 で「人口」「出生数」「死亡数」を比較。 標本を使って自然増減のパターンを定量化。 東京・神奈川・愛知の都市集中、 秋田・高知の過疎化。
「学校数」「教員数」「進学率」を 標本で分析。 県別の教育リソース配分の効率性を評価。 都市と地方の格差を可視化。
「病院数」「医師数」「平均寿命」 を組み合わせ。 標本で医療資源の不均衡と健康成果の関係を推定。 北海道の医師偏在問題。
「就業者数」「消費支出(L3221)」「1 人当たり所得」を 標本で関連付け。 製造業県と観光業県のパターン差。
「高齢化率」「税収」「社会保障費」を 標本で評価。 高齢化が進む県の財政負担の重さを定量化。 県政策への含意。
研究結果を 標本を使って報告するときに守るべきチェックリスト:
標本は学術研究だけでなく、 政策・ビジネスの意思決定に直接活用されています。
計量経済学・教育測定・心理測定・疫学などで 標本は基礎ツール。 近年は機械学習との融合で新しい応用が広がっています。
標本 の概念は、 統計学の発展史と並行して洗練されてきました。
日本では、 1947 年の統計法制定以降、 SSDSE-B のような公的統計の整備が進み、 標本を学ぶ実データ環境が充実してきました。
「標本」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
このフローに沿って判断することで、 「標本」を中核とした適切な手法選択ができる。
姉妹ページの 標本抽出(どう選ぶか)・標本分布と中心極限定理(選んだ結果がどう散らばるか)・母集団(全体とは何か)では扱わない、 もう 1 つの根本問題を掘り下げます。 それは「標本を構成する 1 個(観測単位, unit of observation)は何か」です。 同じデータでも「1 個」の定義を変えると、 標本平均そのものが別の値になります。
SSDSE-B-2026 の 2023 年断面は 47 行、 つまり n=47 の標本(=都道府県の全数)です。 ここで見落としがちなのは、 1 行=1 都道府県であって、 1 人の人間ではないこと。 2023 年の総人口(A1101)は鳥取県 537,000 人、 東京都 14,086,000 人で約 26 倍の開きがあり、 東京都だけで全国 124,353,000 人の 11.33% を占めます。 それでも「47 県の単純平均」を取る瞬間、 鳥取県と東京都は同じ 1 票として扱われます。 味噌汁の比喩でいえば、 大鍋と小鍋から鍋のサイズを無視して 1 杯ずつ味見して平均するようなもの。 「47 県の平均」は「日本に住む人の平均」ではないのです。
高齢化率(65 歳以上人口 A1303 ÷ 総人口 A1101)で実際に確かめます。 SSDSE-B-2026 の 2023 年・47 都道府県の実測値では、
ずれる理由も実測値で説明できます。 高齢化率が全国最小なのは東京都 22.75%、 最大は秋田県 39.06%。 単純平均では「若くて巨大な東京都」の重みが 1/47 に薄められ、 高齢な小規模県が相対的に過大代表されるため、 平均が上振れします。 背景には県人口の強い右歪みがあり、 2023 年の県人口は平均 2,645,809 人に対し中央値 1,549,000 人、 47 県中 35 県が平均未満です。 実務での対処は 1 つだけ:問いに合わせて 1 個を選ぶこと。 「県という制度単位の比較」(例: 自治体政策のばらつき)なら単純平均が正解になり得ますし、 「日本に住む人の話」なら人口加重が必要です。 集団単位の標本平均を個人単位の結論に読み替える誤りは生態学的誤謬(ecological fallacy)と呼ばれ、 選択バイアスと並ぶ標本解釈の二大事故源です。
「47 県は全数だから標本ではない」と片づけるのは早計です。 2023 年断面を「起こりえた年」という超母集団(superpopulation)からの 1 標本とみなす立場に立つと、 全数データにも推測統計の言葉が使えます(本文の有限母集団補正の議論の裏側にある考え方です)。 この視点で SSDSE-B-2026 の時系列 2012–2023 を実測すると、 単純平均と人口加重平均の差は
と一貫して拡大しています。 地方の高齢化と人口の大都市集中が同時進行しているため、 「観測単位の選び方」がもたらす差は年々深刻になる、 という動的な教訓です。 理論的には、 抽出計画の確率だけから不確実性を語る設計ベース推測と、 データ生成過程のモデルを仮定するモデルベース推測という 2 つの流儀があり、 全数データの回帰分析は実質的に後者の立場で正当化されます。 さらに 47 県 × 12 年のパネルとして扱えば「n とは何か」(47 か、 564 か、 それとも実効的にはその中間か)というクラスタ構造の問題に接続します。