【解説】データサイエンス100本ノック【問92〜93回答】

【解説】データサイエンス100本ノック【問92〜93回答】

当ページのリンクには広告が含まれています。



目次


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


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


第92問目:正規化

P-092: 顧客データフレーム(df_customer)では、性別に関する情報が非正規化の状態で保持されている。これを第三正規化せよ。

データの重複をなくし整合的にデータを取り扱える状態にすることを(データベースの)正規化と呼びます。
なお、ここで取り扱っている正規化は、異なる種類のデータを1つの尺度にまとめるために行う正規化とは違います。

今回の問題で行うのは、第三正規化と呼ばれる処理です。

第三正規化とはカラム同士で依存関係を持たないようにデータベースの構造を設計することです。

正規化とは何かを具体的に知りたい方は、以下の記事を参照ください。

【5分で分かる】データモデルとデータベースの設計方法と関係性 - omathin blog

早速問題に取り掛かりたいと思います。まずはdf_customerの構造を確認します。

1
df_customer.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	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
5 CS020401000016 宮下 達士 0 男性 1974-09-15 44 174-0065 東京都板橋区若木********** S13020 20150225 0-00000000-0
6 CS015414000103 奥野 陽子 1 女性 1977-08-09 41 136-0073 東京都江東区北砂********** S13015 20150722 B-20100609-B
7 CS029403000008 釈 人志 0 男性 1973-08-17 45 279-0003 千葉県浦安市海楽********** S12029 20150515 0-00000000-0
8 CS015804000004 松谷 米蔵 0 男性 1931-05-02 87 136-0073 東京都江東区北砂********** S13015 20150607 0-00000000-0
9 CS033513000180 安斎 遥 1 女性 1962-07-11 56 241-0823 神奈川県横浜市旭区善部町********** S14033 20150728 6-20080506-5

問題文に「性別に情報が非正規化状態になっている」と記載されているので、非正規化状態となっているカラムを確認します。

gender_cdとgenderという情報がありますが、仮にgenderを変更するとなった場合、gender_codeまで変更する必要が出てきてしまいます。

そのため、gender_cdとgenderは、依存関係にあるといえます。

どうすればよいかというと、依存関係を表すデータフレームを作成し、もともとのdf_customerからgenderカラムを削除すればOKです。

依存関係を表すデータフレームは、依存関係にあるカラムを取り出し、drop_duplicates()メソッドを使い、重複しているデータを削除すれば良いです。

【解説】データサイエンス100本ノック【問70〜74 回答】 - omathin blog

1
2
df_gender = df_customer[['gender_cd', 'gender']].drop_duplicates()
df_gender
出力
1
2
3
4
	gender_cd	gender
0 1 女性
1 9 不明
5 0 男性

df_customerからgenderカラムを削除したデータフレーム(df_customer_s)を作詞します。

1
2
df_customer_s = df_customer.drop(columns='gender')
df_customer.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	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
5 CS020401000016 宮下 達士 0 男性 1974-09-15 44 174-0065 東京都板橋区若木********** S13020 20150225 0-00000000-0
6 CS015414000103 奥野 陽子 1 女性 1977-08-09 41 136-0073 東京都江東区北砂********** S13015 20150722 B-20100609-B
7 CS029403000008 釈 人志 0 男性 1973-08-17 45 279-0003 千葉県浦安市海楽********** S12029 20150515 0-00000000-0
8 CS015804000004 松谷 米蔵 0 男性 1931-05-02 87 136-0073 東京都江東区北砂********** S13015 20150607 0-00000000-0
9 CS033513000180 安斎 遥 1 女性 1962-07-11 56 241-0823 神奈川県横浜市旭区善部町********** S14033 20150728 6-20080506-5

これで完成です。

第93問目:非正規化

P-093: 商品データフレーム(df_product)では各カテゴリのコード値だけを保有し、カテゴリ名は保有していない。カテゴリデータフレーム(df_category)と組み合わせて非正規化し、カテゴリ名を保有した新たな商品データフレームを作成せよ。

この問題は、前問とは逆の操作を行います。

すなわち、正規化されている2つのデータフレームを結合します。

まずは、df_productとdf_catecoryの構造を確認しましょう。

1
df_product
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost
0 P040101001 04 0401 040101 198.0 149.0
1 P040101002 04 0401 040101 218.0 164.0
2 P040101003 04 0401 040101 230.0 173.0
3 P040101004 04 0401 040101 248.0 186.0
4 P040101005 04 0401 040101 268.0 201.0
... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0
10026 P091503002 09 0915 091503 680.0 510.0
10027 P091503003 09 0915 091503 1080.0 810.0
10028 P091503004 09 0915 091503 1130.0 848.0
10029 P091503005 09 0915 091503 1280.0 960.0
10030 rows × 6 columns
1
df_category
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	category_major_cd	category_major_name	category_medium_cd	category_medium_name	category_small_cd	category_small_name
0 04 惣菜 0401 御飯類 040101 弁当類
1 04 惣菜 0401 御飯類 040102 寿司類
2 04 惣菜 0402 佃煮類 040201 魚介佃煮類
3 04 惣菜 0402 佃煮類 040202 海草佃煮類
4 04 惣菜 0402 佃煮類 040203 野菜佃煮類
... ... ... ... ... ... ...
223 09 洗剤 0914 ペットフード 091401 ペットフード
224 09 洗剤 0914 ペットフード 091402 ペット用剤
225 09 洗剤 0914 ペットフード 091403 ペット用具
226 09 洗剤 0915 DIY用品 091501 建築・塗装材料
227 09 洗剤 0915 DIY用品 091503 園芸用品
228 rows × 6 columns

df_productのcategory_small_cdに一致するdf_categoryのカテゴリ名をくっつけたいので、category_small_cdをキーに内部結合を行います。

【5分で分かる】結合演算とは | 内部結合と外部結合の違いを理解する - omathin blog

1
2
3
4
5
6
7
df_product_full = pd.merge(df_product, df_category[['category_small_cd', 
'category_major_name',
'category_medium_name',
'category_small_name']],
how = 'inner', on = 'category_small_cd')

df_product_full
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	category_major_name	category_medium_name	category_small_name
0 P040101001 04 0401 040101 198.0 149.0 惣菜 御飯類 弁当類
1 P040101002 04 0401 040101 218.0 164.0 惣菜 御飯類 弁当類
2 P040101003 04 0401 040101 230.0 173.0 惣菜 御飯類 弁当類
3 P040101004 04 0401 040101 248.0 186.0 惣菜 御飯類 弁当類
4 P040101005 04 0401 040101 268.0 201.0 惣菜 御飯類 弁当類
... ... ... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 洗剤 DIY用品 園芸用品
10026 P091503002 09 0915 091503 680.0 510.0 洗剤 DIY用品 園芸用品
10027 P091503003 09 0915 091503 1080.0 810.0 洗剤 DIY用品 園芸用品
10028 P091503004 09 0915 091503 1130.0 848.0 洗剤 DIY用品 園芸用品
10029 P091503005 09 0915 091503 1280.0 960.0 洗剤 DIY用品 園芸用品
10030 rows × 9 columns

これで完成です。

まとめ:正規化・非正規化を学びました。

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

データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。

無料体験可能なのでご確認ください。

コメント