【Python初心者】特徴量エンジニアリング|連続変数を分割、カテゴリ変数に変更する

スポンサーリンク
Python
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...

特徴量エンジニアリングとは、今あるデータから新しいデータを作り出すことです。特徴量エンジニアリングのなかで、連続変数を分割したり、それをカテゴリ変数に変換することがあります。
今回は、タイタニックのデータセットを使って、年齢のデータを分割したり、カテゴリ変数に変換する方法を見てみましょう。
Pythonの環境設定はAnacondaをインストールし、Jupyter Labを使っています。以下の過去記事を参照して下さい。

【2021年最新】M1 mac でanacondaをインストールする方法

【2021年最新】WindowsでAnacondaをインストールする方法

必要なライブラリをインポート

import pandas as pd
import seaborn as sns

データセットを読み込む

df = sns.load_dataset('titanic')   # seabornにある titanicのデータセットを読み込む
df = df.dropna(subset=["age"])     # ageに欠損のあるデータを削除する
df

出力:

このタイタニックのデータセットにある「age」を使ってみましょう。

「age」は年齢で連続変数ですね。

これからする特徴量エンジニアリングを行うには、欠損データは邪魔になるため、欠損値を削除しています。

【Python初心者】直感的に分かる欠損値の取り扱い(削除・補完)

欠損値の種類と対処方法

データを分割する

データ数が同じになるように4分割する

df["age_cat_nor"] = pd.qcut(df["age"],4)   # ageを4つに分割する
df

出力:

とりあえず、データを4分割してみました。

4分割したデータを確認してみましょう。

df["age_cat_nor"].value_counts()   # 4つの分割したデータの個数を確認する

出力:

これは、
20.125より上から28.0までのデータが、183個
0.419より上から20.125までのデータが、179個
38.0より上から80.0までのデータが、177個
28.0より上から38.0までのデータが、175個

(小括弧)は数値を含みません、[大括弧]は数値を含みます。

均等に4分割したため、データ数はほぼ同じになります。

データの分布を確認する

特徴量エンジニアリングで作成する新しいデータはなんでもいいわけではなく、今のデータよりも意味のあるデータに変えるべきです。なので、とりあえす、データの分布を確認してみましょう。

df["age"].hist(bins=30)    # ヒストグラムでデータの分布を確認する

出力:

【Python初心者】簡単なヒストグラムの描き方

12,3歳以下と、20~30歳でデータの塊が確認できます。また、高齢になるにつれて、データ数が少しずつ減っています。

また、タイタニックのデータセットはタイタニックの生存が目的変数なので、生存にかかわりそうな分割にするべきです。

上で示したデータの分布とデータの意味を考えると、以下のような分割が妥当ではないでしょうか。

12歳以下:一人では行動できない

12~20歳:自分でお金を出していないが、一人で行動できる

20~50歳:自分でお金を出していて、一人で行動できる

50~100歳:自分でお金を出していて、体力に自信がない

分割する数値を指定する

bins = [0,12,20,50,100]   # 分割したい数値を指定する

df["age_cat"] = pd.cut(df["age"],bins)   # 指定した数値で分割し「age_cat」という変数に入れる
df

出力:

binsで分割したい数値を指定します。今回は0~12~20~50~100という分け方をしたいので、[0,12,20,50,100]としました。

それを、pd.cutの引数にdf[“age”](データフレームにある「age」という変数)とbinsを指定すると分割できます。

df["age_cat"].value_counts()    # 分割したデータの個数を確認する

出力:

データ数は均等ではありませんが、意味のある分割になっている可能性があります。

カテゴリ名を指定する

データを分割しただけでは、分かりにくいため、カテゴリ名を指定しましょう。

names = ["child","young","middle","senior"]  # 分割したデータに合ったカテゴリ名を指定する

df["age_cat"] = pd.cut(df["age"],bins,labels=names)   # 指定したカテゴリ名をデータ
df

出力:

これで、

12歳以下:child

12~20歳:young

20~50歳:middle

50~100歳:senior

というカテゴリ名になりました。

df["age_cat"].value_counts()     # カテゴリ名の個数を確認する

出力:

さきほどとデータ数は同じで、カテゴリ名が変わっています。

ダミー変数に変更する

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

age_cat = pd.get_dummies(df["age_cat"],drop_first=True)  # カテゴリ変数をダミー変数に変更する
age_cat

出力:

作成したダミー変数を基のデータフレームに加える

# もとのデータフレームに入れる
for i in range(len(age_cat.columns)):
    df["age_"+age_cat.columns[i]]=age_cat.iloc[:,i]
df

出力:

別のやり方として、データを横につなぎ合わせる方法もあります。以下のコードでも、上と同じ結果が出力されます(変数名は違います)

pd.concat([df,age_cat],axis=1)  # もとのデータにダミー変数化したデータをつなぎ合わせる

【Python初心者】 直感的に理解できるデータの結合 concat・merge

【Python初心者】matplotlibで棒グラフと円グラフを描いてみよう(データの可視化)

【Python初心者】matplotlibとseabornで散布図を描いてみよう(データの可視化)

コメント

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