論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
横断データ
Cross-sectional Data
リテラシー
別称: 横断面データ / クロスセクションデータ

🔖 キーワード索引

このページ内のセクションへ素早く飛べます(クリックで該当箇所へジャンプ):

💡 30秒結論📍 文脈🎨 直感📐 数式・定義🔬 数式を言葉で読み解く🧮 SSDSE実値計算🐍 Python実装⚠️ 落とし穴🔭 深掘り🌐 関連手法🔗 関連用語📚 関連グループ❓ FAQ

横断面データ (cross-sectional data)」は同一時点で複数主体を観測したデータ形式。 47 都道府県 × 1 時点、 1000 世帯 × 1 調査回など。 時系列データ・パネルデータと対比される。 本ページでは横断面データの定義・標本抽出設計・回帰分析の前提・時系列との違い・パネルへの拡張を整理する。

同一時点 i.i.d.時系列データとの対比パネルデータへの拡張SSDSE-B-2026 47県標本抽出設計OLS 回帰の前提不均一分散 (heteroskedasticity)クラスター標準誤差空間相関

これらのキーワードは「同一時点の複数主体観測 → i.i.d. 仮定 → OLS / GLM の適用 → パネル化で因果推論へ」という横断面データの典型的学習動線を構成する。

💡 30秒で分かる結論 — 横断データ

🍰 まずはやさしく

ある瞬間の様子を切り取った写真のようなデータです。

グループの中での違いを比べるために使います。

クラス全員の今の身長を測るような例です。

この章では横断データの基本と注意点を読みます。

📍 あなたが今見ているもの

🍰 まずはやさしく

今の状態をまとめた一覧表のようなデータです。

データの種類を正しく見分けるために使います。

47都道府県の最新データを比べるような例です。

このページでは12の項目に分けて詳しく読みます。

SSDSE-B-2026 は 2023 年時点の 47 都道府県データ = 典型的な横断データ。 時系列データ・パネルデータと対比される。 OLS 重回帰の基本想定。

「47都道府県の高齢化率」「全国の事業所の従業員数」 — こうした「同時点・複数主体」のデータは典型的な横断データです。

本ページは 横断データ(Cross-Sectional Data) を、 ジャストインタイム型データサイエンス教育の文脈で 12 のセクションに分けて解説します。 上から順に読まなくても、 「🔖 キーワード索引」から必要箇所だけ拾い読みすることもできます。

🎨 直感で掴む — 横断データとは何者か

🍰 まずはやさしく

みんなが同時に写っている集合写真のようなものです。

個体ごとの特徴を比べるために使います。

スマホの利用時間をクラス全員分集めるような例です。

このあと計算方法や使い方の落とし穴を読みます。

横断データとは「同じ時点での複数主体 (47 都道府県・1000 人の回答者・100 社の財務指標) を 1 枚の表に並べたデータ」。 縦軸は時間ではなく 主体。 SSDSE-B-2026 の 2023 年スライス (47 行 × 多変量) はまさに横断データで、 OLS 回帰や PCA の入力として直接使える。 「2010 年から 2023 年までの推移」のように時間方向に伸ばすと時系列、 両方を持つとパネルデータと呼び方が変わる。

場面横断データが登場する例何が分かるか
論文の Methods 節「横断データを用いて分析した」手法の前提と限界が文脈に乗る
実務レポート「横断データの観点で評価」意思決定の根拠が明確化
教育・学習SSDSE-B-2026 を題材に演習実データで本物の感覚が得られる
政策・社会データ種 分野で標準的に登場EBPM や DX の議論に直結

本ページではこのあと、 数式(または定義)・SSDSE 実データ計算・Python実装・落とし穴 を順番に追いかけて、 用語を「使える知識」にしていきます。

写真に例えると:

  • 横断データ=集合写真1枚(全員が同時に写っている)
  • 時系列データ=1人の連続写真(同じ人を時間で追う)
  • パネル=全員の連続写真(横と縦を両方持つ)

「太郎は3年で身長10cm伸びた」は時系列の話、 「クラスの平均身長は男子の方が高い」は横断の話。 質問の種類で必要なデータが変わります。

🎮 触って理解する — 同じデータを3通りに切る

SSDSE-B-2026 は実は 47都道府県 × 12年(2012〜2023年)= 564観測 の大きな箱です。 この同じ箱からどの断面を切り出すかで、 分析単位も「言えること」も変わります。 下のボタンで 横断 / 時系列 / パネル を切り替え、 グリッド上でどこがハイライトされるかを体感してください(セルをタップすると切り出す年・県を変えられます)。 数値は A1101(総人口・万人)の実測値です。

横断モード:ある1年を選んで、その年の県間の違いを切り出します。セルをタップすると比較する年が変わります。

※表示は6県の抜粋。実際のSSDSE-B-2026は全47県×12年=564行。数値は総人口(万人・実測)。

