Pythonデータ分析レシピ集

Python Pandasでカテゴリデータを数値に変換する:One-Hot EncodingとLabel Encodingのレシピ

Tags: Python, Pandas, データ前処理, カテゴリデータ, One-Hot Encoding, Label Encoding

はじめに

データ分析や機械学習のタスクにおいて、データセットには「性別」「商品カテゴリ」「評価(良い、普通、悪い)」といったカテゴリ(質的)データが含まれることが少なくありません。しかし、多くの統計モデルや機械学習アルゴリズムは数値データを入力として想定しており、これらのカテゴリデータをそのままでは扱えないという課題があります。

この記事では、Pythonのデータ分析ライブラリであるPandasとscikit-learnを用いて、カテゴリデータを数値データに変換する主要な二つの手法、「One-Hot Encoding(ワンホットエンコーディング)」と「Label Encoding(ラベルエンコーディング)」について、その概念から具体的なコード例、そしてそれぞれの適切な利用シーンまでを丁寧に解説します。このレシピを活用いただくことで、皆様のデータ分析プロセスにおけるカテゴリデータの扱いにまつわる課題を効率的に解決できることでしょう。

問題提起:カテゴリデータの数値変換の必要性

私たちが日常的に扱うデータには、数値で表せない「カテゴリ」の情報が豊富に含まれています。例えば、顧客の居住地、購入した商品の種類、アンケートの選択肢などがこれに該当します。これらのカテゴリデータは、それ自体が重要な情報源となりますが、コンピューターや数理モデルが直接処理するには不向きな形式であることがほとんどです。

このような背景から、カテゴリデータを適切に数値へと変換する技術は、データ分析において不可欠なスキルであると言えます。特に、どの変換方法を選択するかが、その後の分析結果やモデルの性能に大きく影響するため、それぞれの特性を理解することが重要です。

解決策(コードレシピ)

ここでは、One-Hot EncodingとLabel Encodingの二つの変換手法を、具体的なコード例と共に解説します。サンプルデータを用意し、それぞれの変換を適用して結果を確認します。

1. 必要なライブラリのインポート

データ操作のためにPandas、そしてLabel Encodingのためにscikit-learnのLabelEncoderをインポートします。

import pandas as pd
from sklearn.preprocessing import LabelEncoder

2. サンプルデータの準備

顧客の情報を模したサンプルデータを作成します。このデータには、性別(カテゴリ、順序なし)と満足度(カテゴリ、順序あり)の2種類のカテゴリ列が含まれています。

# サンプルデータの作成
data = {
    '顧客ID': [1, 2, 3, 4, 5, 6, 7, 8],
    '年齢': [25, 30, 35, 40, 45, 28, 33, 38],
    '性別': ['男性', '女性', '男性', '女性', '男性', '女性', '男性', '女性'],
    '満足度': ['普通', '良い', '悪い', '良い', '普通', '良い', '悪い', '普通'],
    '購入額': [1000, 2500, 500, 3000, 1500, 2000, 700, 1200]
}
df = pd.DataFrame(data)

print("元のデータフレーム:")
print(df)

3. One-Hot Encodingの適用

One-Hot Encodingは、順序のないカテゴリデータに適しています。各カテゴリ値を新しい列として追加し、該当する行に1、それ以外に0を割り当てます。Pandasのget_dummies関数を使用します。

# '性別'列にOne-Hot Encodingを適用
df_onehot = pd.get_dummies(df, columns=['性別'], prefix='性別')

print("\nOne-Hot Encoding適用後のデータフレーム(性別):")
print(df_onehot)

もし元の列を削除し、かつダミー変数の多重共線性を避けるためにカテゴリの数-1のダミー変数にしたい場合は、drop_first=Trueを指定します。

# '性別'列にOne-Hot Encodingを適用し、最初のカテゴリ列を削除
df_onehot_drop_first = pd.get_dummies(df, columns=['性別'], prefix='性別', drop_first=True)

print("\nOne-Hot Encoding適用後のデータフレーム(性別、drop_first=True):")
print(df_onehot_drop_first)

4. Label Encodingの適用

Label Encodingは、順序のあるカテゴリデータに適しています。各カテゴリ値を0から始まる整数値に変換します。scikit-learnのLabelEncoderを使用します。

# '満足度'列にLabel Encodingを適用
le = LabelEncoder()
df_label = df.copy() # 元のデータフレームをコピーして操作
df_label['満足度_encoded'] = le.fit_transform(df_label['満足度'])

print("\nLabel Encoding適用後のデータフレーム(満足度):")
print(df_label[['満足度', '満足度_encoded']].drop_duplicates()) # 変換結果の対応を確認
print("\nデータフレーム全体:")
print(df_label)

# 変換された数値から元のカテゴリに戻すことも可能
print("\nエンコードされた値から元のカテゴリに戻す例:")
print(le.inverse_transform([0, 1, 2])) # 例として[0, 1, 2]を変換

コードの詳細解説

One-Hot Encoding (pd.get_dummies)

pd.get_dummiesは、指定されたDataFrameのカテゴリ列をOne-Hotエンコードするための非常に便利な関数です。

One-Hot Encodingは、カテゴリに順序関係がない場合に特に有効です。「男性」「女性」のようなカテゴリに数値的な大小関係を持たせてしまうと、モデルが誤った解釈をする可能性があるため、この手法が適しています。

Label Encoding (sklearn.preprocessing.LabelEncoder)

LabelEncoderは、カテゴリ値を0からn_categories-1までの整数に変換するために使用されます。

Label Encodingは、カテゴリに明確な順序関係がある場合に適しています。「悪い」「普通」「良い」のように順序がある場合、その順序を数値の大小関係(例: 0, 1, 2)で表現することで、モデルがその順序性を学習できる可能性があります。 ただし、順序がないカテゴリにLabel Encodingを適用すると、モデルがその数値の大小関係に意味があると誤解してしまうリスクがあるため、注意が必要です。例えば、「赤」「青」「黄」を0, 1, 2に変換すると、モデルは「赤 < 青 < 黄」のような順序があると解釈する可能性があり、これは不適切です。

まとめ

この記事では、Pythonにおけるカテゴリデータの数値変換の重要性、そしてその主要な手法であるOne-Hot EncodingとLabel Encodingについて、実用的なコードレシピとともに詳細を解説いたしました。

これらの変換手法を適切に使い分けることで、非数値データが混在するデータセットにおいても、多くの機械学習モデルや統計分析手法を適用することが可能になります。ぜひ、ご自身のデータ分析タスクにこれらのレシピを応用し、より深い洞察を得るための一助としてください。