見出し画像

前処理大全:第9章

今回は「前処理大全」の第9章を記載します。
*Pythonのみでのコードになります。

第9章:カテゴリ型

9-1:カテゴリ型への変換

Q:カテゴリ型への変換

顧客テーブルの性別(sex)をブール型とカテゴリ型に変換しましょう

# sexがmanの時にTRUEとするブール型を追加
# このコードは、astype関数を利用しなくてもブール型に変換
customer_tb[['sex_is_man']] = (customer_tb[['sex']] == 'man').astype('bool')

# sexをカテゴリ型に変換
customer_tb['sex_c'] = pd.Categorical(customer_tb['sex'], categories=['man', 'woman'])

# astype関数でも変換可能
# customer_tb['sex_c'] = customer_tb['sex_c'].astype('category')

# インデックスデータはcodesに格納されている
customer_tb['sex_c'].cat.codes

# マスタデータはcategoriesに格納されている
customer_tb['sex_c'].cat.categories

9-2:ダミー変数化

Q:ダミー変数化

顧客テーブルの性別(sex)をダミー変数化してみましょう

# ダミー変数化する前にカテゴリ型に変換
customer_tb['sex'] = pd.Categorical(customer_tb['sex'])

# get_dummies関数によってsexをダミー変数化
# drop_firstをfalseにすると、カテゴリ値の選手類の値をダミーフラグに生成
dummy_vars = pd.get_dummies(customer_tb['sex'], drop_first=False)
dummy_vars.head()

9-3:カテゴリ値の集約

Q:カテゴリ値の集約

顧客テーブルの年齢(age)を10歳区切りでカテゴリ型に変換し、さらに60歳以上の場合は「60歳以上」というカテゴリ値に変換しましょう

# pd.Categoricalによって、category型に変換
customer_tb['age_rank'] = pd.Categorical(np.floor(customer_tb['age']/10)*10)

# マスタデータに60歳以上を追加
customer_tb['age_rank'].cat.add_categories(['60以上'], inplace=True)

# 集約するデータに書き換え
# category型は、=または!=の判定のみ可能なので、isin関数を利用
customer_tb.loc[customer_tb['age_rank'].isin([60.0, 70.0, 80.0]), 'age_rank'] = '60以上'

# 利用されていないマスタデータを削除
customer_tb['age_rank'].cat.remove_unused_categories(inplace=True)
customer_tb.head()

9-4:カテゴリ値の組み合わせ

Q:カテゴリ値の組み合わせ

顧客テーブルの性別(sex)と年齢(age)の10歳区切りのカテゴリ値を組み合わせて、性別/年代のカテゴリ値を生成しましょう

customer_tb['sex_and_age']= pd.Categorical(
    # 連結する列を抽出
    customer_tb[['sex', 'age']]
    
    # lambda関数内でsexで10代区切りのageを_を挟んで文字列として連結
    .apply(lambda x : '{}_{}'.format(x[0], np.floor(x[1] / 10) *10), axis=1)
)

customer_tb.head()

9-5:カテゴリ型の数値型

Q:カテゴリ型の数値化

製品種別(type)を製品種別ごとの平均障害率に変換しましょう。ただし、平均障害率の計算は自身のレコードを除いて計算しましょう
fault_flgがTRUEの割合を基準にtypeを数値化

# 製品種別ごとの障害数
fault_cnt_per_type = production_tb.query('fault_flg').groupby('type')['fault_flg'].count()

# 製品種別ごとの製造数
type_cnt = production_tb.groupby('type')['fault_flg'].count()

production_tb['type_fault_rate'] = production_tb[['type', 'fault_flg']].apply(
    lambda x : (
        fault_cnt_per_type[x[0]] - int(1)) / (type_cnt[x[0]] - 1), axis=1
)

production_tb.head()

9-6:カテゴリ型の補完

Q:KNNによる補完

ault_flgが欠損していないデータを用いた予測結果から、欠損しているfault_flgを補完しましょう。
予測にはKNNを利用しましょう。
lengthとthicknessを基準にtypeを補完

# KNeighborsClassifierをsklearnライブラリから読み込み
from sklearn.neighbors import KNeighborsClassifier

# replace関数によって、Noneをnanに変換
production_missing_category_tb.replace('None', np.nan, inplace=True)

# 欠損していないデータ抽出
train = production_missing_category_tb.dropna(subset=['type'], inplace=False)

# 欠損しているデータの抽出
test = production_missing_category_tb.loc[production_missing_category_tb.index.difference(train.index), :]

# knnモデルを生成、n_neighoborsはknnのkパラメータ
kn = KNeighborsClassifier(n_neighbors=3)

# knnモデル学習
kn.fit(train[['length', 'thickness']], train['type'])

# knnモデルによって予測値を計算し、typeを補完
test['type'] = kn.predict(test[['length', 'thickness']])

test

カテゴリ型の値についての前処理のまとめになります。参考にして貰えたら嬉しいです。

サポートして頂いたお金は開業資金に充てさせて頂きます。 目標は自転車好きが集まる場所を作る事です。 お気持ち程度でいいのでサポートお願い致します!