分析単位(サンプル)
n = 47
2023年の47県を横に並べた1断面
切り出している軸
個体軸=あり(47県)
時間軸=なし(1時点に固定)
この構造で言えること
「どの県が多い/少ないか」という地域間比較。時間変化は分からない。

📋 3構造 → 何が分析できるか(対応表)

構造分析単位主にできる分析できないこと
横断47県 × 1時点
(n=47)
地域間比較・格差の記述・相関/回帰・クラスタリング時間変化・因果の時間順序
時系列1県 × 12年
(T=12)
推移・トレンド・変化率・将来予測県間の差の説明
パネル47県 × 12年
(N×T=564)
両方+固定効果で時不変の個体差を除去→交絡を軽減時不変×時変の完全分離は要工夫
⚠️ 横断(1時点だけ)の落とし穴
  • 因果の時間順序が不明:横断では「Xが先か Yが先か」を観察できない。 例:高齢化率と財政力の相関を見ても、どちらが原因かは1時点では決められない。
  • エコロジカル相関(生態学的誤謬):県平均どうしの相関が、個人レベルの関係と一致する保証はない(Robinson, 1950)。
  • 一時点の特殊性:その年だけの景気・災害・制度変更の影響を「普遍的な構造」と誤読しやすい。 結論には必ず時点を併記する。
→ 時間軸を足して(時系列・パネル化して)はじめて、東京は2012→2023で+85.2万、秋田は−14.9万といった変化が見え、固定効果で個体差を除ける。

📐 数式・定義

🍰 まずはやさしく

時間を固定して集めたデータの集まりのことです。

平均や相関(関係性)を計算するために使います。

部活のメンバー全員の体重を一度に測るような例です。

ここでは数式を使った正確な定義について読みます。

横断データは「ある時点 $t_0$ における複数個体 $i$ の観測集合」として形式化される。 時間添字 $t$ が固定 (実質ない) 点が、 時系列・パネルとの本質的な違い。

① 形式: $$ D_{\text{cross}} = \{(y_i, \mathbf{x}_i) \mid i=1,2,\dots,n\}, \quad t = t_0 \text{ (固定)} $$

② 平均・分散・相関といった個体間集計量を計算する: $$ \bar{y} = \frac{1}{n}\sum_{i=1}^{n} y_i, \quad s_{xy} = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y}) $$

③ パネルとの対比: $D_{\text{panel}} = \{(y_{it}, \mathbf{x}_{it}) \mid i=1\dots n, t=1\dots T\}$。 添字が 1 本減ることで「同一個体の時間内変化」を追えない代わり、 同一時点での多個体比較に専念できる。

📐 横断面データの厳密定義と典型例

横断面データ(Cross-sectional Data)とは、 「ある特定時点(または短期間)に、 複数の主体(個人・企業・地域など)について同時に観測された」データです。 主体添字 $i$ のみを持ち、 時間添字 $t$ を持たない(または固定)点が特徴です。

$$\text{横断面}: \{(y_i, x_i) : i = 1, 2, \dots, n\}$$ $$\text{時系列}: \{(y_t, x_t) : t = 1, 2, \dots, T\}$$ $$\text{パネル}: \{(y_{it}, x_{it}) : i = 1, \dots, n,\ t = 1, \dots, T\}$$

🔬 数式を言葉で読み解く(その 1:3 つのデータ構造比較)

構造添字典型的サイズSSDSE-B-2026 での該当
横断面$i$ のみ$n=47$(都道府県)2026 年版そのもの
時系列$t$ のみ$T=10\sim100$(年)全国合計の年次推移
パネル$i, t$ 両方$n \times T$SSDSE-B 過去年版を連結
反復横断面$i_t, t$(i は各 t で別人)$n_t \times T$国民生活基礎調査

SSDSE-B-2026 は典型的な横断面データで、 「2026 年公表時点での 47 都道府県」を切り取った断面です。 時間的変動は捕えられないので、 推論できるのは「時点間の差異」ではなく「主体間の差異」になります。

🔬 数式・定義を「言葉」で読み解く

先ほどの数式・定義に出てきた記号や概念を、 一つずつ確認します。 とくに 横断データ の文脈で意味を取り違えやすい部分を強調します。

記号意味と注意点
$i$個体添字。 SSDSE-B-2026 なら $i=1,\dots,47$(都道府県)。 横断データはこの添字「のみ」で構造化される
$t, t_0$時間添字と固定時点。 横断データでは $t$ は実質存在せず $t = t_0$ に固定(時間変動を捕えない)
$n, T$$n$ は個体数(横断データの行数)、 $T$ は観測期間長(時系列・パネルで登場)
$y_i, \mathbf{x}_i$個体 $i$ の被説明変数と説明変数ベクトル。 添字 1 本のみ → 横断データの典型表記
$y_{it}, \mathbf{x}_{it}$パネルデータの表記。 添字が 2 本 → 同一個体の時間内変化を追える
$s_{xy}$標本共分散 $s_{xy} = \frac{1}{n-1}\sum (x_i - \bar{x})(y_i - \bar{y})$。 横断データの個体間関係を要約する

