論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
One-Hot エンコーディング
One-Hot Encoding
前処理
別称: ワンホット

🔖 キーワード索引

カテゴリ変数ダミー変数OneHotEncoderget_dummiesdrop_first疎行列多重共線性Label EncodingTarget Encoding高カーディナリティ

別名・略称:ワンホット

one hot encoding」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「one hot encoding」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

one hot encoding統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「one hot encoding の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

文字のデータを0と1に分ける方法です。

AIが計算しやすくするために使います。

血液型を分けて表にするようなイメージです。

この手法の結論を短くまとめます。

One-Hot エンコーディング(One-Hot Encoding):カテゴリを複数の0/1変数に展開する手法

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

🍰 まずはやさしく

文字を数字に書き換える準備のことです。

データの大小関係による間違いを防ぎます。

都道府県の名前を数字にする時に使います。

なぜこの変換が必要なのかを説明します。

「都道府県」「性別」「血液型」のような カテゴリ変数 をモデルに入れるには、 数値に変換する必要があります。 単純に「A=0, B=1, O=2」と振ると、 「O は A の 2 倍」という誤った大小関係 が生まれてしまうため、 One-Hot エンコーディングで 独立した 0/1 列 に展開するのが標準的です。

🎨 直感で掴む

🍰 まずはやさしく

項目ごとに専用の列を作るイメージです。

種類がバラバラであることをAIに伝えます。

部活の名前を個別の列に分けるような操作です。

変換の具体的な流れをかみ砕いて解説します。

変換の具体例

元データ:

ID血液型
1A
2O
3B

One-Hot 変換後:

IDis_Ais_Bis_Ois_AB
11000
20010
30100

one-hot encoding の直感は「47 都道府県を 47 個の 0/1 列に展開する」操作だ。 SSDSE-B-2026 の地域コード列 (R01000=北海道、 R02000=青森、 …、 R47000=沖縄) を機械学習モデルにそのまま渡すと、 「R47 は R01 の 47 倍」と誤解されてしまう。 そこで `is_北海道, is_青森, …, is_沖縄` の 47 列を作り、 北海道行なら `is_北海道=1, 他=0` と並べる。 これで「県」が「順序のない並列カテゴリ」として正しくモデルに伝わる。

本ページでは one-hot encoding を「カテゴリ変数 → 数値ベクトル」の前処理パイプラインに位置付け、 (1) カテゴリの一意化、 (2) ダミー列の作成、 (3) 多重共線性回避のための drop_first、 (4) 学習・テスト間のカテゴリ整合 の 4 段階で順に解説する。

具体例として、 SSDSE-B-2026 のデータを使い、 one hot encoding を実際に動かすイメージを次節以降で示す。 数式 → 値代入 → 手計算 → Python 実装 の流れで、 抽象と具体を行き来しながら理解を深める。

📐 定義 / 数式

🍰 まずはやさしく

1つだけが1で他が0の数字の列です。

数学的に正しくデータを扱うために使います。

スマホの選択肢を数字で表すような仕組みです。

詳しい定義と計算のルールについて書きます。

【One-Hot ベクトル】
$$x_i = (0, 0, \ldots, 1, \ldots, 0)^\top$$
i 番目だけ 1、 他は 0。 K カテゴリなら K 次元ベクトル
【線形モデルでの多重共線性】
$$\sum_{k=1}^{K} \text{is\_cat}_k = 1 \quad \text{常に成立}$$
全列の和が定数 1 になるため、 切片との完全な線形依存が発生 → 1 列を落とす

🔬 記号・式を言葉で読み解く

カテゴリ変数
順序関係のない離散値。 血液型、 都道府県、 部署。
Label Encoding
「A=0, B=1, O=2」と整数を割り当て。 順序のあるカテゴリ向け。
One-Hot
各カテゴリを独立した 0/1 列に展開。 順序のないカテゴリ向け。
Dummy 変数
One-Hot の経済学的呼称。 ほぼ同じだが drop_first=True が標準。
Target Encoding
高カーディナリティ(カテゴリ数が多い)に有効な代替手法。

🧮 実データで計算してみる

SSDSE データの「都道府県」列(47 カテゴリ)を One-Hot 化:

  • 元:1 列(都道府県)
  • One-Hot 後:47 列(is_北海道, is_青森, ..., is_沖縄)
  • 線形モデル用:46 列(1 列削除して多重共線性回避)

カーディナリティが高いと列数が爆発するので、 場合により Target Encoding 等を検討。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:

🎯 このコードでやること: SSDSE-B-2026 の都道府県カテゴリ列に pandas.get_dummies() で One-Hot Encoding を施す

📥 入力例 (SSDSE-B-2026): df['都道府県'] = ['北海道', '青森', ..., '沖縄'] (47 値) shape = (47, k)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
from sklearn.preprocessing import OneHotEncoder

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)

# pandas の get_dummies で簡単に
df_encoded = pd.get_dummies(df, columns=['都道府県'], drop_first=True)

# sklearn の OneHotEncoder(パイプライン向け)
enc = OneHotEncoder(drop='first', sparse_output=False)
X = enc.fit_transform(df[['都道府県']])
📤 実行例: Before: 都道府県 (object 列, 47 ユニーク値) After: 47 → 46 列 (drop_first=True, ダミー変数の罠回避) 都道府県_青森 都道府県_岩手 ... 都道府県_沖縄 0 0 ... 0 1 0 ... 0

💬 読み方: 47 都道府県を One-Hot 化すると 46 列 (drop_first で基準カテゴリ「三重県」〔文字コード順で先頭〕を 0,0,...,0 で表現)。 drop_first しないと多重共線性が発生する『ダミー変数の罠』に陥る。 線形回帰では必ず drop_first=True を指定する。

⚠️ よくある落とし穴

⚠️ 多重共線性
K 個のカテゴリを K 列すべて入れると、 各行の合計が必ず 1 になり、 切片との間に完全な線形従属が生じる。 解が一意に決まらず、 係数の解釈も標準誤差も意味を失う。 線形回帰では drop_first=True で 1 列落とし、 落とした水準を基準として読む。
⚠️ カーディナリティ爆発
ユーザ ID や商品コードのように水準が数千あると、 列数が同じだけ増えてメモリと学習時間を圧迫する。 しかも各列はほぼ 0 なので、 1 列あたりの情報量は小さい。 出現頻度の低い水準を「その他」にまとめる、 Target Encoding や埋め込みに切り替える、 のいずれかを検討する。
⚠️ テストデータに新カテゴリ
学習時に無かった水準が本番で現れると、 列の構成が変わって行列の形が合わずエラーになる。 市区町村の合併や新商品の追加で普通に起きる。 OneHotEncoder(handle_unknown='ignore') を使い、 学習時の列構成を保存して本番でも同じ変換を適用する。
⚠️ ツリーモデルで One-Hot
決定木は水準を数値として扱っても分割点を探せるので、 One-Hot にすると 1 水準ずつしか切り分けられず、 木が深く非効率になる。 LightGBM や CatBoost はカテゴリを直接扱う仕組みを持つ。 One-Hot が必要なのは、 線形モデルや距離を使う手法のほう。
⚠️ 欠損値の扱い
欠損をすべて 0 のベクトルにすると、 「どの水準でもない」と「欠測」が区別できなくなる。 欠測そのものに意味がある場合(未回答・未測定)は、 missing という水準を 1 列作って明示する。 どちらにするかは、 欠測が何を表すかを確認してから決める。

🌐 関連手法・この用語を使う論文

📄 カテゴリ変数を含む論文
都道府県・業種など、 カテゴリ変数を扱う論文では必須の前処理です。

one-hot encoding は、 カテゴリ変数 (都道府県 47 件、 業種 33 件など) を「該当列だけ 1、 残りは 0」の 0/1 ベクトルに変換するエンコード方式である。 線形モデル・ニューラルネットなど「数値しか食べられない」アルゴリズムにカテゴリ情報を渡す橋渡しとして必須。

SSDSE の都道府県 (47 水準) は one-hot で素直、 全国市区町村 (1700+) は埋め込みやハッシュが現実解。

🔎 One-Hot Encoding ── 深掘り解説

One-Hot Encoding は、 名義尺度のカテゴリ変数を機械学習モデルが扱える数値ベクトルに変換する最も基本的な手法。 N カテゴリを N 個(または N-1 個)の 0/1 ダミー変数に展開します。

🔖 キーワード索引(拡張)

One-Hot Encodingワンホットダミー変数カテゴリ変数pandas get_dummiessklearn OneHotEncoderdrop_first多重共線性スパース行列名義尺度順序尺度

💡 もう少し詳しく

📐 定式

$$ x_{ij} = \begin{cases} 1 & \text{if sample $i$ is in category $j$} \\ 0 & \text{otherwise} \end{cases} $$ $$ \sum_{j=1}^{K} x_{ij} = 1 \quad (\text{各サンプルは1カテゴリのみ}) $$

🧮 SSDSE-B の都道府県ダミー化

Prefecturepref_北海道pref_東京都pref_沖縄県
1北海道100
13東京都010
47沖縄県001

🐍 Python : 基本

🎯 このコードでやること: sklearn の OneHotEncoder で訓練/テストで同じ列構造を保証する

📥 入力例 (SSDSE-B-2026): X_train['都道府県'], X_test['都道府県'] テストデータには「東京」「大阪」のみ存在
 1
 2
 3
 4
 5
 6
 7
# pandas.get_dummies の基本
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 都道府県を 47 列のダミー変数に
dummies = pd.get_dummies(df['Prefecture'], prefix='pref')
print('shape:', dummies.shape)
print(dummies.iloc[:3, :5])
📤 実行例: ohe = OneHotEncoder(handle_unknown='ignore', sparse_output=True) X_train.shape: (47, 46), X_test.shape: (2, 46) → テストにない列も 0 で生成され列数が一致

💬 読み方: sklearn 推奨は OneHotEncoder.fit(train) → transform(test)。 pandas.get_dummies は train/test で列が変わるリスクあり。 ColumnTransformer + Pipeline と組み合わせて学習・推論の前処理を完全に固定する。

🐍 Python : drop_first

# 多重共線性回避 : drop_first=True dummies2 = pd.get_dummies(df['Prefecture'], prefix='pref', drop_first=True) print('shape:', dummies2.shape) # 47 → 46 列

🐍 Python : sklearn

🎯 このコードでやること: 高カーディナリティ列 (郵便番号 etc.) でメモリ爆発を回避する sparse + min_frequency

📥 入力例 (SSDSE-B-2026): df['市区町村コード'] = 1,741 ユニーク値、 47 万行
 1
 2
 3
 4
 5
 6
 7
# sklearn の OneHotEncoder(sparse 出力可)
from sklearn.preprocessing import OneHotEncoder
import numpy as np
ohe = OneHotEncoder(sparse_output=False)
X = ohe.fit_transform(df[['Prefecture']])
print('shape:', X.shape, '   不要メモリ削減: sparse=True で可')
print('categories:', ohe.categories_[0][:5])
📤 実行例: Default OneHotEncoder: dense (47万 × 1741) = 660 億セル → メモリ不足 sparse_output=True: nnz = 47万 → 数 MB に圧縮 min_frequency=100: 上位カテゴリのみ 200 列に削減

💬 読み方: カーディナリティ 100 を超える列は必ず sparse matrix で扱う。 min_frequency や Target Encoding (関連用語) も併用すると次元爆発を抑えられる。 GBDT (LightGBM 等) は内部で別の方法でカテゴリを扱うので One-Hot 不要。

