

性別やクラス別など、大小の関係にない変数をカテゴリ変数(名義尺度)と言います。データ収集では、このカテゴリ変数を扱うことがあります。カテゴリ変数を使って、統計や機械学習を行うときは数値データに置き換えたほうが理解しやすいです(カテゴリ変数をそのまま使える場合もありますが)。
今回は、カテゴリ変数を数値データに置き換える、すなわちダミー変数への変換方法をPythonを使ってコードを確認していきましょう。
Pythonの環境設定は、以下の記事を参照して下さい。
【2021年最新】M1 mac でanacondaをインストールする方法
【2021年最新】WindowsでAnacondaをインストールする方法
必要なライブラリをインポート
import pandas as pd import seaborn as sns import warnings warnings.filterwarnings('ignore')
seabornからタイタニックのデータセットを読み込む
df = sns.load_dataset("titanic") df
この中で、性別(sex)のデータを見てみましょう。
df["sex"].value_counts()
出力:
male 577
female 314
Name: sex, dtype: int64
男性(male)が577名、女性(female)が314名です。この性別のデータをダミー変数に置き換えてみましょう。
カテゴリ変数をダミー変数に置き換える
pd.get_dummies(df["sex"])
変数が、「female」と「male」の2つになりました。
「female」が0の場合は「male」が1となり、男性を表します。
「female」が1の場合は「male」が0となり、女性を表します。
つまり、この2つの変数は0と1の違いだけで、同じことを表しています。このように2つの変数で同じ情報がある場合は、1つを削除します。同じ情報なら変数(特徴量)は少ない方が良いです。
1つの変数を削除する場合は、先ほどのコードの引数に「drop_first=True」を加えます。
pd.get_dummies(df["sex"],drop_first=True)
「male」のみになりました。
ではこの新しい変数を元のデータフレームに戻しましょう。
df["sex"] = pd.get_dummies(df["sex"],drop_first=True) df
「sex」が0と1の数値データになりました。これがダミー変数です。
次に「class」の内容を見てみましょう。
df["class"].value_counts()
出力:
Third 491
First 216
Second 184
Name: class, dtype: int64
「Third」が491、「First」が216、「Second」が184です。
「sex」は2つでしたが、「class」は3つのカテゴリに分かれています。
同じようにダミー変数に変換しましょう。
pd.get_dummies(df["class"],drop_first=True)
ダミー変数に変換されました。
このデータも元のデータフレームに還元しましょう。ダミー変数後は変数が2つになったので、新しい変数名を作って、「class」の変数を削除しましょう。
df[["class_Second","class_Third"]] = pd.get_dummies(df["class"],drop_first=True) df.drop(["class"],axis=1,inplace=True) # inplace=True:もとのデータに反映させる df
では次に「pclass」をみてみましょう。
df["pclass"].value_counts()
出力:
3 491
1 216
2 184
Name: pclass, dtype: int64
「pclass」は3が491、1が216、2が184です。文字ではなく数値データですが、カテゴリ変数に属されます。
先ほどと同じようにダミー変数に置き換えてみましょう。
df[["pclass_2","pclass_3"]] = pd.get_dummies(df["pclass"],drop_first=True) df.drop(["pclass"],axis=1,inplace=True) df
データフレームごとダミー変数に置き換える
一度データフレームの内容をリセットするために、seabornからデータを読み込みましょう。
df = sns.load_dataset("titanic")
では一挙にダミー変数に置き換えてみましょう。
df_dummy = pd.get_dummies(df,drop_first=True) pd.set_option('display.max_columns', len(df_dummy.columns)) # カラムを省略しない df_dummy
データが0と1のダミー変数に置き換えられましたね。
しかし、データフレームの左の方はそのままのデータもありますね。
データフレームの数値の種類を確認しましょう。info()で確認できます。
df.info()
(大雑把に)int64やfloat64は数値データです。
objectやcategoryはカテゴリ変数(名義尺度)です。
boolは真偽を表します。つまり、TrueかFalseです。
df_dummy.info()
ダミー変数にしたデータフレームの内容を見てみましょう。
uint8が0と1のデータです。つまりダミー変数に置き換えたデータです。
これを見ると、int64やfloat64の数値データとboolの真偽のデータはダミー変数化されていないことが分かります。
数値データでもカテゴリ変数に意味を持つものがあります(「pclass」など)。また、boolもカテゴリ変数の意味を持ちます。このような場合は、データの種類をカテゴリ変数に変換してから、ダミー変数化します。
カテゴリ変数に変換する
astype(“”)でデータの種類を変更できます。今回は、”category” に変更します。
df["pclass"] = df["pclass"].astype("category") df["adult_male"] = df["adult_male"].astype("category") df["alone"] = df["alone"].astype("category")
では、データの種類を確認してみましょう。
df_dummy = pd.get_dummies(df,drop_first=True) pd.set_option('display.max_columns', len(df_dummy.columns)) # カラムを省略しない df_dummy
カテゴリ変数に置き換えた変数もカテゴリ変数に置き換わっていますね。
このようにダミー変数にしたいデータの種類を、あらかじめカテゴリ変数に変換しておいた方が、いっぺんいダミー変数に置き換えることができます。
コメント