横断データの記号は「個体添字 $i$ が存在し時間添字 $t$ が存在しない(または固定)」が判別の鍵です。 $y_{it}$ のように添字が 2 本ある式はパネル、 $y_t$ のように $t$ のみは時系列で、 横断データを混同すると「同じ個体が時点間でどう変化したか」を推定しようとして失敗します。 $n$(個体数)と $N$(母集団サイズ)の区別、 $s^2$(標本分散)と $\sigma^2$(母分散)の区別も論文ごとに確認してください。

🔬 数式を言葉で読み解く(その 2:横断面 OLS の前提)

横断面データに OLS(最小二乗法)を適用する典型モデルは:

$$y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \dots + \beta_p x_{ip} + \varepsilon_i$$

OLS が一致推定量となるためには、 以下のガウス・マルコフ前提を満たす必要があります:

  1. 線形性:$y_i$ は $\beta_j$ について線形
  2. 無作為標本:$(y_i, x_i)$ は i.i.d.
  3. 外生性:$E[\varepsilon_i | x_i] = 0$(誤差項と説明変数が無相関)
  4. 不偏分散:$\mathrm{Var}(\varepsilon_i | x_i) = \sigma^2$(均一分散)
  5. 共線性なし:$X$ の階数がフル

SSDSE のような都道府県横断面では、 とくに「無作為標本」が成立しません。 47 都道府県は「全数」であり、 母集団からのランダムサンプルではないのです。 推論の解釈は「2026 年時点の県間構造」に限定する必要があります。

また、 均一分散の仮定は「大都市は分散大、 地方は分散小」のような場面で破れがちで、 横断面では White の不均一分散頑健標準誤差を使うのが定番です:

$$\widehat{\mathrm{Var}}(\hat\beta) = (X^\top X)^{-1}\left(\sum_i \hat\varepsilon_i^2 x_i x_i^\top\right)(X^\top X)^{-1}$$

🔬 数式を言葉で読み解く(その 3:横断面で因果が言えない理由)

横断面 OLS の係数 $\hat\beta_j$ は「他の変数を一定としたときの $x_j$ と $y$ の相関」ですが、 これを因果と読むには「条件付き独立性」が必要です:

$$\varepsilon_i \perp x_{ij} | x_{i,-j} \quad \text{(条件付き外生性)}$$

この前提が破れる典型ケース:

横断面データのみで因果を主張するには、 道具変数(IV)回帰不連続デザイン(RDD)傾向スコアマッチング(PSM)差分の差分(DID、 ただしパネルが必要)などの工夫が必要です。

SSDSE のように 1 時点 47 県の限定状況では、 因果より「関連の構造記述」「仮説生成」「予測モデル構築」に留めるのが誠実な姿勢です。

🧮 SSDSE-B 実値で計算してみる

SSDSE-B-2026(47都道府県・2023 年・112 項目)を題材に、 横断データ に関係する変数を実値で確認します。 とくに東京・大阪・沖縄・秋田 など特徴ある県を比較すると、 用語の重みが体感できます。

都道府県総人口(千人)高齢化率(%)TFR有効求人倍率
東京14,08622.80.991.74
大阪8,76327.71.191.27
沖縄1,46823.81.600.96
秋田91439.11.101.51
全国平均124,35329.11.201.31

これらの値を 横断データ の観点で読み解くと、 都道府県間の格差・特徴・関係性が浮かび上がります。 具体的な計算手順は次の「🐍 Python 実装」セクションで実演します。

🧮 数式に値を入れて手で計算する: クロスセクション平均と分散

クロスセクションデータの典型例として、 同一時点 (2025 年) における 5 県の所得水準を仮定値で並べ、 同時点スナップショットならではの代表値 (平均・標本標準偏差) を求める (時間方向の集約は行わない)。

Step 1: 5 県データ

所得 [万円]
A400
B520
C380
D460
E340

Step 2: 平均と標本標準偏差

合計 = 400+520+380+460+340 = 2,100 平均 = 2100/5 = 420 偏差² 和 = (-20)² + 100² + (-40)² + 40² + (-80)² = 400+10000+1600+1600+6400 = 20,000 s² = 20000/4 = 5,000 s ≈ 70.71

🐍 Python で再現

1
2
3
4
import numpy as np
x = np.array([400, 520, 380, 460, 340])
print(f"平均: {x.mean()}")
print(f"標準偏差 (標本): {x.std(ddof=1):.2f}")

📤 実行結果

平均: 420.0 標準偏差 (標本): 70.71

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python 実装

以下は 横断データ を SSDSE-B-2026 で扱うときの典型コード。 encoding='cp932' は政府統計の Shift-JIS 対応。 skiprows=1 は日本語ヘッダ行をスキップする定石。

① 基本パターン(読み込み・確認・主要列抽出)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) Prefecture(都道府県) 北海道 5,092,000 1,681,000 北海道 東京都 14,086,000 3,205,000 東京都 沖縄県 1,468,000 350,000 沖縄県 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd

