【解説】カテゴリデータの作成方法を学ぶ | データサイエンス100本ノック【問56〜57 回答】

【解説】カテゴリデータの作成方法を学ぶ | データサイエンス100本ノック【問56〜57 回答】





目次

この記事の対象者



・ データサイエンティストを目指している人

・ Pythonでカテゴリデータの作成方法を知りたい人



以降はデータサイエンス100本ノックの問題を題材にしながら学んでいきます。


データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。


>>データサイエンス100本ノックの始め方を確認する


第56問目: applyとminを用いた年代カテゴリの作成

P-056: 顧客データフレーム(df_customer)の年齢(age)をもとに10歳刻みで年代を算出し、顧客ID(customer_id)、生年月日(birth_day)とともに抽出せよ。ただし、60歳以上は全て60歳代とすること。年代を表すカテゴリ名は任意とする。先頭10件を表示させればよい。

まずは顧客データフレーム(df_customer)の構造を確認します。

1
df_customer.head(5)
出力
1
2
3
4
5
6
	customer_id	customer_name	gender_cd	gender	birth_day	age	postal_cd	address	application_store_cd	application_date	status_cd
0 CS021313000114 大野 あや子 1 女性 1981-04-29 37 259-1113 神奈川県伊勢原市粟窪********** S14021 20150905 0-00000000-0
1 CS037613000071 六角 雅彦 9 不明 1952-04-01 66 136-0076 東京都江東区南砂********** S13037 20150414 0-00000000-0
2 CS031415000172 宇多田 貴美子 1 女性 1976-10-04 42 151-0053 東京都渋谷区代々木********** S13031 20150529 D-20100325-C
3 CS028811000001 堀井 かおり 1 女性 1933-03-27 86 245-0016 神奈川県横浜市泉区和泉町********** S14028 20160115 0-00000000-0
4 CS001215000145 田崎 美紀 1 女性 1995-03-29 24 144-0055 東京都大田区仲六郷********** S13001 20170605 6-20090929-2

年齢を元に10刻みで年代を算出する方法を考えます。

まずageカラムをデータとして取り出した上で、何らかの関数処理を施したい場合はapplyメソッドの引数にlambda式を用いればよかったですね。

>> applyメソッドとlambda式を復習する

applyとlambda式の使い方を振り返ります。

データフレームと併用する場合は、df.apply(lambda 引数: 返り値)でした。

年代の算出方法はどのように行うでしょうか?

実は、過去の問題で既に取り組んでいます。

>> 年代の算出方法を確認する

上記の記事で述べていることの繰り返しになりますが、年代は、age列の値を1/10倍し、floor関数で小数点を切り捨てたあとに10倍すれば、年代を算出することが出来ます。

例えば22という値を、2.2にし、小数点を切り捨てて2.0にした後10倍すれば20になりますよね?つまり、22歳は20代であることを算出することができます。

また問題文より、60以上はすべて60歳代にする必要があります。

比較演算子を用いて処理しても良いですね。一方で、関数で処理した値の最小値が60であることを指定すれば良いという考え方もできます。そのため、minを用いることで60以上はすべて60代として算出することが出来ます。早速コードを書いていきます。

1
2
df_age = df_customer['age'].apply(lambda x: min(math.floor(x / 10) * 10, 60))
df_age
出力
1
2
3
4
5
6
7
8
9
10
11
12
0        30
1 60
2 40
3 60
4 20
..
21966 50
21967 40
21968 40
21969 50
21970 20
Name: age, Length: 21971, dtype: int64

これを、customer_idbirth_dayとともに抽出させます。

df_agedf_customerの間に共通的なカラムは存在しないので、mergeではなくconcatを用いて結合させます。

concatでdf_ageとdf_customerを結合
1
2
df_customer_era = pd.concat([df_customer[['customer_id', 'birth_day']], df_age], axis=1)
df_customer_era.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	customer_id	birth_day	age
0 CS021313000114 1981-04-29 30
1 CS037613000071 1952-04-01 60
2 CS031415000172 1976-10-04 40
3 CS028811000001 1933-03-27 60
4 CS001215000145 1995-03-29 20
5 CS020401000016 1974-09-15 40
6 CS015414000103 1977-08-09 40
7 CS029403000008 1973-08-17 40
8 CS015804000004 1931-05-02 60
9 CS033513000180 1962-07-11 50

本問はこれで完成です。

第57問目: データの型変換を伴うカテゴリ化

P-057: 前問題の抽出結果と性別(gender)を組み合わせ、新たに性別×年代の組み合わせを表すカテゴリデータを作成せよ。組み合わせを表すカテゴリの値は任意とする。先頭10件を表示させればよい。

「性別×年代の組み合わせを表すカテゴリデータ」とはなにかを補足しておきます。

今回作成する性別×年代の組み合わせを表すカテゴリーデータは、例えばgender_cdが1でageが40だったとしたら、140という風に表す形にしたいと思います。

これを実施するためには、gender_cdとageがともに文字列データにしなければいけません。なぜなら数値型ですと1 + 40は41になってしまうからです。1 + 40 を140にするためには両者を文字列型にしておけば良いことになります。

gender_cdとageはともに数値(int型)なので、これらをastypeメソッドを用いて文字列(str型)に変換させて足し合わせます。その上で新たなカラムであるera_genderに格納させていきます。

1
2
df_customer_era['era_gender'] = df_customer['gender_cd'].astype('str') + df_customer_era['age'].astype('str')
df_customer_era
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	customer_id	birth_day	age	era_gender
0 CS021313000114 1981-04-29 30 130
1 CS037613000071 1952-04-01 60 960
2 CS031415000172 1976-10-04 40 140
3 CS028811000001 1933-03-27 60 160
4 CS001215000145 1995-03-29 20 120
... ... ... ... ...
21966 CS002512000474 1959-10-12 50 150
21967 CS029414000065 1970-10-19 40 140
21968 CS012403000043 1972-12-16 40 040
21969 CS033512000184 1964-06-05 50 150
21970 CS009213000022 1996-08-16 20 120
21971 rows × 4 columns

これで完成です。

まとめ: 様々なカテゴリ化の方法を学びました

本記事は、「【Python】カテゴリデータの作成方法を学ぶ | データサイエンス100本ノック【問56〜57 回答】」というテーマでまとめました。

本記事で学んだこととしては、applyメソッドとlambda式の復習、そしてastypeメソッドによるデータの型変換可と思います。

本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。

なお、データサイエンティストに必要な知識は、Udemyを活用した学習が効率的です。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

世界で34万人が受講した以下の講座をご確認ください。

【世界で34万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜

>> 第58問の回答はこちら

コメント