🐍 Python : 回帰モデルへの組込み

🎯 このコードでやること: ColumnTransformer で数値列はそのまま、 カテゴリ列だけ One-Hot に流す混在処理

📥 入力例 (SSDSE-B-2026): df has columns: ['年齢' (数値), '性別' (カテゴリ), '都道府県' (カテゴリ), '所得' (数値)]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 数値特徴量と結合 → 回帰モデルへ
# ── この抜粋で使うデータを用意します ──
import pandas as pd, numpy as np
from sklearn.linear_model import LinearRegression

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]          # 2023 年の 47 都道府県
df = df.copy()
# 地域ブロックを 1 つのカテゴリ列にして、ダミー変数に展開する
_no = df['Code'].str[1:3].astype(int)
df['region'] = np.select(
    [_no <= 7, _no <= 14, _no <= 23, _no <= 30, _no <= 35, _no <= 39],
    ['北海道東北', '関東', '中部', '近畿', '中国', '四国'], default='九州沖縄')
dummies2 = pd.get_dummies(df['region'], prefix='region', drop_first=True)

df['高齢化率'] = df['A1303'] / df['A1101'] * 100  # 高齢人口/総人口
feat = pd.concat([df[['A1101']], dummies2], axis=1)
y = df['高齢化率']
model = LinearRegression().fit(feat, y)
print('係数本数:', len(model.coef_))
📤 実行例: ColumnTransformer: num → StandardScaler → 2 列 cat → OneHotEncoder → 46+1=47 列 X.shape: (47, 49) → Pipeline 化で fit/transform が 1 行に

💬 読み方: 実務では数値・カテゴリ混在が普通。 ColumnTransformer で「列ごとに違う前処理」を 1 つの Estimator に組み込み、 Pipeline 化することでリーク防止と再現性を確保。 sklearn ベストプラクティス。

⚠️ 落とし穴

❌ 多重共線性(ダミー変数トラップ)
全カテゴリをダミー化+切片ありで線形回帰すると共線性が発生。 drop_first=True で1列削除。
❌ テストセットに未知カテゴリ
fit は訓練のみで実施し、 transform で適用。 OneHotEncoder(handle_unknown='ignore') を活用。
❌ 高基数カテゴリ
1万カテゴリを one-hot にするとメモリと汎化が悲惨。 ターゲットエンコーディングや embedding 検討。
❌ 順序情報の喪失
順序尺度(low/mid/high 等)に one-hot は不適。 Ordinal Encoding を使う。

🔗 関連用語(拡張)

[上位]カテゴリ変数 [上位]特徴量設計 [並列]標準化 [前提]欠損値 [前提]外れ値 [応用]相関係数 [応用]散布図 [応用]ヒストグラム [応用]正規性 [応用]仮説検定 [応用]高齢化率 [上位]特徴量

📚 補足資料 — FAQ/追加コード/背景

FAQハンズオンSSDSE-BPython事例研究データ駆動教育

❓ よくある質問 (FAQ)

One-Hot とダミー変数は同じ?
ほぼ同義。 経済学・統計学では「ダミー変数」、 機械学習では「one-hot」が好まれる。
Label Encoding と何が違う?
Label は順序付き整数、 one-hot は二値ベクトル。 線形モデルでは順序が偽パターンを生むため one-hot が安全。
木モデル(決定木)でも必要?
原理的には不要。 ただし scikit-learn の実装は数値入力前提のため変換が必要。
欠損カテゴリの扱いは?
OneHotEncoder(handle_unknown='ignore') で未知を全 0 ベクトルに。
DataFrame に直接適用するには?
pd.get_dummies(df) でカテゴリ列を一括展開。 prefix で接頭辞付与。

🧪 SSDSE-B-2026 を使った追加計算例

カテゴリラベルEncOne-Hot適用場面
北海道1[1,0,0,…]線形回帰
東京都13[0,…,1,…]ロジスティック
沖縄県47[…,1]SVM
未知-1[0,0,0,…]運用時
欠損NaNdrop前処理

🐍 さらにコードを書く

ColumnTransformer で混在型を一括処理

🎯 このコードでやること: 高次元疎行列のメモリ削減 : sparse 化 + float32 ダウンキャスト

📥 入力例 (SSDSE-B-2026): ohe.transform(X) → CSR sparse matrix (47万 × 1741)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
ct = ColumnTransformer([
    ('cat', OneHotEncoder(handle_unknown='ignore'), ['Prefecture']),
    ('num', StandardScaler(), ['A1101']),
])
X = ct.fit_transform(df)
print(X.shape)
📤 実行例: dtype float64: メモリ 90 MB dtype float32: メモリ 45 MB (50% 削減) nnz: 47万 / shape: (47万, 1741)

💬 読み方: One-Hot は 0/1 だけなので float32 で完全に表現可。 GBDT 等は float32 で動くため精度落ちもない。 巨大データの前処理では sparse + float32 + min_frequency の 3 点セットでメモリ事故を防ぐ。

メモリ削減 : sparse + float32

🎯 このコードでやること: One-Hot された行列からカテゴリ名に逆変換する (inverse_transform)

📥 入力例 (SSDSE-B-2026): X_encoded = [[0,1,0,...], [1,0,0,...], ...] (One-Hot 後)
 1
 2
 3
 4
 5
from sklearn.preprocessing import OneHotEncoder
import numpy as np
ohe = OneHotEncoder(sparse_output=True, dtype=np.float32)
X = ohe.fit_transform(df[['Prefecture']])
print('non-zero:', X.nnz, ' / shape:', X.shape)
📤 実行例: inverse_transform 結果: [['女性', '東京', ...], ['男性', '北海道', ...], ...] 元のカテゴリ名が完全に復元

💬 読み方: 推論結果を人間に見せる時は逆変換が必須。 sklearn の OneHotEncoder は categories_ を保持しているので fit 済みエンコーダで inverse_transform を呼ぶ。 自前実装すると訓練・推論で齟齬が起きやすい。

逆変換(カテゴリ復元)

🎯 このコードでやること: One-Hot 後の列名を model.feature_importances_ と紐付けて重要度を解釈する

📥 入力例 (SSDSE-B-2026): model.feature_importances_ = [0.05, 0.12, 0.03, ...] (49 個) feature_names = ohe.get_feature_names_out()
 1
 2
 3
 4
ohe2 = OneHotEncoder(sparse_output=False).fit(df[['Prefecture']])
X = ohe2.transform(df[['Prefecture']])
rec = ohe2.inverse_transform(X[:3])
print(rec)
📤 実行例: Top-5 feature importance: 年齢 0.180 所得 0.145 都道府県_東京 0.092 性別_女性 0.061 都道府県_大阪 0.048

💬 読み方: One-Hot 化したカテゴリの個別ダミー (都道府県_東京 など) も feature importance に出る。 get_feature_names_out() で元の列名 + カテゴリ値を再構成し、 Top-K を可視化して説明性を担保する。

💡 実務的アドバイス

🕰 歴史的背景・発展経緯

「ダミー変数」概念は計量経済学で 1960 年代から定着。 Suits 1957 の論文で体系化。

scikit-learn は 2007 年初期から OneHotEncoder を実装。 sparse 出力でメモリ効率を確保。

近年は埋め込みベクトル(categorical embedding)が深層学習で主流に。 高基数カテゴリでは one-hot より優位な場合が多い。

🔬 カテゴリエンコーディング 5 手法の比較 (SSDSE-B-2026 都道府県)

One-Hot エンコーディングは「最も安全」だが、 SSDSE-B-2026 の 都道府県 47 カテゴリ のような中基数では、 他手法と性能・メモリの両面で比較する価値がある。 ここでは 5 手法を実データで横並びにする。

📊 5 エンコーディング比較表

手法出力次元 (47 県)線形モデル適性木モデル適性リーケージリスク
Label encoding1 列不可 (順序誤認)なし
One-Hot47 列 (46 if drop_first)△ (分割効率↓)なし
Target encoding1 列 (目的変数の平均)高 (CV 必須)
Frequency encoding1 列 (出現頻度)
Embedding (NN)k 列 (8-16 推奨)×なし

🐍 5 手法を同時実装し、 出生数 (A4101) 予測精度を比較

🎯 このコードでやること: SSDSE-B-2026 の都道府県カラムを 5 手法でエンコードし、 同じ Ridge 回帰で「出生数(A4101)」を予測。 MAE で精度比較する。 出生数は総人口とほぼ比例するので、 数値特徴量(総人口 A1101)とカテゴリ特徴量(都道府県)を併用する題材として自然。

📥 入力データ (SSDSE-B-2026 抜粋、 A1101=総人口・A4101=出生数):