# 横断データ に関連する SSDSE-B-2026 分析の基本パターン
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')

print(df.shape)            # (47, 125)
print(df.dtypes.head(10))
print(df.describe().T.head(10))

# 主要列にエイリアス
df['総人口'] = df['総人口']
df['65歳以上'] = df['65歳以上人口']
df['高齢化率'] = df['65歳以上'] / df['総人口'] * 100
print(df[['都道府県','総人口','高齢化率']].head())
📤 実行例(実測) (564, 112) 年度 int64 地域コード object 都道府県 object 総人口 int64 総人口(男) int64 総人口(女) int64 日本人人口 int64 日本人人口(男) int64 日本人人口(女) int64 15歳未満人口 int64 dtype: object count mean ... 75% max 年度 564.0 2.017500e+03 ... 2020.25 2023.0 総人口 564.0 2.690688e+06 ... 2784925.50 14086000.0 総人口(男) 564.0 1.308956e+06 ... 1349539.00 6914000.0 総人口(女) 564.0 1.381723e+06 ... 1422000.00 7172000.0 日本人人口 564.0 2.637011e+06 ... 2717122.25 13459000.0 日本人人口(男) 564.0 1.283092e+06 ... 1315342.25 6612000.0 日本人人口(女) 564.0 1.353872e+06 ... 1385624.50 6854000 …(以下略)

② 可視化テンプレ(matplotlib / seaborn)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) 北海道 5,092,000 1,681,000 東京都 14,086,000 3,205,000 沖縄県 1,468,000 350,000 …(全 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
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 横断データ の探索的データ分析(EDA)
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')

# 主要変数を取り出して名前を分かりやすく
df['総人口'] = df['総人口']
df['65歳以上'] = df['65歳以上人口']
df['高齢化率']  = df['65歳以上'] / df['総人口'] * 100
df['TFR']      = df.iloc[:, 21]

# ヒストグラム
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sns.histplot(df['高齢化率'], kde=True, ax=axes[0])
axes[0].set_title('高齢化率の分布(47都道府県)')
sns.histplot(df['TFR'], kde=True, ax=axes[1])
axes[1].set_title('TFRの分布')
plt.tight_layout()
plt.savefig('eda_distribution.png', dpi=120)

③ 前処理:欠損・外れ値・型変換

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) Prefecture(都道府県) 北海道 2,023 北海道 東京都 2,023 東京都 沖縄県 2,023 沖縄県 …(全 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
import pandas as pd
import numpy as np

# 横断データ に関わる前処理の典型パターン
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')

# ① 欠損値の確認
print('欠損数:')
print(df.isna().sum().sort_values(ascending=False).head(10))

# ② 数値変換(カンマ・%除去 など)
def to_num(s):
    if isinstance(s, str):
        return float(s.replace(',', '').replace('%', ''))
    return s
_num_cols = [c for c in df.columns
             if c not in ('年度', '地域コード', '都道府県', 'Code', 'Prefecture',
                          'SSDSE-B-2026')]
df[_num_cols] = df[_num_cols].apply(lambda col: col.map(to_num))

# ③ 外れ値検出(IQR)
# 地域コードや都道府県名は大小比較できないので、数値の列だけで判定する
_num = df.select_dtypes(include='number')
q1 = _num.quantile(0.25)
q3 = _num.quantile(0.75)
iqr = q3 - q1
outlier_mask = ((_num < q1 - 1.5*iqr) | (_num > q3 + 1.5*iqr)).any(axis=1)
print('外れ値を含む行数:', outlier_mask.sum())
📤 実行例(実測) 欠損数: 年度 0 地域コード 0 着工新設住宅戸数 0 外国人延べ宿泊者数 0 延べ宿泊者数 0 一般旅券発行件数 0 就職件数(一般) 0 充足数(一般) 0 月間有効求人数(一般) 0 月間有効求職者数(一般) 0 dtype: int64 外れ値を含む行数: 239

④ 検定・推定の最小例(scipy.stats)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1303(65歳以上人口) A1101(総人口) Prefecture(都道府県) 北海道 1,681,000 5,092,000 北海道 東京都 3,205,000 14,086,000 東京都 沖縄県 350,000 1,468,000 沖縄県 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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')

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 '有意差なし')
📤 実行例(実測) 東日本 平均高齢化率: 28.82% 西日本 平均高齢化率: 29.64% t = -2.807, p = 0.0052 判定: 有意差あり

※ より高度な例(クロス集計、 機械学習、 ベイズ推定)は data-types のグループ教材を参照。

🐍 SSDSE-B-2026 で典型的な横断面回帰

このコードでやること:SSDSE-B-2026(47 都道府県の典型的横断面データ)で「合計特殊出生率」を被説明変数として OLS を実行し、 通常標準誤差と White の頑健標準誤差を比較します。

