数値特徴量のビニングでカテゴリデータとして扱う

ビニングとは、連続する数値データを離散的な区間(ビン)に分割することをいいます。これにより、連続値のデータをカテゴリデータとして扱うことができます。ビニングを行うことで、データの特性を簡潔に表現し、外れ値の影響を減少させたりすることが出来ます。

この記事では、数値特徴量に対して様々な視点からのビニングを行い、カテゴリデータへの変換を行ってみます。

データセットの用意

今回、Kaggleにある「Titanic - Machine Learning from Disaster」のデータセットを利用したいと思います。このデータセットは、1912年に沈没したタイタニック号の乗客の情報を含んでおり、生存者を予測するためのモデルを構築することが目的となっています。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("./train.csv")

このデータセットに含まれる年齢の特徴量をビニングし、カテゴリデータとして変換してみます。それでは各ビニングについて見ていきます。

固定幅ビニング

固定幅ビニングはデータの範囲を均等な幅のビンに分割します。

df['Age Group'] = pd.cut(df['Age'], bins=range(0, 101, 10), right=False)

可視化すると下記のようになります。

import matplotlib.pyplot as plt

age_group_counts = df['Age Group'].value_counts().sort_index()

plt.figure(figsize=(10, 6))
age_group_counts.plot(kind='bar', color='skyblue')
plt.xlabel('Age Group')
plt.ylabel('Number of Individuals')
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.show()

年齢データが10年毎のビンに分けられています。

等頻度ビニング

等頻度ビニングは各ビンに同じ数のデータポイントが含まれるように分割します。

df['Age Group'] = pd.qcut(df['Age'], q=4)

上記を実行すると下記のように、等しい頻度の便に分けることができます。
ここではビン数を4としているため、4つのビンに分けられます。

年齢データであればもっと意味のある関心でビニングしたいと思うかもしれません。例えば子供、青年、成人、高齢者といったカテゴリに分けたいと考えるかもしれません。

先ほどの固定幅ビニングで利用したcutを利用して下記のようにしてみます。

bin_labels = ['Child', 'Teenager', 'Adult', 'Senior']
df['Age Group'] = pd.cut(df['Age'], bins=[0, 12, 18, 65, 100], labels=bin_labels)

意味のある区間を設定し、ラベルを設定しています。