【Python初心者】カテゴリ変数をダミー変数に置き変える方法|機械学習に必要な前処理

スポンサーリンク
Python
【初心者】Rと統計学をいっぺんに学ぶ最初の5冊
Rとはオープンソースの統計解析用のプログラミング言語です。 誰でも無料で使えます。統計解析にはSPSSやSASなどが有名ですが、いずれも有料です。大学や研究機関でないと使えないですね。個人でも統計解析できた方が、職場に依存せずにス...
【おすすめ】Pythonの独学で必要な書籍
わたしは、底辺サラリーマンで、Pyhton学習歴は半年、R(フリーの統計解析ソフト)学習歴半年、学習方法は独学です。 ここでの独学とは、体系的な学習カリキュラムがなく、強制力がない学習方法のことを指します。...

性別やクラス別など、大小の関係にない変数をカテゴリ変数(名義尺度)と言います。データ収集では、このカテゴリ変数を扱うことがあります。カテゴリ変数を使って、統計や機械学習を行うときは数値データに置き換えたほうが理解しやすいです(カテゴリ変数をそのまま使える場合もありますが)。

今回は、カテゴリ変数を数値データに置き換える、すなわちダミー変数への変換方法を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

出力:

カテゴリ変数に置き換えた変数もカテゴリ変数に置き換わっていますね。

このようにダミー変数にしたいデータの種類を、あらかじめカテゴリ変数に変換しておいた方が、いっぺんいダミー変数に置き換えることができます。

え?AI詳しいのにプレミアムプランのチェックはまだ?

Python 3 入門+アメリカのシリコンバレー流コードスタイル

AI人材になるための6ヶ月長期コース【ikus.ai】

コメント

タイトルとURLをコピーしました