📥 入力データ:47 都道府県、 6 指標(A1101 総人口・A1301 年少人口〈15歳未満人口〉・B4101 年平均気温・C3301 着工建築物数・E3501 中学校生徒数・E3701 中学校卒業者数)。 被説明変数は A4103 合計特殊出生率。

SSDSE-B-2026 抜粋 (2023 年): Code Prefecture A1101 A1301 B4101 C3301 E3501 E3701 R01000 北海道 5092000 514000 11.0 15872 119115 40250 R13000 東京都 14086000 1513000 17.6 41817 314459 104600 R47000 沖縄県 1468000 236000 23.8 5217 50484 16744 ... ... ... ... ... ... ... ... (47 行) A1101=総人口 A1301=年少人口 B4101=年平均気温 C3301=着工建築物数 E3501=中学校生徒数 E3701=中学校卒業者数
 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
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]).query('`SSDSE-B-2026` == 2023')
features = ['A1101','A1301','B4101','C3301','E3501','E3701']
X = df[features].astype(float)
y = df['A4103'].astype(float)   # 合計特殊出生率

X = sm.add_constant(X)
res_ols = sm.OLS(y, X).fit()
print(res_ols.summary().tables[1])

# White の不均一分散頑健標準誤差 (HC1)
res_hc1 = sm.OLS(y, X).fit(cov_type='HC1')
print('--- HC1 (Robust SE) ---')
print(res_hc1.summary().tables[1])

📤 実行例:

coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ const 1.0394 0.137 7.612 0.000 0.763 1.315 A1101 -2.328e-07 7.38e-08 -3.156 0.003 -3.82e-07 -8.38e-08 A1301 3.632e-06 1.9e-06 1.915 0.063 -2.02e-07 7.47e-06 B4101 0.0206 0.008 2.603 0.013 0.005 0.037 C3301 -3.765e-06 5.7e-06 -0.661 0.512 -1.53e-05 7.75e-06 E3501 -4.502e-06 3.11e-05 -0.145 0.885 -6.73e-05 5.83e-05 E3701 -1.004e-05 7.63e-05 -0.132 0.896 -0.000 0.000 --- HC1 (Robust SE) --- coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ const 1.0394 0.142 7.322 0.000 0.761 1.318 A1101 -2.328e-07 8.57e-08 -2.716 0.007 -4.01e-07 -6.48e-08 A1301 3.632e-06 2.11e-06 1.721 0.085 -5.03e-07 7.77e-06 B4101 0.0206 0.008 2.514 0.012 0.005 0.037 C3301 -3.765e-06 5.03e-06 -0.749 0.454 -1.36e-05 6.09e-06 E3501 -4.502e-06 2.79e-05 -0.161 0.872 -5.92e-05 5.02e-05 E3701 -1.004e-05 6.41e-05 -0.157 0.876 -0.000 0.000

💬 通常 SE でも頑健 SE (HC1) でも、 総人口 A1101(負・規模が大きい県ほど出生率が低い)と 年平均気温 B4101(正・温暖な県ほど出生率が高い=沖縄の TFR が高いことと整合)は有意なまま。 HC1 で標準誤差はやや広がるが主要な結論は頑健です。 横断面では県の規模が大きく異なるため、 頑健 SE を併記して「結論の頑健性」を確認するのが定石です。

📝 より正確な分析: 本節の回帰は実在する SSDSE-B-2026(2023 年・47 都道府県)を skiprows=[1]・年度 2023 で抽出して再計算した実測値。 被説明変数は A4103 合計特殊出生率。 SSDSE-B-2026 のコード対応は A1301=年少人口(15 歳未満人口, ≠ 出生数)B4101=年平均気温(≠ 財政力指数) である点に注意(旧版の変数名ラベルを訂正)。

📊 横断面 vs 時系列:何ができて何ができないか

観点横断面データ時系列データ
単位主体(個人・地域・企業)時間(日・月・年)
問える問い「県間でなぜ違うか」「いつ変化したか」
独立性仮定主体間が独立時点間に強い系列相関
代表的手法OLS, GLM, クラスタリングARIMA, 状態空間, GARCH
外生性脅威省略変数バイアス、 セレクション単位根・共和分・系列相関
因果推論IV・RDD・PSM が標準VAR・グレンジャー因果
サンプルサイズ概念$n$(主体数)$T$(時点数)
頑健 SEWhite / HC0-HC3Newey-West / HAC

🐍 不均一分散の Breusch-Pagan 検定

このコードでやること:横断面 OLS で頻発する不均一分散を Breusch-Pagan 検定で確認します。 残差の二乗を説明変数で回帰し、 説明力があれば「分散が説明変数に依存している」と判定します。

📥 入力:上記 OLS の結果(残差 $\hat\varepsilon_i$)。

 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
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.diagnostic import het_breuschpagan, het_goldfeldquandt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]).query('`SSDSE-B-2026` == 2023')
features = ['A1101','A1301','B4101','C3301','E3501','E3701']
X = sm.add_constant(df[features].astype(float))
y = df['A4103'].astype(float)
res = sm.OLS(y, X).fit()

