カテゴリ変数 ── カテゴリ値を取る変数(質的変数の一種)
質問紙、 アンケート、 顧客属性、 商品分類など、 実データはカテゴリだらけ。 正しく数値化しないと機械学習モデルが動きません。
3種類の量的データ vs カテゴリ変数:
| 尺度 | 例 | 大小比較 | 差の計算 |
|---|---|---|---|
| 名義 | 血液型, 性別 | × | × |
| 順序 | 満足度1-5 | ○ | × |
| 間隔 | 温度(℃) | ○ | ○(比は×) |
| 比例 | 身長, 所得 | ○ | ○ |
OneHotエンコーディング(K個のカテゴリ → K個の0/1列):
回帰では K-1個 に減らす(ダミー変数の罠回避)。 sklearn なら drop='first'。
都道府県(47カテゴリ)の扱い方:
状況により使い分け。 高次元すぎる場合は次元削減か集約を検討。
最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) # pandas での OneHot(基準1列削除) dummies = pd.get_dummies(df['地域'], drop_first=True, prefix='region') df2 = pd.concat([df.drop('地域', axis=1), dummies], axis=1) # sklearn 版 from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder(drop='first', sparse_output=False) encoded = enc.fit_transform(df[['地域']]) print(encoded[:3]) |
| 状況 | 推奨 |
|---|---|
| 順序なし、 少数カテゴリ(<10) | OneHot |
| 順序あり | Label Encoding(整数) |
| 多数カテゴリ(10〜100) | Target / Frequency Encoding |
| 高カーディナリティ(>1000) | Embedding(深層学習) |
| 木モデル全般 | OneHotなしでもOK(CatBoost等) |
| 線形モデル | OneHot必須(drop_first=True) |
| 状況 | 推奨 |
|---|---|
| 順序なし、 少数カテゴリ(<10) | OneHot |
| 順序あり | Label Encoding(整数) |
| 多数カテゴリ(10〜100) | Target / Frequency Encoding |
| 高カーディナリティ(>1000) | Embedding(深層学習) |
| 木モデル全般 | OneHotなしでもOK(CatBoost等) |
| 線形モデル | OneHot必須(drop_first=True) |