データ分析や機械学習のプロジェクトにおいて、カテゴリ変数の扱いは非常に重要なプロセスです。
機械学習アルゴリズムの多くは数値を前提として設計されているため、テキスト形式のデータをそのままモデルに投入することはできません。
そこで活用されるのが、カテゴリ変数を「0」と「1」のフラグ形式に変換するダミー変数化という手法です。
Pythonのデータ分析ライブラリであるPandasには、この変換を簡潔に行うためのget_dummies関数が用意されています。
本記事では、get_dummiesの基本的な使い方から、実務で直面する課題を解決するための高度なテクニックまでを詳しく解説します。
Pandasのget_dummies関数とは
get_dummiesは、Pandasライブラリが提供する、カテゴリデータをワンホット・エンコーディング(One-Hot Encoding)するための関数です。
この関数を使用すると、特定の列に含まれるユニークな値ごとに新しい列が作成されます。
新しい列には、元の行がそのカテゴリに該当する場合に「1」が、該当しない場合に「0」が格納されます。
例えば、「色」という列に「赤」「青」という値がある場合、この関数を適用すると「色_赤」と「色_青」という2つの列が生成されます。
データサイエンスの実務において、カテゴリ変数を数値化する最も一般的な手法の一つとして広く利用されています。
get_dummiesの基本的な使い方
まずは、最もシンプルなデータフレームに対してget_dummiesを適用する例を見てみましょう。
Pandasをインポートし、カテゴリデータを含む簡単なデータフレームを作成して変換を実行します。
import pandas as pd
# サンプルデータの作成
df = pd.DataFrame({
'ID': [1, 2, 3],
'Gender': ['Male', 'Female', 'Female'],
'Access': ['Mobile', 'Desktop', 'Mobile']
})
# ダミー変数化の実行
df_dummies = pd.get_dummies(df)
print(df_dummies)
ID Gender_Female Gender_Male Access_Desktop Access_Mobile
0 1 0 1 0 1
1 2 1 0 1 0
2 3 1 0 0 1
このように、元の文字列データが「列名_カテゴリ名」という形式の新しい列に変換されていることがわかります。
デフォルトでは、数値型の列(この例ではID)は変換されず、オブジェクト型やカテゴリ型の列のみが対象となります。
実務で役立つ主要なパラメータ
get_dummies関数には、変換処理を細かく制御するための便利なパラメータが複数用意されています。
実務で頻繁に使用される設定について、一つずつ確認していきましょう。
特定の列のみを変換する:columns
データフレーム全体を変換するのではなく、特定の列だけをダミー変数化したい場合はcolumns引数を使用します。
この引数にリスト形式で列名を指定することで、必要な項目のみを効率的に処理できます。
# Gender列のみをダミー変数化する
df_selected = pd.get_dummies(df, columns=['Gender'])
print(df_selected)
ID Access Gender_Female Gender_Male
0 1 Mobile 0 1
1 2 Desktop 1 0
2 3 Mobile 1 0
この方法を用いると、変換対象外の列はそのままの状態で維持されるため、データ管理が容易になります。
接頭辞をカスタマイズする:prefixとprefix_sep
デフォルトでは「元の列名_カテゴリ値」という命名規則が適用されますが、これを変更することも可能です。
prefix引数に文字列を指定すると、生成されるすべての列名に独自の接頭辞を付与できます。
また、prefix_sepを使えば、列名とカテゴリ値を繋ぐ記号(アンダースコアなど)を変更できます。
# 接頭辞を'Cat'、区切り文字を':'に設定
df_prefix = pd.get_dummies(df, columns=['Gender'], prefix='Cat', prefix_sep=':')
print(df_prefix)
ID Access Cat:Female Cat:Male
0 1 Mobile 0 1
1 2 Desktop 1 0
2 3 Mobile 1 0
多重共線性を防ぐ:drop_first
統計学的なモデル(特に重回帰分析など)では、ダミー変数同士の相関が強すぎることで発生する「多重共線性」という問題に注意が必要です。
例えば、「男性」か「女性」かの2択であれば、一方が「0」なら必然的にもう一方は「1」であることが決まります。
このような冗長な情報を削除するために、drop_first=Trueを設定します。
# 最初のカテゴリ列を削除してダミー変数化
df_drop = pd.get_dummies(df, columns=['Gender'], drop_first=True)
print(df_drop)
ID Access Gender_Male
0 1 Mobile 1
1 2 Desktop 0
2 3 Mobile 0
このパラメータを適用することで、k個のカテゴリに対してk-1個の列を生成し、モデルの不安定化を防ぐことができます。
欠損値(NaN)の扱いと対策
実データには欠損値が含まれていることが多々ありますが、get_dummiesはデフォルトで欠損値を無視します。
つまり、どのカテゴリにも属さない行はすべて「0」として表現されます。
しかし、欠損値自体を一つの情報として扱いたい場合は、dummy_na=Trueを指定します。
import numpy as np
# 欠損値を含むデータの作成
df_nan = pd.DataFrame({'Color': ['Red', 'Blue', np.nan]})
# 欠損値もダミー変数として扱う
df_with_nan = pd.get_dummies(df_nan, dummy_na=True)
print(df_with_nan)
Color_Blue Color_Red Color_nan
0 0 1 0
1 1 0 0
2 0 0 1
このように、「Color_nan」という列が作成され、欠損があった行に「1」が立つようになります。
データ型の指定:dtypeによる最適化
近年のPandasのバージョンでは、get_dummiesの結果として出力されるデータ型を明示的に指定できるようになりました。
デフォルトでは多くの環境でuint8(符号なし8ビット整数)やbool型が採用されますが、モデルによってはintやfloatが望ましい場合があります。
メモリ消費量を抑えたい場合や、特定の機械学習ライブラリとの互換性を保ちたい場合に有効です。
# 出力される型をfloatに指定
df_float = pd.get_dummies(df, columns=['Gender'], dtype=float)
print(df_float.dtypes)
ID int64
Access object
Gender_Female float64
Gender_Male float64
dtype: object
実務における高度なテクニック:学習データとテストデータの不一致解決
機械学習の運用においてよく発生するのが、「学習データにはあるが、テストデータには存在しないカテゴリ」の問題です。
単純にそれぞれに対してget_dummiesを適用すると、生成される列の数や順番が異なってしまい、モデルがエラーを起こします。
この問題を回避するためには、事前にカテゴリ型(CategoricalDtype)を定義しておく方法が推奨されます。
from pandas.api.types import CategoricalDtype
# 全ての想定されるカテゴリを定義
cat_type = CategoricalDtype(categories=['Red', 'Blue', 'Green'], ordered=False)
# データの準備(Greenが含まれていない)
df_train = pd.DataFrame({'Color': ['Red', 'Blue']})
# カテゴリ型を適用してからダミー変数化
df_train['Color'] = df_train['Color'].astype(cat_type)
df_dummies_final = pd.get_dummies(df_train)
print(df_dummies_final)
Color_Red Color_Blue Color_Green
0 1 0 0
1 0 1 0
この手法を用いることで、データ内に存在しない「Green」の列も値が「0」の状態で作成され、列構成の一貫性を保つことが可能です。
get_dummiesとScikit-learnのOneHotEncoderの使い分け
Pandasのget_dummiesは非常に便利ですが、Scikit-learnのOneHotEncoderとの使い分けに迷う方も多いでしょう。
それぞれの特徴を理解し、状況に合わせて最適なツールを選択することが重要です。
| 特徴 | Pandas get_dummies | Scikit-learn OneHotEncoder |
|---|---|---|
| 主な用途 | データ探索・簡易的な前処理 | 機械学習パイプラインへの組み込み |
| 出力形式 | DataFrame(列名が保持される) | NumPy配列またはSparse行列 |
| 学習・適用 | 一括変換のみ | fit / transformによる分離が可能 |
| メモリ効率 | 比較的高い | 疎行列(Sparse)対応で非常に高い |
探索的なデータ分析(EDA)の段階では、結果が直感的にわかりやすいPandasのget_dummiesが最適です。
一方で、本格的なパイプラインを構築し、モデルをデプロイする場合は、状態を保持できるScikit-learnのOneHotEncoderを検討しましょう。
まとめ
Pandasのget_dummies関数は、カテゴリ変数を数値化するための強力かつ柔軟なツールです。
本記事では、基本的な使い方からcolumnsやdrop_firstといった主要なパラメータ、さらには実務での欠損値対応やデータの一貫性保持について解説しました。
適切なダミー変数化を行うことは、精度の高い機械学習モデルを構築するための第一歩となります。
データの特性や分析の目的に合わせて、これらのテクニックを使い分けてみてください。
まずは手元のデータセットに対して、get_dummiesを適用し、どのように構造が変化するのかを実際に確認してみることをおすすめします。
