今回の記事はカテゴリ変数をダミー変数に変換を解説します。
ダミー変数とは、
カテゴリ変数を数字に変換する手法のことです。具体的には、数字ではないデータを「0」と「1」だけの数列に変換します。機械学習は数字などの量的データによって行うものですが、それ以外の事柄でも数字に変換し、分析に取り入れることができます。多クラスの特徴量をone-hot表現に変換したりすることです。
ダミー変数の作り方
二者択一のダミー変数を作成する場合は、どちらか一方を「0」、もう片方を「1」と変換してデータを作ります。
例えば 「はい→1、いいえ→0」、 「男→1、女→0」、 「あり→1、なし→0」
複数から選択するダミー変数を作成する場合は、含まれる要素の数に応じたダミー変数を作ることでデータに転換可能です。例えば、 国「日本、 中国、アメリカ」
日本ダミー : 日本を1、その他を0とした数列
中国ダミー : 中国を1、その他を0とした数列
アメリカダミー : アメリカを1、その他を0とした数列
だは、pandasのget_dummiesでダミー変数を変更しましょう。
pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
data – ダミー変数を作成したいデータ
prefix – DataFrameのカラムラベルに付け加える文字列
prefix_sep – prefixで指定された文字列を付け加える際に橋渡しとなる文字列
dummy_na – 欠損値もダミー変数の処理
columns – ダミー変数に変換したい列データ
sparse – SparseDataFrameとして返り値
drop_first – カテゴリー数がk個あった時、k-1個のダミー変数を作成するかどうか
dtype – 新たなカラムのデータ型
# サンプルデータ作成
import pandas as pd
import numpy as np
data = [
(‘Japan’, ‘Female’, 400),
(‘China’, ‘Male’, 200),
(‘India’, ‘Female’, 300),
(‘Japan’, ‘Male’, 400),
(‘China’, ‘Male’, 500),
(‘Korea’, np.nan, 300)]
columns = [‘country’, ‘gender’, ‘value’ ]
df = pd.DataFrame(data, columns=columns)
df
# サンプルデータ作成
import pandas as pd
import numpy as np
data = [
(‘Japan’, ‘Female’, 400),
(‘China’, ‘Male’, 200),
(‘India’, ‘Female’, 300),
(‘Japan’, ‘Male’, 400),
(‘China’, ‘Male’, 500),
(‘Korea’, np.nan, 300)]
columns = [‘country’, ‘gender’, ‘value’ ]
df = pd.DataFrame(data, columns=columns)
df
# 二者択一のダミー変数
pd.get_dummies(df[‘gender’])
Female Male
0 1 0
1 0 1
2 1 0
3 0 1
4 0 1
5 0 0
# 複数から選択するダミー変数
pd.get_dummies(df[‘country’])
China India Japan Korea
0 0 0 1 0
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 1 0 0 0
5 0 0 0 1
# 全てのデータダミー変数
pd.get_dummies(df)
value country_China country_India country_Japan country_Korea gender_Female gender_Male
0 400 0 0 1 0 1 0
1 200 1 0 0 0 0 1
2 300 0 1 0 0 1 0
3 400 0 0 1 0 0 1
4 500 1 0 0 0 0 1
5 300 0 0 0 1 0 0
drop_first
最初のカテゴリーを除外
k個のカテゴリーをダミー化する場合、k-1個のダミー変数があればよいが、get_dummies()関数ではデフォルトでk個のダミー変数に変換されます。
# drop_first=True
pd.get_dummies(df[‘gender’], drop_first=True)
Male
0 0
1 1
2 0
3 1
4 1
5 0
dummy_na
NaNも一つのカテゴリーとしてダミー変数化したい場合は、引数dummy_na=Trueとします。
# dummy_na=True
pd.get_dummies(df[‘gender’], dummy_na=True)
Female Male nan
0 1 0 0
1 0 1 0
2 1 0 0
3 0 1 0
4 0 1 0
5 0 0 1
prefix, prefix_sep
デフォルトでは生成されるダミー変数の列名は元の列名_カテゴリー名となります。
Prefix と prefix_sepを指定すると、<prefix><prefix-sep>カテゴリー名のようになります。
# prefix, prefix_sep
pd.get_dummies(df[‘country’], prefix=’C’, prefix_sep=’_’)
C_China C_India C_Japan C_Korea
0 0 0 1 0
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 1 0 0 0
5 0 0 0 1
Columns
columnsにダミー化したい列の列名をリストで指定すると、数値やブールの列もダミー化できます。
# Columns
pd.get_dummies(df, columns=[‘gender’,’value’])
country gender_Female gender_Male value_200 value_300 value_400 value_500
0 Japan 1 0 0 0 1 0
1 China 0 1 1 0 0 0
2 India 1 0 0 1 0 0
3 Japan 0 1 0 0 1 0
4 China 0 1 0 0 0 1
5 Korea 0 0 0 1 0 0
Pingback: Statsmodelsでの回帰分析 | S-Analysis