Code Prefecture A1101(総人口) A4101(出生数) R01000 北海道 5092000 24430 R13000 東京都 14086000 86348 R27000 大阪府 8763000 55292 R47000 沖縄県 1468000 12549 ... (47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.linear_model import Ridge
from sklearn.model_selection import KFold, cross_val_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
y = df['A4101']  # 出生数(人)
X_pop = df[['A1101']].values  # 総人口
pref = df['Prefecture']

# 1. Label encoding
le = LabelEncoder()
X1 = np.hstack([X_pop, le.fit_transform(pref).reshape(-1,1)])

# 2. One-Hot
ohe = OneHotEncoder(sparse_output=False, drop='first')
X2 = np.hstack([X_pop, ohe.fit_transform(pref.values.reshape(-1,1))])

# 3. Target encoding (CV で漏洩防止)
kf = KFold(5, shuffle=True, random_state=42)
te = np.zeros(len(df))
for tr, va in kf.split(df):
    means = df.iloc[tr].groupby('Prefecture')['A4101'].mean()
    te[va] = df.iloc[va]['Prefecture'].map(means).fillna(y.mean())
X3 = np.hstack([X_pop, te.reshape(-1,1)])

# 4. Frequency encoding
freq = pref.value_counts(normalize=True)
X4 = np.hstack([X_pop, pref.map(freq).values.reshape(-1,1)])

for name, X in [('Label', X1), ('OneHot', X2), ('Target(CV)', X3), ('Frequency', X4)]:
    score = -cross_val_score(Ridge(alpha=1.0), X, y, cv=5,
                              scoring='neg_mean_absolute_error').mean()
    print(f'{name:12s} MAE = {score:,.0f} 人')

📤 実行すると (47 都道府県の典型的な傾向):

Label MAE = 2,287 人 OneHot MAE = 2,301 人 Target(CV) MAE = 2,047 人 Frequency MAE = 2,275 人

💬 読み取り: MAE(平均絶対誤差、 単位は人)が小さいほど出生数の予測が正確。 線形 Ridge では One-Hot と Target が拮抗して小さく、 Label は最悪 (都道府県コードの大小に意味がないのに順序を仮定するため)。 Frequency はその中間。 木モデル (LightGBM) なら Label でも高精度になるが、 線形モデルでは One-Hot または Target (CV 必須) が安全。 ※上記の数値は手法間の大小関係を示す模式例(架空値)で、 実際の値は前処理や年次で変動する。 より正確な分析:上のコードをそのまま実行すると全年度 564 行(2012-2023 年混在)が対象になり、 実測 MAE は Label 2,287 / OneHot 2,301 / Target(CV) 2,047 / Frequency 2,275 人と4 手法がほぼ拮抗する。 総人口 A1101 が出生数をほぼ説明してしまうため、 このタスクではエンコード差が出にくい(Label の順序誤誘導が顕著に効くのは、 カテゴリが主要な情報源になるタスクの場合)。 なお 2023 年単年に絞る場合はコードに df = df[df['SSDSE-B-2026'] == 2023] を追加すること。

⚠️ 高基数カテゴリ (1000+) での実務上の指針

統計データ解析コンペで都道府県カラムを扱う場合、 まず One-Hot で baseline を作り、 Target encoding (CV) で改善を試すのが定石。 47 列の sparse 行列は scipy.sparse で扱えばメモリ問題にならない。

🖼 視覚的理解 (3 図)

one-hot encoding の挙動を直感把握するため、 SSDSE-B-2026 由来の汎用図を併記する。 符号化後の特徴量空間で何が起きるかを 3 枚の図で確認する。

散布図
図1: 散布図 (符号化後特徴量の関係例)。 one-hot 列同士は互いに排他で、 任意の 2 列の同時 1 は禁止される。
ヒストグラム
図2: ヒストグラム (各カテゴリの出現頻度)。 都道府県別の頻度分布は均等とは限らず、 high cardinality + 不均衡カテゴリは過学習リスクを増やす。
箱ひげ図
図3: 箱ひげ図 (符号化前後の出力分布比較)。 整数符号化 vs one-hot で線形モデルの予測分布がどう変わるかを示す。

📝 理解度チェック

one-hot encoding を正しく扱えるか 5 問で確認。 各問の解答例は折りたたみで確認できる。

Q1: なぜ one-hot encoding が必要か

解答例

線形モデルや距離ベースのモデルでは、 カテゴリを整数 (1, 2, 3) に置き換えると順序情報を誤って導入する。 「赤=1, 青=2, 緑=3」と数値化すると「青は赤と緑の中間」のような不正な前提が入り、 回帰係数が無意味な値になる。 one-hot encoding はカテゴリを互いに直交するベクトルとして表現し、 この誤りを避ける。 結果として線形モデルがカテゴリ毎に独立した係数を学習でき、 解釈もしやすい。

Q2: dummy variable trap とは何か

解答例

k 個のカテゴリを k 個の one-hot 列で表現すると、 列同士が線形従属になり (合計 = 1)、 線形回帰でランク不足が発生する。 切片項とも完全に共線で、 係数が一意に決まらない。 これを避けるため、 1 列を drop する (k-1 個の列で表現する) のが標準。 sklearn の OneHotEncoder には drop='first' オプション、 pandas には get_dummies(..., drop_first=True) がある。 ただし正則化 (ridge/lasso) を併用する場合は drop しなくてもよい。

Q3: high cardinality の課題と対策

解答例

都道府県 (47)、 顧客 ID (100 万) などカテゴリ数が大きいと one-hot 行列が極めて疎で大きくなる。 メモリ消費、 計算コスト、 過学習リスクが課題。 対策: target encoding (カテゴリ毎に目的変数の平均で置換)、 hashing trick (固定次元にハッシュで割当)、 embedding 層 (低次元連続ベクトルで学習) など。 SSDSE-B-2026 の 47 県は中規模なので、 baseline は one-hot、 改善で target encoding (K-fold で leak 防止) が定石。

Q4: 訓練と本番で見たことないカテゴリが来たら

解答例

本番で訓練に未登場のカテゴリが来ると、 one-hot encoder が ValueError か NaN を出すのがデフォルト挙動。 sklearn では handle_unknown='ignore' で全 0 ベクトル化、 または handle_unknown='infrequent_if_exist' で「その他」カテゴリにマッピングする戦略を取る。 後者は category_encoders ライブラリでも同様の機能がある。 本番運用では未知カテゴリ対応を必ず仕様化する。

Q5: SSDSE-B-2026 で都道府県を特徴量化するときの選択

解答例

47 都道府県を一律 one-hot にすると 47 列の疎行列に。 むしろ「人口クラス 3 段階」「地域ブロック 8」のような集約カテゴリに変換すれば、 列数が削減でき過学習リスクも低い。 機械学習タスクの規模 (47 サンプル) に対して特徴量数を抑えるバランスが重要で、 一般に「サンプル数 / 10」程度を特徴量上限の目安とすると過学習を抑えられる。 ridge/lasso 正則化を併用する場合はさらに緩めてもよい。

🔎 補足: one-hot encoding を「理論・実装・代替手法・実例」4 軸で 70 観点深掘り

one-hot encoding は単純だが、 実用上は「次元爆発」「ランク欠損」「未知カテゴリ」など多くの落とし穴がある。 ここでは理論から実装、 代替手法、 SSDSE-B-2026 実例まで 70 観点で網羅する。

1. 数学的定義

カテゴリ集合 {c_1, c_2, ..., c_k} に対し、 各カテゴリ c_i を k 次元のベクトル e_i ∈ {0, 1}^k に写像し、 i 番目の成分のみ 1、 他は 0 とする。 これにより、 任意の 2 カテゴリ間のユークリッド距離は等しく √2、 内積は 0 になる。 この「等距離・直交」性が one-hot の本質で、 名義尺度の対称性を保存する。 ベクトル空間で見ると、 k 個のカテゴリは標準基底ベクトルに対応し、 k 次元単体の頂点に配置される。

2. 名前の由来

「one-hot」は電子回路の用語で、 「複数の信号線のうち 1 本だけが High (1)」という状態を指す。 機械学習では機械翻訳・ニューラルネットの黎明期 (1980 年代) に符号化方法として導入され、 現在は前処理の標準として広く使われる。 対義語として「multi-hot」(複数 1) もあり、 こちらは multi-label 問題で使われる。

3. なぜ整数符号化ではダメか

カテゴリを整数 (赤=1, 青=2, 緑=3) に置き換えると、 線形モデル・SVM・KNN 等は「青は赤の 2 倍、 緑の 1.5 倍」のような順序を学習してしまう。 これは不正なバイアス。 木ベース (決定木、 random forest, LightGBM) は分岐で扱えるが、 やはり順序がないカテゴリでは split 候補が偏り、 誤解を招く可能性がある。 順序のないカテゴリは原則 one-hot か embedding を選ぶ。

4. 順序変数 (ordinal) の場合

「小・中・大」「初級・中級・上級」のような順序のあるカテゴリは、 整数符号化 (1, 2, 3) で OK。 順序情報を活かすため、 one-hot より整数 (ordinal encoding) のほうが情報量が多い。 ただしモデルが「等間隔」を仮定する点に注意 (小→中と中→大が同じ距離) で、 等間隔でない場合は target encoding や spline 変換も検討する。

5. sklearn OneHotEncoder の使い方

scikit-learn では sklearn.preprocessing.OneHotEncoder を使う。 fit で訓練データのカテゴリ集合を学習し、 transform で新データに適用する。 デフォルトは sparse 出力。 categories 引数で明示的にカテゴリを指定すれば順序の安定性も保てる。 ColumnTransformer で他の数値列と組み合わせるのが Pipeline 設計の定石。

6. pandas get_dummies との比較

pd.get_dummies(df, columns=['pref']) は手軽だが、 訓練・テストの分離処理に向かない (テストにないカテゴリ列が消える)。 本番運用では sklearn OneHotEncoder + Pipeline の方が安全。 探索段階・EDA 段階では get_dummies、 モデリングでは OneHotEncoder と使い分けるのが推奨。

7. sparse=True/False のメモリ影響

OneHotEncoder の sparse_output=True (旧 sparse=True) は scipy.sparse 行列を返し、 大規模 high cardinality でもメモリ効率がよい。 dense (numpy array) は小規模・解釈用途。 47 県 × 47 サンプルなら dense でも 17KB 程度だが、 100 万行 × 1000 カテゴリだと dense は 8GB、 sparse なら数十 MB に収まる。

8. drop='first', drop='if_binary' オプション

線形回帰の dummy variable trap を防ぐため、 drop='first' で先頭カテゴリの列を落とす。 drop='if_binary' は二値カテゴリのみ落とす (3 値以上は落とさない)。 ridge/lasso のような正則化モデルでは drop は不要で、 むしろ落とすと解釈が片寄る場合もある。

9. handle_unknown オプション

本番で未知カテゴリを受けた際の挙動を制御。 'error' (デフォルト、 例外送出)、 'ignore' (全 0 ベクトル化)、 'infrequent_if_exist' (希少カテゴリと同じ列にマップ) の 3 種。 本番運用では原則 ignore か infrequent_if_exist にして例外で落ちないようにする。

10. infrequent_if_exist パラメータ

scikit-learn 1.1 以降の機能で、 min_frequencymax_categories で希少カテゴリを「その他」にまとめる。 high cardinality の自動圧縮に有効。 例えば SSDSE で「市町村」(1700+) を扱うとき、 上位 30 + その他 1 列の 31 列に圧縮できる。

11. category_encoders ライブラリ

contrib ライブラリ category_encoders は sklearn 互換 API で、 OneHotEncoder 以外に Target / James-Stein / WOE / Helmert / Backward Difference / Polynomial / BaseN / Binary / Hashing など多種の encoder を提供する。 競技 ML や Kaggle で広く使われる。

12. target encoding (mean encoding)

カテゴリ毎に目的変数の平均値で置き換える符号化。 例: 都道府県 → その県の平均所得。 1 列に圧縮でき、 high cardinality に強い。 ただし leak のリスクがあり、 CV ループ内で fit する必要がある。 smoothing (Bayesian average) を併用して希少カテゴリの分散を抑える。

13. K-fold target encoding (leak 防止)

target encoding を訓練全体で fit すると目的変数の情報が訓練特徴量に漏れる (leak)。 これを防ぐため K-fold で out-of-fold の平均値を使う。 sklearn の TargetEncoder (1.3+) や category_encoders の TargetEncoder は CV 対応が組み込まれている。

14. weight of evidence (WOE)

二値分類で多用される符号化。 カテゴリ毎に log(P(y=1|c) / P(y=0|c)) を計算して置き換える。 ロジスティック回帰と相性がよく、 信用リスク (クレジットスコアリング) で標準的に使われる。 情報量 (IV: Information Value) と一緒に変数選択にも使う。

15. James-Stein encoding

target encoding の改良版で、 各カテゴリの平均値を全体平均にどれだけ「縮約」するかを Bayesian に決める。 サンプル数が少ないカテゴリは全体平均に強く引かれ、 多いカテゴリはそのままに近い。 過学習耐性が高い。

16. binary encoding

カテゴリ ID をまず整数化し、 その整数を 2 進数で表現する。 k カテゴリを log2(k) 列で表現でき、 high cardinality の圧縮に有効。 ただし「列同士の意味」が二進桁になるため線形モデルでは解釈不能。 木ベースで使う。

17. hashing trick

カテゴリ名をハッシュ関数で固定次元 d (例 256) に写像し、 d 列の one-hot 風行列を作る。 fit 不要、 メモリ固定、 未知カテゴリ自動対応の三拍子で、 オンライン学習・ストリーミングに向く。 衝突 (異なるカテゴリが同じ列に入る) が発生するが、 d を大きくすれば実害は小さい。

18. backward difference encoding

順序カテゴリ向けで、 各レベルとその前レベルの差をエンコードする。 線形モデルで「隣接レベル間の効果」を直接的に解釈できる。 教育水準・収入レベルなど順序カテゴリの分析に向く。

19. helmert encoding

各レベルと「それ以前の全レベルの平均」の差をエンコードする。 分散分析 (ANOVA) で用いられる対比 (contrast) の一種。 統計学的な解釈が明確で、 学術論文で使われる。

20. polynomial encoding

順序カテゴリを多項式 (線形・2 次・3 次) の組み合わせで表現する。 ANOVA の polynomial contrast。 「線形トレンド」「曲線トレンド」を分離して効果検出できる。

21. embedding 化 (entity embedding)

深層学習で one-hot の代わりに低次元 (8-100 次元) の連続ベクトルを学習する手法。 high cardinality でもパラメータ数を抑制でき、 カテゴリ間の類似性も学習される。 Rossmann Store Sales コンペ (Kaggle 2015) で一躍有名になった。

22. fastai の TabularLearner

fastai ライブラリでは TabularLearner がカテゴリ列を自動で embedding 化する。 次元 d はヒューリスティック min(50, (n_cat+1)//2) がデフォルト。 表形式深層学習の入門に手軽。

23. PyTorch nn.Embedding 層

PyTorch では nn.Embedding(num_embeddings, embedding_dim) でカテゴリ ID → ベクトルのルックアップテーブルを学習可能。 NLP の単語埋め込みと同じ仕組みをカテゴリ変数にも適用する。

24. TensorFlow tf.feature_column.categorical_column

TensorFlow の Feature Columns API では categorical_column_with_vocabulary_listindicator_column (= one-hot)、 embedding_column でカテゴリを処理する。 TF2.x では Keras preprocessing 層 StringLookup + CategoryEncoding が後継。

25. high cardinality の扱い (再掲深掘り)

カテゴリ数 k に対して目安: k < 10 は one-hot 一択、 10-100 は one-hot か target encoding、 100-1000 は target encoding + smoothing か frequency encoding、 1000+ は embedding 化か hashing trick。 SSDSE-B-2026 の 47 県は中規模で、 baseline one-hot → target encoding (CV) → embedding と段階的に試すのが定石。

26. memory 最適化 (sparse matrix)

one-hot 行列は 99% 以上が 0 なので、 scipy.sparse.csr_matrix 形式で保持するとメモリが大幅削減できる。 sklearn の多くのモデル (LogisticRegression, LinearSVC, Ridge 等) は sparse 入力をそのまま受け付ける。 dense 化は必要時のみ。

27. 訓練・テストの不一致対応

テストで訓練に無いカテゴリが来る、 逆に訓練にあったカテゴリがテストに無い、 などの不一致は実運用で頻発。 OneHotEncoder は fit で訓練のカテゴリを記憶し、 transform 時に整合させる。 handle_unknown と categories 引数で挙動を制御。

28. cross-validation での one-hot fit のタイミング

CV の各 fold で OneHotEncoder を fit すべきか、 全体で fit すべきか。 厳密には fold ごとが正解 (leak 防止) だが、 OneHotEncoder は目的変数を見ないので全体 fit でも実害は少ない。 一方 target encoding は必ず fold ごとに fit する。

29. Pipeline で leak を防ぐ

Pipeline([('ohe', OneHotEncoder()), ('clf', LogisticRegression())]) のように構築すれば、 cross_val_score 内で自動的に fold ごとに fit_transform される。 Pipeline を使わず手動で OneHotEncode した特徴量を CV にかけると leak リスクがある (target encoding 時)。

30. 多重共線性問題

one-hot の k 列は合計が 1 になるため、 切片項と完全に線形従属。 線形回帰では (X^T X) が特異になり係数が一意に決まらない。 drop='first' で 1 列除去するか、 切片を除去 (fit_intercept=False) するか、 正則化を入れる。

31. dummy variable trap の数学的説明

k 列の one-hot + 切片項 1 列 = k+1 列だが、 ランクは k (全和=切片で表現可能)。 通常最小二乗法では (X^T X)^(-1) が存在しないため数値解が不安定。 ridge 正則化を入れると数値的に安定し、 落とさなくても解ける。 lasso なら自動的に冗長列が消える。

32. ridge/lasso 正則化との関係

ridge (L2) は dummy trap の数値安定性を保証する。 lasso (L1) は不要な one-hot 列を自動で 0 に縮約するので、 カテゴリ毎の有意性検証に近い使い方ができる。 elastic net は両者の中間で実用上バランス取りやすい。

33. 多項ロジスティック回帰での扱い

多クラス分類で目的変数も one-hot (k 個の 0/1) で表現することがある (softmax 出力との対応)。 入力カテゴリの one-hot とは別物だが、 数学的構造は同じ。 sklearn の LogisticRegression(multi_class='multinomial') で対応。

34. one-hot vs softmax

one-hot は入力の符号化、 softmax は出力の確率分布。 cross-entropy 損失で「予測 softmax 分布」と「真の one-hot ラベル」を比較する。 教師ラベルが one-hot なのは「決定的な正解」を表すため。

35. 決定木での扱い (split の効率)

決定木は単一カテゴリ列でも分岐できるが、 one-hot 化すると k 個の二値列に分かれ、 split 候補が増えて深さが増し過学習しやすい。 sklearn の DecisionTreeClassifier は内部的にカテゴリ split を行わないので、 high cardinality では木が偏る。

36. XGBoost の categorical=True

XGBoost 1.6+ では enable_categorical=True + tree_method='hist' でカテゴリ列をネイティブに扱える (one-hot 不要)。 内部で最適 split を効率的に探索。 pandas Categorical 型でカラムを渡す。

37. LightGBM の categorical_feature

LightGBM は categorical_feature=[col_name] でカテゴリ列を Fisher 法で最適 split できる。 one-hot より高速 & 高精度になることが多い。 Kaggle で多用される。

38. CatBoost の自動 target encoding

CatBoost はカテゴリ列を内部で自動 target encoding (順次 ordering scheme で leak 防止) する。 ユーザーは cat_features=[col_name] を指定するだけ。 high cardinality + leak 防止が両立する。

39. h2o.ai の auto encoding

H2O AutoML はカテゴリ列を自動で one-hot / target / enum / sort_by_response の中から選ぶ。 大規模データ分析プラットフォームの一例。

40. AutoML フレームワークでの扱い

auto-sklearn, FLAML, TPOT などの AutoML は前処理 pipeline 候補に複数の encoder を含み、 CV スコアで最適を選ぶ。 ユーザーは encoder 選定を自動化できる。

41. SSDSE-B-2026 で 47 都道府県を one-hot

SSDSE-B-2026 の 47 県 × 1 サンプルなら、 都道府県 ID を 47 列 one-hot にすると単位行列になる (各県固有の dummy)。 これは「固定効果モデル」と等価。 県別の効果を切片差で表現でき、 解釈しやすい。

42. 地域ブロック (8) に集約する戦略

47 県を「北海道・東北・関東・中部・近畿・中国・四国・九州沖縄」の 8 ブロックに集約してから one-hot すれば、 47 列 → 8 列に圧縮。 サンプル数 47 に対して特徴量数 8 なら過学習リスクが大幅減。 地域特性を活かしたい場合に有効。

43. 産業構成 (3 シェア) は連続変数

SSDSE には「第 1 次・2 次・3 次産業就業者数比率」がある。 これらは連続変数なので one-hot 不要。 むしろ合計が 100% なので多重共線性に注意 (compositional data analysis の対象、 log-ratio 変換が推奨)。

44. 多変数の one-hot

複数のカテゴリ列を one-hot すると列数が急増。 都道府県 47 + 産業 10 + 年齢階級 10 = 67 列。 ColumnTransformer で複数列をまとめて処理し、 sparse 形式で保持する。 訓練後の解釈は SHAP 等で対応。

45. 階層的カテゴリ (parent-child)

都道府県の上に「地域ブロック」、 さらに上に「国」がある階層構造。 hierarchical encoding として両方の階層を one-hot し、 細かい粒度と粗い粒度の両方を特徴量に入れる戦略がある。 Gelman の multilevel model にも通じる。

46. cyclic encoding (時刻、 曜日)

時刻 (0-23) や曜日 (0-6) を one-hot すると周期性が失われる。 代わりに sin(2πt/T), cos(2πt/T) の 2 列で encode すると周期性が保たれる。 「23時→0時」の隣接性をモデルに伝えられる。

47. ハッシュ衝突

hashing trick では異なるカテゴリが同じハッシュ値になる衝突が起きる。 確率は (1 - 1/d)^k ≈ exp(-k/d)。 d=256 列で k=100 カテゴリなら衝突率は約 1 - exp(-100/256) ≈ 32%。 衝突しても線形モデルでは合算効果として平均化される。

48. embedding の次元選択ヒューリスティック

embedding 次元 d の経験則: d = min(50, (n_cat + 1) // 2) (fastai)、 d = round(n_cat^0.25 * 6) (Jeremy Howard)、 d = ceil(log2(n_cat)) (情報理論限界)。 タスクに応じて 4-100 の範囲で試す。

49. word2vec, fastText との関係

NLP の単語埋め込み (word2vec, GloVe, fastText) は単語カテゴリ (語彙) を低次元 embedding に学習する手法で、 entity embedding の起源。 「king - man + woman ≈ queen」のような線形構造が学習される。

50. NLP での one-hot vs embedding

初期の NLP では単語を one-hot (語彙 10 万次元) で表現したが、 次元爆発と類似性損失で限界。 word2vec 以降は低次元 embedding が標準。 BERT/GPT 等の Transformer も内部に embedding 層を持つ。

51. CNN での画像のラベル one-hot

画像分類 (ImageNet 1000 クラス) の教師ラベルは 1000 次元 one-hot。 softmax + cross-entropy 損失で学習。 label smoothing で one-hot を「0.9, 0.1/999, ...」に緩和すると汎化が改善する。

52. RNN での文字 one-hot

文字レベル言語モデル (char-RNN) では文字を one-hot (アルファベット 26 次元等) で入力する。 短い語彙なら embedding 不要で one-hot で十分。 長い系列学習で RNN が文脈を捉える。

53. seq2seq での出力 one-hot

機械翻訳 seq2seq の出力は語彙次元の softmax (= 確率分布) と教師の one-hot を比較。 beam search でデコード時に各時刻で argmax (実質 one-hot) を取る。

54. softmax 出力との対応

softmax は連続な確率分布 (合計 1) で、 one-hot はその「極端な極限」(1 つだけ 1)。 学習中は softmax、 推論時は one-hot 化、 という流れが多い。

55. cross-entropy 損失と one-hot

cross-entropy H(p, q) = -Σ p_i log q_i で、 教師 p が one-hot (i=正解のみ 1) なら、 損失は -log q_correct に縮退。 「正解クラスの予測確率の対数を最大化」と等価。

56. label smoothing

one-hot ラベル (1.0, 0, 0, ...) を (0.9, 0.05, 0.05, ...) のように「滑らかに」する正則化手法。 過剰な自信を抑制し、 汎化性能が改善する。 Vision Transformer や BERT の事前学習で標準的に使われる。

57. multi-label の場合

1 サンプルが複数カテゴリに同時所属する場合 (映画ジャンル: アクション + コメディ) は multi-hot (複数 1) で表現する。 損失は binary cross-entropy をクラス毎に適用 (sigmoid 出力)。

58. 同時複数カテゴリ (multi-hot)

multi-hot は「集合のメンバーシップ」を表現する。 sklearn の MultiLabelBinarizer でリスト列から multi-hot 行列を作れる。 推薦システム (ユーザーの興味カテゴリ) で頻出。

59. interaction features

one-hot 列同士の積 (AND) を作ると相互作用特徴量になる。 「都道府県 × 産業」の組み合わせ列を作れば、 県別の産業効果を線形モデルでも捉えられる。 ただし列数が爆発 (47 × 10 = 470) するので、 lasso で選別。

60. polynomial features と組み合わせ

連続変数の多項式特徴量 (x, x^2, x^3) と one-hot を組み合わせるには PolynomialFeatures(interaction_only=True) で連続 × カテゴリの交互作用を作る。 GAM (一般化加法モデル) の発想に近い。

61. KNN/SVM での距離計算

KNN や RBF カーネル SVM は距離ベースなので one-hot が必須。 ただし one-hot 化したカテゴリ間距離は √2 で固定なので、 連続変数とのスケール差に注意。 連続変数を標準化 (StandardScaler) して揃える。

62. cosine 類似度と one-hot

one-hot ベクトル間の cosine 類似度は同じカテゴリで 1、 異カテゴリで 0 (直交)。 高次元疎ベクトル間の類似度計算で頻用される。 文書 bag-of-words モデルも本質的に multi-hot の cosine 類似度。

63. PCA との関係 (疎行列での適用)

one-hot 行列は疎なので、 通常 PCA を直接適用するとメモリ問題。 TruncatedSVD (sklearn.decomposition) を使うと sparse 行列で次元削減できる。 NLP の LSA (Latent Semantic Analysis) の発想と同じ。

64. UMAP/t-SNE の前処理

UMAP/t-SNE でカテゴリデータを可視化するには one-hot + 距離指定 (Jaccard など) を使う。 ただし疎な高次元では「次元の呪い」で距離が均一化するので、 まず embedding か PCA で次元削減してから適用するのが定石。

65. クラスタリング前の符号化選択

K-means や階層クラスタリングはユークリッド距離前提なので、 one-hot 化したカテゴリは扱いに注意 (距離が固定の √2)。 K-modes (カテゴリ専用クラスタリング) や K-prototypes (連続+カテゴリ混合) を使う選択肢もある。

66. 異常検知での扱い

Isolation Forest や LOF などの異常検知では one-hot で次元が増えると「異常スコア」が薄まる。 embedding 化や frequency encoding で次元を抑える方が異常検知に向く。 ただし autoencoder ベースは one-hot 入力でも問題ない。

67. 不均衡データでの注意点

カテゴリの出現頻度が偏ると (例: 1 県だけ 90%、 他 46 県で 10%)、 one-hot 列の分散が小さくなり線形モデルの寄与が薄れる。 SMOTE-NC でカテゴリ列を考慮した oversampling、 もしくは frequency encoding で頻度を直接特徴量化する選択肢もある。

68. fairness 視点 (sensitive attribute の符号化)

性別・人種等の sensitive attribute を one-hot で入れるとモデルが直接利用する。 fairness 制約 (Demographic Parity, Equal Opportunity) を満たすため、 sensitive 列を入れない・正則化で間接効果も抑える・post-processing で補正、 などの手法を組み合わせる。

69. 落とし穴 8 件

(a) 訓練・テストでカテゴリ集合が異なる、 (b) high cardinality で次元爆発、 (c) target encoding の leak、 (d) dummy variable trap で OLS が解けない、 (e) 連続変数とのスケール混在、 (f) sparse 出力を dense 化してメモリ枯渇、 (g) 順序カテゴリを one-hot して情報損失、 (h) embedding 次元の過剰選択。

70. まとめ・チェックリスト

(1) カテゴリ数 k は何か (10 未満→one-hot 一択、 100+ →代替検討)、 (2) 順序があるか (あれば ordinal)、 (3) 線形モデルなら dummy trap 対策、 (4) 木ベースなら native categorical サポート活用、 (5) high cardinality は target/hashing/embedding、 (6) CV で leak 防止、 (7) handle_unknown 設定、 (8) sparse 形式維持、 (9) sensitive attribute は慎重に、 (10) SSDSE では 47 県 one-hot → 地域 8 ブロック集約 → target encoding と段階的に試す。

71. one-hot とビット演算の関係

one-hot ベクトルはビット列とみなせ、 同じカテゴリかどうかの判定は XOR + popcount で高速に行える。 ハードウェア (CPU の SIMD 命令) では masks や bitset として扱われ、 高頻度検索 (e.g. データベースの bitmap index) でも実用される。 機械学習以外でも実装上の親和性が高く、 ベクトル化された距離計算ライブラリで活用される。

72. SQL での one-hot 生成

SQL では CASE WHEN col = 'A' THEN 1 ELSE 0 END AS col_A を必要列分だけ生成する。 BigQuery / Snowflake は PIVOT 構文や DECODE 関数で簡便に書ける。 DWH 上で one-hot 済みテーブルを保持しておくと、 学習側 (Python 側) では読み込むだけで済み、 ETL の負荷分散になる。 ただしカテゴリ追加時に SQL 修正が必要なため、 動的カテゴリには不向き。

73. Spark/PySpark での扱い

Spark MLlib では StringIndexer + OneHotEncoder の組み合わせで分散 one-hot 化を行う。 大規模データ (数億行) でも分散処理で扱える。 ただし fit と transform のタイミングを意識しないと結果がばらつくので、 PipelineModel で固定するのが推奨。 PySpark の最新版は OneHotEncoderEstimator が deprecated で、 OneHotEncoder に統合された。

74. Dask/Vaex での扱い

Dask は pandas 互換 API で、 dd.get_dummies が使える。 ただし計算は遅延評価なので compute() が必要。 Vaex はメモリマップ + on-the-fly evaluation で、 数十億行でも数秒で one-hot 風集計が可能。 巨大 CSV を扱う際の選択肢として有力。

75. one-hot 行列のランクと縮退

k カテゴリの完全 one-hot 行列のランクは k だが、 切片を含めるとランク欠損 (k+1 列、 ランク k)。 statsmodels の OLS は自動でこれを検出し警告を出す。 ランクの本質は「k 個のカテゴリ間の自由度 = k-1」で、 1 つは基準カテゴリとして消える。

76. R の factor 型との対応

R では factor 型でカテゴリを表現し、 lm() で自動的に dummy 化 (基準 = 最初のレベル) してくれる。 relevel() で基準カテゴリを変更可能。 Python (sklearn) は明示的に OneHotEncoder を呼ぶ必要があり、 R の方が「黒魔術的に簡便」だが学習者にはトレードオフ。

77. Julia の CategoricalArrays

Julia では CategoricalArrays.jl でカテゴリ型を扱う。 GLM.jl で線形モデルに渡せば自動 dummy 化、 MLJ.jl では OneHotEncoder モデルを Pipeline に組み込める。 R に近い親和性。

78. SAS/SPSS の DUMMY 構文

SAS は PROC GLMSELECTPROC LOGISTICCLASS 文を使うとカテゴリを自動 dummy 化。 SPSS も DUMMY 関数や RECODE で同等。 統計ソフトでは「カテゴリ列指定 → 自動 one-hot」が伝統的に標準化されている。

79. matlab dummyvar 関数

MATLAB の dummyvar 関数はカテゴリ列を one-hot 行列に変換する。 機械学習 Toolbox の fitlm, fitcsvm 等は内部で呼ぶため、 ユーザーは直接意識せずに済む。

80. データ拡張 (augmentation) との関係

カテゴリデータでは画像のような連続的拡張は難しいが、 mixup / cutmix のラベル混合は one-hot を線形補間して実現する。 (0,1,0) と (1,0,0) の中間 (0.5, 0.5, 0) を「ソフト one-hot」として作る。 NLP では SMOTE-text や paraphrase 生成が augmentation。

81. 時系列カテゴリのラグ特徴量

「先月の天気カテゴリ」を特徴量にする場合、 ラグを取って one-hot 化する。 ラグごとに k 列増えるので、 ラグ数 × カテゴリ数の組合せが膨れる。 ラグ + 集約 (頻度カウント) で次元を抑える戦略もある。

82. 異なるカテゴリ粒度の混在

「都道府県 (47)」「地域ブロック (8)」「人口クラス (3)」を同時に one-hot するとモデルが情報を冗長に持つが、 ridge 正則化で吸収可能。 階層的な情報を全て与えておく方が、 部分的な集約だけより安全な場合がある。

83. オンライン学習での one-hot 更新

SGDClassifier やオンライン Bayesian は新サンプルが来るたびに学習する。 未知カテゴリは hashing trick で固定次元に押し込むのが現実的。 オンライン target encoding は移動平均で更新する。

84. one-hot とドット積

one-hot ベクトル v と任意ベクトル w のドット積 v · w = w_i (i は v の hot 位置)。 これは「ルックアップ操作」と等価で、 embedding 層 nn.Embedding の内部実装そのもの。 計算効率上 one-hot を作らず直接 index で参照する。

85. 確率分布としての one-hot

one-hot ベクトルは離散確率分布 (1 つの値に確率 1) と解釈できる。 Dirac delta 分布の離散版。 確率分布 q から one-hot を引いた差は cross-entropy の元となり、 GAN の Wasserstein 距離でも分布間距離として登場。

86. one-hot と組合せ最適化

整数計画問題で「N 個のうち 1 個を選ぶ」制約は Σ x_i = 1, x_i ∈ {0,1} で表現でき、 これは one-hot 制約。 LP/MIP ソルバ (CPLEX, Gurobi) は one-hot 制約を効率的に扱う。 機械学習の組合せ最適化応用 (例: スケジューリング、 配車) でも頻出。

87. グラフニューラルネット (GNN) との関係

GNN ではノードの「種類」を one-hot で表現することがある (例: 化学グラフの原子種類)。 メッセージパッシングで隣接情報と結合され、 ノード特徴量として学習される。 PyTorch Geometric や DGL で扱う。

88. 強化学習 (RL) の状態表現

離散状態空間の RL (Q-learning, DQN) では状態を one-hot で表現することが多い。 状態数が爆発する場合は embedding か、 状態を関数近似する deep RL に移行する。 Atari 環境の生画像入力は CNN で連続表現に変換される。

89. 確率的 prediction との対応

分類モデルの最終出力 (softmax 確率) を argmax して one-hot に変換すると「予測ラベル」になる。 確率を保持したまま下流タスクに渡せばソフトラベルとして使え、 知識蒸留 (knowledge distillation) で teacher → student に確率分布を継承する。

90. one-hot と情報量の関係

k カテゴリの uniform 分布のエントロピーは log_2(k) bit。 one-hot ベクトル 1 つを記録するのに必要な情報は最大 log_2(k) bit で十分。 47 県なら 6 bit (= ceil(log_2(47)))。 これが binary encoding の理論的上限を示す。

91. 関連教材へのリンク (内部)

このページの関連用語セクションから、 カテゴリ変数回帰分析分類多重共線性 等の関連ページへ進むと理解が深まる。

92. 統計データ解析コンペでの実用ヒント

コンペでは「ラベルエンコーディング → LightGBM のネイティブカテゴリ機能」を最初に試し、 並行して target encoding (K-fold) で baseline を取る。 one-hot は線形モデル ensemble (stacking の input) として使う、 という分業が定石。

93. dummy trap の数値実験

sklearn.linear_model.LinearRegression は内部で SVD ベースの最小二乗法を使うため、 dummy trap 状態でも擬似逆行列で解ける (警告も出ない)。 一方 statsmodels.OLS は X^T X の逆行列計算で失敗または不安定になる。 ライブラリ実装の差異に注意。

94. one-hot とパフォーマンスベンチマーク

同じデータで「one-hot + ロジスティック回帰」「ラベルエンコーディング + LightGBM」「target encoding + XGBoost」を比較すると、 タスクによって順位が変わる。 baseline には all 3 を試し、 CV 性能で選ぶのが王道。

95. one-hot と解釈可能性

線形モデル + one-hot は「カテゴリ毎の係数 = カテゴリ効果」と直接解釈できる。 これは embedding や target encoding には無い利点。 ステークホルダー説明用には one-hot の方が好まれることが多い。

96. one-hot と feature importance

random forest の feature importance を one-hot 列ごとに集計すると、 元の categorical の重要度が分散して見えにくい。 sklearn の permutation_importance を grouped で適用するか、 元の列で集約してから importance を計算する。

97. SHAP 値での one-hot 解釈

SHAP は one-hot 列ごとに寄与を計算するが、 元のカテゴリレベルでの寄与を見たい場合は shap.utils.hclust でクラスタリングするか、 列群を「グループ」として扱う必要がある。 catboost の native categorical の場合は自動でカテゴリ単位の SHAP が出る。

98. one-hot のメモリプロファイリング

pandas DataFrame の memory_usage(deep=True) で one-hot 後のメモリ消費を確認。 dtype を uint8bool にダウンキャストすると劇的に削減 (int64 比 1/8)。 scipy sparse なら更に圧縮。

99. PyArrow / Parquet 形式での扱い

Parquet 形式は列指向 + 圧縮で one-hot 列を効率的に保存。 dictionary encoding が有効化されると、 内部的に「カテゴリ ID + 辞書」で持つため、 元のカテゴリ列のまま保存しても one-hot とほぼ同等のサイズ効率になる。 PyArrow で読み書きが標準。

100. 最終チェックリスト & 次のステップ

(A) カテゴリ数とサンプル数の比 (10 倍以上空けるのが目安)、 (B) handle_unknown 設定、 (C) Pipeline で leak 防止、 (D) sparse 形式維持、 (E) drop_first の要否、 (F) 連続変数とのスケール、 (G) 高 cardinality 対策、 (H) sensitive attribute 配慮。 次のステップ: target encoding (K-fold)、 entity embedding (PyTorch / fastai)、 木ベースの native categorical 機能 (LightGBM / CatBoost) を順に試し、 各々の CV スコアで意思決定する。

101. one-hot 行列のスパース率と効率

k カテゴリの one-hot 行列のスパース率は (k-1)/k で、 k=47 県なら約 97.9% が 0。 dense で int8 保存なら 47 バイト/行、 sparse なら 1 (列 index) + 1 (値) = 約 2 バイト/行。 100 万行で dense 47MB vs sparse 2MB、 圧倒的に sparse が有利。 一方カテゴリ数が 2-3 と少ない場合は dense の方が overhead が少ない場合もある。

102. one-hot とビット圧縮表現

1 列を 1 bit で持てば、 47 県 one-hot は 47 bit = 6 バイトに圧縮可能 (uint64 1 個に収まる)。 numpy の bitpacking や Roaring Bitmap ライブラリで実装される。 巨大データセットで RAM が足りない時の最終手段で、 機械学習ライブラリのほとんどは対応していない (前処理時のみ)。

103. one-hot encoder の永続化

OneHotEncoder を joblib.dump で保存し、 推論時に load して使うのが本番運用の標準。 訓練時のカテゴリ集合・handle_unknown 設定・drop 設定が再現される。 別環境 (Docker / Lambda) でも整合する。 cloudpickle なら lambda / 関数の参照も保存できる。

104. ONNX / Triton への変換

sklearn の OneHotEncoder は skl2onnx で ONNX 形式に変換でき、 Triton Inference Server や ONNX Runtime で本番推論できる。 言語非依存 (C++, Java, JavaScript) で動くため、 マルチクラウド対応に便利。

105. one-hot と quantization

one-hot は本質的に 0/1 なので量子化 (quantization) には強い。 int8 や bool で保存しても精度劣化なし。 一方 embedding は float32 → int8 量子化で多少劣化するため、 モバイル推論では one-hot + 線形モデルが採用される場合もある。

106. one-hot と federated learning

連合学習 (FL) ではクライアント毎にカテゴリ集合が異なる場合がある。 グローバル one-hot の合意は事前同期 (federated schema) で取る、 もしくは hashing trick で固定次元化する。 プライバシ保護目的の差分プライバシー (DP-SGD) との組み合わせも研究されている。

107. one-hot と GDPR / 個人情報保護

顧客 ID やメールアドレスを one-hot するのは「個人識別」に直結。 GDPR / 個人情報保護法上はマスキングや pseudonymization が必要。 ID を直接特徴量にせず、 集約属性 (年齢層・地域) で代用するのが推奨。

108. one-hot と reproducibility

OneHotEncoder の categories は fit 時のデータ順に依存する場合がある。 再現性のため明示的に categories=[['A','B','C']] でソート順を固定するのが推奨。 random seed と合わせて完全再現を狙う。

109. one-hot と CI/CD パイプライン

機械学習システムの CI/CD では、 訓練済み OneHotEncoder と推論コードを一体でテストする。 カテゴリ集合の差分テスト (新カテゴリ警告)、 sparse 形式テスト、 ONNX エクスポートテストを CI に含めるのが推奨。

110. SSDSE-B-2026 都道府県 one-hot サンプルコード補足

例: pd.get_dummies(df['Prefecture'], prefix='Pref') で 47 列の DataFrame が得られる。 さらに pd.concat([df, dummies], axis=1).drop('Prefecture', axis=1) で結合する。 ridge 回帰で人口を回帰すれば、 各県の固定効果を係数として取り出せる。 これは「都道府県別のベースライン人口」と解釈でき、 政策議論にも使える。

111. one-hot と機械学習の歴史

one-hot encoding は 1990 年代の NIST 手書き数字認識 (MNIST 前身) からニューラルネット教科書に登場。 1986 年 Rumelhart の backpropagation 論文でも教師ラベルは「1-of-K」表現と呼ばれ、 これが現代の one-hot の原型。 30 年以上前から本質は変わらない基本概念。

112. embedding 学習と one-hot の関係 (補足)

nn.Embedding(num=47, dim=8) は本質的に「47×8 行列」+ 「one-hot ベクトルとの積」と等価。 ただし one-hot を作らず index で直接 lookup するので計算量は O(1)。 学習中に行列のパラメータが更新され、 「県の特徴ベクトル」が自動的に作られる。

113. 落とし穴: dtype 不整合

OneHotEncoder のデフォルト出力は float64 だが、 LightGBM は int で受けたい場合がある。 .astype(np.int8) で変換するが、 sparse の場合は dtype 変換に注意 (中間で dense 化される場合あり)。

114. 落とし穴: 列名の重複

複数の categorical 列 (例: pref と region) を one-hot する際、 値が同じ (例: 「東京」が両方に含まれる) と pandas は列名衝突を起こす。 prefix 引数で必ず prefix を分ける。 sklearn の OneHotEncoder は内部的に index なのでこの問題が起きにくい。

115. 落とし穴: cross-validation での fit_transform 順序

Pipeline 外で X_oh = ohe.fit_transform(X) としてから cross_val_score(model, X_oh, y) を呼ぶと、 OneHotEncoder は CV の前に全データで fit されてしまう (テスト fold のカテゴリも見ている)。 厳密に leak を防ぐには Pipeline 内で encode する。 target encoding ほど深刻ではないが、 一貫性のため Pipeline 化が推奨。

116. one-hot の対数オッズ解釈

ロジスティック回帰で one-hot 列の係数 β は「基準カテゴリと比較した対数オッズ比」を表す。 exp(β) でオッズ比に変換でき、 「カテゴリ A は基準 B より発生確率が exp(β) 倍」と解釈する。 医療・疫学で頻用される直感的な指標。

117. one-hot とフィッシャーの正確検定の関係

2 つの二値カテゴリ列 (= 2×2 one-hot) の独立性検定はフィッシャーの正確検定や χ² 検定で行う。 これらの検定は内部的に one-hot 表現 (分割表) を前提としており、 機械学習以外でも one-hot は統計学の基本表現として登場する。

118. one-hot と OAR (one-against-rest)

多クラス分類を二値分類に分解する OvR (one-vs-rest) では、 各クラスを「該当 vs 非該当」の二値問題に変換する。 これは出力側の one-hot 化 (k 個の二値ラベル) と本質的に同じ構造。 sklearn の OneVsRestClassifier で wrap される。

119. 機械学習以外での one-hot 利用例

(1) データベースの bitmap index で大量行のフィルタリング、 (2) DNA の塩基 ACGT を 4 次元 one-hot にしてゲノム解析、 (3) 楽譜の音階 12 半音を one-hot で MIDI 解析、 (4) 化学反応式の原子種類を one-hot で材料工学解析、 など機械学習以外でも応用範囲は広い。

120. 結論: シンプル故に強い前処理

one-hot encoding は概念的に最も単純な前処理だが、 「順序の誤導入を防ぐ」「線形モデルに自然に対応する」「直交基底で対称性を保つ」という強力な利点を持つ。 一方で次元爆発・dummy trap・leak・未知カテゴリといった落とし穴も多く、 適切なオプション選択と Pipeline 設計が必須。 SSDSE-B-2026 のような中規模データでは baseline として真っ先に試す価値があり、 そこから target encoding / embedding / 木ベースの native categorical へとステップアップしていくのが現代的な前処理戦略である。

121. one-hot と特徴量選択 (feature selection)

one-hot 化後の k 列のうち、 ターゲットと無関係なカテゴリ列を捨てるのが特徴量選択。 sklearn の SelectKBestRFECV を使うか、 lasso の L1 正則化で自動的に係数 0 にする。 ただしカテゴリ単位ではなく列単位の選択になるので、 同じ元カテゴリの一部だけ残ると解釈が難しい。 グループ lasso (Group Lasso) で「カテゴリ列群」を一括選択するのが理論的に正しい。

122. グループ Lasso と sparse-group Lasso

グループ Lasso は変数群 (例: 都道府県 one-hot 列群) 全体を 0 にするか残すかを選ぶ正則化。 sparse-group Lasso はさらに群内でも sparse を促す。 多項回帰の変数選択で「カテゴリ全体の有意性」を判定するのに使われる。 R の grpreg パッケージや Python の group-lasso ライブラリで実装される。

123. one-hot と多重比較問題

k カテゴリの効果の有意性を一度に検定すると多重比較問題が発生 (有意 p < 0.05 が偶然出る確率が増える)。 Bonferroni 補正 (p_corrected = p × k) や FDR (False Discovery Rate, Benjamini-Hochberg) で補正する。 ANOVA + Tukey HSD で post-hoc 検定するのも標準的。

124. one-hot のメタ情報の保存

本番運用では「どの列がどのカテゴリに対応するか」のメタ情報 (column-to-category mapping) を必ず保存する。 sklearn OneHotEncoder の get_feature_names_out() で取得可能。 JSON や YAML で並列保存し、 ONNX エクスポート時にも添付する。

125. データドリフト検知

本番運用中に「カテゴリ分布が訓練時と変わる」(category drift) を検知する仕組みが必要。 PSI (Population Stability Index) や χ² 検定で各カテゴリの頻度比を監視する。 ドリフト検知後は再訓練 or fine-tuning のトリガーになる。

126. one-hot と説明可能性 (XAI) の現代的潮流

XAI ツール (LIME, SHAP, captum) は one-hot 列の寄与を個別に計算するため、 結果が「カテゴリ A は +0.3、 B は -0.1」のような出力になる。 業務担当者向けには「カテゴリ単位」「特徴量単位」の集約解釈が好まれ、 SHAP の hierarchical aggregation が活用される。

127. AutoML 系での自動選択

auto-sklearn 2.0 は前処理候補に OneHotEncoder / OrdinalEncoder / TargetEncoder / hashing を含み、 HpBandSter で最適選択。 H2O Driverless AI、 DataRobot、 Google AutoML Tables なども同様に自動選択する。 ユーザーは encoder 選定の手間が省ける一方、 内部選定理由がブラックボックスになるトレードオフ。

128. PyCaret での one-hot

PyCaret は setup() 時に categorical_features を指定すると自動 one-hot 化。 encoding_method パラメータで target / ordinal / binary なども選べる。 探索的解析の初動として手軽。

129. MLflow でのトラッキング

MLflow Experiments で one-hot のカテゴリリストを mlflow.log_param('categories', categories_list) として記録すれば、 後から experiment 比較時に「どの実験がどのカテゴリ集合で学習したか」を追える。 再現性とガバナンスの基本。

130. 終わりに: 実務での使い分けまとめ

(1) 探索 EDA: pd.get_dummies で即試す。 (2) baseline モデル: sklearn OneHotEncoder + LogisticRegression / Ridge。 (3) 高 cardinality: target encoding (K-fold) or LightGBM native categorical。 (4) 深層学習: nn.Embedding。 (5) 本番運用: Pipeline + handle_unknown + sparse + メタ情報保存。 これらを段階的に使い分けることで、 単純な one-hot から始まる前処理が実用システムへと進化していく。

131. one-hot encoder の単体テスト設計

本番品質を保つには OneHotEncoder の単体テストが不可欠。 (a) 訓練データのカテゴリ集合が transform で完全再現されるか、 (b) handle_unknown='ignore' で未知カテゴリが全 0 になるか、 (c) sparse 出力の shape が (n_samples, n_categories) と一致するか、 (d) drop='first' で 1 列減るか、 を pytest で網羅的に検証する。 CI で毎コミット走らせることで本番事故を未然に防ぐ。

132. 監査ログとガバナンス観点

金融・医療領域では予測モデルの監査ログが法令上必須。 入力カテゴリ・one-hot 変換結果・モデル予測の三点セットを保存し、 後から「なぜこの予測になったか」を再現できるようにする。 個人情報を含む列は暗号化保存し、 アクセス権限を厳格管理する。

133. one-hot と A/B テストの関係

A/B テストでは「処理群 / 対照群」の二値変数を作るが、 これは 2 値の one-hot と同じ。 回帰モデルに投入すれば処理効果 (Average Treatment Effect, ATE) が係数として推定できる。 多群試験 (A/B/C/D) なら 4 カテゴリ one-hot で群効果を同時推定。

134. one-hot と因果推論

因果推論では交絡変数 (confounder) を全て one-hot で投入してコントロールするのが標準。 マッチング法 (propensity score matching) でも one-hot された共変量空間でマッチを取る。 do-calculus / DAG の文脈でカテゴリ介入を表現する基本表現。

135. one-hot の最終総括

one-hot encoding は「カテゴリ → 直交ベクトル」というシンプルな変換でありながら、 機械学習・統計・因果推論・データベース・組合せ最適化など広範な分野で基本表現として使われる。 SSDSE-B-2026 のような実データで都道府県を扱う場合、 まず one-hot で baseline を作り、 徐々に target encoding / embedding / native categorical へ進化させていく学習パスが推奨される。 概念の単純さと応用の豊かさを兼ね備えた、 統計データ解析の必須技能である。

🧮 数式に値を入れて手で計算する: one-hot 変換

合成 [赤, 青, 緑, 赤, 黄] を one-hot に変換する。

Step 1: カテゴリ

unique = {赤, 青, 緑, 黄} (4 種類)

Step 2: 行列

i
11000
20100
30010
41000
50001

🐍 Python で再現

1
2
3
import pandas as pd
s = pd.Series(['赤','青','緑','赤','黄'])
print(pd.get_dummies(s, dtype=int))

📤 実行結果

緑 赤 青 黄 0 0 1 0 0 1 0 0 1 0 2 1 0 0 0 3 0 1 0 0 4 0 0 0 1

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

🌳 手法選択フロー

「One-Hot Encoding」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. 後段のモデルは何か
    線形回帰・ロジスティック回帰・距離を使う手法(k-means, kNN)なら One-Hot が要る。 LightGBM や CatBoost はカテゴリを直接扱えるので、 One-Hot にするとかえって分割が非効率になる。
  2. 水準はいくつあるか
    数個〜数十なら素直に One-Hot。 数千(ユーザ ID など)になると列数が爆発するので、 頻度の低い水準を「その他」にまとめるか、 Target Encoding や埋め込みに切り替える。
  3. 切片を含む線形モデルか
    含むなら K 列すべてを入れると完全な線形従属が生じ、 解が一意に決まらない。 drop_first=True で 1 列落とし、 落とした水準を基準として読む。
  4. 本番で新しい水準が出るか
    市区町村の合併や新商品の追加で普通に起きる。 handle_unknown='ignore' を指定し、 学習時の列構成を保存して本番でも同じ変換を適用する。

One-Hot は「順序の無いカテゴリを数値にする」道具。 順序があるもの(小・中・大)に使うと順序の情報が失われるので、 その場合は順序尺度として数値を割り当てる。

🔗 隣接手法への橋渡し

「One-Hot エンコーディング」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。

この上流・並列・下流の対応を地図化することで、 「One-Hot エンコーディング」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。

🗺 概念マップ

One-Hot エンコーディングを中心に、 上位概念 (カテゴリ変数前処理)、 並列手法 (ラベル/ターゲット/頻度エンコーディング・埋め込み)、 派生 (drop_first で多重共線性回避・ハッシュトリック)、 前段 (カテゴリ正規化・欠損カテゴリ「不明」追加)、 後段 (線形回帰・ロジスティック回帰・ニューラルネット)、 応用 (47 都道府県ダミー・月名 12 列の季節ダミー) を放射状に配置する概念マップ。

one-hot encoding を中心に、 関連するカテゴリ変数エンコード手法を放射状に配置した。 中央のノードから伸びる枝は、 (a) 上位概念としてのカテゴリ変数前処理(特徴量エンジニアリング)、 (b) 並列手法(ラベルエンコーディング、 順序エンコーディング、 ターゲットエンコーディング、 頻度エンコーディング)、 (c) 派生・拡張(drop_first で多重共線性回避、 ハッシュトリックで高基数対応、 エンベディングで低次元表現)、 (d) 前段(カテゴリ値の正規化・欠損カテゴリ「不明」追加・学習/テストで未知カテゴリ検出)、 (e) 後段(線形回帰・ロジスティック回帰・ニューラルネット等の数値入力モデル)、 (f) 応用領域(47 都道府県を 47 列にする地域ダミー、 月名 12 列の季節ダミー、 業種分類 100 列)を示す。

SSDSE-B-2026 で「出生数(A4101)~ 総人口(A1101)+ 地域ダミー」を OLS で推定する場合、 47 県のうち 1 県(drop_first=True で基準カテゴリ)を除いた 46 列のダミーを作る。 これで各県の係数 = 基準県との差として直接解釈できる。 単に「列を 0/1 にする」のではなく、 「カテゴリの基準・順序・基数を設計する」視点が実務で問われる。

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

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

One-Hot Encodingカテゴリ変数ダミー変数特徴量前処理pandas.get_dummiessklearn多重共線性基準カテゴリスパース

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

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

あなたは、特徴量エンジニアリング の入口で「One-Hot Encoding(One-Hot Encoding)」という用語に出会ったところです。 この用語は カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。

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

SSDSE-B-2026 補足:SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。

🎨 直感で掴む(R18)── One-Hot Encoding を絵で理解

One-Hot Encoding の本質は、ひとことで言うと「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」です。 数式に踏み込む前に、まずイメージで掴みましょう。

ヒント:カテゴリ数 (cardinality) が大きいと One-Hot で列が爆発するため、 高基数カテゴリ (1000+ ユニーク値) では ターゲットエンコーディングハッシュトリック埋め込み (embedding) を検討する。 SSDSE のような 47 県程度なら One-Hot で十分。

📐 数式または定義(R18)── One-Hot Encoding を形式化する

One-Hot Encoding を一般化して書くと、観測ペア $(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$ はモデルでは説明しきれない誤差項。 One-Hot Encoding の流派ごとに、$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$ 値で『どれくらい確信できるか』を必ず併走させる」

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

🧮 実値で計算してみる(R18)── SSDSE-B-2026 で One-Hot Encoding

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

▼ コード解説(SSDSE-B-2026 から Prefecture を読む)
🎯 解説: 47 都道府県 × 1 年分(2023)を抽出し、One-Hot Encoding の代表値(平均・中央値・標準偏差・最大/最小)を一気に確認する。
📥 入力例: data/raw/SSDSE-B-2026.csv(cp932, ヘッダ 2 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd

# df2023 はこのあとのブロックで作っているので、ここでも用意しておく
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)

# One-Hot 化するカテゴリ(Prefecture)の背景として、数値列 A1101(総人口)の代表値を確認
col = 'A1101'  # 総人口(数値列)
s = df2023[col].astype(float)

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('Top 3 prefs  :')
print(df2023.nlargest(3, col)[['Prefecture', col]])

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

🐍 Python 実装(R18)── One-Hot Encoding のミニ完全版

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
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# SSDSE-B-2026 を読み込み(47 都道府県名)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 2023 年度(最新)だけ抽出
df2023 = df[df['SSDSE-B-2026'] == 2023].copy()
print(df2023.shape)         # (47, ...)
print(df2023[['Code', 'Prefecture']].head())

② 集計と可視化

▼ コード解説(matplotlib で 47 都道府県の棒グラフ)
🎯 解説: sort_values + plot.bar で降順可視化。 都道府県名は x ラベル、 縦軸が総人口 (A1101)。
📥 入力例: 2023 年, 47 都道府県, 47 都道府県名
# One-Hot Encoding を 47 都道府県でビジュアル化
fig, ax = plt.subplots(figsize=(9, 6))
df2023.sort_values(col, ascending=False).plot.bar(
    x='Prefecture', y=col, ax=ax, color='#00897B', legend=False)
ax.set_title('47 都道府県の総人口(SSDSE-B-2026, 2023)')
ax.set_ylabel(col)
ax.set_xlabel('都道府県')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig('figures/one-hot-encoding.html_r18_bar.png', dpi=120)
plt.show()

③ 報告用テンプレ

レポート文例:「SSDSE-B-2026(2023 年度, n=47)に基づいて One-Hot Encoding を確認したところ、平均は X、標準偏差は Y、上位 3 県は東京・神奈川・大阪であった。 SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。」

⚠️ 落とし穴(R18)── One-Hot Encoding で踏みやすい 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 度言うこと。 これで One-Hot Encoding の現場運用は十分に回ります。

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

Q1. One-Hot Encoding は機械学習でも使う?

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

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. One-Hot Encoding を最短で身につけるには?

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

Q6. One-Hot Encoding に関する代表的な論文は?

本リポジトリの 論文一覧 から「特徴量エンジニアリング」カテゴリの論文を見ると、One-Hot Encoding を実際に使った再現コードが付いています。

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

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

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

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

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

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

🧪 ミニケース(R18)── One-Hot Encoding を 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 段でも飛ばすと、結論が「数字だけ」になり、読者の腑に落ちなくなります。 One-Hot Encoding は「数字 + 物語」のセットで完成です。

🚫 アンチパターン集(R18)── One-Hot Encoding で「やってはいけない」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 を「因果の強さ」と書く(One-Hot Encoding で因果は出ない)
  9. レポートの最後で「以上」と書いて閉じる(必ず「限界」と「次の一手」を 1 行ずつ)

🔎 深掘り解説(R18)── One-Hot Encoding を 30 分で 1 段深く

A. 歴史的背景

One-Hot Encoding は、19 世紀末〜 20 世紀初頭の統計学黎明期から発達してきました。特徴量エンジニアリング の中核として、Galton、Pearson、Fisher、Yule などが基礎を築き、現代では SSDSE のような公的データを使った教育素材で広く扱われています。

B. 数理的位置づけ

One-Hot Encoding は、観測ペア $(x_i, y_i)_{i=1}^{n}$ から条件付き期待値 $E[y \mid x]$ または分布 $P(y \mid x)$ を推定する道具です。 線形・非線形・パラメトリック・ノンパラメトリックという 4 つの軸の中で、One-Hot Encoding は「特徴量エンジニアリング」という棚に並んでいます。

C. 実装上の工夫

D. 学問体系の位置

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

🎙 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)(総人口。カテゴリ列 Prefecture は代表値計算の対象外)
📤 出力例: 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/one-hot-encoding.html_r18_bar.png)
▼ コード解説(④ 関係を測る)
🎯 解説: 2 変量の関係は scipy.stats.pearsonr または df.corr() で測る。 r と p-value を同時に得る。
📥 入力例: df2023[[X, Y]](X=A1101 総人口 など数値列)
📤 出力例: r = 0.9910, p = 6.3e-41(総人口と 65 歳以上人口、2023 年 47 都道府県)
▼ コード解説(⑤ 報告)
🎯 解説: 「目的→データ→One-Hot Encoding→結果→限界→次」の 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)

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

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

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

👣 ステップバイステップ(R18)── One-Hot Encoding を 10 行で実装する

解説は最小限。コードは 10 行以内。これで One-Hot Encoding の最短ルートが手に入ります。

  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 = 'A1101' # 総人口(数値列)
  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/one-hot-encoding.html_r18_hist.png', dpi=120)
  10. plt.show()

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

📖 さらに学ぶには(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 本を完走。再現コードを動かして、One-Hot Encoding の応用範囲を体感する。

📝 報告フォーマット(R18)── One-Hot Encoding を 200 字で書く

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

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

「本研究では、SSDSE-B-2026(n=47, 2023 年度)を用いて One-Hot Encoding を確認した。 主たる説明変数は Prefecture(47 都道府県名)であり、47 都道府県を対象とした分布の確認、相関の評価、One-Hot Encoding を用いた分析を実施した。 分析の結果、上位 3 県・下位 3 県の特徴と、SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。」

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

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

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

「皆さん、One-Hot Encoding はひとことで言うと『カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。』です。 今回は SSDSE-B-2026(総務省統計局, 47 都道府県, 2023 年度)を使って、実際の数字でこの考え方を確かめました。 皆さん自身でも、別の指標(人口、出生率、家計支出など)に置き換えて同じ手順を試してみてください。」

🔭 3 つの視点で One-Hot Encoding を見る(R18)

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

視点 ① 統計学者の目

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

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

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

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

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

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

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

One-Hot Encoding と似た用語を、使い分けの観点から並べます。違いを言語化できれば、迷いが減ります。

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

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

Q1. One-Hot Encoding と「特徴量エンジニアリング」全体の関係は?

One-Hot Encoding は 特徴量エンジニアリング の中で「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」を担う基本道具です。特徴量エンジニアリング の他のトピックは、この基本の応用または並列の道具にあたります。

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

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

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

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

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

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

Q5. One-Hot Encoding で AI(機械学習)に進めますか?

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

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

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

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

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

Q8. One-Hot Encoding を勉強する優先順位は?

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

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

用語One-Hot Encoding(One-Hot Encoding)
カテゴリ特徴量エンジニアリング
ひとこと定義カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。
SSDSE-B での使い方SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。
主な道具pandas / matplotlib / scipy / statsmodels / scikit-learn
最大の注意n=47 の小標本・単位混在・因果と相関の混同
学習ステップ読む → 集計 → 描く → 検定 → 報告
代表的な関連用語相関係数・回帰分析・ヒストグラム・散布図・標準偏差

このカードを印刷し、SSDSE-B-2026 で 1 回手を動かせば、用語の「使える形」が定着します。 One-Hot Encoding はあくまで「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」というシンプルな考え方の道具ですので、迷ったらこの 1 行に戻ってください。

🎮 触って理解する

カテゴリ変数(例では 血液型)を追加・選択すると、 その値が One-Hot ベクトル(該当列だけ 1、 ほかは 0)へ変換される様子を 表と数値でリアルタイム に確認できます。 ラベルエンコーディング(整数化)との違い、 drop_first(ダミー変数トラップ回避)、 カテゴリ数を増やしたときの 次元の呪い も体感してください。

① カテゴリ(列)を編集
(各チップの ✕ で削除)
💡 ラベルエンコーディングとの違い:ラベル列(整数)は「A=0, B=1, O=2, AB=3」のように大小関係を勝手に作ってしまい、 線形モデルは「AB は A の 3 倍」という誤ったパターンを学習します。 One-Hot なら各カテゴリが互いに直交し、 順序の誤解が起きません(任意の 2 カテゴリ間の距離は常に等しく √2)。
② 次元の呪いを体感:ハンドルをドラッグ(タッチ可)

カテゴリ数 k を動かすと、 1 サンプルの One-Hot ベクトルの「列数」がそのまま伸びます。 ラベルエンコーディングは常に 1 列であることと比べてください。

k=4 One-Hot ベクトル(1 サンプル分・ハイライト=1):
🧭 直感:カテゴリを「数値ベクトル」に
One-Hot は「どのカテゴリか」を、 該当する位置だけ 1 が立った旗(one hot = 1 本だけ High の信号線)で表します。 k 個のカテゴリは k 次元空間の標準基底ベクトル(単位ベクトル)に対応し、 すべて互いに直交・等距離。 これで名義尺度(順序のないカテゴリ)の対称性がそのまま保存されます。
⚠️ よくある落とし穴:次元爆発と多重共線性
高カーディナリティ(カテゴリ数が多い)だと列が爆発します。 顧客 ID 100 万種なら 100 万列の疎行列に。 メモリ・計算コスト・過学習が跳ね上がるので、 scipy.sparse や min_frequency で圧縮します。 もう一つは多重共線性:k 列の合計は必ず 1 なので切片項と完全に線形従属になり、 線形回帰では係数が一意に決まりません(ダミー変数トラップ)。 上のチェックボックスで drop_first を on にして 1 列落とすと解消します(正則化を使う場合は落とさなくても可)。
🚀 発展:ダミー変数・ターゲット/埋め込みエンコーディング
ダミー変数は One-Hot の経済学・統計学での呼称(drop_first=True が標準)。 ターゲットエンコーディングはカテゴリを「そのカテゴリでの目的変数の平均」に置き換え 1 列に圧縮する手法で、 高カーディナリティに強い一方、 リーク防止に K-fold が必須。 埋め込み(embedding)エンコーディングは深層学習で低次元の連続ベクトルを学習し、 カテゴリ間の類似性まで捉えます。 目安:k<10 は One-Hot 一択、 10〜100 は One-Hot か Target、 100〜1000 は Target、 1000+ は embedding/hashing。 SSDSE-B-2026 の 47 都道府県は「10〜100」の中規模帯です。

関連用語: カテゴリ変数ダミー変数多重共線性埋め込み表現特徴量エンジニアリング / ラベルエンコーディング ・ ターゲットエンコーディング ・ 次元の呪い(本ページ内で解説)

🧭 解説を深める — 幾何・尺度・カテゴリ安定性から見る One-Hot

既存セクションは drop_first・多重共線性・高カーディナリティ・未知カテゴリを丁寧に扱っている。ここでは重複を避け、「距離の幾何」「尺度変換(標準化)との相性」「カテゴリ集合の安定性」という別角度から、実測値のみで補強する。

🎨 直感 — One-Hot は「単位行列」であり、全カテゴリを等距離に置く

SSDSE-B-2026 の 2023 年 47 都道府県を One-Hot 化すると、行列の形はきれいな 47 × 47 の単位行列(対角だけが 1、他は 0)になる(実測 shape = (47, 47))。ここから One-Hot の本質が 2 つ見える。

⚠️ 落とし穴(重要) — 「標準化」と「正則化 × drop_first」

① One-Hot 列を StandardScaler にかけてはいけない
数値列と一緒に前処理パイプへ流し込むと、うっかり One-Hot 列まで標準化されがち。だが 47 県 1 年分では各 One-Hot 列は「1 が 1 個、0 が 46 個」で 平均 0.0213・標準偏差 0.144(実測)。標準化するとその唯一の 1 は +6.78、残りの 0 は -0.147(実測計算値)という極端に非対称な値に化ける。0/1 の意味は壊れ、希少カテゴリほど巨大な値を持つ「外れ値列」になる。距離ベース手法(KNN・k-means)や勾配法では特に有害。→ 数値列だけスケーリングし、One-Hot 列は素通しにする(ColumnTransformer で列を分ける)。
② 正則化(Ridge/Lasso)を使うなら drop_first はむしろ避ける
「線形モデル=必ず drop_first」は無正則化のときの話。Ridge/Lasso は係数そのものに罰則をかけるので多重共線性は自動的に解消され、drop は不要。むしろ drop すると基準カテゴリだけ罰則の外に置かれ、どの県を落としたかで係数の解釈と縮小のされ方が変わる(結果が「たまたま先頭になった三重県」に依存する)。正則化ありなら全 47 列を残す方が対称で素直。既存ページの「正則化を併用する場合は drop しなくてよい」という一文の中身がこれ。

🚀 発展 — 「カテゴリ集合が動くか」を必ず疑う

SSDSE-B-2026 は 2012〜2023 の全 12 年で県集合が完全一致(実測:各年の県集合を比較して all identical = True。総行数 564 = 47 県 × 12 年)。つまり handle_unknown='ignore'一度も発火しない「行儀の良すぎる」データ。だが実務の店舗 ID・商品 ID・郵便番号は毎月のように新カテゴリが増える。教材データで身についた「未知カテゴリは起きない」という感覚は本番で崩れるので、次の 2 点を癖にしておく。

🔗 関連ページ

数値出典:data/raw/SSDSE-B-2026.csvpd.read_csv(encoding='cp932', skiprows=[1]))。実測 = 実際に集計した値/理論値 = 定義から一意に定まる数学的値。合成デモは行っていない。