Pandasでカテゴリ変数をダミー変数に変換する方法:get_dummiesを徹底解説


 

データ分析において、カテゴリ変数を数値データに変換することは非常に重要です。機械学習モデルの多くは数値データを扱うため、文字列で表現されたカテゴリ変数をそのままでは利用できません。Pandasのget_dummies()関数は、この変換を簡単に行うための強力なツールです。本記事では、get_dummies()関数の使い方とそのメリットについて、初心者の方にも分かりやすく解説します。


 

1. カテゴリ変数とは? 🤔

 

カテゴリ変数とは、性別(男性、女性)、血液型(A型、B型、O型、AB型)、地域(東京、大阪、福岡)のように、いくつかのカテゴリに分類される変数のことです。これらの変数は通常、文字列として表現されます。

 

なぜ変換が必要なのか?

 

多くの機械学習アルゴリズムは、数値データに基づいて計算を行います。例えば、決定木や線形回帰、サポートベクターマシンなどは、カテゴリ変数を直接扱うことができません。そのため、カテゴリ変数を数値に変換するエンコーディングという処理が必要になります。


 

2. ダミー変数化(One-Hot Encoding)とは? 💡

 

ダミー変数化は、カテゴリ変数を数値に変換する手法の一つで、ワンホットエンコーディング (One-Hot Encoding) とも呼ばれます。これは、元のカテゴリの数だけ新しい列(ダミー変数)を作成し、該当するカテゴリであれば1、そうでなければ0を割り当てる方法です。

例えば、「色」というカテゴリ変数に「赤」「青」「緑」という値があった場合、ダミー変数化すると以下のようになります。

色_赤 色_青 色_緑
1 0 0
0 1 0
0 0 1

このように、元のカテゴリごとに独立したバイナリの列が生成されます。


 

3. pd.get_dummies()の使い方 🚀

 

Pandasのget_dummies()関数を使えば、このダミー変数化を非常に簡単に行うことができます。

 

H3: 基本的な使い方

 

まずは、簡単なデータフレームを作成してget_dummies()を使ってみましょう。

Python
 
import pandas as pd

# サンプルデータの作成
data = {'City': ['Tokyo', 'Osaka', 'Tokyo', 'Fukuoka', 'Osaka'],
        'Gender': ['Male', 'Female', 'Male', 'Female', 'Male']}
df = pd.DataFrame(data)

print("変換前データフレーム:")
print(df)

# 'City'列をダミー変数に変換
df_encoded = pd.get_dummies(df, columns=['City'])

print("\n変換後データフレーム:")
print(df_encoded)

実行結果:

変換前データフレーム:
      City  Gender
0    Tokyo    Male
1    Osaka  Female
2    Tokyo    Male
3  Fukuoka  Female
4    Osaka    Male

変換後データフレーム:
      Gender  City_Fukuoka  City_Osaka  City_Tokyo
0     Male             0           0           1
1   Female             0           1           0
2     Male             0           0           1
3   Female             1           0           0
4     Male             0           1           0

この例では、columns=['City']と指定することで、City列のみがダミー変数に変換されました。元のCity列は削除され、City_Fukuoka, City_Osaka, City_Tokyoという新しい列が追加されているのがわかります。

 

H3: 複数の列を同時に変換する

 

複数のカテゴリ変数を同時にダミー変数化することも可能です。

Python
 
import pandas as pd

data = {'City': ['Tokyo', 'Osaka', 'Tokyo', 'Fukuoka', 'Osaka'],
        'Gender': ['Male', 'Female', 'Male', 'Female', 'Male']}
df = pd.DataFrame(data)

# 'City'と'Gender'列をダミー変数に変換
df_encoded_multi = pd.get_dummies(df, columns=['City', 'Gender'])

print(df_encoded_multi)

実行結果:

   City_Fukuoka  City_Osaka  City_Tokyo  Gender_Female  Gender_Male
0             0           0           1              0            1
1             0           1           0              1            0
2             0           0           1              0            1
3             1           0           0              1            0
4             0           1           0              0            1

 

H3: drop_first=Trueで多重共線性を避ける

 

ダミー変数化を行う際によく考慮されるのが多重共線性です。これは、独立変数間に強い相関がある場合に発生し、回帰分析などのモデルの精度に悪影響を与える可能性があります。

get_dummies()drop_first=Trueオプションを使用すると、各カテゴリ変数グループから最初のカテゴリに対応するダミー変数を削除できます。これにより、カテゴリ数-1個のダミー変数が生成され、多重共線性を避けることができます。

Python
 
import pandas as pd

data = {'City': ['Tokyo', 'Osaka', 'Tokyo', 'Fukuoka', 'Osaka']}
df = pd.DataFrame(data)

# 'City'列をダミー変数に変換し、最初の列を削除
df_encoded_drop_first = pd.get_dummies(df, columns=['City'], drop_first=True)

print(df_encoded_drop_first)

実行結果:

   City_Osaka  City_Tokyo
0           0           1
1           1           0
2           0           1
3           0           0
4           1           0

この例では、City_Fukuokaが削除され、City_OsakaCity_Tokyoの2列のみが残っています。City_OsakaCity_Tokyoも0であれば、それはFukuokaであることを意味します。

 

H3: prefixprefix_sepで列名をカスタマイズする

 

デフォルトでは列名_カテゴリ値という形式で新しい列名が生成されますが、prefixprefix_sep引数を使ってこれをカスタマイズできます。

Python
 
import pandas as pd

data = {'City': ['Tokyo', 'Osaka', 'Tokyo']}
df = pd.DataFrame(data)

# プレフィックスとセパレータを指定
df_custom_prefix = pd.get_dummies(df, columns=['City'], prefix='Area', prefix_sep='-')

print(df_custom_prefix)

実行結果:

   Area-Osaka  Area-Tokyo
0           0           1
1           1           0
2           0           1

 

4. まとめ ✨

 

本記事では、Pandasのget_dummies()関数を使ったカテゴリ変数のダミー変数化について解説しました。

  • カテゴリ変数は、文字列で表現される分類データであり、機械学習モデルで利用するためには数値に変換する必要があります。

  • ダミー変数化(ワンホットエンコーディング) は、各カテゴリをバイナリの新しい列に変換する手法です。

  • pd.get_dummies()は、この変換を非常に簡単に行うための関数です。

  • drop_first=Trueオプションで多重共線性を避けることができます。

  • prefixprefix_sepで新しい列名をカスタマイズできます。

get_dummies()を使いこなすことで、データ前処理の効率が格段に向上し、機械学習モデルの構築がよりスムーズになります。ぜひ、ご自身のデータで試してみてください!