【ダミー変数化】OneHotEncordingで質的データを量的データに変換する方法【CategoryEncoders】

OneHotEncodingってどんなことをするのかな?
Pythonでの実装方法や、OneHotEncodingの使い所をわかりやすく知りたいな



機械学習で質的データ(定性データ・カテゴリ変数)をモデルに使いたい場合は、データ型を変換しないとエラーになってしまいます。

そんな時に必要なのが、OneHotEncodingという手法です。



本記事では、下記のことがわかるようになります。

本記事でわかること

✅質的データ・量的データとは?
✅OneHotEncodingとはどんなことをするのか?
✅OneHotEncodingの実装方法は?



質的データと量的データとは?

質的データとは、データが数字ではなくカテゴリで表せるもののことです。



一方、量的データとは、数字の大小に意味があるデータのことを指します。


質的データや量的データの意味については、こちらの記事で詳しく解説しています。


ぜひご参照ください。

質的変数と量的変数の違いとは?【全データ種類解説】

2022年6月17日



OneHotEncodingとは?【質的データから量的データに変換する】

OneHotEncodingとは、質的データを量的データに変換することです。

質的データから量的データに変換したい場面って、どんな時だろう?


機械学習をする時に、文字列(質的データのデータ型)を読み込もうとするとエラーになってしまいます。

しかし、モデルの説明力を高めるために、質的データをモデルに入れたい場合もありますよね

そのような場合は、質的データを質問形の問に変換し、1(Yes)か0(No)の値で表示します。


質的データを量的データに変換する




上記の例では、「性別」を「男であるかどうか」と「女であるかどうか」という質問に変えています。


このように、質的データを0や1に変換することをOneHotEncodingといいます。


ダミー変数化とも呼びます。


質的データを1か0で表現することで、機械学習のモデリングでも使えるようになります。


OneHotEncodingの方法【CategoryEncodersライブラリ】

【初回のみ】Category Encodersライブラリをインストールする

OneHotEncodingには、Category Encodersライブラリを使います。

Category Encodersライブラリを初めて使う場合は、インストールする必要があります。

#Anacondaの場合
conda install -c conda-forge category_encoders



#pipでインストールする場合
pip install category_encoders




ライブラリをimportする

必要なライブラリをインポートして、pythonファイルで使える状態にしましょう。

OneHotEncodingでは、CategoryEncodersとPandasを使います。

pandasはデータセットの読み込みや確認に使います。


import category_encoders as ce
import pandas as pd



データセットを読み込む

df = pd.read_csv("sample.csv")


今回の例では、タイタニック号のデータセットを使います。

練習したい方は、ぜひkaggleでダウンロードしてみてください。(リンクはこちらから)





データフレームの確認をしましょう。

#転置すると、変数が見やすいのでおすすめ
df.T



Sex(性別)は、male(男性)とfemale(女性)の質的データのようです。



今回は、SexをOneHotEncodingしてみましょう。

まずは、Sexのデータがmaleとfemaleの2種類なのかどうかを確認します。

#ユニークな要素の値と、出現回数を確認する
df["Sex"].value_counts()

>>実行結果
male      577
female    314
Name: Sex, dtype: int64




maleとfemaleの2種類のみであることが、確認できました。


今回の例では、カテゴリ名はmanとfemaleの2種類ですが、OneHotEncodingは3種類以上のカテゴリ名がある場合でも使えます。




OneHotEncodering

質的データ「Sex」をOneHotEncodingしましょう。

#Eoncodeしたい列をリストで指定。複数の列を指定することもできる。
list_cols = ['Sex']

#OneHotEncoderインスタンスの生成
ohe = ce.OneHotEncoder(cols=list_cols)


ce.OneHotEncoderの引数には、次の属性を設定することができます。



OneHotEncoderの属性
  • cols:Eoncodeしたい列のリストを指定します。指定がない場合は、全ての文字列の列がエンコードされます。
  • handle_unkown:fit_transform時に存在しなかった未知のデータが入力された場合の扱いを指定します。
    • value(デフォルト):0として対応する
    • indicator:追加のダミー列として対応する
    • error:ValueErrorを発生させる
    • return_nan:「Nan」にする
  • drop_invariant:分散が0の変数(全て同じ値である場合)を削除するかどうかを指定します。
    • False(デフォルト):変数を削除しない
    • True:変数を削除する
  • use_cat_names:変換後の列名にカテゴリ名を使うか
    • False(デフォルト):使わない(「列名-1」,「列名-2」と変換される)
    • True:使う(「列名-カテゴリ名」と変換される)




データフレームの対象列にOneHotEncodingを適用させる

データフレームに適用させるには、fit_transformを使います。

引数に、変換したいデータフレームを入れましょう。

エンコーディング後のデータフレームをdf_onehotとしました。

#データフレーム中の対象列をダミー変数へ変換
df_onehot = ohe.fit_transform(df)

#確認
df_onehot.T



実行した結果、元の変数「Sex」が「Sex_1(男性列)」と「Sex_2(女性列)」に変換されています。

OneHotEncodingされているね!




列名がSex_1,Sex_2では、列名を見た時にどんなデータが入っているのかがわかりにくいため、列名にカテゴリ名を使ってみましょう。

use_cat_names属性を使います。

ohe_name = ce.OneHotEncoder(cols=list_cols, use_cat_names=True)

#データフレーム中の対象列をダミー変数へ変換
df_onehot_name = ohe_name.fit_transform(df)

#確認
df_onehot_name.T



列名が変更されました。





データ分析を学びたい方におすすめ


Pythonでデータ分析・データサイエンスをしたい初心者向けに、Pythonデータ分析徹底解説総まとめページを作成しました。



流れに沿って実装することで、データ分析の基礎が固められます。

【総集編】データ前処理をPythonで実装【機械学習入門】

2022年9月25日

また、専門の講師と一緒に挫折せずに学習したい方には、データサイエンススクールがおすすめです。

おすすめのスクール一覧はこちらからどうぞ。

【2023年最新版】データサイエンスが学べるおすすめスクール5選

2022年6月4日