# Breusch-Pagan 検定
bp_stat, bp_pval, _, _ = het_breuschpagan(res.resid, X)
print(f'Breusch-Pagan LM 統計量: {bp_stat:.3f}')
print(f'Breusch-Pagan p 値: {bp_pval:.4f}')

# Goldfeld-Quandt 検定(A1101 で分割)
gq_stat, gq_pval, _ = het_goldfeldquandt(y, X, idx=1)
print(f'Goldfeld-Quandt F 統計量: {gq_stat:.3f}')
print(f'Goldfeld-Quandt p 値: {gq_pval:.4f}')

# 残差の絶対値と説明変数の相関
print('--- 残差絶対値 vs 説明変数 相関 ---')
for f in features:
    r = np.corrcoef(np.abs(res.resid), df[f].astype(float))[0,1]
    print(f'  |resid| vs {f}: r = {r:+.3f}')

📤 実行例:

Breusch-Pagan LM 統計量: 6.418 Breusch-Pagan p 値: 0.3780 Goldfeld-Quandt F 統計量: 1.284 Goldfeld-Quandt p 値: 0.3070 --- 残差絶対値 vs 説明変数 相関 --- |resid| vs A1101: r = -0.189 |resid| vs A1301: r = -0.192 |resid| vs B4101: r = -0.211 |resid| vs C3301: r = -0.226 |resid| vs E3501: r = -0.188 |resid| vs E3701: r = -0.188

💬 BP 検定 p=0.378、 Goldfeld-Quandt 検定 p=0.307 で いずれも 5% 有意でない → この 6 変数モデルでは不均一分散の強い証拠は見られない(残差絶対値と各説明変数の相関も |r|≲0.23 と小さい)。 ただし横断面では県規模の差から不均一分散が生じやすいため、 頑健 SE (HC1/HC3) を併記して確認するのは依然として良い習慣です。 「検定してから頑健 SE の要否を判断する」 という手順自体が横断面分析の型です。

🐍 47 県の K-means クラスタリング

このコードでやること:典型的な横断面分析として、 SSDSE-B-2026 の 47 県を 5 つのクラスタに分けます。 横断面データは「主体間の類似性」を扱える代表的データ形式で、 クラスタリングが定番手法です。

📥 入力:47 県 × 6 指標(標準化済)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]).query('`SSDSE-B-2026` == 2023')
features = ['A1101','A1301','B4101','C3301','E3501','E3701']
X = StandardScaler().fit_transform(df[features].astype(float))

km = KMeans(n_clusters=5, n_init=20, random_state=0).fit(X)
df['cluster'] = km.labels_

# クラスタ別の県と平均
for c in range(5):
    members = df[df['cluster']==c]['Prefecture'].tolist()
    avg = df[df['cluster']==c][features].mean()
    print(f'\n--- Cluster {c} ({len(members)} 県) ---')
    print('代表県:', members[:6])
    print(f'平均: 人口={avg["A1101"]:.0f}, 出生率={df[df["cluster"]==c]["A4103"].mean():.3f}')
print(f'\n慣性 (inertia): {km.inertia_:.1f}')

📤 実行例:

--- Cluster 0 (4 県) --- 代表県: ['千葉県', '静岡県', '兵庫県', '福岡県'] 平均: 人口=5071250, 出生率=1.235 --- Cluster 1 (27 県) --- 代表県: ['群馬県', '富山県', '石川県', '福井県', '山梨県', '岐阜県'] 平均: 人口=1293333, 出生率=1.372 --- Cluster 2 (11 県) --- 代表県: ['北海道', '青森県', '岩手県', '宮城県', '秋田県', '山形県'] 平均: 人口=2023818, 出生率=1.185 --- Cluster 3 (1 県) --- 代表県: ['東京都'] 平均: 人口=14086000, 出生率=0.990 --- Cluster 4 (4 県) --- 代表県: ['埼玉県', '神奈川県', '愛知県', '大阪府'] 平均: 人口=8200000, 出生率=1.188 慣性 (inertia): 40.2

💬 横断面データから「県の社会経済構造による 5 つの類型」が浮かび上がります。 東京は単独クラスタ(外れ値的)。 人口規模と出生率は逆相関の傾向。 横断面ならではの「主体間の質的分類」が可能になります。

✅ 横断面データ分析チェックリスト

⚠️ よくある落とし穴(7 件)

横断データ に取り組むときに、 学生・実務者・研究者がよく踏むワナをまとめました。 該当しそうな項目があれば、 自分の分析を見直してみてください。

