前処理大全:第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
カテゴリ型の値についての前処理のまとめになります。参考にして貰えたら嬉しいです。
サポートして頂いたお金は開業資金に充てさせて頂きます。 目標は自転車好きが集まる場所を作る事です。 お気持ち程度でいいのでサポートお願い致します!