閉じる

Pandasでダミー変数を作成する方法:get_dummiesの基本と実務での活用テクニック

データ分析や機械学習のプロジェクトにおいて、カテゴリ変数の扱いは非常に重要なプロセスです。

機械学習アルゴリズムの多くは数値を前提として設計されているため、テキスト形式のデータをそのままモデルに投入することはできません。

そこで活用されるのが、カテゴリ変数を「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をインポートし、カテゴリデータを含む簡単なデータフレームを作成して変換を実行します。

Python
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引数を使用します。

この引数にリスト形式で列名を指定することで、必要な項目のみを効率的に処理できます。

Python
# 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を使えば、列名とカテゴリ値を繋ぐ記号(アンダースコアなど)を変更できます。

Python
# 接頭辞を'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を設定します。

Python
# 最初のカテゴリ列を削除してダミー変数化
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を指定します。

Python
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型が採用されますが、モデルによってはintfloatが望ましい場合があります。

メモリ消費量を抑えたい場合や、特定の機械学習ライブラリとの互換性を保ちたい場合に有効です。

Python
# 出力される型を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)を定義しておく方法が推奨されます。

Python
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_dummiesScikit-learn OneHotEncoder
主な用途データ探索・簡易的な前処理機械学習パイプラインへの組み込み
出力形式DataFrame(列名が保持される)NumPy配列またはSparse行列
学習・適用一括変換のみfit / transformによる分離が可能
メモリ効率比較的高い疎行列(Sparse)対応で非常に高い

探索的なデータ分析(EDA)の段階では、結果が直感的にわかりやすいPandasのget_dummiesが最適です。

一方で、本格的なパイプラインを構築し、モデルをデプロイする場合は、状態を保持できるScikit-learnのOneHotEncoderを検討しましょう。

まとめ

Pandasのget_dummies関数は、カテゴリ変数を数値化するための強力かつ柔軟なツールです。

本記事では、基本的な使い方からcolumnsdrop_firstといった主要なパラメータ、さらには実務での欠損値対応やデータの一貫性保持について解説しました。

適切なダミー変数化を行うことは、精度の高い機械学習モデルを構築するための第一歩となります。

データの特性や分析の目的に合わせて、これらのテクニックを使い分けてみてください。

まずは手元のデータセットに対して、get_dummiesを適用し、どのように構造が変化するのかを実際に確認してみることをおすすめします。

URLをコピーしました!