❌ 1. 横断データから因果を結論する
「教育年数が長い県ほど所得が高い」を見て「教育 → 所得」と断言できない。 時間的先行を観察できない横断データでは、 RCT・パネル固定効果・操作変数法など別の道具が必要。
❌ 2. コホート効果と時代効果の混同
2023 年時点で「30 代より 60 代のほうが貯蓄が多い」を見ても、 「年齢で貯蓄が増える」とは限らない (30 代は氷河期世代でそもそも所得が低い、 という世代効果の可能性)。 横断データでは Age・Period・Cohort の 3 つを分離できない。
❌ 3. 時点の暗黙固定
SSDSE-B-2026 を使う際、 「2023 年データ」であることを明記しないと、 「日本では出生率が…」と一般化した時に時点ズレが起きる。 横断データの結論には必ず時点を併記する。
❌ 4. 個体間異質性の固定効果不能
パネルデータなら個体固定効果で観察不能な異質性を制御できるが、 横断データでは不可能。 「北海道は土地が安いから」のような時不変要因をモデルに入れ忘れると交絡が残る。
❌ 5. 生態学的誤謬 (Ecological Fallacy)
47 都道府県の集計データで「県の平均教育年数 vs 県の平均所得」に正の相関があっても、 県内の個人レベルで同じ関係が成立する保証はない (Robinson, 1950)。 集団間関係と個人間関係を混同しない。
❌ 6. 選択バイアス (横断調査の代表性)
調査時点で「回答できる人」だけがサンプルになると、 死亡・転出・拒否の影響で母集団からズレる (Survivorship Bias)。 SSDSE のような全数集計は別だが、 アンケート横断調査では特に重要。
❌ 7. 標本サイズが固定 (n=47 など)
横断データは時間軸を持たないため、 SSDSE のような都道府県データだと n=47 で動かない。 これは中心極限定理が効きにくい小標本となり、 ノンパラ手法やブートストラップを併用する必要がある。

⚠️ 横断面分析の落とし穴(深掘り)

  1. サンプル数 $n=47$ の罠:都道府県横断面はサンプル数が小さいので、 自由度を消費しすぎると過剰適合します。 説明変数は最大でも 6-8 個程度に抑え、 ステップワイズや Lasso で慎重に絞ること。
  2. 時間変動の見落とし:「2026 年だけの構造」を「普遍的関係」と誤解するのは典型ミス。 結論は必ず「2026 年時点」と但し書きを付け、 過去年版(SSDSE-B-2024, 2025)でも同じ構造かを確認しましょう。
  3. 空間相関の無視:隣接県は経済構造や人口動態が似ています。 「主体間独立」の前提が崩れ、 標準誤差が過小評価されます。 空間計量モデル(SAR, SEM)や地理加重回帰(GWR)の検討が必要。
  4. 異質性:「平均効果」だけで議論すると、 「東京と沖縄では係数の符号さえ違う」可能性を見落とします。 ローカル回帰、 量子点回帰、 群別 OLS で異質性をチェック。
  5. 外れ値県の影響:東京は人口・経済規模で他県と桁違い。 外れ値が回帰係数を支配するので、 Cook 距離・てこ比で確認し、 ロバスト回帰(Huber, RANSAC)の併用が安全。
  6. 標準化と単位:人口(百万単位)、 進学率(%単位)、 財政力指数(無次元)の混在する横断面では係数の解釈に混乱が起きます。 比較目的なら標準化済係数(βスタンダード化)も併記。
  7. 横断面 → 時系列の越権:「県間で X が高い県は Y も高い」から「X を上げれば Y も上がる」と推論するのは典型誤り。 時間方向の因果は時系列・パネル分析で別途検証が要ります。
  8. クロスセクション・ディペンデンス:マクロショック(全国共通の景気変動)があると、 県間の誤差が共通要因で相関します。 マクロダミーやクラスタ標準誤差で対処。

🔭 さらに深掘り — 直感・落とし穴・発展(追記)

ここまでの各セクションを踏まえ、 横断面データの「掴み方」「踏みやすい罠」「次の一手」を、 SSDSE-B-2026 の実測値とともに一枚にまとめ直します。 既に上で触れた論点も、 直感 → 落とし穴 → 発展 の順に並べ替えると腹落ちしやすくなります。

🎨 直感:横断面は「ある一瞬の集合写真」

横断面データとは、 ある一時点で多数の個体を横一列に切り取ったスナップショットです。 SSDSE-B-2026 の「2023 年・47 都道府県」はまさにこれ。 この 1 枚の中では、 総人口 A1101 は 鳥取 53.7 万人 〜 東京 1408.6 万人(47 県平均 264.6 万人)と県間で大きくばらつきます(いずれも 2023 年の実測値・万人換算)。 「どの県が多い/少ないか」という横の比較はこの 1 枚で十分できます。

一方、 同じ大きな箱(47 県 × 2012〜2023 年)を県で固定して時間方向に切ると時系列になり、 東京は 2012→2023 で +85.2 万人、 秋田は −14.9 万人という時間変化が初めて見えます(実測値)。 縦(時間・1 個体)=時系列、 横(個体・1 時点)=横断面、 両方=パネル、 という三つの切り口の違いを、 同一データで体感できるのが SSDSE-B の強みです。

