論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
ダミー変数
Dummy Variable
回帰分析前処理

🔖 キーワード索引

30秒結論 文脈ボックス 直感 数式・定義 数式読解 実値計算 Python実装 エンコーディング種別 落とし穴 関連手法 応用 関連用語 グループ教材 FAQ 概念マップ

💡 30秒で分かる結論

🍰 まずはやさしく

文字のデータを0か1に置き換える方法です。

計算モデルにデータを入れるために使います。

都道府県をグループで分けるときに便利です。

ダミー変数の作り方と使い方を学びます。

📍 文脈ボックス — あなたが今見ているもの

🍰 まずはやさしく

データの種類を変える翻訳装置のようなものです。

文字の情報を数値として伝えるために使います。

回帰分析という計算の手法でよく登場します。

この機能がどこで使われるのかを確認しましょう。

あなたは 「データ前処理 / 回帰分析 / 変数変換」 の交点ページを見ています。 ダミー変数は データの種類 で言う「質的変数」を 「量的変数の言葉で機械に伝えるための翻訳装置」です。

上位概念カテゴリ変数エンコーディング
同列概念One-Hot / Effect Coding / Target Encoding / Binary Encoding
下位応用線形回帰 / ロジスティック回帰 / 多変量 ANOVA / 共分散分析
前提知識データの種類と変数 / 重回帰

🎨 直感で掴む

🍰 まずはやさしく

「当てはまるか」を0と1で表す仕組みです。

機械が文字を勘違いしないようにします。

血液型や住んでいる地域などで考えます。

基準を決めて比べる方法を具体的に見ましょう。

「血液型が A 型なら 1, それ以外なら 0」「都道府県が東京なら 1, それ以外なら 0」のように、 該当するか/しないか を 0/1 で表す変数がダミー変数です。 機械(線形回帰や決定木)は数値しか扱えないので、 文字列カテゴリをこの形に翻訳して入力します。

SSDSE-B-2026 の「都道府県」列をそのまま回帰に入れると、 「東京=1, 北海道=2, ... 」のように数値順に意味を勘違いされます。 そこで「東京ダミー」「大阪ダミー」「愛知ダミー」「...」と カテゴリの数-1 個 の 0/1 変数を新設するのです。

基準カテゴリは「ダミーが全て 0」のグループ。 たとえば「沖縄を基準」にすると、 各ダミー係数は「沖縄と比較した差」を意味します。 基準の選び方で係数は変わりますが、 予測値は同じです。

表 1. 5 県の都市圏フラグをダミー化した例
三大都市圏中四国北日本基準(その他)
東京都100
大阪府100
広島県010
北海道001
沖縄県000基準

📐 数式または定義

🍰 まずはやさしく

カテゴリを0か1の変数にする定義です。

数式を使って正しく計算するために使います。

グループごとの平均の差を求めるときに役立ちます。

ダミー変数を使った計算式について読みましょう。

カテゴリ変数 $C \in \{c_1, c_2, \dots, c_k\}$ に対して、 第 $j$ 番目($j=1,\dots,k-1$、 $c_k$ を基準)のダミー変数 $D_j$ を:

$$D_j = \mathbb{1}\!\left[ C = c_j \right] = \begin{cases} 1 & C = c_j \\ 0 & \text{otherwise} \end{cases}$$

ダミー変数を含む線形回帰モデル:

$$y_i = \beta_0 + \sum_{j=1}^{k-1} \beta_j D_{ij} + \gamma X_i + \varepsilon_i$$

$\beta_j$ は「カテゴリ $c_j$ と基準カテゴリ $c_k$ の平均差」を表す。 すべてのダミーが 0 のとき(=基準カテゴリ)の予測値は $\beta_0 + \gamma X_i$。

交互作用項(カテゴリと連続変数の組み合わせ):

$$y_i = \beta_0 + \beta_1 D_i + \beta_2 X_i + \beta_3 (D_i \cdot X_i) + \varepsilon_i$$

効果コーディング(Effect Coding):

$$D_j = \begin{cases} 1 & C = c_j \\ -1 & C = c_k \\ 0 & \text{otherwise} \end{cases}$$

🔬 数式を言葉で読み解く

記号名前意味
$C$カテゴリ変数「都市圏」「血液型」など
$D_j$第 $j$ ダミー$c_j$ に属するなら 1
$\beta_0$切片基準カテゴリの平均
$\beta_j$ダミー係数カテゴリ $c_j$ と基準との差
$D_i \cdot X_i$交互作用項傾き自体がカテゴリで変わる

$k-1$ 個に抑える理由:$k$ 個すべて入れると $\sum_j D_j = 1$ なので切片と完全多重共線になり推定不能(ダミー変数トラップ)。 ペナルティ付き回帰(Ridge, Lasso)では数学的には大丈夫ですが、 解釈のために 1 つ除くのが慣例。

🧮 数式に値を入れて手で計算する(SSDSE-B-2026 都道府県)

ダミー変数を使ったグループ別平均の差を、 5 都道府県の SSDSE-B-2026 実数値で Step ごとに手計算します。 ここでは「三大都市圏ダミー $D$」と「地方グループ」の総人口(万人)の差 $\hat{\beta}_1$ を OLS 手計算で求めます。

モデル:

$$y_i = \beta_0 + \beta_1 D_i + \varepsilon_i$$

ここで $D_i=1$ が三大都市圏、 $D_i=0$ が地方(基準)。 シンプルな二群モデルで、 OLS 解は

$$\hat{\beta}_1 = \bar{y}_{D=1} - \bar{y}_{D=0}, \quad \hat{\beta}_0 = \bar{y}_{D=0}$$

つまり係数 $\hat{\beta}_1$ は「都市圏グループの平均人口 − 地方グループの平均人口」に等しい。

📥 入力データ(SSDSE-B-2026 より抜粋、総人口単位は万人)

表 2. 5 都道府県の実データ(SSDSE-B-2026 最新年度)
都道府県$D_i$(都市圏)総人口 $y_i$(万人)
東京都11,408.6
神奈川県1922.9
北海道0509.2
広島県0273.8
沖縄県0146.8

Step 1. グループ別平均を計算する

都市圏グループ($D=1$): 東京都 + 神奈川県

$$\bar{y}_{D=1} = \frac{1{,}408.6 + 922.9}{2} = \frac{2{,}331.5}{2} = 1{,}165.75 \text{ 万人}$$

地方グループ($D=0$): 北海道 + 広島県 + 沖縄県

$$\bar{y}_{D=0} = \frac{509.2 + 273.8 + 146.8}{3} = \frac{929.8}{3} = 309.93 \text{ 万人}$$

Step 2. ダミー係数(都市圏効果)を計算する

$$\hat{\beta}_1 = \bar{y}_{D=1} - \bar{y}_{D=0} = 1{,}165.75 - 309.93 = 855.82 \text{ 万人}$$

切片(地方グループの平均):

$$\hat{\beta}_0 = \bar{y}_{D=0} = 309.93 \text{ 万人}$$

Step 3. 各観測値の予測値と残差を計算する

表 3. 予測値・残差(手計算)
都道府県$D_i$$y_i$$\hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1 D_i$残差 $e_i = y_i - \hat{y}_i$
東京都11,408.6309.93 + 855.82 = 1,165.75+242.85
神奈川県1922.9309.93 + 855.82 = 1,165.75−242.85
北海道0509.2309.93 + 0 = 309.93+199.27
広島県0273.8309.93 + 0 = 309.93−36.13
沖縄県0146.8309.93 + 0 = 309.93−163.13

Step 4. Python で同じ計算を再現する(一致確認)

このコードでやること:numpy で上記の手計算(グループ平均差)を再現し、 OLS の係数と一致することを確認する。

📥 入力(5 都道府県の実データ): 都道府県 = ['東京都','神奈川県','北海道','広島県','沖縄県'] D = [1, 1, 0, 0, 0] # 三大都市圏ダミー y = [1408.6, 922.9, 509.2, 273.8, 146.8] # 総人口(万人)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np

# SSDSE-B-2026 5 都道府県(手計算と同じデータ)
D = np.array([1, 1, 0, 0, 0], dtype=float)
y = np.array([1408.6, 922.9, 509.2, 273.8, 146.8])

# グループ別平均(手計算と一致するはず)
y_metro = y[D==1].mean()
y_rural = y[D==0].mean()
beta1 = y_metro - y_rural
beta0 = y_rural

# OLS で確認(X = [1, D])
X = np.column_stack([np.ones(5), D])
beta_ols = np.linalg.lstsq(X, y, rcond=None)[0]

print(f'手計算: β0={beta0:.2f}, β1={beta1:.2f}')
print(f'OLS:   β0={beta_ols[0]:.2f}, β1={beta_ols[1]:.2f}')
print('一致確認:', np.allclose([beta0, beta1], beta_ols))
📤 実行結果: 手計算: β0=309.93, β1=855.82 OLS: β0=309.93, β1=855.82 一致確認: True

💬 手計算と OLS は完全に一致(True)。 切片 $\hat{\beta}_0 = 309.93$ 万人は地方グループ(北海道・広島・沖縄)の平均人口。 ダミー係数 $\hat{\beta}_1 = 855.82$ 万人は「三大都市圏は地方より平均 855 万人多い」という効果を示す。 都市圏の県はこの「+855 万人」が上乗せされ、 沖縄・広島はほぼ切片水準に収まる。

基準カテゴリを変えると係数はどう変わる?

