このページ内のセクションへ素早く飛べます(クリックで該当箇所へジャンプ):
🍰 まずはやさしく
アンケートなどで集めたデータのことです。
人々の考えや行動を分析するために使います。
クラスで好きな食べ物を調べる時に似ています。
まずは結論と注意点を短く確認しましょう。
🍰 まずはやさしく
データの集め方についてのガイドです。
正しい結果を出すための方法を学びます。
部活のアンケートで誰に聞くかを決める例です。
このページにある12の解説を順番に見ていきます。
標本抽出法(無作為・層化・割当)、 回答バイアス、 無回答処理 — 調査データ特有の落とし穴は多い。 サンプリングの理論が結果の信頼性を決める。
🍰 まずはやさしく
一部の人から得た回答のようなものです。
全体がどうなっているかを予想するために使います。
スマホの利用時間を数人に聞いて調べる例です。
計算方法や注意点を具体的に体験しましょう。
調査データ(Survey Data)は、 SSDSE-B-2026 のような公的統計の背後にある「47 都道府県を 1 件ずつ調べた」プロセスそのもの。 国勢調査 (悉皆) と消費動向調査 (層化二段抽出) では、 同じ「平均」でも誤差構造がまったく違います。 ここでは標本誤差・カバレッジ誤差・非回答誤差の 3 種を SSDSE-B-2026 で具体的に体感しましょう。
調査データは「母集団全体ではなく、 抽出された一部から得た回答」のデータ。 国勢調査(全数)、 家計調査(約 9000 世帯)、 国民生活基礎調査(約 30 万人)など方式は多様で、 SSDSE-B-2026 の 47 都道府県データはこれら原調査の集計結果である。 「一部から推測する」性質上、 標本誤差・回答バイアス・無回答調整が必然的に絡む。
例: 「世帯の食料費」を SSDSE-B-2026 で見ると 47 県平均 80.60 千円 / 月だが、 これは家計調査(二人以上の世帯は全国で約 8,000 世帯)の県庁所在市の値で、 1 市あたりの調査世帯はその一部にとどまるため、 全国平均より標本誤差がずっと大きい。 県全体の値ではない点と、 年ごとの上下に標本誤差が混ざる点に注意して読む。
調査データ (survey data) とは、 アンケート・面接・国勢調査など、 調査主体が対象者に質問を投げ、 回答を集約することで生じるデータ。 SSDSE-B-2026 は元をたどれば国勢調査・人口動態統計・家計調査といった政府の調査・統計の集約物で、 まさに調査データの代表例だ。 行動ログのように「センサが自動で拾う」のではなく、 「人間が質問に答える」プロセスを介する点が特徴。
調査データの強みは 「観察できない内面(意識・態度・記憶)を測れる」こと。 「あなたは現在の暮らしに満足していますか?」「政治に関心はありますか?」「将来の不安は何ですか?」など、 行動からは推定困難な変数が直接取れる。 一方、 弱みは 「回答が真実とは限らない」こと。 社会的望ましさバイアス・記憶バイアス・質問順序効果など、 多種多様な歪みが入り込む。
SSDSE-B-2026 を例にとると、 「総人口 (A1101)」は人数を数えれば客観的だが、 「主観的健康度」や「政治意識」を測ろうとすれば、 国民生活基礎調査や社会意識調査の自己申告に頼る。 同じ「健康」でも、 客観指標(受診回数、 BMI)と主観指標(健康だと感じるか)は乖離する。 だからこそ調査設計時には 「何を測りたいのか」「どう聞けば本心が出るか」「比較可能性をどう担保するか」を厳しく詰める必要がある。
SSDSE-B-2026 の 109 の指標列は、 列コードの頭文字ごとに元の統計が違い、 集め方も「全数を数える調査」「届出や業務の記録を集計したもの」「一部を選んで調べる標本調査」に分かれる。 標本誤差を気にする必要があるのは主に最後の種類である。
| 頭文字 | 内容(列の例) | 主な集め方 | 読むときの注意 |
|---|---|---|---|
| A | 人口・出生・死亡・転出入・婚姻(A1101・A4101) | 国勢調査(全数)と、 それを基準にした推計・人口動態の届出 | 総人口は 2015・2020 年度だけ 1 人単位、 他の年度は千人単位の推計 |
| B | 気温・降水量(B4101) | 気象の観測値 | 質問して集める調査データではない |
| C・H | 建築着工・住宅着工(C3301・H1800)、 ごみ(H5609) | 届出や自治体の報告の集計 | 届出の基準が変わると時系列が不連続になる |
| E | 学校数・児童生徒数・進学者数(E2501) | 学校への全数調査 | 標本誤差は無いが、 回答の誤りなど非標本誤差は残る |
| F | 求職・求人・就職件数(F3101) | ハローワークの業務記録 | ハローワークを通さない求人・就職は含まない |
| L | 消費支出と費目(L3221・L322101) | 家計調査(標本調査、 二人以上の世帯) | 県全体ではなく県庁所在市の値で、 年ごとの上下に標本誤差が混ざる |
🍰 まずはやさしく
調査データのきまりや定義のことです。
分析の根拠をはっきりさせるために使います。
買い物での満足度を数値にする例です。
計算式や使う時のルールについて詳しく読みます。
標本平均 $\bar{x}$ の 標本誤差 (sampling error) は、 母集団からのランダム抽出に伴う偶然のバラツキで、 標本標準偏差を用いて
$$\text{SE}(\bar{x}) = \frac{s}{\sqrt{n}}$$
で表される。 母集団が有限で標本割合 $f = n/N$ が無視できない場合、 有限母集団修正 (finite population correction, FPC)
$$\text{SE}_{\text{FPC}}(\bar{x}) = \frac{s}{\sqrt{n}} \sqrt{\frac{N - n}{N - 1}}$$
を適用する。 95% 信頼区間は
$$\bar{x} \pm 1.96 \cdot \text{SE}(\bar{x})$$
層化抽出 (stratified sampling) では、 各層 $h$ の標本平均 $\bar{x}_h$ と層サイズ $N_h$ を用いて
$$\bar{x}_{\text{strat}} = \sum_{h=1}^{H} \frac{N_h}{N} \bar{x}_h$$
で重み付き集計する。 層内のバラツキが小さいほど、 単純無作為抽出より精度が上がる(分散減少効果)。 不均等抽出後の 事後層別重み (post-stratification weight) は
$$w_i = \frac{N_h / N}{n_h / n}$$
で、 「母集団に占める層比率」を「標本に占める層比率」で割った値。 これで小集団のオーバーサンプル分を打ち消す。
📐 章の 4 つの式に出てくる記号を、 調査の場面に当てはめて読む。
| 記号 | 調査の場面での意味 | 2023 年度の高齢化率(47 県)で読むと |
|---|---|---|
| $N$ | 母集団の大きさ(調べたい対象の全数) | 47(都道府県) |
| $n$ | 実際に調べた数(標本サイズ) | たとえば 10 県だけ選んで調べる |
| $s$($\sigma$) | 母集団の中での値のばらつき | 47 県の高齢化率の標準偏差 3.302 ポイント |
| $s/\sqrt{n}$ | 選び直すたびに標本平均がどれだけ揺れるか(無限母集団の場合) | n = 10 で 3.302/√10 = 1.044 |
| $\sqrt{(N-n)/(N-1)}$ | 有限母集団修正。 母集団の多くを調べるほど揺れが小さくなる分 | n = 10 で √(37/46) = 0.897、 n = 47 で 0 |
| $N_h/N$ | 層 $h$ が母集団に占める割合(層化抽出の重み) | 3 大都市圏 10 県なら 10/47 |
| $w_i$ | 事後層別ウェイト。 標本で多すぎる層を小さく、 少なすぎる層を大きく数え直す | 高齢者が答えすぎた調査では高齢層の重みが 1 より小さくなる |
数式を言葉で読み解くと、 まず 標本誤差 $s/\sqrt{n}$ は「同じ母集団から $n$ 人を選び直すたびに、 標本平均がどれくらい揺らぐか」の標準偏差。 $n$ を 4 倍にすれば標本誤差は半分になる($\sqrt{4} = 2$)が、 4 倍未満では効果が小さい。 「精度を 10 倍にしたい」なら 100 倍のサンプルが必要、 という非対称な関係がここから来る。
有限母集団修正は「全人口を調べた極端なケース ($n=N$) では誤差ゼロ」を保証する。 SSDSE-B-2026 のような 悉皆データ(全 47 都道府県すべて)の場合、 $f = n/N = 1$ で FPC = 0 となり、 標本誤差は理論上ゼロ。 つまり「平均値そのものが母集団値」になる。 ただしこれは「集計後の値」の話で、 元データ収集時の 非標本誤差(質問の誤解、 入力ミス)は別途残る。
層化抽出の数式は「層ごとに代表値を計算し、 層の重さで加重平均」を取ることを意味する。 例えば男女比 1:1 の母集団から「女性 200 人・男性 100 人」をサンプリングした場合、 単純平均は男性過小評価/女性過大評価となる。 事後層別重みで「女性 1.0 倍・男性 2.0 倍」と補正すれば、 母集団推定が正しくなる。 政府統計の多くはこの層化+重み付け方式で公表されている。
🎯 このコードでやること:2023 年度の 47 県の高齢化率を母集団とみなし、 そこから n 県を非復元で選んで平均する作業を 20,000 回繰り返して、 標本平均の実際のばらつきを、 σ/√n と有限母集団修正(FPC)付きの式の値と比べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] aging = (d['A1303'] / d['A1101'] * 100).to_numpy() # 高齢化率(%), N = 47 の母集団 N = len(aging) sigma = aging.std(ddof=0) # 47 県全体(母集団)の標準偏差 print(f'47 県の高齢化率: 平均 {aging.mean():.3f}%, σ {sigma:.3f}') rng = np.random.default_rng(0) for n in [5, 10, 20, 40]: # 47 県から n 県を非復元で選んで平均する、 を 20,000 回 means = [rng.choice(aging, n, replace=False).mean() for _ in range(20000)] se = sigma / np.sqrt(n) fpc = np.sqrt((N - n) / (N - 1)) print(f'n={n:2d}: 実際のばらつき {np.std(means):.3f} / σ/√n {se:.3f} / FPC 付き {se * fpc:.3f}') |
💬 47 県から 10 県を選ぶと、 標本平均の実際のばらつき(標準偏差)は 0.932 で、 σ/√n の 1.044 より小さく、 FPC を掛けた 0.937 とほぼ一致する。 n = 40 では σ/√n が 0.522 なのに実際は 0.205 と半分以下で、 FPC 付きの 0.204 がちょうど合う。 母集団の大部分を調べると、 選び直しても同じ県がほとんど入るので平均が揺れにくい。 FPC を付けないと、 全数に近い調査ほど誤差を大きく見積もりすぎる。 n = 47(全数)なら FPC は 0 で、 47 県の値そのものに標本誤差は無い。
2023 年度の 47 県合計で、 15〜64 歳人口(A1302)は 73,954,000 人、 65 歳以上人口(A1303)は 36,229,000 人なので、 15 歳以上に占める 65 歳以上の割合は $N_h/N = 36{,}229{,}000 / 110{,}183{,}000 = 0.329$ である。 ある調査で 15 歳以上の回答者 1,000 人のうち 500 人($n_h/n = 0.5$)が 65 歳以上だったとすると、 高齢の回答者のウェイトは $w = 0.329 / 0.5 = 0.658$、 15〜64 歳の回答者は $w = 0.671 / 0.5 = 1.342$ になる。 高齢者の回答 1 件を 0.66 件分、 現役世代の回答 1 件を 1.34 件分として数え直すことで、 回答者の年齢構成を人口の構成(33% と 67%)に合わせる。 ウェイトの合計は 500 × 0.658 + 500 × 1.342 = 1,000 で、 回答者数は変わらない。
仮に、 ある質問に「はい」と答えた割合が 65 歳以上の回答者で 60%、 15〜64 歳の回答者で 40% だったとする(数値は説明のための仮定)。 ウェイトを付けずに 1,000 人をそのまま集計すると (500 × 0.60 + 500 × 0.40) / 1,000 = 50.0% だが、 ウェイトを付けると 0.329 × 60 + 0.671 × 40 = 46.6% になる。 高齢者が答えすぎた分だけ、 単純集計は 3.4 ポイント高く出ていたことになる。 ただしこの補正が正しいのは、 同じ年齢層の中では「答えた人」と「答えなかった人」の意見が同じ場合に限られる。
SSDSE-B-2026 の 2023 年度から 4 県を並べる。 総人口と高齢化率は人口推計(千人単位の推計値)、 TFR は人口動態統計、 消費支出は家計調査(二人以上の世帯・県庁所在市)と、 列ごとに元の調査が違う。
| 都道府県 | 総人口(千人) | 高齢化率(%) | TFR | 消費支出(円/月) |
|---|---|---|---|---|
| 東京 | 14,086 | 22.8 | 0.99 | 341,320 |
| 大阪 | 8,763 | 27.7 | 1.19 | 271,246 |
| 沖縄 | 1,468 | 23.8 | 1.60 | 251,222 |
| 秋田 | 914 | 39.1 | 1.10 | 272,086 |
| 全国 ※ | 124,353 | 29.1 | 1.29 | 295,856 |
※ 全国行は、 総人口 = 47 都道府県合計、 高齢化率 = 65 歳以上人口合計 ÷ 総人口合計、 TFR・消費支出 = 47 都道府県の単純平均(SSDSE-B-2026・2023 年実測値から算出)。
SSDSE-B-2026 は政府の各種調査・統計(国勢調査、 学校基本調査、 人口動態統計、 家計調査など)を都道府県単位で集約したものだ。 ここから「調査データを集約した値」の性質を確認しよう。
国勢調査は 悉皆調査のため、 標本誤差は理論上ゼロ。 SSDSE-B-2026 の「総人口 A1101」は、 国勢調査の年(2015・2020 年度)はその調査の実数(例: 2020 年度の北海道 5,224,614 人)で、 それ以外の年度は国勢調査を基準に出生・死亡・転出入を足し引きした推計値を千人単位に丸めたもの(2023 年度の 47 都道府県合計 124,353,000 人)。 どちらにも「±X 万人」のような標本誤差は付かない(が、 回答漏れなどによる カバレッジ誤差や、 推計値の誤差はある)。
SSDSE-B-2026 の家計関連項目(L3221 「消費支出」、 L322107 「交通・通信費」など)は、 家計調査の二人以上の世帯の値。 家計調査は 標本調査(二人以上の世帯は全国で約 8,000 世帯)で、 SSDSE-B-2026 に入っているのは県全体ではなく県庁所在市の値なので、 1 市あたりの調査世帯は少なく、 標本誤差が大きい。 下の ⚠️ 章で実測するとおり、 前年比の絶対値の中央値は 4.12% で、 総人口(0.59%)の約 7 倍揺れる。
| 標本サイズ n | 標本誤差 (比率 50% 時) | 95% 信頼区間幅 | 用途例 |
|---|---|---|---|
| 100 | ±5.0% | ±9.8% | パイロット調査 |
| 400 | ±2.5% | ±4.9% | 市町村調査 |
| 1,000 | ±1.6% | ±3.1% | 世論調査の標準 |
| 10,000 | ±0.5% | ±1.0% | 全国規模の標本調査 |
| 100,000 | ±0.2% | ±0.3% | 大規模な標本調査 |
「n=1,000 で 95% CI ±3.1%」は世論調査でよく見る数字。 新聞報道で「支持率 50%、 ±3 ポイント」と書いてあれば n≈1,000 と推測できる。
🎯 このコードでやること:比率 50% を推定するときの標準誤差と 95% 信頼区間の幅を、 標本サイズごとに式 √(p(1−p)/n) から計算し、 「±3 ポイント以内」に必要な n を逆算する(上の表の検算)
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np from scipy import stats p = 0.5 z = stats.norm.ppf(0.975) for n in [100, 400, 1000, 1600, 10000]: se = np.sqrt(p * (1 - p) / n) print(f'n={n:6,d}: 標準誤差 ±{se*100:.2f} ポイント / 95% 信頼区間 ±{z*se*100:.2f} ポイント') # 逆算: 95% 信頼区間を ±3 ポイント以内にしたいときの n m = 0.03 print('±3 ポイントに必要な n:', int(np.ceil((z / m) ** 2 * p * (1 - p)))) |
💬 上の表の値(n = 100 で ±9.8、 400 で ±4.9、 1,000 で ±3.1)がそのまま再現される。 n を 400 から 1,600 へ 4 倍にすると幅は ±4.90 から ±2.45 へちょうど半分になり、 「精度を 2 倍にするには標本を 4 倍」という関係が数字で確かめられる。 ±3 ポイント以内に収めるには n = 1,068 が必要で、 世論調査がおおむね 1,000 人前後を目標にする理由がここにある。 ただしこれは無作為に選んだ場合の標本誤差だけで、 非回答や質問文による偏りは含まない。
🎯 このコードでやること:SSDSE-B-2026 の総人口(A1101)を年度ごとに 47 県で合計し、 千人単位に丸められた県の数と前年差を並べて、 国勢調査の年と推計の年の違いを確かめる
1 2 3 4 5 6 7 8 9 10 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) g = df.groupby('SSDSE-B-2026') tab = pd.DataFrame({ '47県合計(人)': g['A1101'].sum(), '千人単位の県': g['A1101'].apply(lambda s: int((s % 1000 == 0).sum())), }) tab['前年差(人)'] = tab['47県合計(人)'].diff() print(tab.loc[2014:2022].to_string()) |
💬 2015 年度と 2020 年度だけは千人単位に丸められた県が 0 で、 47 県すべてが国勢調査の 1 人単位の実数になっている。 それ以外の年度は 47 県すべてが千人単位の推計値である。 47 県合計の前年差は 2016〜2019 年度に −5 万〜−19 万人だったのが、 2020 年度は −40.9 万人と急に大きくなる。 この前年差には実際の増減だけでなく、 推計の基準が 2015 年国勢調査から 2020 年国勢調査へ切り替わったずれも混ざりうる。 国勢調査の年をまたいで前年差や伸び率を読むときは、 「調査の方式が変わった年」であることを先に確かめる。
以下は 調査データ を SSDSE-B-2026 で扱うときの典型コード。 encoding='cp932' は政府統計の Shift-JIS 対応。 skiprows=1(header=1 と同じ)は 1 行目の英字コード行を飛ばし、2 行目の日本語項目名を列名にする定石。
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 from scipy import stats # 調査データ 文脈での基本的な仮説検定 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) # 見出しの下に地域コード以外の行が混ざるので、47 都道府県だけ残して数値に直す df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() for _c in df.columns[3:]: df[_c] = pd.to_numeric(df[_c], errors='coerce') # 同じ県が 12 年度ぶん入っているので、2023 年度の 47 行だけを使う # (12 年度を混ぜると同じ県を 12 回数え、n が水増しされて p 値が小さく出すぎる) df = df[df['年度'] == 2023].copy() df['aging'] = df['65歳以上人口'] / df['総人口'] * 100 df['region'] = df['都道府県'].apply(lambda p: '東日本' if p in ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県'] else '西日本') east = df.loc[df['region']=='東日本', 'aging'] west = df.loc[df['region']=='西日本', 'aging'] t, p = stats.ttest_ind(east, west, equal_var=False) print(f'東日本 平均高齢化率: {east.mean():.2f}%') print(f'西日本 平均高齢化率: {west.mean():.2f}%') print(f't = {t:.3f}, p = {p:.4f}') print('判定:', '有意差あり' if p < 0.05 else '有意差なし') |
💬 2023 年度の 47 行で、東日本 31.18%・西日本 31.97%、t = −0.804、p = 0.43 で有意差なし。12 年度を混ぜた 564 行のまま検定すると t = −2.81、p = 0.005 と有意に見えたが、それは同じ県を 12 回数えて標本数を水増ししたため。調査データの検定では「1 行が独立な 1 回答(1 単位)か」を最初に確かめ、繰り返し観測なら年度を絞るかクラスタを考慮する。
🎯 このコードでやること:SSDSE-B-2026 を「悉皆データ」として扱いつつ、 仮に標本調査だったら標本誤差がどれくらい付くかを計算する。 pandas と scipy.stats を併用。
📥 入力例:
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 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] # 都道府県別人口の記述統計(悉皆データ) pop = latest['A1101'] print(f'47 都道府県の人口(悉皆)') print(f' 平均: {pop.mean():,.0f} 人') print(f' 標準偏差: {pop.std():,.0f}') print(f' 合計: {pop.sum():,.0f} 人(2023 年度の推計人口)') # もし「47 都道府県のうち 10 県だけサンプリングしたら?」 sample = pop.sample(10, random_state=42) se = sample.std(ddof=1) / (len(sample) ** 0.5) # 有限母集団修正 (FPC) N, n = 47, 10 fpc = ((N - n) / (N - 1)) ** 0.5 se_fpc = se * fpc print(f'10 県サンプル平均: {sample.mean():,.0f} 人') print(f'標本誤差 SE: {se:,.0f}') print(f'FPC = {fpc:.4f}') print(f'FPC 補正後 SE: {se_fpc:,.0f}') print(f'95% CI: [{sample.mean()-1.96*se_fpc:,.0f}, {sample.mean()+1.96*se_fpc:,.0f}]') |
📤 実行例:
💬 結果の読み方:悉皆データの真の平均は 2,645,809 人。 10 県サンプルでは 4,220,400 人(過大推定)、 95% CI [1,823,883, 6,616,917] と非常に広い。 サンプリングしないと精度は出ない。 政府がわざわざ全 47 都道府県を悉皆で集める理由がここにある。
🎯 このコードでやること:47 都道府県を「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 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] # 層化:3 大都市圏 vs 地方 metro = ['東京都', '神奈川県', '千葉県', '埼玉県', '大阪府', '京都府', '兵庫県', '愛知県', '三重県', '岐阜県'] latest.loc[:, 'stratum'] = latest['Prefecture'].apply( lambda p: '都市圏' if p in metro else '地方') # 層別の人口・件数 summary = latest.groupby('stratum').agg(prefs=('Prefecture', 'count'), pop_sum=('A1101', 'sum'), pop_mean=('A1101', 'mean')) print(summary) # 単純平均(県を 1 票として平等) simple_mean = latest['A1101'].mean() # 人口加重平均(人を 1 票として) weighted = (latest['A1101'] * latest['A1101']).sum() / latest['A1101'].sum() print(f'単純平均(県単位): {simple_mean:,.0f} 人/県') print(f'人口加重平均: {weighted:,.0f} 人') |
📤 実行例:
💬 結果の読み方:3 大都市圏 10 県だけで全国人口の 52% を占める(64,706,000/124,353,000)。 単純平均だと「県の平均人口は 264 万人」だが、 人口加重平均では「平均的な日本人が住む県の人口は 554 万人」と倍以上の差。 同じデータでも 「県を 1 単位とするか/人を 1 単位とするか」で結論が変わる典型例。 調査データの読み方では集計単位の明示が必須。
🎯 このコードでやること:世論調査で「内閣支持率 45%、 サンプル数 1,200」のとき、 95% 信頼区間を Wilson 法で計算する。
📥 入力例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from statsmodels.stats.proportion import proportion_confint n = 1200 success = 540 p_hat = success / n # Wilson 法(小標本・極端比率に強い) low, up = proportion_confint(success, n, alpha=0.05, method='wilson') print(f'支持率: {p_hat*100:.1f}%') print(f'95% CI (Wilson): [{low*100:.1f}%, {up*100:.1f}%]') # 正規近似版(広く使われるが、 比率が極端だと不正確) low2, up2 = proportion_confint(success, n, alpha=0.05, method='normal') print(f'95% CI (正規近似): [{low2*100:.1f}%, {up2*100:.1f}%]') # 「支持率 50% 前後では n=1200 で ±2.8%」が世論調査の経験則 margin = 1.96 * ((p_hat * (1 - p_hat)) / n) ** 0.5 print(f'マージン: ±{margin*100:.2f}%') |
📤 実行例:
💬 結果の読み方:n=1,200 での 95% CI は [42.2%, 47.8%]。 「先月 47%、 今月 45%」のような変化は CI が重なるので「有意な変化ではない」と判断するのが統計的に正しい。 メディアが「支持率急落!」と報じても、 標本誤差を考慮すると有意でないことが多い。 世論調査結果は 必ず標本誤差と一緒に読むこと。
🎯 このコードでやること:SSDSE-B-2026 を母集団とし、 「高齢者ほど回答する」という仮想の回答パターンを想定して、 単純集計と重み付け補正の差を見る。
📥 入力例:
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 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] # 母集団:全国の生産年齢人口と高齢人口 N_work = latest['A1302'].sum() # 15-64 歳 N_old = latest['A1303'].sum() # 65+ # 仮想:内閣支持率は生産年齢 40%, 高齢者 60% true_support_work = 0.40 true_support_old = 0.60 true_overall = (N_work * true_support_work + N_old * true_support_old) / (N_work + N_old) # 回答率:生産年齢 20%, 高齢者 60%(高齢者が答えやすい) resp_work = 0.20 resp_old = 0.60 # 回答者数(n=2000 配布したと仮定) n_target = 2000 share_work = N_work / (N_work + N_old) sent_work = n_target * share_work sent_old = n_target * (1 - share_work) resp_w = sent_work * resp_work resp_o = sent_old * resp_old # 単純集計(バイアスあり) naive_support = (resp_w*true_support_work + resp_o*true_support_old) / (resp_w + resp_o) # 重み付け補正(事後層別) w_work = (N_work / (N_work+N_old)) / (resp_w / (resp_w+resp_o)) w_old = (N_old / (N_work+N_old)) / (resp_o / (resp_w+resp_o)) adj_support = (w_work*resp_w*true_support_work + w_old*resp_o*true_support_old) \ / (w_work*resp_w + w_old*resp_o) print(f'真の支持率: {true_overall*100:.1f}%') print(f'単純集計(バイアスあり): {naive_support*100:.1f}%') print(f'重み付け補正後: {adj_support*100:.1f}%') |
📤 実行例:
💬 結果の読み方:高齢者が答えやすい状況で単純集計すると真値より +5.3 ポイントも過大評価される。 事後層別重み付けで補正すれば真値に一致する。 これが 非回答バイアス (non-response bias)。 ただし「回答した高齢者と回答しなかった高齢者でも意見が違う」場合は重み補正でも消せないので、 回答率そのものを上げる工夫が要る。
本ページ上部の「よくある落とし穴」を補完する、 調査データ特有の罠をさらに 5 件挙げます。 これらは ML 系の教材ではあまり強調されませんが、 公的統計を扱うときには必ず意識すべきポイントです。
調査票や集計区分は数年ごとに見直されることがあり、 同じ列名でも年度によって意味が違うことがあります。 「2010 年と 2020 年の数値を単純比較したら、 実は 2015 年に分類が変わっていた」というのは公的統計分析でよくある失敗です。 出典 PDF の「調査の概要」や「変更点」セクションは必ず確認しましょう。
完全失業率や鉱工業生産指数などは「原数値」と「季節調整値」の 2 種類が公開されています。 月次の動きを論じるなら季節調整値、 年計や前年同月比なら原数値、 と使い分けが必要です。 取り違えると「失業が増えた/減った」の結論が逆になることもあります。
「100 万円」「億円」「千円」が列によってバラバラだったり、 同じ調査内でも年度によって変わったりします。 数値が大き過ぎる/小さ過ぎると感じたら、 まず単位を疑うのが鉄則。 SSDSE のような集約データでも列ごとに単位が違うので、 必ずメタデータを確認してください。
標本調査の個票には抽出ウェイトがついていることが多く、 これを無視して単純平均を取ると母集団の特性を歪んで推定してしまいます。 個票を扱う際は weights 引数を取れる関数(numpy.average, statsmodels の WLS 等)を使うか、 ウェイトの意味を理解した上で集計しましょう。
SSDSE のような都道府県データでは n=47 ですが、 これは厳密には「ランダムサンプル」ではなく「日本という母集団そのもの」です。 ですから p 値を計算しても、 通常の標本論的解釈は当てはまりません。 「47 都道府県の全数を観察した上での記述」と捉えるのが本来正しい立場です。
公的統計や社会調査の世界では、 調査の品質を体系的に評価する枠組みとして TSE (Total Survey Error) モデルが広く使われています。 これは「最終的に分析者が手にする数値」に至るまでに、 どこでどんな誤差が混入するかを系統的に整理する考え方です。
TSE は誤差を大きく 表現誤差 (representation error) と 測定誤差 (measurement error) の 2 系統に分けます。 前者は「誰を観察するか」に関わる誤差、 後者は「観察した内容が正しいか」に関わる誤差です。 SSDSE-B-2026 のような集約データを使う場合、 すでに統計部局によってこれらの誤差が一定程度コントロールされていますが、 「ゼロではない」ことを忘れてはいけません。
「カバレッジ誤差」は対象母集団と抽出枠の不一致から生じます。 たとえば 20 年前の住民票ベースで電話調査をすれば、 すでに転居した人や固定電話を持たない人が抜け落ちます。 「無回答誤差」は回答拒否や不在が原因で、 回答する人と回答しない人の特性が違うと、 集計値が偏ります。 「標本抽出誤差」は前述したように、 標本サイズに依存する確率的なズレです。
「質問文の曖昧さ」「回答選択肢の不適切さ」「面接員効果」「社会的望ましさバイアス」など、 回答プロセスそのものに起因する誤差です。 たとえば「あなたは差別をしますか?」と直接聞けば、 多くの人が「しない」と答えるでしょうが、 これは真実とは限りません。 質問文のワーディング 1 つで、 集計結果が大きく変わる例は調査研究の歴史に数多くあります。
公開データを使う側は、 これらの誤差源を「すでに統計部局が処理してくれている」と思いがちですが、 実際には残存誤差が必ずあります。 調査の「結果概要」「利用上の注意」セクションには、 回答率・標本誤差・系統誤差の評価結果が記載されているので、 分析前に必ず一読することが推奨されます。 ここを飛ばすと、 「数値だけ見て解釈を間違える」という典型的な失敗に陥ります。
A. 信頼性の高さは概ね事実ですが、 「無条件に信用」は危険です。 統計法の下で厳密な手順を踏んでいる一方、 過去には毎月勤労統計問題のように、 調査手順の逸脱が大きく報道された事例もあります。 また、 調査設計そのものに時代遅れの部分があれば、 結果は現実を捉えきれません。 「数値の背景にあるプロセス」を理解した上で使うのが正しい姿勢です。
A. むしろ補完関係です。 SNS ログや POS データは大量・即時性が魅力ですが、 「誰のデータか」が不明な自己選抜サンプルです。 一方、 調査データは標本設計に基づき母集団を代表できるという強みがあります。 たとえば「全国民の労働状態」を捉えるには、 やはり労働力調査のような正式な調査が必要で、 SNS データだけでは代替できません。
A. 「標本」ではなく「日本という母集団そのもの」と捉えれば、 n=47 で十分です。 ただし、 通常の標準誤差や p 値を計算する場合は「47 という数」を意識した解釈が必要です。 また、 検定よりも記述統計(散布図や順位)の方が情報量が大きいこともあります。 統計検定にこだわらず、 視覚的に「県ごとの違い」を表現する方が、 むしろ生産的なケースが多いです。
A. 技術的には可能で、 実際多くの研究で行われています。 ただし、 調査データは観察データなので、 「予測精度の高いモデル」と「因果関係を捉えたモデル」は別物だと意識する必要があります。 たとえば「消費支出を予測するモデル」が高精度でも、 「どの政策を打てば消費支出が増えるか」には直接答えてくれません。 因果推論の枠組みと併用するか、 「予測課題か因果課題か」を最初に明確化することが重要です。
A. 「最新性」が重要な分析(現状の把握、 政策判断)には適しませんが、 「時系列での変化」「歴史的検証」には不可欠です。 たとえば人口の長期トレンドを論じるには、 1920 年の国勢調査から始まる 100 年分のデータが必要です。 むしろ「古いから使えない」と切り捨てるのではなく、 「いつのデータを、 何の目的で使うのか」を意識して使い分けるのが正しい姿勢です。
調査データ (survey data) は「人が回答する」という性質上、 観測データとは別種のバイアスが入り込む。 SSDSE-B-2026 が依拠する政府統計 (国勢調査、 家計調査、 労働力調査) でも、 以下の 5 類型に対する補正が掛けられている。
| 類型 | 発生機序 | SSDSE での該当例 | 補正法 |
|---|---|---|---|
| 社会的望ましさバイアス | 「正しい」と思われる回答に寄る | 家計調査の喫煙・飲酒支出が過少報告 | 税収統計との突合補正 |
| 非回答バイアス | 回答拒否者と回答者で属性が異なる | 単身高齢世帯の回答率低下 | 層別ウエイト調整 (post-stratification) |
| 想起バイアス | 過去の出来事を正確に思い出せない | 家計調査の月次支出回答 | 家計簿実測法に切替 |
| 質問順効果 | 前問が次問の回答を誘導 | 満足度→具体的問題点の順で満足度低下 | ランダム化提示 |
| 標本抽出バイアス | サンプリングフレームの偏り | 固定電話のみの世論調査が高齢層偏重 | RDD + 携帯併用、 web 補完 |
💡 観測データ (POS / センサーログ) ではこれらは原理的に発生しないが、 代わりに「測定機器の経年劣化」「ログ取得条件のサンプリング」など別系統のバイアスを抱える。 調査データと観測データのバイアス対比を理解しておくことが、 公式統計の正しい解釈の第一歩。
🎯 このコードでやること:総人口(A1101)と、 家計調査由来の消費支出(L3221、 二人以上の世帯・県庁所在市)の前年比を 47 県 × 11 年度ぶん計算し、 どれだけ年ごとに揺れるかを比べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.sort_values(['Code', 'SSDSE-B-2026']) # 新しい年度が先なので並べ替える yoy = df.groupby('Code')[['A1101', 'L3221']].pct_change() * 100 yoy['Prefecture'] = df['Prefecture'] yoy = yoy.dropna() print('前年比の絶対値(%)の中央値 総人口:', round(yoy['A1101'].abs().median(), 2), ' 消費支出:', round(yoy['L3221'].abs().median(), 2)) print('前年比が ±10% を超えた県・年の数 総人口:', int((yoy['A1101'].abs() > 10).sum()), ' 消費支出:', int((yoy['L3221'].abs() > 10).sum()), '/', len(yoy)) big = yoy.loc[yoy['L3221'].abs().idxmax()] print('消費支出の前年比が最も大きく動いた例:', big['Prefecture'], df.loc[yoy['L3221'].abs().idxmax(), 'SSDSE-B-2026'], '年度', f"{big['L3221']:+.1f}%") s = df[df['Prefecture'] == '秋田県'].set_index('SSDSE-B-2026')['L3221'] print('秋田県の消費支出(円/月):', s.loc[2016:2023].to_dict()) |
💬 前年比の絶対値の中央値は、 総人口が 0.59% なのに対し消費支出は 4.12% と約 7 倍で、 ±10% を超える動きは総人口では 0 件、 消費支出では 517 件中 34 件ある。 最大は愛知県の 2022 年度で +21.0%。 秋田県も 2018 年度に 280,058 円へ上がり翌年 261,579 円に戻るなど、 1 年ごとに上下する。 消費支出は県庁所在市の限られた世帯を調べた標本調査の値なので、 この上下の多くは標本誤差と考えられる。 標本調査の列で「1 年で 2 割増えた」を実際の変化と読む前に、 数年の平均や全国の動きと見比べる。
🎯 このコードでやること:消費支出(L3221)について、 2023 年度単年の県の順位と 2021〜2023 年度の 3 年平均の順位を比べ、 3 年移動平均にしたときに前年比の揺れがどれだけ小さくなるかを測る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) w = df.pivot(index='Prefecture', columns='SSDSE-B-2026', values='L3221') # 県 × 年度 single = w[2023] avg3 = w[[2021, 2022, 2023]].mean(axis=1) print('2023 年度単年の上位 5:', single.nlargest(5).index.tolist()) print('2021-23 年度平均の上位 5:', avg3.nlargest(5).index.tolist()) print('順位の相関(スピアマン):', round(single.rank().corr(avg3.rank()), 3)) moved = (single.rank(ascending=False) - avg3.rank(ascending=False)).abs() print('順位が 10 位以上ずれた県:', int((moved >= 10).sum()), '県 /', moved.idxmax(), f'{int(moved.max())} 位') # 3 年移動平均にすると、 前年比の揺れはどれだけ小さくなるか ma = w.T.sort_index().rolling(3).mean() raw_yoy = w.T.sort_index().pct_change().abs().stack().median() * 100 ma_yoy = ma.pct_change().abs().stack().median() * 100 print(f'前年比の絶対値の中央値: 単年 {raw_yoy:.2f}% → 3 年移動平均 {ma_yoy:.2f}%') |
💬 単年と 3 年平均の順位の相関は 0.906 と高いが、 上位 5 県は 3 県しか重ならず(単年の三重県・栃木県が 3 年平均では岐阜県・千葉県に入れ替わる)、 10 位以上順位がずれた県が 4 県あり、 最大は山口県の 14 位。 前年比の絶対値の中央値は、 単年の 4.12% から 3 年移動平均では 1.52% まで下がる。 標本調査の列で県の順位を報告するときは、 単年の順位だけで「何位に上がった」と書かず、 複数年の平均も並べる。
🎯 このコードでやること:高齢化率と消費支出(L3221)の相関係数を、 12 年度それぞれの 47 県で計算し、 年度によってどれだけ変わるかを見る
1 2 3 4 5 6 7 8 9 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df['高齢化率'] = df['A1303'] / df['A1101'] * 100 r = df.groupby('SSDSE-B-2026')[['高齢化率', 'L3221']].apply( lambda g: g['高齢化率'].corr(g['L3221'])) print('年度ごとの r(高齢化率 × 消費支出, 47 県)') print(r.round(3).to_string()) print(f'最小 {r.min():.3f}({r.idxmin()} 年度) 〜 最大 {r.max():.3f}({r.idxmax()} 年度)') |
💬 同じ 2 つの列の相関が、 2012 年度は +0.117、 2022 年度は −0.361 と、 年度によって符号まで変わる。 2016 年度以降は負の値が続くので「高齢化率の高い県ほど県庁所在市の消費支出が少ない」傾向はありそうだが、 単年だけを見ると −0.03 の年も −0.36 の年もある。 片方の列が標本調査の値だと、 その標本誤差が相関にもそのまま乗る。 1 年分の 47 県だけで「関係がある/ない」と結論せず、 複数年で同じ向きの関係が続くかを確かめる。
解答
世論調査でおなじみの「支持率 ○○%、 誤差 ±△ ポイント」。 この 誤差の幅がどこから来るのかを、 実際にスライダーを動かして体感します。 母集団の 真の割合 $p$(例: 本当の支持率)に対して、 サンプルサイズ $n$ を変えると 95% 信頼区間の幅が変わります。 さらに 非標本誤差(無回答・質問文バイアス)を加えると、 $n$ をいくら増やしても真値からズレが消えないことも確かめられます。
数直線をタップ/ドラッグしても真の割合を変えられます。 計算式は 95%CI $= \hat{p} \pm 1.96\sqrt{\hat{p}(1-\hat{p})/n}$($\hat{p}$ は観測された割合=真値+バイアス)です。
バイアス 0 のとき、 n を増やすと誤差幅(オレンジ)がぐんぐん縮みます。 バイアスを付けると、 推定(青)が真値(緑)からズレ、 n を最大にしても信頼区間が真値を外し続けることを確認してください。
調査データの誤差は大きく 標本誤差と 非標本誤差に分かれます。 標本誤差は「母集団の一部だけを見た」ことによる偶然のブレで、 上のオレンジの幅がそれ。 サンプルを増やせば $1/\sqrt{n}$ の速さで縮み、 悉皆調査(全員調査)では理論上ゼロになります。 一方 非標本誤差は「そもそも測り方が偏っている」ことによる系統的なズレで、 上の青いマーカーの移動がそれ。 n をいくら増やしても消えません。 精度(誤差幅の狭さ)と正確性(真値への近さ)は別物、 というのが調査データを読む最重要ポイントです。
非標本誤差は設計と後処理で軽減します。 層化抽出で年齢・地域ごとに一定数を確保し、 集計時に 事後層別重み $w_i = (N_h/N)/(n_h/n)$ で母集団構成に合わせます。 複数の周辺分布(年齢×性別×地域)に同時整合させる レーキング、 補助変数と整合させる キャリブレーション、 無回答項目を埋める 多重代入法などが実務の標準です。 ただし重み付けは「観測できた偏り」しか直せない点に注意——回答者に一切現れない層のズレ(=カバレッジ誤差)は重みでも救えません。 詳しくは 標本抽出・標準誤差・信頼区間・母集団・標本 の各ページも参照。
本ページはすでに直感・落とし穴・発展を厚く扱っていますが、 補足として「見落とされやすい 3 つの角度」——非確率標本、 リッカート尺度の扱い、 混合モード——を追記します。 いずれも SSDSE-B-2026 が依拠する公的調査(家計調査・国勢調査など)の理解に直結する論点です。
調査データの発想は スープの味見に似ています。 鍋全部を飲まなくても、 スプーン一杯で全体の味が分かる——これが「標本から母集団を推測する」ということ。 ただし成立条件が 1 つあり、 飲む前によくかき混ぜること。 かき混ぜが 無作為抽出に対応し、 具が下に沈んだまま上澄みだけすくえば(=偏った抽出)、 一口の味は全体を代表しません。 調査は大きく ①質問設計(何をどう聞くか)→ ②標本抽出(誰に聞くか)→ ③回収(実際に何件戻ったか)の 3 工程で、 どの工程が崩れても「一口の味」が全体からズレます。 SSDSE-B-2026 の数値も、 元をたどればこの 3 工程を経た国勢調査・家計調査などの 公的調査由来であり、 集約後の綺麗な表の裏側にこのプロセスが隠れています。
上部の落とし穴群を補完する、 とりわけ実務で頻発する 4 点です。
📊 公的調査データの実測例(SSDSE-B-2026・2023 年・47 都道府県)
家計調査(=標本調査)由来の「二人以上世帯・月平均支出」を県単位で見ると、 消費支出 L3221 は 47 県平均 295,856 円、 標準偏差 24,144 円、 変動係数 8.2%(最小=愛媛 223,423 円/最大=埼玉 344,092 円)。 一方、 内訳の小項目である 教育費 L322108 は 47 県平均 9,577 円、 標準偏差 4,212 円、 変動係数 44.0%(最小=秋田 4,316 円/最大=東京 24,160 円)と、 相対的なバラツキが桁違いに大きくなります。 教育費の県差は「実際の地域差」に加え、 支出額が小さい項目ほど家計調査のサブサンプルで標本誤差が相対的に効きやすいことも一因です。 集約後の表を鵜呑みにせず「元は標本調査」という出自を思い出す好例です。
混合モード調査(mixed-mode survey)とは、 郵送・訪問・電話・Web など複数の回収方法を組み合わせる設計です。 回収率とカバレッジを底上げできる反面、 同じ質問でもモードによって回答が変わる モード効果(例:面接だと社会的望ましさバイアスが強まる、 Web だと中間選択肢が選ばれやすい)が混入します。 近年の公的統計・世論調査は Web 併用へ移行が進んでおり、 時系列比較のときに「モードが変わった年」を確認することが必須になっています。
質問設計の原則も発展的に押さえておきましょう。 ①ダブルバーレル質問を避ける(「価格とデザインに満足ですか」は 2 つの問いを 1 問に混ぜており回答不能)、 ②誘導語・感情語を避け中立に(「無駄な支出を減らすべきか」ではなく「支出をどう評価するか」)、 ③選択肢を網羅的かつ排他的に、 ④尺度の点数(4 件法 vs 5 件法、 中立選択肢の有無)を目的に応じて決める、 ⑤本調査前にパイロット調査で誤解を洗い出す。 これらは前ページで触れた順序効果・ワーディング効果を「設計段階で潰す」ための実務原則です。
最後に、 これらすべてを俯瞰する枠組みが本ページ上部でも触れた Total Survey Error(TSE)です。 標本誤差・カバレッジ誤差・非回答誤差・測定誤差・処理誤差という 5 系統を、 「どこにコストをかければ全体の誤差が最小になるか」という 予算配分の問題として捉え直すのが TSE の実践的な使い方。 例えば「n を倍増して標本誤差を縮める」より「無回答フォローアップに投資して非回答バイアスを減らす」方が、 全体誤差の削減に効くことは珍しくありません。 精度(狭さ)と正確性(真値への近さ)を分けて考える——調査データを読む姿勢の総まとめです。
本節で触れた論点を掘り下げるための、 用語集内の実在ページです:
※ 質問票設計(questionnaire)の専用ページは用語集内に未整備のため、 本節の「質問設計の原則」を暫定的な参照先とします。
ツリーの 4 つの枝のうち、 このページで SSDSE-B-2026 を使って数値を確かめたのは「サンプリング」と「誤差源」の 2 つである。 悉皆(国勢調査)の枝は総人口が 1 人単位になる 2015・2020 年度、 層化抽出の枝は 3 大都市圏と地方の重み付き集計、 標本誤差の枝は有限母集団修正のシミュレーションと消費支出の年ごとの揺れに対応する。 図の周辺の 6 ノード(標本設計・事後層別・レーキング・キャリブレーション・欠測値補完・小地域推定)は、 誤差を小さくしたり、 偏りを重みで直したりするための手法で、 家計調査の県庁所在市の値のように 1 地域あたりの標本が少ないときに使われるのが小地域推定である。
調査データ (survey data) は「サンプリングを通じて母集団の特性を推定するために収集されたデータ」。 SSDSE-A (家計調査) は無作為抽出された世帯の調査データで、 SSDSE-B-2026 (都道府県別基本指標) は調査ではなく既存統計の集約。 調査データには無回答 / 標本誤差 / 回答バイアスの 3 つの不確実性が常につきまとう。
調査データは「真の値 + 標本誤差 + 非標本誤差 (回答バイアス・カバレッジ誤差)」の合成。 SSDSE-B-2026 のような集約済みデータは元の調査誤差が見えなくなるので、 出典統計の調査設計を確認する習慣をつける。
調査データを分析する際のサンプリング設計と分析手法の選択フロー。
SSDSE-B-2026 を「調査データ」として扱う場合、 元の調査 (国勢調査・家計調査等) のサンプリング設計を参照し、 47 都道府県の値が母集団推定値か全数値かを区別する。