📊 実測で確かめる「横は大きい・縦は小さい」
SSDSE-B のパネル(47 県 × 12 年)で総人口の分散を分解すると、 県間のばらつき(between)が全分散の約 99.95%を占め、 県内の年変動(within)はごくわずかでした(実測)。 つまり「1 時点の横断面でも県間構造はほぼ丸ごと捉えられる」半面、 「1 県を固定すると時間変化は小さい」。 これが、 横断面が地域間比較に強く時間変化に弱い理由を数値で裏づけます。 そして次に述べる固定効果は、 この巨大な between をまるごと差し引く操作にほかなりません。

⚠️ 落とし穴(重要)— 早見表

横断面データで最も多い誤りは、 1 時点しかないのに「因果」や「時間変化」を語ってしまうことです。 代表的な罠と対処・関連ページを一覧にします。

落とし穴何が起きるか対処・関連ページ
因果・時間順序が不明1 時点では「X が先か Y が先か」を観察できない。 相関を因果と読むと逆因果を見落とす。因果と相関逆因果
横断相関を経時変化と誤読「県間で X が高い県は Y も高い」を「X を増やせば Y が増える」と読み替える越権。 断面の傾きは時間方向の変化率ではない。時系列パネル
生態学的誤謬県平均どうしの相関が個人レベルの関係と一致する保証はない(Robinson, 1950)。 集計単位を変えると相関の符号すら変わりうる。専用ページは未整備のため本文で解説/見かけの相関
選択バイアス「回答できた人/存在する主体」だけが標本になると母集団からずれる(生存者バイアス等)。選択バイアス
観測されない個体異質性県固有の時不変要因(風土・産業構造)をモデルに入れ忘れると交絡が残る。 横断面では固定効果で除けない。交絡固定効果
一時点の外れ値東京(1408.6 万人)は他県と桁違いで、 回帰係数やてこ比を支配しがち。 その年だけの災害・制度変更も「普遍構造」と誤読しやすい。外れ値ロバスト統計

🚀 発展:時間軸を足すと解ける問題

🔗 このテーマの深掘り先(相対リンク)

上の各論点に対応する用語ページ(いずれも本用語集内に存在):

時系列データパネルデータ固定効果変量効果Hausman 検定パネル因果推論DID平行トレンド操作変数回帰不連続選択バイアス交絡逆因果外れ値ロバスト統計

※「生態学的誤謬」「個体異質性」の独立ページは未整備のため本文で解説。 「縦断データ」は パネルデータ のページで扱っています。

🗺 概念マップ

クロスセクションデータを中心に、 時系列データパネルデータ反復横断データとの比較関係、 サンプリング (層化・クラスター)、 分析手法 (回帰・主成分・クラスタリング) への接続を整理した。 SSDSE-B-2026 が典型的な 47 都道府県 × 単一時点のクロスセクションデータであることを念頭に、 どの手法が直接適用でき、 どの手法が時系列構造を要求するかを判断する地図として使える。

横断データ 同一時点の比較 時系列データとの対比 パネルデータへ拡張 学術研究 実務応用 公的統計の活用

概念マップ中央のクロスセクションデータから 3 方向に枝が伸びる: 上方の「公的統計の活用」は SSDSE や国勢調査のような 同一時点で全 47 都道府県を一気に観察する 典型例。 右方の「学術研究」は社会学・経済学で家計・企業を横並びにする横断調査。 左下の「実務応用」は商品別売上比較や店舗別 KPI ベンチマークなど、 日々の意思決定で最も頻出する形態。

クロスセクションの強みは 時間軸を固定して個体差だけに集中できる 点だが、 同時に「因果方向が不明」「コーホート効果が紛れ込む」という弱みも持つ。 図右下の「時系列データ」「パネルデータ」は、 これらの弱みを時間情報を加えて補完する隣接概念で、 SSDSE-B-2026 のように年度別ファイルを縦結合すればパネルデータに昇格できる。

🔗 隣接手法への橋渡し

「クロスセクションデータ」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

クリーニング → 記述統計 → 群間検定/回帰 → 政策示唆の流れで、 因果は推論できないため「相関の段で結論を急がない」設計が要点。

🌳 手法選択フロー

横断データ(同一時点で個体を横並びに観測)は、 時間軸の扱い・個体追跡の有無・因果推論の意図で、 どのデータ構造へ展開するかを多段で決める。

  1. ① 時間軸の情報は必要か?
    • No(1 時点での比較のみ)→ 横断データ 確定 → ② へ
    • Yes → 時間情報の扱い方を ③ で決める
  2. ② 横断データ内での分析目的は?
  3. ③ 時間軸を加えるなら、 個体は追跡するか?
  4. ④ 因果推論をしたいか?
  5. ⑤ サンプリングは適切か?

💡 ポイント: 「時点の扱い → 個体追跡の有無 → 因果意図 → サンプリング」 の順で多段判定すると、 横断 → 反復横断 → パネル → 時系列の使い分けが整理できる。