「地方基準 → 都市圏基準($D=1$ を基準に $D'=1-D$)」に変えると、 切片が $\bar{y}_{D=1}=1{,}165.75$ に再校正され、 ダミー係数の符号が反転して $-855.82$ になります。 予測値 $\hat{y}_i$ は変わりません。 係数の数値は変わっても「基準との差」という意味は保たれます。

✏️ 演習問題(手計算)

問題:以下の 4 県データで、$\hat{\beta}_0$ と $\hat{\beta}_1$ を手計算しなさい。

$D_i$(三大都市圏)$y_i$(総人口 万人)
大阪府1876.3
愛知県1747.7
福岡県0510.3
宮城県0226.4

ヒント:$\hat{\beta}_1 = \bar{y}_{D=1} - \bar{y}_{D=0}$、 $\hat{\beta}_0 = \bar{y}_{D=0}$

▶ 解答を見る

都市圏グループ平均:$\bar{y}_{D=1} = (876.3 + 747.7)/2 = 1624.0/2 = 812.0$ 万人

地方グループ平均:$\bar{y}_{D=0} = (510.3 + 226.4)/2 = 736.7/2 = 368.35$ 万人

$\hat{\beta}_1 = 812.0 - 368.35 = \mathbf{443.65}$ 万人(都市圏効果)

$\hat{\beta}_0 = 368.35$ 万人(地方グループの平均人口)

💬 今回は東京・神奈川を除いたデータのため、係数は本文の 855.82 より小さく 443.65 になる。基準カテゴリや標本の選び方によって係数値は変わる。

🎮 触って理解する

3 つのグループ(A=基準 / B / C)を、 共通の傾き $\beta_1$ と グループごとのダミー係数(切片シフト) で回帰するモデルです。 スライダー、 または 散布図の左端の丸(ハンドル)を上下にドラッグすると、 3 本の回帰直線と数値がリアルタイムに動きます。 スマホでは指でドラッグできます。

モデル:$\;\hat{y}=\beta_0+\beta_1 x+\beta_B D_B+\beta_C D_C\;$($D_B,D_C$ は 0/1)。 グループ A は $D_B=D_C=0$ の 基準カテゴリ。 だから A の切片は $\beta_0$、 B の切片は $\beta_0+\beta_B$、 C の切片は $\beta_0+\beta_C$ になります。 ダミー係数 $\beta_B,\beta_C$ は「基準 A との切片の差」そのものです。 3 カテゴリなのでダミーは 2 本($k-1$)だけ ── これがダミー変数トラップ回避です。

説明変数 x(連続量) 応答変数 y
いまの 3 本の回帰式(切片=基準 β₀ にダミー係数を足したもの)
A:ŷ = ...
B:ŷ = ...
C:ŷ = ...
解釈:...
残差二乗和 SSR:...

🧭 直感:カテゴリを 0/1 にして回帰に入れるだけ

ダミー変数は「そのグループに属するなら 1、 そうでなければ 0」というスイッチです。 回帰式にこのスイッチを入れると、 スイッチが ON のとき係数ぶんだけ切片が上下します。 上の図で β_B を動かすと B のラインだけが平行移動するのは、 B の点だけ $D_B=1$ でスイッチが入るからです。 傾き β₁ は全グループ共通なので、 3 本はいつも平行です。

🕳 よくある落とし穴

🚀 発展

🐍 Python 実装

SSDSE-B-2026 で「三大都市圏ダミー」を作り、 人口を消費支出と都市圏フラグで回帰します。

🎯 このコードでやること: SSDSE-B-2026 から各都道府県の最新年度データを取り出し、 isin() で三大都市圏ダミー (0/1) を作成する

📥 入力例 (SSDSE-B-2026、 skiprows=1 で日本語列名・2023 年度): 年度 地域コード 都道府県 総人口 2023 R01000 北海道 5,092,000 2023 R02000 青森県 1,184,000 ... 2023 R47000 沖縄県 1,468,000
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
import numpy as np

# 実 SSDSE-B-2026 読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
latest = df.sort_values('年度').groupby('都道府県').last().reset_index()

# 三大都市圏ダミーを作成
metro = {'東京都','神奈川県','埼玉県','千葉県',
         '大阪府','京都府','兵庫県','奈良県',
         '愛知県','岐阜県','三重県'}
latest['大都市圏ダミー'] = latest['都道府県'].isin(metro).astype(int)
print(latest[['都道府県','大都市圏ダミー','総人口','消費支出(二人以上の世帯)']].head(15))
📤 実行結果 (先頭 6 行、 15 行まで表示される): 都道府県 大都市圏ダミー 総人口 消費支出(二人以上の世帯) 0 三重県 1 1727000 332663 1 京都府 1 2535000 314636 2 佐賀県 0 795000 274861 3 兵庫県 1 5370000 279880 4 北海道 0 5092000 296888 5 千葉県 1 6257000 306943

💬 読み方: sort_values('年度') → groupby('都道府県').last() で各県の最新年度 (2023) を 1 行ずつ取り出し、 isin() で 0/1 の三大都市圏ダミーを作った。 このダミーはそのまま線形回帰や ANOVA に投入できる。

🎯 このコードでやること: pandas.get_dummies(drop_first=True) で地域ブロックを 7 列のダミー変数に変換する

📥 入力例 (SSDSE-B-2026): df['region'] = ['北海道', '東北', '関東', ..., '九州'] (47 行、 8 値)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# pd.get_dummies で地域ブロックダミー化
region_map = {
    '北海道':'北海道','青森県':'東北','岩手県':'東北','宮城県':'東北','秋田県':'東北','山形県':'東北','福島県':'東北',
    '茨城県':'関東','栃木県':'関東','群馬県':'関東','埼玉県':'関東','千葉県':'関東','東京都':'関東','神奈川県':'関東',
    '新潟県':'中部','富山県':'中部','石川県':'中部','福井県':'中部','山梨県':'中部','長野県':'中部','岐阜県':'中部','静岡県':'中部','愛知県':'中部',
    '三重県':'近畿','滋賀県':'近畿','京都府':'近畿','大阪府':'近畿','兵庫県':'近畿','奈良県':'近畿','和歌山県':'近畿',
    '鳥取県':'中国','島根県':'中国','岡山県':'中国','広島県':'中国','山口県':'中国',
    '徳島県':'四国','香川県':'四国','愛媛県':'四国','高知県':'四国',
    '福岡県':'九州','佐賀県':'九州','長崎県':'九州','熊本県':'九州','大分県':'九州','宮崎県':'九州','鹿児島県':'九州','沖縄県':'九州'
}
latest['地域'] = latest['都道府県'].map(region_map)
latest['地域'] = pd.Categorical(latest['地域'], categories=['北海道','東北','関東','中部','近畿','中国','四国','九州'])  # 先頭カテゴリ=基準を明示
dummies = pd.get_dummies(latest['地域'], drop_first=True)  # 北海道を基準に
print(dummies.head())
X = pd.concat([latest[['消費支出(二人以上の世帯)']], dummies], axis=1)
y = latest['総人口']
print('説明変数の形:', X.shape)
📤 実行結果 (先頭 5 行): 東北 関東 中部 近畿 中国 四国 九州 0 False False False True False False False 1 False False False True False False False 2 False False False False False False True 3 False False False True False False False 4 False False False False False False False ← 北海道 (基準、 全列 0) 説明変数の形: (47, 8)

💬 読み方: k 値カテゴリを k-1 個のダミーで表現し、 完全多重共線性『ダミー変数の罠』を回避。 削除されたカテゴリ (北海道) が基準 (reference level) になり、 切片に吸収される。 なお drop_first=True は既定では五十音順の先頭を落とすため、 pd.Categorical で基準を明示している。 線形回帰では必須テクニック。

🎯 このコードでやること: statsmodels で地域ダミー入り OLS 回帰を実行し、 各地域の所得効果を推定

📥 入力例 (SSDSE-B-2026): y = 総人口, X = 消費支出 + 地域ダミー 7 列 + 切片
1
2
3
4
5
6
# statsmodels で OLS 回帰
import statsmodels.api as sm
Xc = sm.add_constant(X.astype(float))
model = sm.OLS(y, Xc).fit()
print(model.summary())
# 各地域ダミーの係数 = 「北海道と比べてその地域は平均何人多い/少ないか」
📤 実行結果 (model.params 抜粋、 単位は人): const = 1,159,573 (基準=北海道) 消費支出 = 13.0 関東 = +866,255 (北海道より多い) 東北 = -3,680,023 (北海道より少ない) 九州 = -3,104,127

💬 読み方: 各ダミー係数は基準カテゴリ (北海道) との差分。 消費支出を一定とした下で、 関東は約 +87 万人、 東北は約 −368 万人など解釈が直感的になる。 ANOVA の F 検定と同等の効果が、 ダミー回帰で得られる。

🎯 このコードでやること: sklearn の OneHotEncoder で同じダミー化を実装し、 訓練/テスト分割で列構造を固定

📥 入力例 (SSDSE-B-2026): X_train['region'], X_test['region'] テスト集合に北海道がない場合でも列は揃える
1
2
3
4
5
6
7
8
9
# scikit-learn の OneHotEncoder で同じことを
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LinearRegression
enc = OneHotEncoder(drop='first', sparse_output=False)
D = enc.fit_transform(latest[['地域']])
X2 = np.hstack([latest[['消費支出(二人以上の世帯)']].values, D])
reg = LinearRegression().fit(X2, latest['総人口'])
print('係数:', dict(zip(['消費支出'] + list(enc.get_feature_names_out()), reg.coef_)))
print('切片:', reg.intercept_)
📤 実行結果 (係数は丸めて表示): 係数: {'消費支出': 13.2, '地域_中部': 720801, '地域_九州': 511121, '地域_北海道': 3615248, '地域_四国': -312577, '地域_東北': -64775, '地域_近畿': 1666446, '地域_関東': 4481503} 切片: -2455675.0 → OneHotEncoder の drop='first' は五十音順で先頭の「中国」を基準に落とす点に注意

💬 読み方: pandas.get_dummies は train/test で列が変わるリスクあり。 sklearn の OneHotEncoder + drop='first' で完全に固定。 Pipeline 化することで、 fit/transform/inverse の運用ミスを防ぐ。

🎯 このコードでやること: 対話 (interaction) ダミー: 地域 × 都市/地方の交互作用項を追加し、 効果の異質性を捉える

📥 入力例 (SSDSE-B-2026): X = 地域ダミー 7 列 + 都市ダミー 1 列 + 交互作用 7 列
1
2
3
4
5
# patsy 形式で交互作用を含める (R 流フォーミュラ)
import statsmodels.formula.api as smf
latest_renamed = latest.rename(columns={'消費支出(二人以上の世帯)':'消費'})
# 地域による傾き差を許す
m = smf.ols('総人口 ~ 消費 * C(地域, Treatment("北海道"))', data=latest_renamed).fit()
📤 実行結果 (m.params 抜粋): 消費 = +29.7 (基準=北海道の傾き) 消費:関東ダミー = +87.9 (関東は傾きが急) 消費:近畿ダミー = -77.4 消費:東北ダミー = -21.9 → 地域ごとに消費支出の傾き (効果) が異なる

💬 読み方: 交互作用項で『消費支出の効果 (傾き) は地域によって異なる』を表現。 関東の傾きは基準の +29.7 に交互作用 +87.9 が乗って約 +117.6 になる。 ただし N=47 の小標本に項数が多く係数は不安定。 ANCOVA や混合効果モデルで効果の異質性を分析する第一歩。

🎯 このコードでやること: 高カーディナリティ (47 都道府県) を扱うために、 ターゲットエンコーディングを併用する

📥 入力例 (SSDSE-B-2026): df['都道府県'] = 47 ユニーク値、 高カーディナリティ
1
2
3
4
# Target Encoding: ダミー数が爆発する場合の代替
te = latest.groupby('地域')['総人口'].transform('mean')
latest['地域_TE'] = te
print(latest[['都道府県','地域','地域_TE']].head(10))
📤 実行結果 (先頭 5 行): 都道府県 地域 地域_TE 0 三重県 近畿 3.141429e+06 1 京都府 近畿 3.141429e+06 2 佐賀県 九州 1.753625e+06 3 兵庫県 近畿 3.141429e+06 4 北海道 北海道 5.092000e+06 → 地域ごとの総人口平均で 1 列に圧縮、 47 ダミー回避

💬 読み方: 47 都道府県をすべてダミーにすると 46 列で過学習リスク。 Target Encoding は『目的変数の平均値』で 1 列に圧縮するが、 リーク防止のため smoothing と CV fold ごとの fit が必須。

⚠️ 落とし穴

❌ ダミー変数トラップ(完全多重共線)
k カテゴリすべてのダミーを入れると切片との完全共線が発生し、 OLS が解けない。 必ず 1 つを基準として除く(drop_first=True)。 Ridge/Lasso では数学的には大丈夫だが解釈は不安定。
❌ 高カーディナリティで列数爆発
「47 都道府県」「2000 商品」のように水準数が多いとモデルが疎で過学習しやすい。 Target Encoding やランダムエフェクトモデルで縮約する。
❌ 基準カテゴリの選び方が悪い
サンプル数が極端に少ないカテゴリを基準にすると、 他カテゴリの係数の標準誤差が膨らむ。 サンプル数が中央値前後の代表的カテゴリを基準に選ぶのが定石。
❌ 順序情報の喪失
「低・中・高」のような順序カテゴリをダミー化すると順序情報が消える。 必要に応じて順序符号化 (Ordinal) や Polynomial Coding を使う。
❌ 訓練/テストでカテゴリが違う
テストデータに訓練時に存在しなかったカテゴリが出ると列がずれて予測できない。 OneHotEncoder の handle_unknown='ignore' などを設定する。

🗺 概念マップ

ダミー変数は カテゴリ変数を線形モデルに繋ぐ橋データの種類 → ダミー化 → 回帰 / ロジスティック / ANOVA という典型的なフローを支えます。

分野別の呼称マップ

分野用語の呼ばれ方基準 drop の慣例
統計学ダミー変数 / 指示変数drop_first=True で k-1 個
機械学習One-Hot Encodingk 個すべて残すことも多い
経済学指標変数 (Indicator)対照群を基準に
心理学/医学対比 (Contrast) 変数効果コーディング (+1/-1) も使用
深層学習Embedding / One-HotEmbedding で学習済みベクトルに

包含・依存関係ツリー

階層用語 / 概念ダミー変数との関係
上位カテゴリ変数 / 特徴量エンジニアリングダミー化はカテゴリ → 数値変換の一手法
同列Target Encoding / Ordinal / Binary / Hashing別のエンコーディング方式(互いに代替可能)
下流線形回帰 / ロジスティック回帰 / ANOVA / 重回帰ダミーを説明変数として受け取るモデル群
応用DiD / 固定効果モデル / 交互作用 / 季節調整ダミー変数が因果推論・時系列の基盤に

SSDSE-B-2026 での概念的位置づけ

SSDSE-B-2026 の 47 都道府県データでは次のような変換パスが典型的に使われます:

カテゴリ変数(元)ダミー化の方法生成されるダミー列数基準
都道府県(47 県)get_dummies(drop_first)46 列北海道(or アルファベット先頭)
地域ブロック(8 区分)get_dummies(drop_first)7 列北海道
三大都市圏(2 区分)isin() で 0/1 作成1 列地方($D=0$)
政令指定都市ダミーカラム作成1 列非政令市($D=0$)

関係図(SVG 概念マップ)

カテゴリ変数 ダミー変数 (0/1) 線形回帰 / 重回帰 ANOVA / F 検定 ロジスティック回帰 Effect Coding Target Encoding 変換・投入の流れ 同列の代替手法

🔗 隣接手法への橋渡し

「ダミー変数」は単独で完結する手法ではなく、 隣接手法と連携することで真価を発揮します。 入力・並列・出力の 3 方向から整理します。

方向手法ダミー変数との接続
上流カテゴリ変数の識別名義・順序・比例の区別がダミー化の判断基準
上流欠損値処理欠損を「不明」カテゴリとしてダミー化する手法も存在する
並列ANOVA(分散分析)グループ間差の F 検定。 ダミー回帰と数学的に等価
並列t 検定2 グループの差検定 = k=2 のダミー回帰の t 検定と等価
下流重回帰分析ダミー変数を連続変数と混合して投入する標準的なモデル
下流ロジスティック回帰ダミーの係数は対数オッズ比として解釈される
発展機械学習(One-Hot)sklearn の OneHotEncoder はダミー変数の機械学習版。 Pipeline で前処理を固定できる
因果DiD / 固定効果モデル処置群ダミー × 期間ダミーの交互作用が因果効果 $\delta$ になる

これらの接続を意識することで、 ダミー変数を中核に据えた「データ読み込み → エンコーディング → 回帰 / 検定 → 解釈」という一貫した分析パイプラインを構築できます。

🌳 手法選択フロー

カテゴリ変数をどのようにエンコードするか、 状況別に 4 段階で判定するフローを示します。 SSDSE-B-2026 の都道府県データを想定しています。

ステップ判断条件Yes → 選択肢No → 代替
Step 1カテゴリ数 $k$ は 20 以下か?ダミー変数(k-1 列)を使う→ Step 2 へ(高カーディナリティ対策)
Step 2目的変数との関係を把握したいか?Target Encoding(リーク防止必須)→ Frequency Encoding / Hashing
Step 3順序のある変数か(例:低/中/高)?Ordinal Encoding(順序保持)→ ダミー変数(順序無視)
Step 4深層学習モデルで使うか?Embedding(学習済みベクトル)→ One-Hot / ダミー変数

SSDSE-B-2026 での判定例:

🧩 エンコーディングの種類

名称符号化特徴
Dummy / One-Hot0/1, k-1 列標準。 解釈容易
Effect / Sum Coding+1, -1, 0「全体平均との差」を測る
Helmert Coding各カテゴリと後続平均を比較順序カテゴリに有効
Polynomial Coding直交多項式線形・二次トレンドを抽出
Target Encodingカテゴリ別目的変数平均高カーディナリティに有効。 リーク注意
Binary Encoding2進表現列数を $\log_2 k$ に
Frequency Encoding出現頻度情報量少だが軽量
Embedding学習されるベクトル深層学習の標準

🔬 応用事例

✅ ベストプラクティス

⚖ コーディング方式の比較

3 水準 {A, B, C} (基準 C) の場合の各コーディング行列:

水準Dummy (D₁ D₂)Effect (E₁ E₂)Helmert (H₁ H₂)
A1, 01, 0-1, -1
B0, 10, 11, -1
C (基準)0, 0-1, -10, 2

同じデータでも符号化を変えると係数の数値・解釈が変わります。 ただし 予測値・モデルの当てはまり ($R^2$)・F 検定の結果は不変。 解釈の都合で選びます。

📜 歴史と語源

「ダミー変数」という言葉は 1950 年代の計量経済学(Suits 1957 など)で広まりました。 元来は「実体のない、 単に他のものを表すために置かれる」という英語 dummy の意味どおり、 実際の数量ではなく属性を 0/1 で表す 変数として導入されました。 機械学習が普及した 2000 年代以降は One-Hot Encoding という呼び名が広がりましたが、 統計学では依然「ダミー変数」が一般名です。

📖 係数の解釈ガイド

線形回帰でのダミー係数解釈は 基準カテゴリとの差。 モデルによって解釈の単位が変わる点に注意:

モデルダミー係数の意味単位
線形回帰目的変数 $y$ の平均差$y$ と同じ単位
対数線形回帰$y$ の比率差(約 $\%$)$e^\beta - 1 \approx \beta$
ロジスティック回帰対数オッズ比$\exp(\beta) =$ OR
ポアソン回帰対数発生率比$\exp(\beta) =$ IRR
Cox 回帰対数ハザード比$\exp(\beta) =$ HR

SSDSE-B-2026 で「東京ダミー係数 = +6,500,000」(線形 OLS)なら「東京は基準カテゴリより平均 650 万人多い」。 同じデータに対数線形を当てて「東京ダミー係数 = 0.6」なら「東京は基準より約 +60% (= $e^{0.6}-1 \approx 0.82$ で約 +82%) 大きい」。

📊 ダミーで因果推論:DiD と二要因 ANOVA

ダミーが本領を発揮するのは 因果推論 の場面です。 差の差分法 (Difference-in-Differences, DiD) では「処置ダミー × 期間ダミー」の交互作用係数が因果効果の推定量になります。

$$y_{it} = \alpha + \beta_1 \text{Treat}_i + \beta_2 \text{Post}_t + \delta(\text{Treat}_i \cdot \text{Post}_t) + \varepsilon_{it}$$

$\delta$ が「処置による効果」の不偏推定量(共通トレンド仮定下)。 例:ある県に観光振興政策が 2020 年に導入されたとき、 政策実施県と未実施県で「2020 年前後の旅館施設数の変化の差」を $\delta$ が捉えます。

表 3. DiD 設計表(SSDSE-B 旅館施設数を使う例)
処置前 (2018)処置後 (2023)
処置群(政策実施県)$\bar{y}_{T,0}$$\bar{y}_{T,1}$$\Delta_T$
対照群(その他)$\bar{y}_{C,0}$$\bar{y}_{C,1}$$\Delta_C$
差の差$\delta = \Delta_T - \Delta_C$

🏛 固定効果モデルとダミー

パネルデータでは「47 都道府県ダミー」を全て投入することで、 県固有の時間不変な影響を吸収できます。 これが 固定効果モデル (Fixed Effects) の骨格。 within 推定量と数学的に等価。

$$y_{it} = \alpha_i + \beta X_{it} + \varepsilon_{it}, \quad \alpha_i = \sum_{j=1}^{N-1} \beta_j D_{ji}$$

$N=47$ 県の場合、 46 個のダミーを追加します。 SSDSE-B-2026 のように複数年×複数県のパネルでは、 県固定効果と年固定効果を両方入れる 2-way FE が標準。

❓ FAQ

Q1. なぜ k-1 個に減らすのか?

k 個すべてを入れると $\sum_j D_j = 1$ となり切片と線形従属(rank 落ち)。 OLS の正規方程式が解けないため。 ペナルティ付き回帰では k 個でも回るが、 解釈用の慣例として 1 つ除く。

Q2. ダミー変数係数の有意性は何を検定する?

$\beta_j = 0$(基準カテゴリと差なし)の帰無仮説に対する t 検定。 ただし「カテゴリ全体が説明力を持つか」は F 検定(複数係数の同時零仮説) で評価する。

Q3. ツリーモデルでもダミー化は必要?

scikit-learn の決定木・ランダムフォレストは カテゴリを直接扱えない のでダミー化が必要。 LightGBM, CatBoost は内部で対応する機能あり。

Q4. インタラクション項はいつ入れる?

カテゴリによって連続変数の効果が変わる根拠があるとき。 例:「都市/地方で消費支出が人口に与える効果が違う」。 R² の改善や F 検定で必要性を判断。

Q5. ダミー変数を標準化すべき?

原則 標準化しない。 0/1 のままで解釈しやすさを保つ。 Ridge/Lasso と組み合わせる場合は連続変数と尺度を揃えるため標準化することもある。

🔢 高カーディナリティ対策

水準数 $k$ が数百〜数千になると、 単純なダミー化は 列数爆発・スパース・過学習を招きます。 対策:

SSDSE-B-2026 の 47 都道府県は中程度のカーディナリティ。 47 個全部ダミー化しても良いし、 「8 地域ブロック」「3 都市規模」に集約してもよい。 サンプル数 47 × 12 年 = 564 程度なら 8 ダミーくらいが妥当。

🧭 リファレンスカテゴリの選び方(ダミー変数固有の勘所)

K カテゴリを K-1 個のダミー変数に変換するとき、 「どのカテゴリを 0 として残すか」(リファレンス、 基準カテゴリ) はモデルの数値解釈を大きく左右する。 SSDSE-B-2026 で「地方ブロック」(北海道/東北/関東/中部/近畿/中国/四国/九州沖縄) をダミー化する場面で、 リファレンス選定の指針を整理する。

指針推奨される基準カテゴリなぜ
最大サンプル「関東」(47 都道府県中 7 県)回帰係数 SE が最小化、 推定の安定性が高い
政策的基準「全国平均に近いブロック」他ブロック効果が「全国比でどれだけ高い/低い」と直感解釈できる
時系列分析「基準年 (2015)」他年のダミー係数が基準年からの差分として読める
介入研究「対照群 (コントロール)」処置効果がそのまま回帰係数になる ATE 解釈と整合

⚠️ pd.get_dummies(df['block'], drop_first=True) はアルファベット昇順で最初の値 (「九州沖縄」など) が落ちる仕様。 意図したカテゴリを基準にしたいときは pd.Categorical(df['block'], categories=['関東','北海道',...], ordered=False) で順序を明示すること。 R の relevel(factor, ref="関東") と等価。

🐍 補強コード例 1 — SSDSE-B-2026 の構造確認

🎯 このコードでやること:SSDSE-B-2026 の CSV を読み込み、全体の行数・列数・先頭 3 行・最初の 10 列名を表示して、データ構造を把握する。

📥 入力例 (SSDSE-B-2026、 skiprows=1 で日本語列名): 年度 地域コード 都道府県 総人口 ... 2023 R01000 北海道 5092000 ...
1
2
3
4
5
6
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
print(df.shape)
print(df.head(3))
print(df.columns[:10].tolist())
📤 実行結果: (564, 112) 年度 地域コード 都道府県 総人口 ... 0 2023 R01000 北海道 5092000 ... 1 2022 R01000 北海道 5140000 ... 2 2021 R01000 北海道 5183000 ... ['年度', '地域コード', '都道府県', '総人口', '総人口(男)', '総人口(女)', '日本人人口', '日本人人口(男)', '日本人人口(女)', '15歳未満人口']

💬 47 都道府県 × 12 年分 (2012〜2023) = 564 行。列数 112 はさまざまな統計指標を含む。ダミー化の前に必ずこの構造を把握しておく。

🐍 補強コード例 2 — 人口上位 10 県の一覧

🎯 このコードでやること:最新年度(2023)の 47 都道府県から総人口上位 10 県を抽出して表示し、三大都市圏ダミーとの対応を目視確認する。

📥 入力例: d23 = df[df['年度'] == df['年度'].max()] # 47 行
1
2
3
4
5
6
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
d23 = df[df['年度'] == df['年度'].max()]
top10 = d23.nlargest(10, '総人口')[['都道府県', '総人口']]
print(top10.to_string(index=False))
📤 実行結果: 都道府県 総人口 東京都 14086000 神奈川県 9229000 大阪府 8763000 愛知県 7477000 埼玉県 7331000 千葉県 6257000 兵庫県 5370000 福岡県 5103000 北海道 5092000 静岡県 3555000

💬 上位 7 県(東京〜兵庫)はいずれも三大都市圏ダミー D=1 に該当する。福岡県・北海道は例外的に大きい地方県として D=0 の基準カテゴリ代表例になる。

🐍 補強コード例 3 — 総人口の経年トレンド確認

🎯 このコードでやること:SSDSE-B-2026 の全都道府県の総人口を年度別に合計し、最近 10 年間の全国人口トレンドを百万人単位で表示する。ダミー化前のデータ傾向を把握するのに役立つ。

📥 入力例: df['年度'] が複数年、df['総人口'] が人単位の整数
1
2
3
4
5
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
trend = df.groupby('年度')['総人口'].sum() / 1e6
print(trend.tail(10))
📤 実行結果 (単位: 百万人): 年度 2014 127.238000 2015 127.094745 2016 127.044000 2017 126.920000 2018 126.748000 2019 126.555000 2020 126.146099 2021 125.500000 2022 124.946000 2023 124.353000 Name: 総人口, dtype: float64

💬 全国総人口はこの 10 年間(2014〜2023)一貫して減少傾向にある。三大都市圏ダミーで分析する際、この全国的トレンドをコントロール変数として考慮することが重要。

🐍 補強コード例 4 — 総人口の記述統計

🎯 このコードでやること:最新年度の 47 都道府県の総人口について記述統計(平均・中央値・標準偏差・最大/最小)を計算し、ダミー変数の目的変数としての分布を把握する。

📥 入力例: d23 = 2023 年度の 47 行 df
1
2
3
4
5
6
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
d23 = df[df['年度'] == df['年度'].max()]
stats = d23['総人口'].describe()
print(stats)
📤 実行結果: count 4.700000e+01 mean 2.645809e+06 std 2.797551e+06 min 5.370000e+05 25% 1.034000e+06 50% 1.549000e+06 75% 2.636500e+06 max 1.408600e+07 Name: 総人口, dtype: float64

💬 平均 265 万人、中央値 155 万人、最大 1,409 万人(東京)。平均 > 中央値 の右裾分布で東京の外れ値が顕著。ダミー変数の目的変数として使う際、対数変換を検討する余地がある。

🔖 キーワード索引(R18 補強版)

この ダミー変数 ページで出てくる主要キーワードを一覧します。チップをクリックすると該当箇所へジャンプできます。

ダミー変数カテゴリ基準カテゴリ多重共線性回帰係数解釈差分パネル固定効果DiD

💡 30 秒で分かる結論(R18)

📍 文脈ボックス(R18)── あなたが今見ているもの

あなたは、回帰モデル の入口で「ダミー変数(Dummy Variable)」という用語に出会ったところです。 この用語は カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。

本ページでは、まず数式や形式的定義よりも、実データ(SSDSE-B-2026, 47 都道府県)で具体的な値を見ます。 そのあと、数式 → 計算 → Python 実装 → 落とし穴 → 関連用語、という順で「使える知識」に組み立てていきます。

SSDSE-B-2026 補足:SSDSE-B-2026 の都道府県を「東京 = 1、ほか = 0」のダミー変数で表現すると、回帰式で「東京効果」を係数として読み取れます。

🎨 直感で掴む(R18)── ダミー変数 を絵で理解

ダミー変数 の本質は、ひとことで言うと「カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。」です。 数式に踏み込む前に、まずイメージで掴みましょう。

ヒント:直感が掴めたら、次の「数式または定義」セクションで形式化を確認してください。 形式化と直感がつながれば、ダミー変数 はもう武器です。

📐 数式または定義(R18)── ダミー変数 を形式化する

ダミー変数 を一般化して書くと、観測ペア $(x_1, y_1), \dots, (x_n, y_n)$(ここでは $n = 47$ 都道府県)に対して、次の関係を仮定します。

$$ \boxed{\quad y = f(x_1, x_2, \dots, x_p; \theta) + \varepsilon \quad} $$

ここで $\theta$ は推定したいパラメータ、$\varepsilon$ はモデルでは説明しきれない誤差項。 ダミー変数 の流派ごとに、$f$ の形(線形・ロジスティック・木)、$\varepsilon$ の分布(正規・二項・ポアソン)が変わります。

記号 意味 SSDSE-B での例
$x$説明変数Prefecture(都道府県(47 カテゴリ))
$y$目的変数死亡率・出生率など
$n$標本数47(都道府県数)
$\theta$パラメータ傾き・切片など
$\varepsilon$誤差項モデルで説明しきれない残り

🔬 数式を言葉で読み解く(R18)

上の式 $y = f(x; \theta) + \varepsilon$ を「数学者の声」ではなく、「現場の声」で読み直してみます。

  1. $y = f(x; \theta)$:「あなたが説明したい量($y$)は、手元の説明材料($x$)から、ある関数 $f$ で計算できると 仮に 置く」
  2. $+ \varepsilon$:「とはいえ、$y$ は完全には $x$ で決まらない。残りは 誤差項 $\varepsilon$ として認める」
  3. パラメータ $\theta$ の推定:「データを 47 個並べ、$y$ と $f(x;\theta)$ の差をできるだけ小さくする $\theta$ を選ぶ」
  4. 不確かさの定量化:「$\theta$ も $f$ もデータから推定したので、信頼区間と $p$ 値で『どれくらい確信できるか』を必ず併走させる」

合言葉:「定義は短い、解釈は長い」。ダミー変数 はたった 1 行の式ですが、それを 47 都道府県データに当てると、5 種類のチェックリスト(線形性・独立性・等分散・正規性・外れ値)が芋づる式に出てきます。

🧮 実値で計算してみる(R18)── SSDSE-B-2026 で ダミー変数

数式が読めたら、すぐに 実データ(SSDSE-B-2026, 47 都道府県, 2023 年度)で計算しましょう。 抽象を 47 行の表に落とすと、急に理解できることがあります。

▼ コード解説(SSDSE-B-2026 から Prefecture を読む)
🎯 解説: 47 都道府県 × 1 年分(2023)を抽出し、ダミー変数 の代表値(平均・中央値・標準偏差・最大/最小)を一気に確認する。
📥 入力例: data/raw/SSDSE-B-2026.csv(cp932, ヘッダ 2 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ダミー変数 の代表値を SSDSE-B-2026 で確認
col = '大都市圏ダミー'
s = latest[col]

print('n            :', len(s))             # 47
print('mean         :', round(s.mean(), 2))
print('median       :', round(s.median(), 2))
print('std          :', round(s.std(),  2))
print('min / max    :', s.min(), '/', s.max())
print('三大都市圏:')
print(latest[latest[col]==1][['都道府県', col]])
📤 実行例(実測) n : 47 mean : 0.23 median : 0.0 std : 0.43 min / max : 0 / 1 三大都市圏: 都道府県 大都市圏ダミー 0 三重県 1 1 京都府 1 3 兵庫県 1 5 千葉県 1 7 埼玉県 1 9 大阪府 1 10 奈良県 1 17 岐阜県 1 24 愛知県 1 26 東京都 1 32 神奈川県 1

結果を見ると、47 都道府県のうち上位 3 県が突出しているか、なだらかに分布しているか、すぐ分かります。 この「分布の形」が見えると、ダミー変数 を語る土台ができたことになります。

🐍 Python 実装(R18)── ダミー変数 のミニ完全版

Python の実装は「読む → 集計 → 描く → 報告」を一直線に書きます。長いコードよりも、各ステップが分離していることが大事です。

① データ読み込み

▼ コード解説(SSDSE-B-2026 を pandas で読む)
🎯 解説: encoding='cp932' が必須。 2 行目は日本語ラベルなので skiprows で飛ばす。
📥 入力例: data/raw/SSDSE-B-2026.csv(東京・大阪などを含む 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
import numpy as np

# SSDSE-B-2026 を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
latest = df.sort_values('年度').groupby('都道府県').last().reset_index()
metro = {'東京都','神奈川県','埼玉県','千葉県','大阪府','京都府','兵庫県','奈良県','愛知県','岐阜県','三重県'}
latest['大都市圏ダミー'] = latest['都道府県'].isin(metro).astype(int)
print(latest.shape)         # (47, ...)
print(latest[['都道府県', '総人口']].head())
📤 実行例(実測) (47, 113) 都道府県 総人口 0 三重県 1727000 1 京都府 2535000 2 佐賀県 795000 3 兵庫県 5370000 4 北海道 5092000

② 集計と可視化

▼ コード解説(matplotlib で 47 都道府県の棒グラフ)
🎯 解説: sort_values + plot.bar で降順可視化。 都道府県名は x ラベル、 縦軸が Prefecture。
📥 入力例: 2023 年, 47 都道府県, 都道府県(47 カテゴリ)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt
# ダミー変数の分布を 47 都道府県でビジュアル化
col = '大都市圏ダミー'
fig, ax = plt.subplots(figsize=(9, 4))
latest.sort_values(col, ascending=False).plot.bar(
    x='都道府県', y=col, ax=ax, color='#00897B', legend=False)
ax.set_title('三大都市圏ダミー(1=都市圏, 0=地方)SSDSE-B-2026')
ax.set_ylabel('大都市圏ダミー')
ax.set_xlabel('都道府県')
plt.xticks(rotation=90)
plt.tight_layout()

③ 報告用テンプレ

レポート文例:「SSDSE-B-2026(2023 年度, n=47)に基づいて ダミー変数 を確認したところ、平均は X、標準偏差は Y、上位 3 県は東京・神奈川・大阪であった。 SSDSE-B-2026 の都道府県を「東京 = 1、ほか = 0」のダミー変数で表現すると、回帰式で「東京効果」を係数として読み取れます。」

⚠️ 落とし穴(R18)── ダミー変数 で踏みやすい 5 つ

合言葉:レポート提出前に「ゼロ起点で 1 枚描き直す」「外れ値を 1 県外して再計算」「逆方向の因果を 1 行で否定する」を必ずやる。

🎙 narration まとめ(R18)── コード解説の総括

本ページに登場した Python コードはすべて以下のテンプレートで読み解けます:

▼ コード解説(テンプレート)
🎯 解説: ① 読む → ② 集計 → ③ 描く → ④ 検定 → ⑤ 報告。 中間結果を必ず print して人間が確認できるようにする。
📥 入力例: SSDSE-B-2026.csv(47 都道府県 × 約 110 列)
📤 出力例: 図 1 枚 + 統計量 1 表 + レポート文 1 段落

覚え方:「Read → Roll up → Render → Read it back」。 最後の「Read it back」は、出力された数字や図を口に出して 1 度言うこと。 これで ダミー変数 の現場運用は十分に回ります。

❓ FAQ(R18)── よくある質問 7 連

Q1. ダミー変数 は機械学習でも使う?

使います。前処理(特徴量 → 入力ベクトル)、評価(指標の可視化)、解釈(係数の可視化)など、機械学習のあらゆる工程で ダミー変数 は登場します。

Q2. n=47 で十分?

記述統計や 1 変量・2 変量の可視化には十分。ただし複数の説明変数を同時に検討するときは、自由度が枯れます。bootstrap や情報量規準(AIC/BIC)で補強しましょう。

Q3. SSDSE-B-2026 はどこで手に入る?

独立行政法人統計センター(NSTAC)「SSDSE」サイトから無料でダウンロードできます。本ページの実装はすべて data/raw/SSDSE-B-2026.csv を前提にしています。

Q4. ライセンスは?

SSDSE は教育目的での利用が許諾されています(出典明示、改変記録)。論文公開時は出典欄に「総務省統計局, SSDSE-B-2026」を必ず書きましょう。

Q5. ダミー変数 を最短で身につけるには?

① ヒストグラム 1 枚を描く → ② 平均・中央値・標準偏差を読み上げる → ③ 上位 3 県・下位 3 県を暗記する → ④ 2 変量の相関を 1 つ確認する → ⑤ レポート 1 行にまとめる。これを 47 都道府県データで 3 回回せば、用語の地形が掴めます。

Q6. ダミー変数 に関する代表的な論文は?

本リポジトリの 論文一覧 から「回帰モデル」カテゴリの論文を見ると、ダミー変数 を実際に使った再現コードが付いています。

Q7. 報告書ではどの順で書く?

「目的 → データ → ダミー変数 の選択理由 → 結果(図 + 数値)→ 解釈 → 限界(n=47, 単年)→ 次の一手」の順が王道です。

📚 さらに踏み込む(R18)── 用語ネットワーク 16 件

用語は単独では覚えづらいので、前提・並列・発展の 3 方向で 16 件並べます。

勧め方:1 日 1 リンク。クリックして読んだら、ダミー変数 のページに戻り、「ダミー変数 とこの用語はどう違う?」を 1 行書く。

✅ 使う前のチェックリスト(R18)

🧪 ミニケース(R18)── ダミー変数 を 5 段階で完走する

  1. STEP 1:問いを書く ── 47 都道府県のうち「都道府県(47 カテゴリ)」が大きい県と小さい県では、暮らしぶりにどんな差があるか?
  2. STEP 2:データを読む ── SSDSE-B-2026 から Prefecture を取り出し、2023 年度・47 行に絞る。
  3. STEP 3:分布を見る ── ヒストグラムと箱ひげ図で「上位 3・下位 3」を特定し、東京・神奈川・大阪などの突出を確認する。
  4. STEP 4:関係を測る ── 別の変数(人口・死亡率など)との 2 変量関係を散布図 + 相関で測る。
  5. STEP 5:報告する ── 「上位 3 県は X, Y, Z。これらは…」という 200 字レポートに落とす。

合言葉:5 STEP のうちどれか 1 段でも飛ばすと、結論が「数字だけ」になり、読者の腑に落ちなくなります。 ダミー変数 は「数字 + 物語」のセットで完成です。

🚫 アンチパターン集(R18)── ダミー変数 で「やってはいけない」9 連

  1. 合成データを np.random.seed で作って「再現実験しました」と書く(教育用途では SSDSE-B-2026 を使うのが必須)
  2. カラムを iloc[:, 5] のように位置で参照し、SSDSE のバージョン違いで壊れるコードを書く
  3. 都道府県の集計順を「日本語五十音」「アルファベット」「東京から時計回り」など混在させ、図の解釈を難しくする
  4. 変数名を x1, x2, x3 のように匿名化し、読者が意味を追えないコードにする
  5. 軸を切り取って小さな差を大きく見せる(特に y 軸の最小値を 0 にしない)
  6. 外れ値の県を黙って削除する(必ず「東京を外した版」と「全件」を両方描く)
  7. p < 0.05 を「効果がある」と読み替える(本来は「偶然では説明しづらい」だけ)
  8. 相関 r を「因果の強さ」と書く(ダミー変数 で因果は出ない)
  9. レポートの最後で「以上」と書いて閉じる(必ず「限界」と「次の一手」を 1 行ずつ)

🔎 深掘り解説(R18)── ダミー変数 を 30 分で 1 段深く

A. 歴史的背景

ダミー変数 は、19 世紀末〜 20 世紀初頭の統計学黎明期から発達してきました。回帰モデル の中核として、Galton、Pearson、Fisher、Yule などが基礎を築き、現代では SSDSE のような公的データを使った教育素材で広く扱われています。

B. 数理的位置づけ

ダミー変数 は、観測ペア $(x_i, y_i)_{i=1}^{n}$ から条件付き期待値 $E[y \mid x]$ または分布 $P(y \mid x)$ を推定する道具です。 線形・非線形・パラメトリック・ノンパラメトリックという 4 つの軸の中で、ダミー変数 は「回帰モデル」という棚に並んでいます。

C. 実装上の工夫

D. 学問体系の位置

ダミー変数 は 記述統計データサイエンス機械学習 の交差点に位置します。 どの分野から入っても、いずれは ダミー変数 を通ります。

🎙 narration コレクション(R18)── 5 連ストック

同じテーマで使い回せる narration を 5 つ並べておきます。コピペして「コード解説」欄に貼ってください。

▼ コード解説(① 読み込み)
🎯 解説: SSDSE-B-2026 を読み、 2023 年度に絞る。 cp932 と skiprows=[1] を忘れない。
📥 入力例: data/raw/SSDSE-B-2026.csv
📤 出力例: 47 行 × 約 110 列の DataFrame
▼ コード解説(② 代表値)
🎯 解説: mean / median / std / min / max を一気に表示。 平均と中央値が大きく離れたら歪んだ分布。
📥 入力例: df2023['A1101'].astype(float)(総人口)
📤 出力例: mean 2645809 / median 1549000 / std 2797551 / min 537000 / max 14086000(2023 年 47 都道府県)
▼ コード解説(③ 可視化)
🎯 解説: matplotlib の bar / hist / boxplot を 1 枚ずつ重ねず作る。 figsize=(9,6) が標準。
📥 入力例: sort_values 後の DataFrame、 x=都道府県、 y=A1101(総人口)
📤 出力例: PNG 1 枚(figures/dummy-variable.html_r18_bar.png)
▼ コード解説(④ 関係を測る)
🎯 解説: 2 変量の関係は scipy.stats.pearsonr または df.corr() で測る。 r と p-value を同時に得る。
📥 入力例: df2023[['A1101', 'A1303']](総人口と 65 歳以上人口)
📤 出力例: r = 0.9910, p = 6.3e-41(総人口と 65 歳以上人口、2023 年 47 都道府県)
▼ コード解説(⑤ 報告)
🎯 解説: 「目的→データ→ダミー変数→結果→限界→次」の 6 段に分けて 200 字レポートに。
📥 入力例: 上で得た図 + 表 + r/p
📤 出力例: マークダウン 200 字程度

📔 ミニ用語集(R18)── 同じ話題で使う 12 語

標本(sample)
母集団から取り出した観測の集まり。本ページでは「47 都道府県, 2023 年度」が標本。
母集団(population)
標本の背後にある全体。47 都道府県は日本全土の「県別断面」と読める。
変数(variable)
各観測単位に対応する 1 つの数値・カテゴリ。SSDSE では人口・出生率など 約 110 列。
分布(distribution)
変数が取る値の頻度の形。hist / KDE / box で可視化する。
代表値(central tendency)
平均・中央値・最頻値の総称。歪んだ分布では中央値を優先。
ばらつき(dispersion)
標準偏差・IQR・分散の総称。代表値とセットで報告する。
外れ値(outlier)
分布の主部から大きく外れた観測。原因を 1 つ書ける外れ値だけ「正当な外れ値」と呼ぶ。
相関(correlation)
2 変量の同調具合。−1 〜 +1 の単数で要約。
因果(causation)
X を動かすと Y も動くという関係。相関では保証されない。
p 値(p-value)
帰無仮説下で「観測以上に極端な値」が出る確率。「効果あり」とは言えない点に注意。
信頼区間(confidence interval)
同じ実験を何度もやったとき、推定値が含まれる範囲。点推定とセットで提示。
正規化(normalization)
変数のスケールを揃える操作。Min-Max / Z-score / Robust の 3 種を覚える。

🗾 47 都道府県データの位置づけ(R18)

ダミー変数 を学ぶときに使う SSDSE-B-2026 は、47 都道府県 × 約 110 列 × 複数年度のパネルデータです。 本ページでは「2023 年度の 47 行」を主に使います。 以下に、よく登場する代表的なカラムを示します。

SSDSE コード 日本語名 単位 ダミー変数 での主な使い方
Code地域コードJOIN キー
Prefecture都道府県名カテゴリ軸・ラベル
A1101総人口説明変数(規模)
A130365 歳以上人口高齢化率の分子
A4101出生数人口動態の説明変数
A4200死亡率目的変数の代表
B4101年平均気温気候系の説明変数
L3221消費支出家計の目的変数

使い方のコツ:列名はすべて A1101 のような英数記号です。SSDSE のコードブックで日本語ラベルを確認しながら使ってください。 本ページの例では Prefecture(都道府県(47 カテゴリ))を中心に使っています。

👣 ステップバイステップ(R18)── ダミー変数 を 10 行で実装する

解説は最小限。コードは 10 行以内。これで ダミー変数 の最短ルートが手に入ります。

  1. import pandas as pd
  2. df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
  3. df = df[df['SSDSE-B-2026'] == 2023]
  4. col = 'Prefecture'
  5. print(df[['Prefecture', col]].sort_values(col, ascending=False).head())
  6. import matplotlib.pyplot as plt
  7. df.plot.hist(y=col, bins=20)
  8. plt.title('都道府県(47 カテゴリ)(SSDSE-B-2026, 2023)')
  9. plt.savefig('figures/dummy-variable.html_r18_hist.png', dpi=120)
  10. plt.show()

注意:10 行で動かせる、というだけで、これがゴールではありません。 ダミー変数 の本当の難しさは「描いた図をどう解釈するか」「報告にどう落とすか」にあります。

📖 さらに学ぶには(R18)── 学習ロードマップ 4 段

  1. レベル 1(30 分):本ページの「30 秒で分かる結論」と「直感で掴む」だけ読む。SSDSE-B-2026 を 1 度ダウンロードして開く。
  2. レベル 2(2 時間):「Python 実装」セクションを写経し、Prefecture の図を 1 枚作る。報告 200 字を書く。
  3. レベル 3(半日):「数式または定義」「数式を言葉で読み解く」を踏まえ、別の 2 つの変数で同じ分析を反復。3 通り作って比べる。
  4. レベル 4(1 週間):本リポジトリの 論文一覧 から「回帰モデル」カテゴリの論文 1 本を完走。再現コードを動かして、ダミー変数 の応用範囲を体感する。

📝 報告フォーマット(R18)── ダミー変数 を 200 字で書く

ダミー変数 の結果を、ゼミ・卒論・社内会議で報告するときの定型文を 3 つ用意しました。 最初は丸ごとコピー、慣れたら差し替えて使ってください。

テンプレ A:研究レポート向け

「本研究では、SSDSE-B-2026(n=47, 2023 年度)を用いて ダミー変数 を確認した。 主たる説明変数は Prefecture(都道府県(47 カテゴリ))であり、47 都道府県を対象とした分布の確認、相関の評価、ダミー変数 を用いた分析を実施した。 分析の結果、上位 3 県・下位 3 県の特徴と、SSDSE-B-2026 の都道府県を「東京 = 1、ほか = 0」のダミー変数で表現すると、回帰式で「東京効果」を係数として読み取れます。」

テンプレ B:ビジネスレポート向け

「都道府県(47 カテゴリ) を 47 都道府県で比較したところ、東京・神奈川・大阪など大都市圏が突出していることが分かった。 ダミー変数 を用いた分析から、地域差は単に人口規模の違いだけでは説明できず、複数要因の組み合わせで生じていると示唆された。 今後の打ち手は、上位県のベストプラクティスを参考にしつつ、下位県への支援策を検討することである。」

テンプレ C:教育用講義スライド向け

「皆さん、ダミー変数 はひとことで言うと『カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。』です。 今回は SSDSE-B-2026(総務省統計局, 47 都道府県, 2023 年度)を使って、実際の数字でこの考え方を確かめました。 皆さん自身でも、別の指標(人口、出生率、家計支出など)に置き換えて同じ手順を試してみてください。」

🔭 3 つの視点で ダミー変数 を見る(R18)

同じ用語でも、見る立場によって意味が変わります。3 つの視点を切り替えて、用語の輪郭を立体的に掴みましょう。

視点 ① 統計学者の目

統計学者にとって ダミー変数 は「データから母集団を推定する道具」です。 確率モデル・尤度・不偏性・効率性・一致性などの数学的性質に注目し、漸近理論で性能保証を行います。 47 都道府県データは「小標本(n=47)」と分類され、bootstrap や情報量規準による補強が必要になります。

視点 ② データサイエンティストの目

データサイエンティストにとって ダミー変数 は「ビジネス課題を数字で答えるパイプラインの 1 部品」です。 モデルの理論的性質より、運用性・解釈性・更新コストを重視します。 SSDSE のような公的データを用いるときは「データの出典・更新頻度・ライセンス」を最優先で確認します。

視点 ③ 教育者・学習者の目

教育の現場では ダミー変数 は「初学者が躓きやすいポイント」を含む単元です。 抽象的な数式よりも、具体的な 47 都道府県データで手を動かし、図を描き、結果を口頭で説明できるようになることが目標になります。 本ページの並び(直感 → 数式 → 計算 → Python → 落とし穴)は、まさにこの教育的アプローチに沿っています。

視点切り替えの効果:1 つの用語を 3 通りに眺めると、自分が今どの立場で議論しているか自覚できます。 論文を読むときは ①、現場で使うときは ②、人に教えるときは ③ ── と意識的に切り替えてください。

⚖️ 似た用語との使い分け(R18)── 8 列比較表

ダミー変数 と似た用語を、使い分けの観点から並べます。違いを言語化できれば、迷いが減ります。

用語 目的 入力 出力 強み 弱み
ダミー変数カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。47 都道府県 × 約 110 変数図 + 表 + 200 字レポート直感的、再現容易小標本(n=47)の制約
相関係数2 変量の同調を 1 数で要約x, y の 47 ペアr ∈ [−1, +1]シンプル非線形は捉えられない
線形回帰条件付き期待値の線形近似説明変数群回帰係数・予測値解釈容易非線形には弱い
ロジスティック回帰2 値分類説明変数群確率 + 係数分類問題の標準線形決定境界
ランダムフォレスト非線形分類・回帰大量変数予測 + 重要度非線形対応解釈やや難

❓ 拡張 FAQ(R18)── 詰まりがちな 8 つの疑問

Q1. ダミー変数 と「回帰モデル」全体の関係は?

ダミー変数 は 回帰モデル の中で「カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。」を担う基本道具です。回帰モデル の他のトピックは、この基本の応用または並列の道具にあたります。

Q2. 47 都道府県以外のデータで使えますか?

使えます。SSDSE-A(市区町村)、SSDSE-C(年次推移)、SSDSE-D・E(個票)など、ダミー変数 の手順はそのまま適用できます。粒度(県・市・個人)に応じて n が変わるので、結果の信頼性も変わります。

Q3. SSDSE-B-2026 が将来更新されたら?

SSDSE は年に 1 度更新されます。ダミー変数 のコード自体は変更不要ですが、結果(数値・図)は最新年度のものに置き換えてレポートしましょう。出典欄に「SSDSE-B-2027(仮)」と書き換えるのを忘れずに。

Q4. Excel でも同じことはできますか?

できます。ピボット → グラフ → 関数 で代表値や相関は出ます。ただし、再現性・履歴管理・自動化の面で Python に劣ります。学習用には Python を強く勧めます。

Q5. ダミー変数 で AI(機械学習)に進めますか?

進めます。ダミー変数 は機械学習の「特徴量設計」と「結果解釈」の両端で必須です。AI と聞くと深層学習を連想しがちですが、SSDSE のような表形式データでは線形モデル + ダミー変数 の組み合わせで十分実用になります。

Q6. 「コードが動かない」ときは?

3 つ確認します:①ファイルパス(data/raw/SSDSE-B-2026.csv)が合っているか、②エンコーディングが cp932 か、③ヘッダ 2 行目の日本語ラベルを skiprows で飛ばしたか。これで 9 割解決します。

Q7. 図を保存できない場合は?

figures/ ディレクトリが存在しない可能性があります。import os; os.makedirs('figures', exist_ok=True) を先頭に追加してください。

Q8. ダミー変数 を勉強する優先順位は?

本ページの 12 セクションを順に読み進めるのが最短です。特に「直感 → 数式 → 計算 → Python」の 4 段が腑に落ちれば、用語の 80 % は理解できたとみなせます。

🎯 サマリーカード(R18)── 1 ページ印刷用

用語ダミー変数(Dummy Variable)
カテゴリ回帰モデル
ひとこと定義カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。
SSDSE-B での使い方SSDSE-B-2026 の都道府県を「東京 = 1、ほか = 0」のダミー変数で表現すると、回帰式で「東京効果」を係数として読み取れます。
主な道具pandas / matplotlib / scipy / statsmodels / scikit-learn
最大の注意n=47 の小標本・単位混在・因果と相関の混同
学習ステップ読む → 集計 → 描く → 検定 → 報告
代表的な関連用語相関係数・回帰分析・ヒストグラム・散布図・標準偏差

このカードを印刷し、SSDSE-B-2026 で 1 回手を動かせば、用語の「使える形」が定着します。 ダミー変数 はあくまで「カテゴリ変数を 0/1 の数値列に変換した変数。One-Hot Encoding の各列がダミー変数。」というシンプルな考え方の道具ですので、迷ったらこの 1 行に戻ってください。

理解度チェック(R445)

ダミー変数(dummy variable)は、 カテゴリ変数(例:性別、 都道府県、 都市規模区分、 業種)を回帰モデルや機械学習モデルで使える「0/1 の数値列」に変換するための極めて基本的な道具です。 ここでは SSDSE-B-2026(都道府県 47 行)の数値を念頭に置きながら、 ダミー変数を「正しく作る・正しく解釈する・正しく使い分ける」ための理解度を 12 問のセルフチェックで確認します。 各問の解説には、 回帰係数の意味、 基準カテゴリ(base / reference category)の役割、 多重共線性(multicollinearity)と完全多重共線性(dummy variable trap)の違い、 順序尺度(ordinal)への適切な扱い、 そして交互作用項(interaction term)まで含めて、 「次にどう動けばよいか」を 1 行で示します。

Q1. ダミー変数とは何か(30 秒で答える)

ダミー変数とは、 「あるカテゴリに該当するなら 1、 そうでなければ 0」を取る 2 値の数値列です。 例えば SSDSE-B-2026 で「東京かどうか」を表す列 is_tokyo を作ると、 北海道は 0、 東京は 1、 大阪は 0、 …というベクトルになります。 これを回帰モデル y = β0 + β1·is_tokyo + ε に投入すると、 β1 は「東京の y の平均 − 東京以外の y の平均」を推定する係数になります。 つまりダミー変数は、 「カテゴリの効果を 1 個の係数として読み取る装置」です。

Q2. なぜ「1 つだけ落とす」必要があるのか

k 個のカテゴリがあるとき、 k 個のダミー列をすべて入れて切片も入れると、 列の合計 = 1 という関係が成立し、 設計行列のランクが落ちて係数が一意に決まらなくなります。 これが完全多重共線性(perfect multicollinearity)、 通称「ダミー変数トラップ」です。 解決は単純で、 k − 1 個のダミーだけを使い、 残り 1 個を「基準(reference / base)」とします。 pandas の pd.get_dummies(..., drop_first=True) は最初のカテゴリを自動的に落としてくれます。 statsmodels の C(変数名, Treatment(reference='値')) を使うと基準カテゴリを明示的に指定できます。

Q3. 基準カテゴリを変えると係数の解釈はどう変わるか

係数は「基準カテゴリと比べた差」を表します。 例えば「東京を基準にする」と、 北海道の係数は「北海道 − 東京」、 大阪の係数は「大阪 − 東京」となり、 多くの係数が負になりがちです。 一方「北海道を基準にする」と、 東京の係数は大きな正の値、 大阪の係数も正の値になります。 モデルの予測値・残差・全体の説明力(R^2)は基準を変えても一切変わりません。 変わるのは「係数の表示」だけです。 報告書では「基準カテゴリは何か」を必ず明記してください。 これを書き忘れると読者は係数を誤って解釈します。

Q4. 順序尺度(小・中・大)はどう扱うべきか

都市規模区分のような順序尺度には 2 つの選択肢があります。 (A) 順序を活かして 1, 2, 3 の整数として 1 列で投入(線形に効くと仮定)、 (B) ダミー変数化して順序を捨て、 各水準の効果を独立に推定。 (A) は係数 1 個で済み解釈が単純ですが、 「小→中の差」と「中→大の差」が等しいという強い仮定を置きます。 (B) は仮定が弱く、 各水準の差を自由に推定できますが、 列数が増え、 小標本では推定が不安定になります。 SSDSE-B-2026 のように n=47 と小さい場合は、 まず (B) で水準ごとの平均を観察し、 (A) の線形仮定が妥当そうなら (A) に切り替える、 という流れが堅実です。

Q5. ダミー変数と One-Hot Encoding の違いは

名前は違いますが、 中身は同じ「カテゴリ → 0/1 列群」の変換です。 慣例的に、 統計(回帰)の世界では「ダミー変数」と呼び、 k 個のカテゴリに対して k − 1 列を作る(基準カテゴリを落とす)流儀が標準。 機械学習の世界では「One-Hot Encoding」と呼び、 k 列すべてを作る流儀が標準です。 機械学習でも正則化(Lasso / Ridge)や決定木系(XGBoost, LightGBM)を使う場合、 k 列すべてあっても完全多重共線性の問題が表に出ないため、 そのまま使うことが多いです。 線形回帰や線形 SVM のように切片+多重共線性に弱いモデルでは、 必ず k − 1 列に落とすか、 切片を外す必要があります。

Q6. 交互作用項を入れたいときはどうするか

ダミー変数 is_tokyo と連続変数 population の交互作用を入れたい場合、 新しい列 is_tokyo × population を掛け算で作って投入します。 こうすると、 「人口の傾きが東京と東京以外で違うか」を係数として推定できます。 交互作用項を入れるときは、 必ず主効果(is_tokyopopulation の単独項)も同時に入れてください。 主効果を抜くと「東京以外の傾きはゼロ」という妙な制約が暗黙に入ります。 statsmodels の式記法では y ~ population * C(is_tokyo) と書けば、 主効果 2 つと交互作用 1 つが自動的に展開されます。

Q7. ダミー変数の係数の有意性をどう読むか

係数 β の t 統計量と p 値は、 「このダミー変数の効果はゼロと有意に違うか」を判定します。 ただし「ダミー全体としてどのカテゴリ群が効いているか」を見たいときは、 個別の t 検定ではなく、 「全カテゴリのダミーを一括で外すモデル」と「入れたモデル」を比較する F 検定(partial F-test)が適切です。 statsmodels では anova_lm(model_small, model_large) で実行できます。 SSDSE-B-2026 のように n=47、 都道府県カテゴリ 47 個(基準を 1 つ落とせば 46 個)のような状況では、 1 行 1 ダミーになってしまうので、 ダミーを「地域ブロック」(北海道、 東北、 関東…)に丸めるなどの集約が必須です。

Q8. 標本サイズが小さいときの落とし穴

n=47(都道府県)で 8 ブロックのダミー(基準を除いて 7 列)+連続変数 3 個+切片を入れると、 自由度は 47 − 7 − 3 − 1 = 36 残ります。 ここまでなら現実的ですが、 47 都道府県すべてをダミー化(46 列)すると自由度は 0、 つまり完全フィットになりすべての説明力が無意味になります。 経験則として、 「1 ダミー列あたり最低 10 観測」を目安にすると安定します。 観測が少ない場合は、 地域ブロック・都市規模 3 区分・産業大分類などの「粗い集約」でダミー数を抑えるか、 階層モデル(ランダム効果)を使って情報をプールします。

Q9. 欠損・新カテゴリへの対応

本番運用では「学習データに無かったカテゴリ」が予測時に出現します。 例えば学習時に「東京・大阪・名古屋・福岡」だけだったところに、 予測時「札幌」が現れる、 という状況です。 対策は 3 つ。 (1) 全カテゴリを OneHotEncoder(handle_unknown='ignore') で受けて未知カテゴリは全列ゼロにする、 (2) 「その他(other)」というダミー列を学習時から用意しておく、 (3) 階層モデル(target encoding +ベイズ的縮小)で滑らかに補間する。 SSDSE-B-2026 のような閉じたデータセット(47 都道府県固定)では (2) は不要ですが、 一般化のために (1) または (2) を選ぶ習慣をつけましょう。

Q10. ダミー変数を「使うべきでない」場面

カテゴリ水準が非常に多く(例:郵便番号 4 桁で 1,000 個)、 各水準のサンプルが極端に少ない場合、 ダミー変数は破綻します。 この場合は (A) ハッシング(feature hashing)で次元を強制的に縮める、 (B) 埋め込み(embedding)でカテゴリを低次元の連続ベクトルに学習させる、 (C) target encoding(カテゴリごとの目的変数の平均を特徴量として使う/ベイズ平均で安定化)といった代替手法が現実的です。 SSDSE-B のような 47 都道府県程度なら素朴なダミー変数で十分ですが、 製品 SKU や URL のように高基数(high cardinality)になると、 設計を切り替えるタイミングがあります。

Q11. ダミー変数とフラグ変数の違い

どちらも 0/1 の列ですが、 意味の射影が異なります。 ダミー変数は「カテゴリ変数を分解して得られた 0/1 列群」、 フラグ変数は「ある条件(is_outlier、 is_holiday、 is_weekend)を満たすかどうかを示す 1 列」です。 実装上はどちらも同じ int または uint8 の列ですが、 報告書での説明では区別すると伝わりやすくなります。 SSDSE-B-2026 では「総人口(A1101)が中央値超かどうか」「延べ宿泊者数(G7101)が全国平均超かどうか」のようなフラグ変数を派生させると、 ロジスティック回帰や決定木で見通しが良くなります。

Q12. 報告書に書くべきこと(チェックリスト)

図で理解するダミー変数(R445)

ダミー変数の効果は「散布図に折れ線として現れる切片の上下動」として可視化すると最も分かりやすくなります。 ここでは SSDSE-B-2026 を念頭に、 3 種類の可視化で「ダミー変数とは結局のところ何を変えているか」を整理します。

ダミー変数の効果を散布図で示す例(R445)
図1. ダミー変数 is_tokyo を入れた回帰のイメージ。 東京 (1) と東京以外 (0) で「切片だけが上下に平行移動する」のがダミー変数の本質。 傾きを変えたい場合は交互作用項を追加する。

散布図の点は SSDSE-B-2026 の都道府県、 横軸は総人口(万人)、 縦軸は延べ宿泊者数(百万人泊)。 東京(総人口 1408.6 万人、 延べ宿泊者数 80.3 百万人泊)は外れ値として右上に大きく離れ、 これを「東京かどうか」のダミー変数で吸収すると、 ほかの 46 県の傾向がきれいに見えるようになります。 これがダミー変数の最初のご利益です。

地域ブロック別の分布(R445)
図2. 地域ブロック別の延べ宿泊者数(百万人泊)の分布。 8 ブロックを 7 個のダミー変数(基準=北海道)で表現すると、 ブロックごとの中央値の差をそのまま係数として読める。

箱ひげ図は「カテゴリごとの分布の違い」を最も誠実に見せてくれる図です。 ダミー変数を入れた回帰の係数は、 平均(中央ではなく算術平均)の差を推定しますが、 分布が大きく歪んでいるカテゴリがあれば、 平均差は中央値差と乖離します。 箱ひげ図で外れ値の有無を確認してから回帰に進む習慣をつけましょう。

ダミー変数群を入れた回帰の残差分布(R445)
図3. ダミー変数を入れた前後の残差ヒストグラム。 ダミーを入れない場合の残差は右に重い裾を引くが、 「東京」ダミーを入れると残差がほぼ対称になる。

残差ヒストグラムは、 回帰モデルが「拾い切れていない構造」を示します。 ダミー変数を 1 つ入れただけで残差が大きく対称化される場合、 そのダミーは「外れ値構造」を捉えていた、 と解釈できます。 SSDSE-B-2026 では「東京」「大阪」「神奈川」の 3 県をダミー化するだけで多くの分析が安定します。

ダミー変数の作り方 4 流派(R445)

実務でダミー変数を作る方法は大きく 4 流派あります。 ここでは pandas / scikit-learn / statsmodels / numpy 直書きの 4 つを並べ、 それぞれの強みと弱みを整理します。

流派 代表 API 基準カテゴリの扱い 未知カテゴリ対応 向く場面
pandas pd.get_dummies(df, drop_first=True) 最初のカテゴリを自動で落とす 手動で再整列が必要 探索的分析・レポート作成
scikit-learn OneHotEncoder(drop='first', handle_unknown='ignore') 明示的に指定可能 handle_unknown で吸収 本番運用・パイプライン
statsmodels C(変数名, Treatment(reference='値')) 完全に明示的 基本的に学習時のみ 仮説検定・係数解釈
numpy 直書き (df['col'] == 'TOKYO').astype(int) 手動 手動 フラグ変数 1-2 個だけ

レポートや授業で結果を見せたいなら pandas が最速、 機械学習パイプラインに組み込むなら scikit-learn の ColumnTransformer + OneHotEncoder、 学術論文や統計報告では statsmodels が王道です。 numpy 直書きは「フラグ変数を 1 個だけ作る」ような場面で短く書けますが、 多カテゴリには向きません。

流派ごとの落とし穴と回避策

多重共線性(VIF)と完全多重共線性の見分け方(R445)

ダミー変数を扱う上で最も恐ろしい落とし穴が「完全多重共線性」と「ほぼ完全な多重共線性」です。 完全多重共線性は線形代数の問題で、 ライブラリがエラーで止めてくれるか、 自動で 1 列落として警告を出すか、 のどちらかになります。 厄介なのは「ほぼ完全」のケースです。 列同士の相関が 0.99 のような状況だと、 ライブラリは止まらず、 ただ係数の標準誤差が爆発的に大きくなり、 t 統計量がゼロ付近になり、 「効果がない」と誤って結論しがちです。

対策は VIF(Variance Inflation Factor、 分散拡大係数)の計算です。 ある説明変数 X_j を他のすべての説明変数で回帰したときの R^2_j を用いて、 VIF_j = 1 / (1 - R^2_j) で計算します。 VIF が 1 なら全く共線性なし、 5 を超えると要注意、 10 を超えると深刻、 というのが一般的な目安です。 ダミー変数群では、 同じカテゴリ変数から派生した 2 つのダミー(例:is_tokyo と is_osaka)は構造的に相関が低いので、 通常は問題になりません。 問題になるのは「is_tokyo と population」のような「カテゴリと連続変数の相関」です。

VIF の値 解釈 対応策
1.0 - 2.0 問題なし そのまま進める
2.0 - 5.0 軽度 解釈時に注意するが、 対応は通常不要
5.0 - 10.0 中度 変数選択・正則化・主成分分析で次元削減
10.0+ 深刻 該当変数を除外、 または同じカテゴリ変数の別ダミー設計を試す

SSDSE-B-2026(2023 年度・47 都道府県)で実際に VIF を計算すると、 都道府県ダミー同士は VIF ≈ 1、 「総人口(A1101)」と「一般診療所数(I5102)」は VIF ≈ 17.9(両者の相関 0.972)のように共線性が高い、 という典型例が観察できます。 これは「人口の多い県は一般診療所数も多い」という単純な事実が原因です。 こうした場合、 (A) 一方を落とす、 (B) 人口 1 人あたり施設数(per capita)に変換してから投入する、 (C) 主成分分析(PCA)で「規模成分」を 1 個の合成変数にまとめる、 が定石です。

5 行で振り返るダミー変数(R445)

  1. ダミー変数は「カテゴリ → 0/1」の変換。 k カテゴリなら k − 1 列を使い、 1 つを基準として落とす。
  2. 係数は「基準との差」を意味する。 基準を変えると係数の表示は変わるが、 予測値と R^2 は不変。
  3. 「k 個全部入れる」のは完全多重共線性で禁忌。 ただし正則化 / 決定木では実害なし。
  4. 順序尺度は (A) 整数 1 列、 (B) ダミー化の両方を検討し、 線形仮定の妥当性で選ぶ。
  5. 多重共線性は VIF で確認、 10 を超えるなら設計を見直す。 小標本ではダミー数を制限。

ケーススタディ:SSDSE-B-2026 でダミー変数を実践する(R445b)

📝 教材補足(実データで実行):以下は実データ SSDSE-B-2026(2023 年度・47 都道府県, cp932, ヘッダ 2 行)skiprows=[1] で読み込み、 目的変数=延べ宿泊者数(G7101, 百万人泊)、 連続説明変数=総人口(A1101, 万人)・一般診療所数(I5102, 千施設)、 カテゴリ=地域ブロック(Code から導出した 8 区分, 基準=北海道)実際に重回帰した結果です。 以下の pop/clinic/nights や係数・R^2・VIF はすべて実測値(実在列のみ使用)です。

ここまでの理論を、 SSDSE-B-2026(教育用標準データセット 2026 年版、 47 都道府県 × 多変量)で実際に動かしてみます。 目的は、 「延べ宿泊者数(G7101)を、 総人口・一般診療所数・地理ブロックで説明する重回帰モデル」を組み立て、 ダミー変数の効果がモデルにどう寄与するかを見ることです。 一気通貫の流れは次のとおり:(1) データ読み込みと前処理、 (2) 地域ブロック列の派生、 (3) ダミー変数化、 (4) 重回帰、 (5) 係数解釈、 (6) 残差診断。 6 ステップを順に追います。

ステップ 1: データ読み込み

SSDSE-B-2026 は CSV 形式で配布されており、 ヘッダは 2 行(コード行と日本語名行)になっています。 pandas では encoding='cp932' を指定し、 2 行目(日本語ラベル行)を skiprows=[1] で飛ばして読み込みます。 先頭列「SSDSE-B-2026」が年度なので df[df['SSDSE-B-2026']==2023] で 2023 年度の 47 行に絞ります。 必要列だけを df[['Prefecture','A1101','I5102','G7101','Code']] で抜き出します(A1101=総人口、 I5102=一般診療所数、 G7101=延べ宿泊者数)。 列名は元のコードのままだと分かりにくいので、 短い英語名(pop, clinic, nights)にリネームしておくと後段のコードがすっきりします。

ステップ 2: 地域ブロック列の派生

47 都道府県をそのままダミー化すると 46 列になり、 n=47 の自由度が破綻します。 そこで「8 地域ブロック」(北海道・東北・関東・中部・近畿・中国・四国・九州沖縄)に集約します。 これで 7 列のダミー(基準=北海道)で済み、 連続変数 2 個+切片を入れても自由度は 47 − 7 − 2 − 1 = 37 残ります。 集約は辞書 region_map = {'北海道': '北海道', '青森県': '東北', ...} を作り、 df['region'] = df['都道府県'].map(region_map) で 1 行で完了します。 マッピング辞書は別ファイルに切り出して再利用可能にすると便利です。

ステップ 3: ダミー変数化

pd.get_dummies(df, columns=['region'], prefix='reg', drop_first=True) で一発です。 drop_first=True により最初のカテゴリ(アルファベット順だと「九州沖縄」、 50 音順だと「北海道」など、 環境に依存)を基準として落とします。 基準を明示したい場合は、 一度全列を作ってから明示的に 1 列を drop() します。 列名は reg_東北, reg_関東, reg_中部, reg_近畿, reg_中国, reg_四国, reg_九州沖縄 の 7 つになります(基準を北海道とした場合)。

ステップ 4: 重回帰の実行

statsmodels の smf.ols('nights ~ pop + clinic + C(region, Treatment(reference="北海道"))', data=df).fit() で式記法を使うと、 ダミー変数化を内部で自動的に行ってくれます。 結果サマリには切片、 連続変数 2 個(pop と clinic)、 地域ダミー 7 個の係数が並びます。 各係数の右に t 統計量と p 値が表示され、 「基準(北海道)と比べて統計的に有意に差があるブロック」を一目で確認できます。 実測では R^2 = 0.873、 調整済み R^2 = 0.842(n=47, 自由度 37)となり、 7 個の地域ダミーはいずれも p ≤ 0.001 で有意でした。

ステップ 5: 係数の解釈

係数の読み方は次の 3 階層です。 (i) 切片 β0 = 25.89:「pop=0、 clinic=0、 region=北海道(基準)」のときの nights 予測値(現実には pop=0 はあり得ないので解釈の意味は薄い)。 (ii) 連続変数の係数:一般診療所数が 1 単位(千施設)増えると延べ宿泊者数が約 +9.62 百万人泊増える(clinic 係数 +9.615, p<0.001)。 一方 pop 係数は −0.051 と小さく負に出ますが、 これは pop と clinic が強く相関(VIF ≈ 17.9)しているため符号が不安定化した多重共線性の実例です。 (iii) ダミーの係数:そのブロックが北海道と比べて、 他の変数を一定にしたとき、 延べ宿泊者数がどれだけ高い/低いか。 実測では「reg_関東 = −20.89」となり、 「総人口と一般診療所数を揃えたとき、 関東は北海道より延べ宿泊者数が 20.9 百万人泊 低い」と読みます(北海道は観光需要が大きく基準として高いため、 各ブロックの係数は負に出ます)。

ステップ 6: 残差診断

残差プロット model.resid.plot()、 残差ヒストグラム、 Q-Q プロット、 残差 vs 予測値プロットの 4 種類で診断します。 実測では、 ダミー変数を入れたあとでも 沖縄県(+16.2)・京都府(+14.7)・千葉県(+14.0 百万人泊)が大きな正残差として残ります。 これは「観光需要が、 総人口・一般診療所数・地域ブロックの平均だけでは捉えきれない」ことを意味します。 対応として、 (A) 「is_okinawa」などの個別ダミーを追加、 (B) 対数変換 log(nights) でスケールを圧縮、 (C) 「人口 1 人あたり延べ宿泊者数(per capita)」に切り替えて単位を揃える、 の 3 通りがあります。 教材としては (A) と (C) を並べて示すと、 「同じ目的でもアプローチが複数ある」ことが伝わります。

歴史的経緯と用語の整理(R445b)

「ダミー変数」という用語は、 1950 年代から計量経済学の文献に登場します。 元々は「本物の数値ではなく、 単にカテゴリの代理(dummy)として置く 0/1 の数値」という意味で、 やや見下した語感もありました。 1960 年代に Suits(1957)の論文「Use of Dummy Variables in Regression Equations」で体系化され、 以降は計量経済学・社会統計の標準ツールになりました。 機械学習側では 2000 年代に scikit-learn が普及するにつれて「One-Hot Encoding」という用語が一般化し、 現在ではこちらの方が業界用語として優勢です。

歴史的に派生した関連用語が多いので整理します。 「Effect coding」(−1/0/+1 を使うコーディング、 sum-to-zero contrast)は係数の解釈が「全カテゴリ平均からのズレ」になり、 ANOVA との接続が滑らかになります。 「Helmert coding」は順序のあるカテゴリで、 各水準を「それ以前のすべての水準の平均」と比較する。 「Polynomial contrast」は順序カテゴリの線形・二次・三次成分を分離して係数化する。 これらは patsy(statsmodels が使う式パーサ)でサポートされており、 C(col, Treatment)C(col, Sum)C(col, Helmert)C(col, Poly) で切り替えられます。

コーディング方式 係数の意味 典型的な用途
Treatment (Dummy) 0 / 1 基準カテゴリとの差 一般的な回帰
Effect (Sum) -1 / 0 / +1 全平均との差 ANOVA、 実験計画
Helmert 複雑な係数 前段カテゴリ平均との差 順序カテゴリ
Polynomial 線形・二次・三次 直交多項式の係数 投薬量、 学年など
Backward Difference 後方差分 直前の水準との差 時系列カテゴリ

実務では Treatment(ダミー)一択で問題ない場合が大半ですが、 「カテゴリ全体の効果を均等に分散させて、 切片に偏らせたくない」場合は Effect coding が役立ちます。 学習者には「まず Treatment を完璧に使えるようになってから、 必要に応じて他方式を学ぶ」という順序が推奨されます。

追加の落とし穴 7 連発(R445b)

冒頭の「⚠️ 落とし穴」セクションに加えて、 実務で頻発するハマりポイントを 7 つ追加します。 これらはコードレビューや報告書チェックの観点としても使えます。

  1. 「True/False」を get_dummies に渡すとエラー:pandas 2.x からは bool 列も自動でダミー化されるが、 1.x との互換性差で挙動が分かれる。 必ず astype('object') でカテゴリ型に明示変換してから渡す。
  2. カテゴリ名にスペース・記号'A&B''X (2024)' のような名前は、 statsmodels の式記法でクォートエラーを起こす。 事前に str.replace で正規化する。
  3. nan のカテゴリ化get_dummies のデフォルトは欠損を「全列ゼロ」とする。 「欠損自体に意味があるカテゴリ」の場合は dummy_na=True で欠損ダミーを 1 列追加する。
  4. 標準化との順序:連続変数の標準化(z-score)はダミー変数化の前後どちらで行ってもよいが、 ダミー変数を標準化してはいけない(解釈が崩れる)。 ColumnTransformer で列ごとに変換を分ける。
  5. クロスバリデーションでの leakagefit_transform を全データで先にやってから CV すると、 「テストデータのカテゴリ情報」が学習時に漏れる。 必ず Pipeline 内で OneHotEncoderfit する。
  6. サンプル数 0 のカテゴリ:訓練データには現れないが、 カテゴリ定義としては存在する水準(例:「沖縄」というカテゴリ自体は定義されているが、 訓練データには沖縄のレコードが 0 件)がある場合、 OneHotEncoder(categories='auto') はその列を作らない。 明示的に categories=[全カテゴリ一覧] を渡す。
  7. カテゴリの順序記憶:探索→本番の間で「カテゴリの並び順」が変わると、 学習時と予測時で列が一致しない事故が起きる。 pickle 保存時は OneHotEncoder オブジェクトごと保存し、 自力で順序管理しない。

数式で見るダミー変数(R445b)

ダミー変数を入れた回帰モデルを数式で書き下すと、 「条件付き平均の構造」が明確になります。 カテゴリ変数 G が k 個の水準 g_1, g_2, ..., g_k を取り、 連続変数 X とともに目的変数 Y を説明するモデルを考えます。 基準カテゴリを g_1 として、 ダミー変数 D_j = I(G = g_j) for j = 2, ..., k を定義します。

モデルは次のように書けます:$$ Y = \beta_0 + \beta_X X + \sum_{j=2}^{k} \beta_j D_j + \varepsilon $$ ここで条件付き期待値を取ると、 G = g_1 のとき $E[Y | X, G = g_1] = \beta_0 + \beta_X X$、 G = g_j (j ≥ 2) のとき $E[Y | X, G = g_j] = (\beta_0 + \beta_j) + \beta_X X$ となります。 つまりダミー変数の係数 β_j は「g_j の切片」と「g_1 の切片」の差そのものです。 傾き β_X はすべてのカテゴリで共通(並行線)です。

交互作用項を入れると、 傾きもカテゴリで変えられます:$$ Y = \beta_0 + \beta_X X + \sum_{j=2}^{k} \beta_j D_j + \sum_{j=2}^{k} \gamma_j (D_j \cdot X) + \varepsilon $$ G = g_j のときの「X の傾き」は $\beta_X + \gamma_j$ となります。 γ_j がゼロから有意に外れていれば、 「g_j の傾きは g_1 の傾きと有意に異なる」と結論できます。 SSDSE-B-2026 で言えば、 「東京の人口あたり延べ宿泊者数の伸びは、 ほかの 46 道府県と違うか」を直接検定できる、 ということです。

最尤推定(OLS の正規方程式)の観点から見ると、 ダミー変数 D_j 列を含めた設計行列 X の X'X 行列が正則であることが要求されます。 k 個全てのダミー+切片を入れると、 D_1 + D_2 + ... + D_k = 1(全行で 1)になり、 切片列と線形従属になります。 これが「ダミー変数トラップ」の数学的内容です。 1 列落とせばランクが回復し、 推定値が一意に決まります。

機械学習文脈でのダミー変数(R445b)

線形回帰の世界では「k − 1 列にする」が鉄則ですが、 機械学習の多くのモデルでは事情が異なります。 ここでは主要モデルごとに「ダミー変数の扱い方」を整理します。

モデル k 列全部 OK か 推奨方式 理由
線形回帰 (OLS) NG k − 1 列、 切片あり 完全多重共線性で X'X が特異
ロジスティック回帰 NG k − 1 列、 切片あり 同上
Ridge / Lasso OK k 列でもよい 正則化で解が一意に定まる
決定木 / ランダムフォレスト OK k 列または原カテゴリのまま 分割は 1 列ずつ独立に評価
XGBoost / LightGBM OK LightGBM はカテゴリ型を直接受け入れ可 カテゴリ分割をネイティブサポート
ニューラルネット OK だが推奨は埋め込み 高基数なら Embedding 疎な入力より連続ベクトルが効率的

実践のコツ:scikit-learn の Pipeline + ColumnTransformer で「連続変数は StandardScaler、 カテゴリ変数は OneHotEncoder」と列ごとに変換を分け、 モデル本体(線形回帰なら drop='first'、 ランダムフォレストなら drop=None)に合わせて引数を切り替えます。 こうしておくと、 同じパイプラインのままモデルだけ差し替えてベンチマークできます。

LightGBM の categorical_feature 引数を使えば、 ダミー変数化せずにカテゴリ列をそのまま渡せて、 木の分割で「{A, C} vs {B, D, E}」のような最適分割を自動探索してくれます。 これは高基数(数百〜数千カテゴリ)で特に有効で、 ダミー化に伴うメモリ爆発を避けられます。 ただし「カテゴリ列を整数エンコード」しておくことが必要なので、 OrdinalEncoder を先に通す前処理が伴います。

最後に:ダミー変数を「使いこなす」とは(R445b)

ダミー変数は単純な道具ですが、 「使いこなす」には次の 5 段階のスキルアップが必要です。 (1) 基本:get_dummiesOneHotEncoder でカテゴリを 0/1 化できる。 (2) 解釈:係数を「基準との差」として正しく日本語で説明できる。 (3) 設計:基準カテゴリを目的に応じて選び、 報告書に明記できる。 (4) 検査:VIF と F 検定でダミーの妥当性をチェックできる。 (5) 応用:交互作用項・正則化・埋め込みを組み合わせ、 モデルごとに最適な戦略を選べる。

SSDSE-B-2026 を題材にすれば、 47 都道府県という「ちょうどよい大きさのカテゴリ集合」で 5 段階すべてを実体験できます。 まずは「東京かどうか」の 1 ダミーを入れて回帰し、 残差がどう変わるか観察するところから始めてください。 そこから「8 地域ブロック」「都市規模 3 区分」「人口密度 4 階級」と段階的にカテゴリ設計を拡張していけば、 ダミー変数の「効果と限界」が手で触れるようになります。

最後にひとこと:ダミー変数の係数を「効果」と呼ぶのは、 観察データでは因果ではなく単に条件付き平均の差を表します。 因果効果として解釈するには、 ランダム化実験あるいは因果推論(操作変数、 傾向スコア、 差の差分法、 回帰不連続)の追加設計が必要です。 「ダミーの係数が大きいから影響がある」と短絡しないことが、 実務における最後の節度です。

具体例で深堀り:4 つの実務シナリオ(R445c)

ダミー変数の使いどころを 4 つの実務シナリオに分けて深堀りします。 それぞれ「データの形」「ダミー設計」「係数の解釈」「報告書での書き方」を 1 セットで提示します。 すべて公的データ(SSDSE-B-2026、 国勢調査、 経済センサス、 学校基本調査)を念頭に置いた現実的な設定です。

シナリオ A: 都道府県別の延べ宿泊者数モデル

SSDSE-B-2026(2023 年度)の 47 行を使い、 目的変数を「延べ宿泊者数(G7101, 百万人泊)」、 説明変数を「総人口(A1101, 万人)」「一般診療所数(I5102, 千施設)」「地域ブロック(北海道・東北・関東・中部・近畿・中国・四国・九州沖縄の 8 区分, Code から導出)」とします。 地域ブロックは 7 ダミー(基準=北海道)に変換します。 切片 1 個、 連続 2 個、 ダミー 7 個で合計 10 パラメータ、 自由度 37。 報告書では「一般診療所数を 1 千施設増やすと延べ宿泊者数は約 9.6 百万人泊増える、 ただし関東ブロックは北海道と比べて 20.9 百万人泊 低い」のように書きます(実測 R^2 = 0.873)。

📝 教材補足(実データで実行):このシナリオは 実在列(G7101 延べ宿泊者数・A1101 総人口・I5102 一般診療所数)のみを使い、 SSDSE-B-2026 を encoding='cp932', skiprows=[1] で読み、 2023 年度・47 都道府県に絞って実際に重回帰した結果です。 上記の係数・R^2 はすべて実測値です(同じモデルの詳細は本ページの「ケーススタディ(R445b)」節を参照)。

シナリオ B: 学校種別の進学率モデル

学校基本調査の都道府県別データで、 目的変数を「大学進学率(%)」、 説明変数を「県内大学数」「平均世帯所得」「都市規模(大・中・小の 3 区分)」とします。 都市規模は順序尺度なので、 まず (A) 整数 1 列で投入する素朴モデル、 (B) ダミー 2 列(基準=小都市)で投入する柔軟モデルの両方を比較します。 (A) と (B) の調整済み R^2 がほぼ同じなら (A) を採用、 大きく違うなら (B) を採用、 という意思決定が標準です。

シナリオ C: 産業別の売上モデル

経済センサスの市区町村別データで、 目的変数を「事業所あたり売上高(億円)」、 説明変数を「従業者数」「立地(都心・郊外・地方の 3 区分)」「業種大分類(小売・卸売・サービス・製造の 4 区分)」とします。 立地で 2 ダミー(基準=地方)、 業種で 3 ダミー(基準=小売)、 連続変数 1 個、 切片 1 個で合計 7 パラメータ。 交互作用「立地 × 業種」を入れるかどうかは仮説次第ですが、 「都心の小売は郊外の小売と効き方が違う」という仮説があるなら、 C(立地) * C(業種) で交互作用も入れます。

シナリオ D: 月別の電力需要モデル

時系列データで、 目的変数を「月次電力需要(GWh)」、 説明変数を「月平均気温」「経済活動指数」「月(1 月〜12 月の 12 区分)」とします。 月は循環カテゴリなので、 (A) 11 ダミー(基準=1 月)で素朴に投入、 (B) フーリエ項 sin(2π·月/12), cos(2π·月/12) 等で周期性を表現、 の 2 通り。 (A) は月ごとの差を自由に推定できる一方パラメータ数が多く、 (B) はパラメータ 2-4 個で済むが「月ごとの細かい差」は捉えづらい。 サンプル数と目的次第で選びます。

ダミー変数の運用チェックリスト 20 項目(R445c)

実務でダミー変数を扱うとき、 「うっかり忘れがちな確認項目」を 20 個にまとめました。 コードレビューや報告書査読のチェックリストとして活用してください。

  1. カテゴリの一意な値を確認したか(df['col'].unique())。
  2. カテゴリごとの件数を確認したか(df['col'].value_counts())。
  3. 件数が極端に少ないカテゴリ(< 10 行)はないか。 あれば「その他」に集約したか。
  4. 欠損(NaN)はどう扱うか方針を決めたか(除外・専用ダミー・平均値補完)。
  5. カテゴリ名に余計な空白・改行・大文字小文字混在はないか。 str.strip().str.lower() で正規化したか。
  6. カテゴリ列の型は objectcategory か。 intbool のまま get_dummies に渡していないか。
  7. 基準カテゴリ(reference)は何か。 報告書に明記したか。
  8. k − 1 列にしたか。 線形モデルで k 列すべて入れていないか。
  9. VIF を計算したか。 5 を超えるダミーがあれば設計を見直したか。
  10. F 検定(partial F-test)でダミー群全体の有意性を確認したか。
  11. 係数の符号と大きさが事前期待と一致するか。 一致しない場合は原因を調査したか。
  12. 残差プロットで「カテゴリごとの残差分布」を確認したか。 特定カテゴリで残差が偏っていないか。
  13. 交互作用項を入れたい場合、 主効果も同時に入れているか。
  14. クロスバリデーションのとき、 OneHotEncoder.fit を全データで先にやって leakage させていないか。
  15. 本番予測時に未知カテゴリが出る可能性に備えて、 handle_unknown='ignore' または「その他」ダミーを用意したか。
  16. カテゴリ数が多い(> 50)場合、 ダミーではなく target encoding や embedding を検討したか。
  17. 標準化はダミー変数に適用していないか(連続変数だけに適用しているか)。
  18. カテゴリの順序(順序尺度)を活かしたい場合、 ダミーではなく整数列または Polynomial contrast を検討したか。
  19. 係数を「効果」と書く場合、 因果か条件付き相関か明示したか。
  20. パイプライン全体(前処理+モデル)を pickle で保存したか。 「カテゴリ一覧」を別管理していないか。

よくある質問(FAQ、 R445c)

Q. ダミー変数を使った回帰の R^2 は、 ダミーを増やせばいくらでも上がるのでは?

その通りで、 ダミーを増やせば R^2 は単調に上がります。 これは「自由度を消費して当てに行く」ことの代償で、 過学習の典型です。 正しい比較指標は 調整済み R^2AICBICクロスバリデーション RMSE のいずれかです。 これらはパラメータ数にペナルティを課すので、 「無駄なダミーを増やす」と数値が悪化します。 ダミー設計の意思決定は必ずこれらの指標で行いましょう。

Q. すべてのダミーが有意ならカテゴリ変数を全部使うべき?

「すべてのダミーが有意」というのは、 「すべてのカテゴリが基準カテゴリと有意に異なる」という意味で、 「カテゴリ変数全体が有意」と同じではありません。 全体の有意性は F 検定(partial F-test)で判定します。 また、 ダミーが有意でも「効果量(係数の大きさ)」が小さければ実務的にはほとんど影響しません。 「統計的有意性」と「実務的重要性」は別物です。 報告書では係数の絶対値・信頼区間・標準化係数のすべてを併記しましょう。

Q. カテゴリの順序を活かす方法は?

3 通りあります。 (1) 整数エンコード(1, 2, 3, ...)して 1 列にする。 線形に効くと仮定。 (2) ダミー変数化して順序を捨てる。 各水準の効果を自由に推定。 (3) Polynomial contrast で「線形成分」「二次成分」「三次成分」に分解。 (3) は学術論文で順序カテゴリを扱う際の王道で、 「効果は線形に増えているのか、 それとも非線形なのか」を係数で直接判定できます。 statsmodels の C(col, Poly) で利用できます。

Q. one-hot と dummy はどちらの語を使うべき?

読者層によります。 統計・計量経済の文脈(教科書、 学会論文、 政策レポート)では「ダミー変数」が標準。 機械学習・データサイエンスの文脈(Kaggle、 Qiita、 技術ブログ)では「One-Hot Encoding」が標準。 学際的な報告書では初出時に「ダミー変数(dummy variable、 機械学習文脈での one-hot encoding と同等)」のように両方併記すると親切です。 技術的には、 ダミー変数は k − 1 列を作る慣例、 one-hot は k 列を作る慣例、 という細かな違いがあることを指摘しておきましょう。

Q. なぜ整数エンコード(1, 2, 3)ではダメなのか?

名義尺度(順序のないカテゴリ)に整数エンコードを当てると、 「カテゴリ間に大小関係がある」という偽の情報をモデルに与えてしまいます。 例えば「東京=1、 大阪=2、 名古屋=3」と整数化すると、 線形回帰は「東京と名古屋の差(係数 × 2)は東京と大阪の差(係数 × 1)の 2 倍」と仮定します。 これは意味のない仮定で、 係数推定がカテゴリの並び順に依存してしまいます。 名義尺度は必ずダミー変数化(または embedding)してください。

Q. ダミー変数を作るタイミングはモデリングの前?後?

探索的データ分析(EDA)の段階では作らず、 カテゴリ変数のまま groupbycrosstab で集計するほうが見やすいです。 ダミー変数化はモデリングの直前、 Pipeline または ColumnTransformer の中で行うのが標準です。 EDA の段階で作ってしまうと、 列が大量に増えて DataFrame の見通しが悪くなり、 集計コードも煩雑になります。

物語で理解する:ダミー変数が活躍した 3 つの研究(R445d)

ダミー変数は教科書では「ただの 0/1 列」と素朴に紹介されますが、 実際の研究では極めて重要な役割を果たしてきました。 ここでは、 ダミー変数の使い方が研究の質を分けた 3 つの古典的・現代的な例を物語形式で紹介します。 これらは「ダミーをどう設計するか」がそのまま研究の説得力を左右した好例です。

物語 1: 賃金格差研究(Mincer 賃金関数、 1974)

労働経済学の Jacob Mincer は、 1974 年に「賃金は教育年数と職務経験で説明できる」という有名な賃金関数を提案しました。 この関数の重要な拡張が「性別ダミー」「人種ダミー」「業種ダミー」の導入です。 ダミー変数の係数が「同じ教育・経験を持つ男女の賃金差」「同じ条件下での人種間賃金差」として直接読めるため、 「差別の経済学的定量化」が可能になりました。 この枠組みは今日でも世界中の労働統計で標準的に使われており、 OECD の年次レポートにも登場します。 ダミー変数 1 列の有無が、 「賃金格差は属性で説明できる部分とできない部分がある」という政策議論を支える根拠になっているのです。

物語 2: 教育効果の自然実験(Angrist & Krueger、 1991)

Joshua Angrist と Alan Krueger は、 「義務教育の最短離学年齢」と「生まれ月」の関係を利用した自然実験で、 「教育年数の追加 1 年が賃金に与える因果効果」を推定しました。 ここでも「生まれ四半期ダミー」が操作変数(IV)として使われ、 教育年数の内生性を回避する役割を担いました。 ダミー変数が単なる統制変数ではなく、 「因果推論の道具」として活躍した代表例です。 この研究は計量経済学の教科書に必ず登場する古典で、 後のノーベル経済学賞(2021 年、 Angrist 受賞)にもつながりました。

物語 3: 機械学習での Kaggle 優勝(カテゴリ特徴量、 2010 年代後半〜)

現代の機械学習コンペティション Kaggle では、 「カテゴリ特徴量をどう扱うか」が優勝を分ける鍵になることが多々あります。 単純なダミー変数化(One-Hot)から始まり、 target encoding、 frequency encoding、 mean encoding、 そして CatBoost のようなネイティブ対応モデルが登場しました。 「ダミー変数化はベースライン、 そこからどう拡張するか」が現代のデータサイエンティストの腕の見せ所です。 高基数カテゴリ(例:商品 ID 数百万種)での扱いは、 単純な One-Hot ではメモリが破綻するため、 hashing trick、 embedding、 target encoding が必須技術になっています。

アンチパターン集:絶対にやってはいけない 10 連発(R445d)

ダミー変数の扱いで「これをやったら確実に分析が破綻する」という典型的アンチパターンを 10 個リストアップします。 コードレビューで見つけたら即修正対象です。

  1. 線形回帰で k 列すべて入れて切片もそのまま:完全多重共線性で X'X が特異、 係数が一意に決まらない。 必ず k − 1 列にする。
  2. カテゴリの並び順を変えるたびに結果が変わる:整数エンコードを名義尺度に当ててしまっている典型。 ダミー化または明示的なエンコーダを使う。
  3. 学習データだけで get_dummies、 予測データでも別に get_dummies:列の有無や順序がずれる。 必ず reindex(columns=train.columns, fill_value=0) で揃える。
  4. 標準化を全列(ダミーも含む)に適用:ダミーの係数の解釈が「0/1 の差」から「標準化後の単位」になり、 解釈が崩れる。 連続変数だけ標準化する。
  5. クロスバリデーション前に target encoding をすべてのデータで計算:テストデータの目的変数情報が学習に漏れる。 必ず CV の各 fold 内で encoding を計算。
  6. 基準カテゴリを明記せずに係数を解釈:「東京の係数は -5」と書かれても、 基準が大阪なのか北海道なのかで意味が全く変わる。 必ず基準カテゴリを書く。
  7. カテゴリ件数 1 や 2 のダミーを入れる:自由度の無駄遣い、 過学習の温床。 件数の少ないカテゴリは「その他」に集約する。
  8. 交互作用項だけ入れて主効果を抜く:「片方の傾きはゼロ」という暗黙の制約が入り、 解釈が破綻。 必ず主効果も同時に入れる。
  9. 順序尺度を 1 列の整数として扱い、 線形性を仮定しっぱなし:「小→中の差」と「中→大の差」が等しいという強い仮定を確認せずに採用。 必ず (B) ダミー化との比較も行う。
  10. ダミー係数が大きい=因果効果が大きい、 と短絡:観察データでは条件付き相関でしかない。 因果と書くなら追加の同定戦略(IV、 PSM、 DID、 RDD)が必要。

締めの言葉(R445d)

ダミー変数は、 統計学・機械学習・データ分析の基礎中の基礎です。 同時に、 落とし穴の数も基礎中の基礎です。 基準カテゴリ、 多重共線性、 順序尺度、 交互作用、 標本サイズ、 leakage、 未知カテゴリ、 因果と相関の混同、 解釈の正確さ。 これらすべてを意識しながらダミーを設計できれば、 あなたは「ダミー変数を使いこなしている」と胸を張れます。 SSDSE-B-2026 の 47 都道府県データは、 この「使いこなし」を体感するのに最適な題材です。 まずは「東京かどうか」の 1 ダミーから始め、 段階的に複雑な設計に進んでください。

最後に、 ダミー変数の本質を 1 行でまとめると:「カテゴリ変数を回帰モデルに入れるための数値変換であり、 その係数は基準カテゴリとの条件付き平均差を表す」。 この 1 行を肌感覚で理解できれば、 ダミー変数のあらゆる応用が見通せるようになります。 用語の暗記ではなく、 「係数を 1 行で解釈する」スキルこそが、 ダミー変数学習のゴールです。

用語ミニ辞書:ダミー変数まわり 15 語(R445e)

ダミー変数を扱う際に登場する関連用語を簡潔に整理します。 各用語は 2-3 行の定義と「ダミー変数とのつながり」を併記します。

これら 15 語は、 ダミー変数の話題で登場する核心語彙です。 報告書やコードレビューで「この用語の意味が曖昧」と感じたら、 この一覧に戻って再確認してください。

次のステップ:ダミー変数を超えて(R445e)

ダミー変数を一通りマスターしたら、 次の 5 つの発展トピックに進むと、 カテゴリ変数の扱いがさらに洗練されます。

  1. 正則化付き回帰 (Lasso / Ridge):ダミーが多いときに係数を縮小し、 不要なダミーを自動的に削除(Lasso)。 高次元カテゴリで威力を発揮。
  2. 階層モデル (Hierarchical / Mixed Effects):カテゴリの効果を「ランダム効果」として扱い、 サンプル数が少ないカテゴリの推定を全体平均に引き寄せる。 部分プーリング。
  3. ベイズ推論:ダミー係数に事前分布を置き、 事後分布として効果を推定。 不確実性を区間として直接得られる。
  4. 因果推論 (Propensity Score, IV, DID, RDD):ダミーを「処置」と見なし、 因果効果を識別する戦略。 観察データから因果に踏み込む。
  5. 埋め込み (Entity Embedding):カテゴリをニューラルネットで低次元ベクトルに学習。 高基数カテゴリで定番。 自然言語処理の word embedding の発想を構造化データに応用。

これらはどれも「ダミー変数を理解していること」を前提に組み立てられた発展手法です。 まずダミー変数を完璧に使いこなし、 その上で目的・データ規模・解釈性の要請に応じて発展手法を選んでください。 「基礎は道具、 応用は戦略」の言葉どおり、 ダミー変数という基礎道具を磨くことが、 すべての応用の出発点になります。

クイックリファレンス:ダミー変数のコード断片集(R445f)

ダミー変数の操作で「すぐ思い出したい」コード断片をまとめます。 SSDSE-B-2026 を題材にした極小サンプルですので、 必要に応じてカラム名を読み替えてお使いください。

(1) pandas で 1 列だけダミー化df['is_tokyo'] = (df['都道府県'] == '東京都').astype(int) のように 1 行で「東京かどうか」のフラグ列を作れます。 これは最も素朴かつ最頻出のパターンです。 注意点は、 比較対象の文字列を「東京」「東京都」「Tokyo」などで取り違えないこと。 元データの値を df['都道府県'].unique() で必ず確認します。

(2) pandas で複数カテゴリを一括ダミー化df_d = pd.get_dummies(df, columns=['region'], prefix='reg', drop_first=True, dtype=int) で region 列を 7 ダミー(k − 1 列)に展開します。 dtype=int を明示しておくと後段の数値演算でエラーが出にくくなります。 pandas 2.x ではデフォルトが bool になっているので注意。

(3) scikit-learn パイプラインColumnTransformer([('num', StandardScaler(), ['pop', 'clinic']), ('cat', OneHotEncoder(drop='first', handle_unknown='ignore'), ['region'])]) で「連続変数は標準化、 カテゴリ変数はダミー化」を 1 つのオブジェクトにまとめられます。 これを Pipeline でモデルと結合すれば、 cross-validation の中でも leakage なく動きます。

(4) statsmodels 式記法smf.ols('nights ~ pop + clinic + C(region, Treatment(reference="北海道"))', data=df).fit().summary() で基準を明示しつつダミー化+回帰を 1 行で実行。 結果サマリには各ダミーの係数・標準誤差・t 値・p 値・95% 信頼区間が並び、 論文・レポートにそのまま貼れる形式で表示されます。

(5) VIF 計算from statsmodels.stats.outliers_influence import variance_inflation_factor をインポートし、 設計行列の各列について variance_inflation_factor(X.values, i) をループで計算。 10 を超える列があれば設計を見直すサイン。

これら 5 断片を覚えておけば、 SSDSE-B-2026 規模のデータでのダミー変数操作は 95% カバーできます。 残りの 5% は「未知カテゴリ対応」「target encoding」「embedding」など発展手法で、 必要になった時に学べば十分です。

学習者へのメッセージ(R445g)

ダミー変数の学習で最も大切なのは、 「コードが書けること」ではなく「係数を 1 行で正しく解釈できること」です。 「関東ダミーの係数が −20.9 ということは、 ほかの条件が同じなら関東ブロックは基準カテゴリ(北海道)より延べ宿泊者数が 20.9 百万人泊 低い、 ということ」と即座に言える状態を目指してください。 この「読みの速さ」が、 統計家・データサイエンティスト・経済アナリストすべてに共通する基礎体力です。

SSDSE-B-2026 の 47 都道府県データは、 ダミー変数の練習に最適な題材です。 まず東京ダミーから始め、 地域ブロックダミー、 都市規模ダミー、 交互作用項、 と段階的に複雑さを上げていけば、 「ダミーを設計する力」が自然と身につきます。 ぜひ手を動かしながら、 係数の解釈を声に出して読む練習をしてください。 それがダミー変数を「使いこなす」最短ルートです。

なお、 SSDSE-B-2026 で扱う 47 都道府県は、 ダミー変数の理論と実践を架橋する「ちょうど良い大きさ」のデータセットであり、 学習教材として最適化されています。 付け加えるなら、 ダミー変数は「データを 0/1 という最も単純な数値に翻訳する技術」であり、 翻訳の質がそのまま分析の質を決めます。 翻訳が雑なら(例:基準カテゴリの明示忘れ、 順序尺度を名義尺度として扱う、 完全多重共線性を見落とす)、 後段でいくら高度なモデルを使っても結論は揺らぎます。 逆に翻訳が丁寧なら、 線形回帰という最もシンプルな道具でも、 政策提言に耐える深い洞察が得られます。 ダミー変数は派手さこそありませんが、 データ分析の屋台骨であり、 「シンプルな道具を丁寧に使う」職人技の象徴です。 ぜひこの道具を、 自分の分析の確かな基礎にしてください。

🧩 解説深化 ── ダミーだけの回帰は「群平均の再現機」(飽和モデル視点)

このページの他セクション(基準カテゴリ選び・交互作用・固定効果・DiD)とは別の角度から、 「連続変数を一切入れず、単一カテゴリを基準+k−1 個のダミーだけで回帰すると何が起きるか」 を、 SSDSE-B-2026 の 8 地方ブロック × 総人口(2023 年・47 都道府県) の実測値で確かめます。 結論を先に言うと、 係数は自動的に「各ブロックの平均そのもの(=群平均差)」に収束します。 これを統計学では飽和モデル(saturated model)と呼びます。

🎨 直感

「切片+k−1 個のダミー」は、 実は各グループに 1 個ずつパラメータを割り当てているのと同じです(切片が基準グループ、 各ダミーが「基準との差」)。 パラメータの自由度がグループ数とちょうど一致するので、 OLS は各グループの点をその群平均で通す以外にやりようがありません。 だからダミーだけの回帰の予測値は、 必ずそのカテゴリの標本平均になります。 「回帰」というより「グループ集計(groupby→mean)を線形モデルの言葉で書き直しただけ」と捉えると腑に落ちます。

下表は 47 都道府県の総人口(2023、 万人)を 8 地方ブロックへ集約し、 基準=中部としてダミー回帰したときの係数です(中部は 9 県を含む中位規模ブロックなので基準に選びました)。 numpy の lstsq で解いた OLS 係数は、 手集計の群平均差と小数点以下まで完全一致しました。

表. 8 地方ブロックの総人口(SSDSE-B-2026, 2023, 万人)と基準=中部のダミー係数
地方ブロック県数 n平均総人口(万人)ダミー係数=中部との差予測値=切片+係数
北海道1509.20+278.66509.20
東北6138.63−91.91138.63
関東7621.81+391.27621.81
中部(基準)9230.54— (切片=230.54)230.54
近畿7314.14+83.60314.14
中国5141.40−89.14141.40
四国489.45−141.0989.45
九州沖縄8175.36−55.18175.36
📤 実測値(SSDSE-B-2026, df[df['SSDSE-B-2026']==2023], 総人口 A1101/10000, 万人): 切片(=中部の平均) = 230.54 関東の予測 = 230.54 + 391.27 = 621.81 (=関東 7 県の平均そのもの) 北海道の予測 = 230.54 + 278.66 = 509.20 (=北海道 1 県の値そのもの) lstsq の OLS 係数 と groupby('地方').mean() の差 は allclose = True

つまり「予測値=群平均」が全ブロックで成り立ちます。 これがダミーだけの飽和モデルの正体です。 連続変数 X を足すと初めて「群平均からのズレを X で説明する」ことになり、 回帰らしくなります。

🕳 落とし穴(重要)── 群サイズ 1 のダミーは「残差ゼロ」で有意性が測れない

上表で 北海道ブロックは n=1 です。 飽和モデルの帰結として、 このブロックの予測値は北海道の実値 509.20 にぴったり一致し、 残差が厳密に 0 になります。 一見「完璧な当てはまり」に見えますが、 これは危険信号です。

経験則:1 ダミー列あたり最低 10 観測を目安に。 47 都道府県で 8 ブロック(7 ダミー)ならまだ余裕がありますが、 47 県すべてを個別ダミー化(46 列)すると全観測が残差 0 の完全飽和になり、 何も説明していないのに R²=1 という無意味な結果になります。

🚀 発展

※ 本セクションの数値は data/raw/SSDSE-B-2026.csv を pd.read_csv(encoding='cp932', skiprows=[1]) で読み、 2023 年・47 都道府県の総人口(A1101÷10000, 万人)を 8 地方ブロックへ集約して算出した実測値です(合成・架空データは含みません)。